( dev/controller/keys )

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

%RTN { JMP2r }
%TOS { #00 SWP }
%LTS2  { #8000 ++ SWP2 #8000 ++ >> } 
%AUTO-NONE   { #00 .Screen/auto DEO }
%AUTO-X      { #01 .Screen/auto DEO }

( devices )

|00 @System     [ &vector $2 &pad    $6 &r      $2 &g     $2 &b      $2 ]
|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 ]

( variables )

|0000

@center
	&x $2
	&y $2
@frame
	&w $2 &h $2
	&x0 $2 &y0 $2
	&x1 $2 &y1 $2

( init )

|0100 ( -> )

	( theme ) 
	#0ff7 .System/r DEO2 
	#0f07 .System/g DEO2 
	#0f07 .System/b DEO2

	( find center )
	.Screen/width DEI2 #01 SFT2 .center/x STZ2
	.Screen/height DEI2 #01 SFT2 .center/y STZ2

	( place controller )
	#0068 .frame/w STZ2
	#0030 .frame/h STZ2
	.center/x LDZ2 .frame/w LDZ2 #0002 // -- .frame/x0 STZ2
	.center/y LDZ2 .frame/h LDZ2 #0002 // -- .frame/y0 STZ2
	.frame/x0 LDZ2 .frame/w LDZ2 ++ .frame/x1 STZ2
	.frame/y0 LDZ2 .frame/h LDZ2 ++ .frame/y1 STZ2

	( vectors ) 
	;on-button .Controller/vector DEO2

	( frame )
	.frame/x0 LDZ2 .frame/y0 LDZ2
	.frame/x1 LDZ2 .frame/y1 LDZ2
		#03 ;line-rect JSR2

	,draw-controller JSR

BRK

@on-button ( -> )

	,draw-controller JSR

	( print stack on start button )
	.Controller/button DEI #08 = JMP BRK #010e DEO

BRK

@draw-controller ( -- )

	.Controller/button DEI STH

	( d-pad )
	.frame/x0 LDZ2 #0010 ++ .Screen/x DEO2
	.frame/y0 LDZ2 #0010 ++ .Screen/y DEO2
	;controller-icn/dpad-up .Screen/addr DEO2
	#03 [ STHkr #04 SFT #01 AND DUP + - ] .Screen/sprite DEO
	.Screen/y DEI2 #0010 ++ .Screen/y DEO2
	;controller-icn/dpad-down .Screen/addr DEO2
	#03 [ STHkr #05 SFT #01 AND DUP + - ] .Screen/sprite DEO
	.Screen/y DEI2 #0008 -- .Screen/y DEO2
	.Screen/x DEI2 #0008 -- .Screen/x DEO2
	;controller-icn/dpad-left .Screen/addr DEO2
	#03 [ STHkr #06 SFT #01 AND DUP + - ] .Screen/sprite DEO
	.Screen/x DEI2 #0010 ++ .Screen/x DEO2
	;controller-icn/dpad-right .Screen/addr DEO2
	#03 [ STHkr #07 SFT #01 AND DUP + - ] .Screen/sprite DEO
	.Screen/x DEI2 #0008 -- .Screen/x DEO2
	;controller-icn/dpad .Screen/addr DEO2
	#03 .Screen/sprite DEO

	( options )
	.center/y LDZ2 #0009 ++ .Screen/y DEO2
	.center/x LDZ2 #0009 -- .Screen/x DEO2
	;controller-icn/option .Screen/addr DEO2
	#03 [ STHkr #02 SFT #01 AND DUP + - ] .Screen/sprite DEO
	.center/x LDZ2 #0004 ++ .Screen/x DEO2
	;controller-icn/option .Screen/addr DEO2
	#03 [ STHkr #03 SFT #01 AND DUP + - ] .Screen/sprite DEO

	( buttons )
	.center/y LDZ2 #0000 ++ .Screen/y DEO2
	.center/x LDZ2 #0018 ++ .Screen/x DEO2
	;controller-icn/button .Screen/addr DEO2
	#03 [ STHkr #01 SFT #01 AND - ] .Screen/sprite DEO
		.Screen/y DEI2 #000a ++ .Screen/y DEO2
		;font-hex #000b #30 SFT2 ++ .Screen/addr DEO2
		#03 .Screen/sprite DEO

	.center/y LDZ2 #0000 ++ .Screen/y DEO2
	.center/x LDZ2 #0024 ++ .Screen/x DEO2
	;controller-icn/button .Screen/addr DEO2
	#03 [ STHr #01 AND - ] .Screen/sprite DEO
		.Screen/y DEI2 #000a ++ .Screen/y DEO2
		;font-hex #000a #30 SFT2 ++ .Screen/addr DEO2
		#03 .Screen/sprite DEO

	.center/x LDZ2 #0010 -- .Screen/x DEO2
	.center/y LDZ2 #0010 -- .Screen/y DEO2
	AUTO-X
	.Controller/button DEI2 #03 ;draw-short JSR2
	AUTO-NONE

RTN

( generics )

@draw-short ( short* color -- )

	STH SWP STHkr ,draw-byte JSR STHr 

@draw-byte ( byte color -- )

	STH DUP #04 SFT STHkr ,draw-hex JSR STHr 

@draw-hex ( char color -- )

	#00 ROT #0f AND #30 SFT2 ;font-hex ++ .Screen/addr DEO2
	.Screen/sprite DEO

RTN

@line-rect ( x1* y1* x2* y2* color -- )

	STH
	DUP2 ,&ver-y2 STR2 ,&hor-y2 STR2
	DUP2 ,&ver-x2 STR2 ,&hor-x2 STR2
	DUP2 ,&ver-y1 STR2 ,&hor-y1 STR2
	DUP2 ,&ver-x1 STR2 ,&hor-x1 STR2
	( horizontal )
	[ LIT2 &hor-x2 $2 ] INC2 [ LIT2 &hor-x1 $2 ]
	&hor
		DUP2 .Screen/x DEO2
		[ LIT2 &hor-y1 $2 ] .Screen/y DEO2 STHkr .Screen/pixel DEOk
		[ LIT2 &hor-y2 $2 ] .Screen/y DEO2 DEO
		INC2 GTH2k ,&hor JCN
	POP2 POP2
	( vertical )
	[ LIT2 &ver-y2 $2 ] [ LIT2 &ver-y1 $2 ]
	&ver
		DUP2 .Screen/y DEO2
		[ LIT2 &ver-x1 $2 ] .Screen/x DEO2 STHkr .Screen/pixel DEOk
		[ LIT2 &ver-x2 $2 ] .Screen/x DEO2 DEO
		INC2 GTH2k ,&ver JCN
	POP2 POP2
	POPr

RTN

@controller-icn
	&dpad       ffff ffff ffff ffff
	&dpad-up    7eff e7c3 ffff ffff
	&dpad-down  ffff ffff c3e7 ff7e
	&dpad-left  7fff efcf cfef ff7f
	&dpad-right feff f7f3 f3f7 fffe
	&option     0000 7eff ff7e 0000
	&button     3c7e ffff ffff 7e3c

@font-hex 
	003c 4242 4242 3c00 0018 0808 0808 1c00
	003c 4202 3c40 7e00 003c 421c 0242 3c00
	000c 1424 447e 0400 007e 407c 0242 3c00
	003c 407c 4242 3c00 007e 0204 0810 1000
	003c 423c 4242 3c00 003c 4242 3e02 3c00
	003c 4242 7e42 4200 007c 427c 4242 7c00
	003c 4240 4042 3c00 007c 4242 4242 7c00
	007e 4078 4040 7e00 007e 4078 4040 4000