( launcher

	TODO:
		Theme setting
		Window size setting
		Play notes
	)

%+  { ADD } %-   { SUB }  %*  { MUL }  %/  { DIV }
%<  { LTH } %>   { GTH }  %=  { EQU }  %!  { NEQ }
%++ { ADD2 } %-- { SUB2 } %** { MUL2 } %// { DIV2 }
%<< { LTH2 } %>> { GTH2 } %== { EQU2 } %!! { NEQ2 }

%RTN { JMP2r }
%TOS { #00 SWP }
%BRK? { #01 JCN BRK }
%RTN? { #01 JCN RTN }

%DEBUG  { ;print-hex/byte JSR2 #0a .Console/write DEO }
%DEBUG2 { ;print-hex/short JSR2 #0a .Console/write DEO }

%HEX-CHAR { DUP #09 GTH #04 JCN #30 + RTN #57 + }

( devices )

|00 @System     &vector $2 &wst      $1 &rst    $1 &pad   $4 &r      $2 &g      $2 &b    $2 &debug  $1 &halt $1 ]
|10 @Console    &vector $2 &read     $1 &pad    $5 &write $1 &error  $1 ]
|20 @Screen     &vector $2 &width   $2 &height $2 &auto $1 &pad $1 &x      $2 &y      $2 &addr $2 &pixel $1 &sprite $1
|80 @Controller &vector $2 &button $1 &key    $1 ]
|90 @Mouse      &vector $2 &x        $2 &y      $2 &state $1 &wheel  $1 ]
|a0 @File       &vector $2 &success $2 &stat $2 &delete $1 &append $1 &name $2 &length $2 &load $2 &save $2
|b0 @DateTime   &year   $2 &month    $1 &day    $1 &hour  $1 &minute $1 &second $1 &dotw $1 &doty $2 &isdst $1 ]

( variables )

|0000

@input $30
@second $1
@pointer
	&x  $2 &y  $2
@browser-frame
	&x $2 &y $2

( init )

|0100 ( -> )

	( theme ) 
	#f077 .System/r DEO2 
	#f00c .System/g DEO2 
	#f02a .System/b DEO2

	( vectors )
	;on-frame .Screen/vector DEO2
	;on-button .Controller/vector DEO2
	;on-mouse .Mouse/vector DEO2

	( theme support )
	;load-theme JSR2
	
BRK

@on-frame ( -> )

	.DateTime/second DEI .second LDZ ! BRK?
	.DateTime/second DEI .second STZ ;draw-time JSR2

BRK

@on-mouse ( -> )

	;pointer-icn .Screen/addr DEO2
	( clear last cursor )
	.pointer/x LDZ2 .Screen/x DEO2
	.pointer/y LDZ2 .Screen/y DEO2
	#40 .Screen/sprite DEO

	( record pointer positions )
	.Mouse/x DEI2 .pointer/x STZ2 
	.Mouse/y DEI2 .pointer/y STZ2

	( draw new cursor )
	.pointer/x LDZ2 .Screen/x DEO2
	.pointer/y LDZ2 .Screen/y DEO2
	#41 .Mouse/state DEI #01 = + .Screen/sprite DEO

BRK

@on-button ( -> )

	.Controller/key DEI BRK?

	.Controller/key DEI
	DUP #08 ! ,&no-backspace JCN
		;form/erase JSR2 POP BRK
		&no-backspace
	DUP #0d ! ,&no-enter JCN
		;form/validate JSR2 POP BRK
		&no-enter
	;form/append JSR2

BRK

@form ( -- )

	&append ( char -- )
		,&seek JSR STH2k NIP #30 < ,&can-append JCN
			POP POP2r RTN
			&can-append
		( save ) STH2kr STA
		( null ) #00 STH2r INC2 STA
		#07 ,&draw JSR
	RTN

	&validate ( -- )
		;input ;load-rom JSR2
		#00 ,&draw JSR
		( null ) #0000 ;input STA2
	RTN

	&erase ( -- )
		;input LDA2 #0000 !! ,&can-erase JCN
			RTN
			&can-erase
		#00 ,&draw JSR
		( remove ) #00 ,&seek JSR #0001 -- STA
		#07 ,&draw JSR
	RTN

	&seek ( -- end* )
		;input #0001 -- 
		&seek-loop 
			INC2 LDAk ,&seek-loop JCN
	RTN

	&draw ( color -- )
		STH
		#0038 #00c0 ;input STHkr ;draw-label JSR2
		STHr ;draw-cursor JSR2
	RTN

RTN

@redraw ( -- )

	#0018 #0020 #0040 #0040 ;logo-icn #03 ;draw-icn JSR2
	#0020 #0070 ;welcome-txt #01 ;draw-label JSR2
	;draw-time JSR2
	#0020 #00b0 ;prompt-txt #01 ;draw-label JSR2
	#0020 #00c0 ;do-txt #03 ;draw-label JSR2
	#03 ;form/draw JSR2
	#0010 #0010 #0060 #0060 ;mascot-icn #01 ;draw-icn JSR2

RTN

@draw-time ( -- )

	.DateTime/day DEI
		DUP #0f AND ;hex-char JSR2 ;&date-str #0009 ++ STA
		#04 SFT ;hex-char JSR2 ;&date-str #0008 ++ STA
	.DateTime/month DEI
		DUP #0f AND ;hex-char JSR2 ;&date-str #0006 ++ STA
		#04 SFT ;hex-char JSR2 ;&date-str #0005 ++ STA
	.DateTime/year DEI2
		DUP #0f AND ;hex-char JSR2 ;&date-str #0003 ++ STA
		#04 SFT ;hex-char JSR2 ;&date-str #0002 ++ STA
		DUP #0f AND ;hex-char JSR2 ;&date-str INC2 STA
		#04 SFT ;hex-char JSR2 ;&date-str STA

	.DateTime/second DEI
		DUP #0f AND ;hex-char JSR2 ;&time-str #0007 ++ STA
		#04 SFT ;hex-char JSR2 ;&time-str #0006 ++ STA
	.DateTime/minute DEI
		DUP #0f AND ;hex-char JSR2 ;&time-str #0004 ++ STA
		#04 SFT ;hex-char JSR2 ;&time-str #0003 ++ STA
	.DateTime/hour DEI
		DUP #0f AND ;hex-char JSR2 ;&time-str INC2 STA
		#04 SFT ;hex-char JSR2 ;&time-str STA

	#0020 #0080 ;&date-str #01 ;draw-label JSR2
	#0080 #0080 ;&time-str #02 ;draw-label JSR2

RTN
	&date-str "0000-00-00 $1
	&time-str "00:00:00 $1

@hex-char ( hex -- char )

	HEX-CHAR

RTN

@draw-cursor ( color -- )

	STH
	;cursor-icn .Screen/addr DEO2
	STHkr .Screen/sprite DEO
	.Screen/y DEI2 #0008 ++ .Screen/y DEO2
	STHr .Screen/sprite DEO

RTN

@draw-icn ( x* y* width* height* addr* color  -- )
	
	( load ) STH .Screen/addr DEO2 ,&height STR2 ,&width STR2 ,&y STR2 ,&x STR2
	,&height LDR2 #0000 
	&ver
		( save ) DUP2 ,&y LDR2 ADD2 .Screen/y DEO2
		,&width LDR2 #0000
		&hor
			( save ) DUP2 ,&x LDR2 ADD2 .Screen/x DEO2
			( draw ) STHkr .Screen/sprite DEO
			( incr ) .Screen/addr DEI2 #0008 ADD2 .Screen/addr DEO2
			#0008 ADD2 GTH2k ,&hor JCN
		POP2 POP2
		#0008 ADD2 GTH2k ,&ver JCN
	POP2 POP2
	POPr

RTN
	&x $2 &y $2 &width $2 &height $2

@draw-label ( x* y* addr* color -- )

	STH STH2
	.Screen/y DEO2
	.Screen/x DEO2
	STH2r
	&loop
		( top-addr ) LDAk #20 - TOS #0010 MUL2 ;font ++ .Screen/addr DEO2
		( top-draw ) STHkr .Screen/sprite DEO
		( bottom-addr ) .Screen/addr DEI2 #0008 ++ .Screen/addr DEO2
		( next-y ) .Screen/y DEI2 #0008 ++ .Screen/y DEO2
		( bottom-draw ) STHkr .Screen/sprite DEO
		( prev-y ) .Screen/y DEI2 #0008 -- .Screen/y DEO2
		( move ) .Screen/x DEI2 #0008 ++ .Screen/x DEO2
		INC2 LDAk ,&loop JCN
	POP2 POPr

RTN

( theme )

@theme-txt ".theme $1

@load-theme ( -- )

	;theme-txt .File/name DEO2 
	#0006 .File/length DEO2 
	#fffa .File/load DEO2

	.File/success DEI2 #0006 !! ,&ignore JCN
		#fffa LDA2 .System/r DEO2
		#fffc LDA2 .System/g DEO2
		#fffe LDA2 .System/b DEO2
		&ignore
	;redraw JSR2

RTN

( helpers )

@print-hex ( value* -- )
	
	&short ( value* -- )
		SWP ,&echo JSR 
	&byte ( value -- )
		,&echo JSR
	RTN

	&echo ( value -- )
	STHk #04 SFT ,&parse JSR .Console/write DEO
	STHr #0f AND ,&parse JSR .Console/write DEO
	RTN
	&parse ( value -- char )
		DUP #09 GTH ,&above JCN #30 + RTN &above #09 - #60 + RTN

RTN

@welcome-txt
	"Welcome 20 "to 20 "your 20 "UXN 20 "Ordinator $1
@today-txt
	"Today 20 "is 20 "0000-00-00 ", 20 "the 20 "time 20 "is 20 "00:00:00 $1
@prompt-txt
	"What 20 "shall 20 "we 20 "do? $1
@do-txt
	"$: $1

@error-txt
	"Sorry, 20 "ROM 20 "not 20 "found. $1

@pointer-icn
	80c0 e0f0 f8e0 1000
@cursor-icn
	ffff ffff ffff ffff

include projects/library/load-rom.tal

include projects/assets/logo05x05.tal
include projects/assets/mascot0cx0c.tal
include projects/assets/msx01x02.tal