From 0114af1a10254de26f95aad0645729a7dfb7eb02 Mon Sep 17 00:00:00 2001 From: Devine Lu Linvega Date: Tue, 16 Nov 2021 10:35:11 -0500 Subject: [PATCH] Added nametable demo --- projects/examples/demos/nametable.tal | 232 ++++++++++++++++++++++++++ projects/pictures/bulma37x29.chr | Bin 0 -> 36080 bytes 2 files changed, 232 insertions(+) create mode 100644 projects/examples/demos/nametable.tal create mode 100644 projects/pictures/bulma37x29.chr diff --git a/projects/examples/demos/nametable.tal b/projects/examples/demos/nametable.tal new file mode 100644 index 0000000..bd8c198 --- /dev/null +++ b/projects/examples/demos/nametable.tal @@ -0,0 +1,232 @@ + +( + 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 diff --git a/projects/pictures/bulma37x29.chr b/projects/pictures/bulma37x29.chr new file mode 100644 index 0000000000000000000000000000000000000000..d7b0ac24e54668c767e4635c360b19f26f9ec112 GIT binary patch literal 36080 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 SLV(