( 
	uxnasm projects/examples/demos/nametable.tal bin/nametable.rom 
	uxnemu bin/nametable.rom 
)

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

%2** { #10 SFT2 } %2// { #01 SFT2 }
%8** { #30 SFT2 } %8// { #03 SFT2 }
%10** { #40 SFT2 } %10// { #04 SFT2 }
%MOD2 { DIV2k MUL2 SUB2 }
%MOD { DIVk MUL SUB }
%RTN { JMP2r }

%WIDTH { #0037 }
%HEIGHT { #0029 } ( 08cf )
%LENGTH { WIDTH HEIGHT MUL2 10** }

( 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 &read $2 &write $2 ]

( variables )

|0000

( program )

@tiles-frame
	&x $2 &y $2
@nametable-frame
	&x $2 &y $2
@buffer $10

|0100 ( -> )

	( theme ) 
	#34cd .System/r DEO2 
	#28ac .System/g DEO2 
	#297b .System/b DEO2

	WIDTH 8** #0010 ++ .Screen/width DEO2
	#01e8 .Screen/height DEO2

	#0008 .tiles-frame/x STZ2
	HEIGHT 8** #0008 ++ .tiles-frame/y STZ2
	#0008 .nametable-frame/x STZ2 
	#0008 .nametable-frame/y STZ2

	;input-name 
		DUP2 ,load JSR
		;assoc JSR2 

	;draw-tiles JSR2
	;draw-nametable JSR2
	;draw-short JSR2

BRK

@load ( filename* -- )

	LIT2r 0000
	.File/name DEO2
	&stream
		#0010 .File/length DEO2
		;buffer 
			DUP2 .File/read DEO2
			,find-tile JSR #ffff !! ,&skip JCN
				;buffer ;add-tile JSR2
				&skip
		INC2r
		.File/success DEI2 #0000 !! ,&stream JCN
	STH2r #0001 -- ;result/tiles STA2

RTN

@find-tile ( addr* -- addr* )

	STH2
	;result/length LDA2 #0000
	&loop
		DUP2 10** ;result/data ++ STH2kr ;tiles-equal JSR2 #00 = ,&continue JCN
			NIP2 POP2r RTN
			&continue
		INC2 GTH2k ,&loop JCN
	POP2 POP2 POP2r
	( default ) #ffff

RTN

@tiles-equal ( a* b* -- bool )

	STH2
	DUP2 #0010 ++ SWP2
	&loop
		LDAk LDAkr STHr = ,&continue JCN
			POP2 POP2 POP2r #00 RTN
			&continue
		INC2r
		INC2 GTH2k ,&loop JCN
	POP2 POP2 POP2r #01

RTN

@add-tile ( addr* -- addr* )

	STH2
	#0010 #0000
	&loop
		( addr* ) DUP2 ;result/length LDA2 10** ;result/data ++ ++
		( data ) OVR2 STH2kr ++ LDA
		( order ) ROT ROT STA
		INC2 GTH2k ,&loop JCN
	POP2 POP2
	POP2r
	( incr ) ;result/length LDA2 INC2 ;result/length STA2

RTN

@assoc ( -- length )

	LIT2r 0000
	.File/name DEO2
	&stream
		#0010 .File/length DEO2
		;buffer 
			DUP2 .File/read DEO2
			;find-tile JSR2 STH2kr SWP2 ;set-tile JSR2
		INC2r
		.File/success DEI2 #0000 !! ,&stream JCN
	POP2r

RTN

( draw )

@draw-tiles ( -- )

	.tiles-frame/x LDZ2 .Screen/x DEO2
	.tiles-frame/y LDZ2 .Screen/y DEO2
	;result/data .Screen/addr DEO2

	( width ) LITr 00
	( auto x addr ) #05 .Screen/auto DEO
	;result/data ;result/length LDA2 10** ++ ;result/data
	&loop
		STHkr WIDTH NIP MOD ,&continue JCN
			.tiles-frame/x LDZ2 .Screen/x DEO2
			.Screen/y DEI2 #0008 ++ .Screen/y DEO2
			POPr LITr 00
			&continue
		INCr
		#81 .Screen/sprite DEO
		#0010 ++ GTH2k ,&loop JCN
	POP2 POP2
	( auto none ) #00 .Screen/auto DEO
	POPr

RTN

@set-tile ( id* addr* -- )

	SWP2 2** ;result/data ++ ;result/length LDA2 10** ++ STA2

RTN

@get-tile ( id* -- addr* )

	2** ;result/length LDA2 10** ;result/data ++ ++ LDA2

RTN

@draw-nametable ( -- )

	;result/tiles LDA2 #0000
	&loop
		DUP2 WIDTH MOD2 8** .nametable-frame/x LDZ2 ++ .Screen/x DEO2
		DUP2 WIDTH DIV2 8** .nametable-frame/y LDZ2 ++ .Screen/y DEO2
		DUP2 ;get-tile JSR2 10** ;result/data ++ .Screen/addr DEO2
		#81 .Screen/sprite DEO
		INC2 GTH2k ,&loop JCN
	POP2 POP2

RTN

@draw-short ( -- )

	#0008 .Screen/x DEO2
	#0008 .Screen/y DEO2
	#01 .Screen/auto DEO
		;result/length LDA2 SWP 
		( high ) ,&draw-byte JSR
		( low ) ,&draw-byte JSR
	#05 .Screen/auto DEO

RTN

	&draw-byte ( byte -- )
		DUP
		( high ) #04 SFT ,&draw-char JSR
		( low ) #0f AND ,&draw-char JSR
		RTN
	&draw-char ( num -- )
		#30 SFT #00 SWP ;font-hex ADD2 .Screen/addr DEO2
		#01 .Screen/sprite DEO
		RTN

@input-name "projects/pictures/bulma37x29.chr $1

@font-hex ( 0-F )
	007c 8282 8282 827c 0030 1010 1010 1010
	007c 8202 7c80 80fe 007c 8202 1c02 827c
	000c 1424 4484 fe04 00fe 8080 7c02 827c
	007c 8280 fc82 827c 007c 8202 1e02 0202
	007c 8282 7c82 827c 007c 8282 7e02 827c
	007c 8202 7e82 827e 00fc 8282 fc82 82fc
	007c 8280 8080 827c 00fc 8282 8282 82fc
	007c 8280 f080 827c 007c 8280 f080 8080

@result
	&length $2
	&tiles $2
	&data