added offline version of the client as a generic bootloader, and made confirmation controls a bit more intuitive
Iris Lightshard nilix@nilfm.cc
PGP Signature
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEkFh6dA+k/6CXFXU4O3+8IhROY5gFAmFrfsQACgkQO3+8IhRO Y5iHOg//bgMZJxTG+X6n7YWy4fkjlFD1ZU2svvDd+ocd1Rkj3UzEuC6v6X+AqzdO mlisOQjxB/X5qxcBLb23nU0QwiMkfg3n5/rt3qrz+gK1jAau7NxE4NYBS5R8k6xt KiGUqtacmeVapSUykd5kz9JslaetoJUHVAPmfOmGrIgXeUWu1ZJe2UvALNjZaB+f V/sOuNlNnAwhLwnSY8MYSRWUvXrd5dscEXQUzpIBysMo3CH5mHfgo+k4TU9Z9kW2 pwOgDauWSVMsE11jvovpMHr00d9FFb0opTe1eCwWMx8C9N5K5c9NTjuEj/g/ITYG gcVlvHyXUcrv2vqsmEzS6gUOzYddkj3LkPR50yv6FuW2WcIctnds03zaWiFzzeGL mnZ/vptDboaaxDt4ynRZKyo8iNfAcqFCbzEUASd1lbFLGRwXinyrnVXonWB9Hz6H IdGIAQGiBSOi65ACbRLgRVIgZSVMs3Qi8XpTRLrHqeFvwQAU9kONROfEscFyEYY8 jO7lww4R13LzQW3gxBS1QG5vu9saqXDmmHb+TyZqtl5PKVHJoOtv+2d29RqOG687 Oz6WfCt6C2GIVlUX0sks1hymZWe/CnCeIG/1VbpY7FLvodtN+rXCvyfNlNPBlYg5 VgaH9qtquGoffgfvDqGZjO1dXgx3Tv1Z91koPlu1TWvowhYBIZs= =71nJ -----END PGP SIGNATURE-----
2 files changed,
1079 insertions(+),
9 deletions(-)
A
uxn-client/xrxs-local.tal
@@ -0,0 +1,1070 @@
+( utility macros ) + +%INC-X { .Screen/x DEI2 #0008 ADD2 .Screen/x DEO2 } ( -- ) +%INC-Y { .Screen/y DEI2 #0008 ADD2 .Screen/y DEO2 } ( -- ) + +%CENTER-X { .Screen/width DEI2 #01 SFT2 } +%CENTER-Y { .Screen/height DEI2 #01 SFT2 } + +%MOD { DIVk MUL SUB } +%MOD2 { DIV2k MUL2 SUB2 } + +%2** { #10 SFT2 } %2// { #01 SFT2 } +%8** { #30 SFT2 } %8// { #03 SFT2 } +%TOS { #00 SWP } %TOB { SWP POP } + +%NEXT-TILE { DUP2 #0010 ADD2 } +%GET-USABLE-HEIGHT { .Screen/height DEI2 #0050 SUB2 #03 SFT2 SWP POP } + +%RTN { JMP2r } + +( 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 ] +|30 @Audio0 [ &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1 ] +|40 @Audio1 [ &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1 ] +|50 @Audio2 [ &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $1 ] +|60 @Audio3 [ &vector $2 &position $2 &output $1 &pad $3 &adsr $2 &length $2 &addr $2 &volume $1 &pitch $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 &offset-hs $2 &offset-ls $2 &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 + +@state $1 +@ticker $1 +@anim-speed $1 + +@logo-coords [ + &x $2 + &y $2 +] + +@list-len $2 +@list-offset $1 +@list-elem-offset $1 +@list-top $1 +@list-height $1 +@select-index $1 +@ncarts $1 +@btn-state $1 +@sb-len $1 +@sb-pos $1 +@sb-step $1 + +@cart-len $1 + +( program ) + +|0100 +@init ( -> ) + + ( steppewnolf-dark theme ) + #02c1 .System/r DEO2 + #02cd .System/g DEO2 + #02cb .System/b DEO2 + + #0200 .Screen/width DEO2 + #0110 .Screen/height DEO2 + + ( initialize state ) + #00 .ticker STZ + #00 .state STZ + #00 .select-index STZ + #20 .anim-speed STZ + #ff .btn-state STZ + GET-USABLE-HEIGHT .list-height STZ + + ;carts-file .File/name DEO2 + #2000 .File/length DEO2 + ;list-buf .File/load DEO2 + .File/success DEI2 .list-len STZ2 + + CENTER-X .logo-coords/x STZ2 + CENTER-Y .logo-coords/y STZ2 + + ;on-frame .Screen/vector DEO2 + +BRK + +@on-frame ( -> ) + + .ticker LDZ #01 ADD + DUP .anim-speed LDZ EQU ,&next-render JCN + .ticker STZ + BRK + + &next-render + POP #00 .ticker STZ + .state LDZ + + ( draw uxn logo ) + DUP #00 NEQ ,&state1 JCN + ;draw-uxn-logo JSR2 + INC .state STZ + BRK + + ( draw first syllable of xrxs logo ) + &state1 DUP #01 NEQ ,&state2 JCN + ;draw-xrxs-logo-xr JSR2 + INC .state STZ + BRK + + ( draw second syllable of xrxs logo ) + &state2 DUP #02 NEQ ,&state3 JCN + ;draw-xrxs-logo-xs JSR2 + + INC .state STZ + BRK + + ( clear screen ) + &state3 + ;clear-screen JSR2 + + ( move shove logo into top-left corner ) + DUP #03 NEQ ,&state4 JCN + #04 .anim-speed STZ + ;scoot-logos JSR2 + ;draw-uxn-logo JSR2 + ;draw-xrxs-logo-xr JSR2 + ;draw-xrxs-logo-xs JSR2 + .logo-coords/x LDZ2 #0020 GTH2 ,&keep-state JCN + + INC .state STZ + ;get-select-idx-by-mouse .Mouse/vector DEO2 + ;get-select-idx-by-key .Controller/vector DEO2 BRK + &keep-state POP + BRK + + ( render the cartridge list interface ) + &state4 DUP #04 NEQ ,&state5 JCN + ;draw-gray-borders JSR2 + ;draw-bl-scanlines JSR2 + ;draw-tl-scanlines JSR2 + ;draw-tr-scanlines JSR2 + ;draw-br-scanlines JSR2 + ;draw-uxn-logo JSR2 + ;draw-xrxs-logo-xr JSR2 + ;draw-xrxs-logo-xs JSR2 + [ ;title-loadCart + CENTER-X OVR2 ;strlen JSR2 #20 SFT2 SUB2 + #0010 + #02 ] ;draw-string JSR2 + ;render-cart-list JSR2 + ;draw-scrollbar JSR2 + ;draw-pointer JSR2 + POP + BRK + + ( confirm the selected cartridge ) + &state5 DUP #05 NEQ ,&state6 JCN + ;draw-gray-borders JSR2 + ;draw-bl-scanlines JSR2 + ;draw-tl-scanlines JSR2 + ;draw-tr-scanlines JSR2 + ;draw-br-scanlines JSR2 + ;draw-uxn-logo JSR2 + ;draw-xrxs-logo-xr JSR2 + ;draw-xrxs-logo-xs JSR2 + [ ;title-confirmCart + CENTER-X OVR2 ;strlen JSR2 #20 SFT2 SUB2 + #0010 + #02 ] ;draw-string JSR2 + ;render-cart-list JSR2 + ;draw-scrollbar JSR2 + ;draw-confirm-buttons JSR2 + ;draw-pointer JSR2 + POP + BRK + &state6 + POP +BRK + +@clear-screen ( -> ) + + .Screen/width DEI2 #0000 &whilex EQU2k ,&endx JCN + DUP2 ,&x STR2 + .Screen/height DEI2 #0000 &whiley EQU2k ,&endy JCN + DUP2 ,&y STR2 + ,&x LDR2 .Screen/x DEO2 + ,&y LDR2 .Screen/y DEO2 + ;blank .Screen/addr DEO2 + #10 .Screen/sprite DEO + #40 .Screen/sprite DEO + #0008 ADD2 ,&whiley JMP &endy POP2 POP2 + #0008 ADD2 ,&whilex JMP &endx POP2 POP2 + +RTN +&x $2 +&y $2 + +@scoot-logos ( -> ) + + .logo-coords/x LDZ2 #0021 LTH2 ,&no-scoot-x JCN + .logo-coords/x LDZ2 #01 SFT2 + .logo-coords/x STZ2 + &no-scoot-x + + .logo-coords/y LDZ2 #0021 LTH2 ,&no-scoot-y JCN + .logo-coords/y LDZ2 #01 SFT2 + .logo-coords/y STZ2 + &no-scoot-y + +RTN + +@draw-uxn-logo ( -> ) + + .logo-coords/x LDZ2 #0020 SUB2 .Screen/x DEO2 + .logo-coords/y LDZ2 #0010 SUB2 .Screen/y DEO2 + + #0100 #0000 &while EQU2k ,&end JCN + DUP2 ;uxn-logo ADD2 .Screen/addr DEO2 + #c1 .Screen/sprite DEO INC-X + + NEXT-TILE #0030 AND2 #0000 NEQ2 ,&no-inc-y JCN + .logo-coords/x LDZ2 #0020 SUB2 .Screen/x DEO2 + INC-Y + &no-inc-y + #0010 ADD2 ,&while JMP &end POP2 POP2 + +RTN + +@draw-xrxs-logo-xr ( -> ) + + .logo-coords/x LDZ2 .Screen/x DEO2 + .logo-coords/y LDZ2 #0010 SUB2 .Screen/y DEO2 + + #0080 #0000 &while EQU2k ,&end JCN + DUP2 ;xrxs-logo ADD2 .Screen/addr DEO2 + #c1 .Screen/sprite DEO INC-X + + NEXT-TILE #0030 AND2 #0000 NEQ2 ,&no-inc-y JCN + .logo-coords/x LDZ2 .Screen/x DEO2 + INC-Y + &no-inc-y + #0010 ADD2 ,&while JMP &end POP2 POP2 + +RTN + +@draw-xrxs-logo-xs ( -> ) + + .logo-coords/x LDZ2 .Screen/x DEO2 + .logo-coords/y LDZ2 .Screen/y DEO2 + + #0100 #0080 &while EQU2k ,&end JCN + DUP2 ;xrxs-logo ADD2 .Screen/addr DEO2 + #c1 .Screen/sprite DEO INC-X + + NEXT-TILE #0030 AND2 #0000 NEQ2 ,&no-inc-y JCN + .logo-coords/x LDZ2 .Screen/x DEO2 + INC-Y + &no-inc-y + #0010 ADD2 ,&while JMP &end POP2 POP2 + +RTN + +@draw-gray-borders ( -> ) + + ;blank .Screen/addr DEO2 + #0028 #0000 &whilemtop EQU2k ,&endmtop JCN + DUP2 .Screen/y DEO2 + .Screen/width DEI2 #0000 &whiletop EQU2k ,&endtop JCN + DUP2 .Screen/x DEO2 + #84 .Screen/sprite DEO + #0008 ADD2 ,&whiletop JMP &endtop POP2 POP2 + #0008 ADD2 ,&whilemtop JMP &endmtop POP2 POP2 + + #0040 #0000 &whilemleft EQU2k ,&endmleft JCN + DUP2 .Screen/x DEO2 + .Screen/height DEI2 #0028 SUB2 #0028 &whileleft EQU2k ,&endleft JCN + DUP2 .Screen/y DEO2 + #84 .Screen/sprite DEO + #0008 ADD2 ,&whileleft JMP &endleft POP2 POP2 + #0008 ADD2 ,&whilemleft JMP &endmleft POP2 POP2 + + .Screen/width DEI2 DUP2 #0040 SUB2 &whilemright EQU2k ,&endmright JCN + DUP2 .Screen/x DEO2 + .Screen/height DEI2 #0028 SUB2 #0028 &whileright EQU2k ,&endright JCN + DUP2 .Screen/y DEO2 + #84 .Screen/sprite DEO + #0008 ADD2 ,&whileright JMP &endright POP2 POP2 + #0008 ADD2 ,&whilemright JMP &endmright POP2 POP2 + + .Screen/height DEI2 DUP2 #0028 SUB2 &whilembottom EQU2k ,&endmbottom JCN + DUP2 .Screen/y DEO2 + .Screen/width DEI2 #0000 &whilebottom EQU2k ,&endbottom JCN + DUP2 .Screen/x DEO2 + #84 .Screen/sprite DEO + #0008 ADD2 ,&whilebottom JMP &endbottom POP2 POP2 + #0008 ADD2 ,&whilembottom JMP &endmbottom POP2 POP2 + +RTN + + +( come up with a more elegant way to draw these ) + +@draw-bl-scanlines ( -> ) + CENTER-Y ,&y STR2 + #0008 ,&x STR2 + + &whileld + ,&y LDR2 CENTER-Y SUB2 #04 SFT2 DUP2 ADD2 #0008 ADD2 ,&x STR2 + .Screen/height DEI2 #0028 SUB2 ,&y LDR2 LTH2 ,&endld JCN + &dlscan #0040 ,&x LDR2 EQU2 ,&enddlscan JCN + ,&x LDR2 .Screen/x DEO2 + ,&y LDR2 .Screen/y DEO2 + #03 .Screen/pixel DEO + ,&x LDR2 #0001 ADD2 ,&x STR2 ,&dlscan JMP &enddlscan + ,&y LDR2 #0004 ADD2 ,&y STR2 ,&whileld JMP &endld + +RTN +&x $2 +&y $2 + +@draw-tl-scanlines + #0028 ,&y STR2 + #0008 ,&x STR2 + + &whilelu + CENTER-Y ,&y LDR2 SUB2 #04 SFT2 DUP2 ADD2 #0008 ADD2 ,&x STR2 + CENTER-Y ,&y LDR2 LTH2 ,&endlu JCN + &ulscan #0040 ,&x LDR2 EQU2 ,&endulscan JCN + ,&x LDR2 .Screen/x DEO2 + ,&y LDR2 .Screen/y DEO2 + #03 .Screen/pixel DEO + ,&x LDR2 #0001 ADD2 ,&x STR2 ,&ulscan JMP &endulscan + ,&y LDR2 #0004 ADD2 ,&y STR2 ,&whilelu JMP &endlu + +RTN +&x $2 +&y $2 + +@draw-br-scanlines ( -> ) + CENTER-Y ,&y STR2 + .Screen/width DEI2 #0008 SUB2 ,&x STR2 + + &whilerd + .Screen/width DEI2 #0040 SUB2 ,&x STR2 + .Screen/height DEI2 #0028 SUB2 ,&y LDR2 LTH2 ,&endrd JCN + &drscan .Screen/width DEI2 #0008 SUB2 ,&y LDR2 CENTER-Y SUB2 #04 SFT2 DUP2 ADD2 SUB2 ,&x LDR2 EQU2 ,&enddrscan JCN + ,&x LDR2 .Screen/x DEO2 + ,&y LDR2 .Screen/y DEO2 + #03 .Screen/pixel DEO + ,&x LDR2 #0001 ADD2 ,&x STR2 ,&drscan JMP &enddrscan + ,&y LDR2 #0004 ADD2 ,&y STR2 ,&whilerd JMP &endrd +RTN +&x $2 +&y $2 + +@draw-tr-scanlines + #0028 ,&y STR2 + .Screen/width DEI2 #0008 SUB2 ,&x STR2 + + &whileru + .Screen/width DEI2 #0040 SUB2 ,&x STR2 + CENTER-Y ,&y LDR2 LTH2 ,&endru JCN + &urscan .Screen/width DEI2 #0008 SUB2 CENTER-Y ,&y LDR2 SUB2 #04 SFT2 DUP2 ADD2 SUB2 ,&x LDR2 EQU2 ,&endurscan JCN + ,&x LDR2 .Screen/x DEO2 + ,&y LDR2 .Screen/y DEO2 + #03 .Screen/pixel DEO + ,&x LDR2 #0001 ADD2 ,&x STR2 ,&urscan JMP &endurscan + ,&y LDR2 #0004 ADD2 ,&y STR2 ,&whileru JMP &endru + +RTN +&x $2 +&y $2 + + +@draw-pointer ( -> ) + + ;cursor .Screen/addr DEO2 + + .Mouse/x DEI2 .Screen/x DEO2 + .Mouse/y DEI2 .Screen/y DEO2 + + #4a .Screen/sprite DEO + +RTN + +@draw-string ( addr x y color -- ) + + STH ( save color ) + .Screen/y DEO2 ( set y ) + .Screen/x DEO2 ( set x ) + + ( now the string address is at the top of the stack ) + &loop + LDAk DUP #00 NEQ #20 MUL SUB TOS 8** ;font ADD2 .Screen/addr DEO2 + STHkr .Screen/sprite DEO + INC-X + INC2 + LDAk #00 NEQ ,&loop JCN + POP2 + POPr + +RTN + +@strlen ( addr -- len ) + + DUP2 + &loop + INC2 LDAk ,&loop JCN + SWP2 SUB2 + +RTN + +@store-char ( char -- char ) + + #00 .list-elem-offset LDZ ;word ADD2 STA + .list-elem-offset LDZ INC .list-elem-offset STZ + +RTN + +@shouldnt-draw-word ( -- flag ) + + .list-offset LDZ .list-top LDZ LTH ,&no JCN + .list-offset LDZ .list-top LDZ .list-height LDZ ADD #01 SUB GTH ,&no JCN + #00 RTN + + &no + #01 +RTN + +@finish-line ( -> ) + + ;get-entry-color JSR2 #02 EQU ,&end JCN + + &while + .Screen/x DEI2 + .Screen/width DEI2 #0048 SUB2 + + EQU2 ,&end JCN + #0c .Screen/sprite DEO + INC-X + + ,&while JMP &end + +RTN + + +@draw-cart-name ( -> ) + + ;get-entry-color JSR2 #0c NEQ ,&no-store-cart JCN + ;store-cart JSR2 + &no-store-cart + [ ;word + .Screen/x DEI2 + .Screen/y DEI2 + ;get-entry-color JSR2 ] ;draw-string JSR2 + ;finish-line JSR2 + +RTN + + +@render-cart-list ( -> ) + + #0040 .Screen/x DEO2 + #0028 .Screen/y DEO2 + + #00 .list-offset STZ + .list-len LDZ2 #0000 &while EQU2k ,&end JCN + ( get a character from the list ) + DUP2 ;list-buf ADD2 LDA + + ( if null byte, terminate loop ) + DUP #00 EQU ,&end JCN + + ( if not newline, store the character and increment the offsets ) + DUP #0a EQU ,&inc-line JCN + ;store-char JSR2 + ,&continue JMP ( continue looping ) + + ( if newline, print the word, increment x, reset y ) + ( clear the word and word offsets, increment the buffer offset ) + &inc-line + #00 .list-elem-offset LDZ ;word ADD2 STA + ( if the word isn't in the scroll window, don't draw it ) + ;shouldnt-draw-word JSR2 ,&no-draw JCN + ;draw-cart-name JSR2 + #0040 .Screen/x DEO2 + INC-Y + &no-draw + .list-offset LDZ INC .list-offset STZ + + #20 #00 &word_clr EQUk ,&end-clr JCN + #00 OVR SWP DUP ROT ;word ADD2 STA + INC ,&word_clr JMP &end-clr POP2 + #00 .list-elem-offset STZ + &continue INC2 ,&while JMP + &end .list-offset LDZ #01 SUB .ncarts STZ POP2 POP2 + +RTN + +@store-cart ( -> ) + + #20 #00 &while EQUk ,&end JCN + DUP TOS ;word ADD2 LDA + DUP #0a EQU ,&done JCN + DUP #00 EQU ,&done JCN + SWP DUP TOS ;cart ADD2 + ROT STH STA + STHr + INC ,&while JMP &end POP2 + RTN + + &done + POP + .cart-len STZ + POP + + #05 #00 &p-while EQUk ,&p-end JCN + DUP TOS ;dot-rom ADD2 LDA + SWP DUP .cart-len LDZ ADD TOS ;cart ADD2 + ROT STH STA + STHr + INC ,&p-while JMP &p-end POP2 +RTN + +@get-entry-color ( -- colorByte ) + + .list-offset LDZ + .select-index LDZ + + NEQ ,&normal JCN + + ( selected ) + #0c RTN + &normal + #02 + +RTN + +@draw-scrollbar ( -> ) + + .Screen/width DEI2 #0048 SUB2 .Screen/x DEO2 + #0028 .Screen/y DEO2 + + ( draw the trough no matter what ) + ;scrollbar-trough .Screen/addr DEO2 + .list-height LDZ #00 + &while-trough EQUk ,&end-trough JCN + #81 .Screen/sprite DEO + INC-Y + INC ,&while-trough JMP &end-trough POP2 + + ( stop here if there is no overflow ) + .ncarts LDZ .list-height LDZ LTH ,&no-handle JCN + ,&draw-handle JMP + + &no-handle + RTN + + ( if there are more carts than will fit in the view area, draw the handle ) + &draw-handle + #0028 .Screen/y DEO2 + ( store the number of carts per tile of the scrollbar ) + .ncarts LDZ .list-height LDZ DIV .sb-step STZ + + ( set the length of the scrollbar ) + .list-height LDZ .ncarts LDZ .list-height LDZ SUB .sb-step LDZ DIV SUB .sb-len STZ + + ;scrollbar .Screen/addr DEO2 + #0028 .sb-pos LDZ #30 SFT TOS ADD2 .Screen/y DEO2 + .sb-len LDZ #00 &while-handle EQUk ,&end-handle JCN + .Screen/y DEI2 .Screen/height DEI2 #0028 SUB2 EQU2 ,&end-handle JCN + #81 .Screen/sprite DEO + INC INC-Y ,&while-handle JMP &end-handle POP2 + +RTN + +@get-select-idx-by-mouse ( -> ) + + .Mouse/wheel DEI #00 EQU ,&no-scroll JCN + .Mouse/wheel DEI #01 NEQ ,&scroll-down JCN + ( scroll-up ) + ;try-scroll-up-mouse JSR2 + ,&no-scroll JMP + + &scroll-down + ;try-scroll-down-mouse JSR2 + + &no-scroll + .Mouse/x DEI2 #0040 LTH2 ,&done JCN + .Mouse/x DEI2 .Screen/width DEI2 #0048 SUB2 GTH2 ,&done JCN + + .Mouse/y DEI2 #0028 LTH2 ,&done JCN + .Mouse/y DEI2 .Screen/height DEI2 #0028 SUB2 GTH2 ,&done JCN + + .Mouse/y DEI2 #0028 SUB2 8// TOB .list-top LDZ ADD .select-index STZ + + .Mouse/state DEI #00 EQU ,&no-click JCN + .select-index LDZ .ncarts LDZ GTH ,&no-click JCN + .state LDZ INC .state STZ + ;set-button-state-by-key .Controller/vector DEO2 + ;set-button-state-by-mouse .Mouse/vector DEO2 + &no-click + BRK + + &done + #ff .select-index STZ + +BRK + +@try-scroll-up-mouse ( -> ) + .ncarts LDZ .list-height LDZ LTH ,&no-scroll-up JCN + .list-top LDZ #00 EQU ,&no-scroll-up JCN + .list-top LDZ #01 SUB .list-top STZ + ;update-sb-pos JSR2 + &no-scroll-up +RTN + +@try-scroll-down-mouse ( -> ) + .ncarts LDZ .list-height LDZ LTH ,&no-scroll-down JCN + .list-top LDZ .list-height LDZ ADD .ncarts LDZ #01 ADD EQU ,&no-scroll-down JCN + .list-top LDZ INC .list-top STZ + ;update-sb-pos JSR2 + &no-scroll-down +RTN + + +@try-scroll-up ( -> ) + .select-index LDZ + DUP .list-top LDZ NEQ ,&no-scroll-up JCN + .list-top LDZ #00 EQU ,&no-scroll-up JCN + .list-top LDZ #01 SUB .list-top STZ + ;update-sb-pos JSR2 + &no-scroll-up +RTN + +@try-scroll-down ( -> ) + .select-index LDZ + DUP .list-top LDZ .list-height LDZ ADD #01 SUB NEQ ,&no-scroll-down JCN + .list-top LDZ .list-height LDZ ADD .ncarts LDZ #01 ADD EQU ,&no-scroll-down JCN + .list-top LDZ INC .list-top STZ + ;update-sb-pos JSR2 + &no-scroll-down +RTN + +@update-sb-pos ( -> ) + + .list-top LDZ .sb-step LDZ DIV .sb-pos STZ + +RTN + +@get-select-idx-by-key ( -> ) + + .Controller/button DEI + + DUP #10 NEQ ,&no-up JCN + ;try-scroll-up JSR2 + DUP #00 EQU ,&no-dec JCN + #01 SUB .select-index STZ + ,&no-up JMP + &no-dec + POP + &no-up + + DUP #20 NEQ ,&no-down JCN + ;try-scroll-down JSR2 + DUP .ncarts LDZ EQU ,&no-inc JCN + INC .select-index STZ + ,&no-down JMP + &no-inc + POP + &no-down + + DUP #01 NEQ ,&no-a-btn JCN + .state LDZ INC .state STZ + #00 .btn-state STZ + ;set-button-state-by-key .Controller/vector DEO2 + ;set-button-state-by-mouse .Mouse/vector DEO2 + &no-a-btn + POP + +BRK + +@set-button-state-by-key ( -> ) + + .Controller/button DEI #00 NEQ ,&action JCN + BRK + + &action + .btn-state LDZ #ff EQU ,&from-null JCN + .btn-state LDZ #00 EQU ,&from-no JCN + ( from yes ) + .Controller/button DEI #10 MOD #00 NEQ ,&check-action JCN + #00 .btn-state STZ + BRK + + &from-no + .Controller/button DEI #10 MOD #00 NEQ ,&check-action JCN + #01 .btn-state STZ + BRK + + &from-null + .Controller/button DEI #10 MOD #00 NEQ ,&check-action JCN + #00 .btn-state STZ + BRK + + &check-action + .Controller/button DEI #00 EQU ,&no-action JCN + ( check A button ) + .Controller/button DEI #01 NEQ ,&check-b-button JCN + ( A on yes ) + .btn-state LDZ #01 NEQ ,&a-on-no JCN + ;capture-input JSR2 + ;load-cart JSR2 + BRK + &a-on-no + .btn-state LDZ #00 NEQ ,&no-action JCN + ;get-select-idx-by-mouse .Mouse/vector DEO2 + ;get-select-idx-by-key .Controller/vector DEO2 + #04 .state STZ + BRK + + &check-b-button + .Controller/button DEI #02 NEQ ,&no-action JCN + ;get-select-idx-by-mouse .Mouse/vector DEO2 + ;get-select-idx-by-key .Controller/vector DEO2 + #04 .state STZ + &no-action + +BRK + +@set-button-state-by-mouse ( -> ) + + ( if not in the vertical range of the buttons, quit early ) + .Mouse/y DEI2 .Screen/height DEI2 #001c SUB2 LTH2 ,¬-no JCN + .Mouse/y DEI2 .Screen/height DEI2 #000c SUB2 GTH2 ,¬-no JCN + + + .Mouse/x DEI2 CENTER-X #0030 SUB2 LTH2 ,¬-yes JCN + .Mouse/x DEI2 CENTER-X GTH2 ,¬-yes JCN + #01 .btn-state STZ + ,&check-click JMP + + ¬-yes + + .Mouse/x DEI2 CENTER-X LTH2 ,¬-no JCN + .Mouse/x DEI2 CENTER-X #0030 ADD2 GTH2 ,¬-no JCN + #00 .btn-state STZ + ,&check-click JMP + + ¬-no + #ff .btn-state STZ BRK + + &check-click + .Mouse/state DEI #00 EQU ,&no-click JCN + .btn-state LDZ #00 NEQ ,&state-load JCN + ;get-select-idx-by-mouse .Mouse/vector DEO2 + ;get-select-idx-by-key .Controller/vector DEO2 + #04 .state STZ + BRK + &state-load + ;capture-input JSR2 + ;load-cart JSR2 + &no-click + +BRK + +@button-color ( bit -- sprite ) + + ,&get-color-yes JCN + + ( get color no ) + .btn-state LDZ #ff EQU ,&no-inactive JCN + .btn-state LDZ #01 EQU ,&no-inactive JCN + ( active ) + ;no-btn-active RTN + + &no-inactive + ;no-btn RTN + + + &get-color-yes + .btn-state LDZ #ff EQU ,&yes-inactive JCN + .btn-state LDZ #00 EQU ,&yes-inactive JCN + ( active ) + ;yes-btn-active RTN + + &yes-inactive + ;yes-btn + +RTN + +@draw-confirm-buttons ( -> ) + + ( yes ) + .Screen/height DEI2 #001c SUB2 .Screen/y DEO2 + CENTER-X #0030 SUB2 .Screen/x DEO2 + + #00c0 #0000 &while-yes EQU2k ,&end-yes JCN + DUP2 [ #01 ;button-color JSR2 ] ADD2 .Screen/addr DEO2 + #81 .Screen/sprite DEO INC-X + + NEXT-TILE #0060 NEQ2 ,&no-inc-y JCN + CENTER-X #0030 SUB2 .Screen/x DEO2 + INC-Y + &no-inc-y + #0010 ADD2 ,&while-yes JMP &end-yes POP2 POP2 + + ( no ) + .Screen/height DEI2 #001c SUB2 .Screen/y DEO2 + CENTER-X .Screen/x DEO2 + + #00c0 #0000 &while-no EQU2k ,&end-no JCN + DUP2 [ #00 ;button-color JSR2 ] ADD2 .Screen/addr DEO2 + #81 .Screen/sprite DEO INC-X + + NEXT-TILE #0060 NEQ2 ,&no-inc-y-no JCN + CENTER-X .Screen/x DEO2 + INC-Y + &no-inc-y-no + #0010 ADD2 ,&while-no JMP &end-no POP2 POP2 + +RTN + +@load-cart ( -> ) + + .state LDZ INC .state STZ + ;cart ;load-rom JSR2 +RTN + +@load-rom ( filename* -- ) +( + Attempts to load the ROM from filename* and executes it. If the file exists + and has non-zero length, this function does not return, because the new ROM + is executing in its place. + + The screen and both stacks are cleared and all the device vectors are + written to zero as a convenience. All other device bytes are left + untouched, so they could introduce a device state to the next ROM that + it's not expecting. +) + + .File/name DEO2 + #0000 .File/offset-hs DEO2 + #0000 .File/offset-ls DEO2 + + ( return if file can't be found, or zero length ) + #0001 .File/length DEO2 + ;&tmp .File/load DEO2 + .File/success DEI2 ORA JMP JMP2r + + ( clear wst ) + #ab + &wst-loop + POP + .System/wst STH DEIr STHr ,&wst-loop JCN + + ( clear rst ) + LITr ab + &rst-loop + POPr + .System/rst DEI ,&rst-loop JCN + + ( clear screen ) + #01 .Screen/auto DEO + #0000 .Screen/y DEO2 + .Screen/width DEI2 #0007 ADD2 #03 SFT2 #ffff MUL2 STH2 + &screen-yloop + #0000 .Screen/x DEO2 + STH2kr + &screen-xloop-bg + #00 .Screen/sprite DEO + INC2 + ORAk ,&screen-xloop-bg JCN + POP2 + #0000 .Screen/x DEO2 + STH2kr + &screen-xloop-fg + #40 .Screen/sprite DEO + INC2 + ORAk ,&screen-xloop-fg JCN + POP2 + .Screen/y DEI2 #0008 ADD2 + DUP2 .Screen/y DEO2 + .Screen/height DEI2 LTH2 ,&screen-yloop JCN + POP2r + #00 .Screen/auto DEO + + ( reset device vectors ) + LIT2r 0000 #00 + &device-vector-loop + DUP2r STHk DEO2r + #10 ADD + DUP ,&device-vector-loop JCN + POP POP2r + + ( copy the zero-page-loader into f0-ff ) + ;&zero-page-loader LITr f0 + ©-loop + LDAk STHkr STZ + INC2 INCr + STHkr ,©-loop JCN + POP2 ( leave 00 on return stack ) + + ( prepare the stack for the zero-page-loader ) + ( the more we prepare here in advance, the less we'll have to overwrite ) + STHkr #00fe ( arguments for STZ2 at ff ) + STHkr ( argument for JMP at fe (carry on) ) + DUPk #fcfe ( arguments for STZ2 at fd and JMP (repeat) ) + OVR2 #fafe ( arguments for STZ2 at fd and JMP (repeat) ) + OVR2 #f8fe ( arguments for STZ2 at fd and JMP (repeat) ) + OVR2 #f6fe ( arguments for STZ2 at fd and JMP (repeat) ) + OVR2 #f401 ( arguments for STZ2 at fd, plus an extra 01 ) + STHkr ( first argument for ADD2 ) + .File/success ( argument for DEI2 ) + #0100 .File/load ( arguments for DEO2 ) + #ff00 .File/length DEO2 + #00f0 JMP2 + + &zero-page-loader + ( f0 ) DEO2 + ( f1 ) DEI2 + ( f2 ) ADD2 + ( f3 ) &loop DUPr + ( f4 ) STH2k + ( f5 ) STAr + ( f6 ) INC2 + ( f7 ) NEQ2k + ( f8 ) ,&loop + ( f9 ) + ( fa ) JCN + ( fb ) POPr + ( fc ) POP2 + ( fd ) STZ2 ( deletes f4-fd through looping ) + ( fe ) JMP + ( ff ) STZ2 ( deletes fe-ff ) + + &tmp $1 + +@capture-input ( -> ) + + ;no-instr .Mouse/vector DEO2 + ;no-instr .Controller/vector DEO2 + +RTN + +@no-instr BRK + +( constants ) +@carts-file "index 00 + +@title-loadCart "Select 20 "A 20 "ROM 00 +@title-confirmCart "Load 20 "This 20 "ROM? 00 + +@cart $32 +@dot-rom ".rom 00 + +( sprites ) +@blank $16 +@uxn-logo [ + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 1b 3f 1e 18 18 18 + 00 00 00 00 00 00 00 00 00 e0 f0 38 1c 0c 0c 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 18 18 18 18 18 18 3e + 00 00 00 00 00 00 00 00 0c 0c 0c 0c 0c 0c 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 78 30 30 30 30 30 30 00 00 00 00 00 00 00 00 7c 18 18 18 18 18 18 18 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 30 30 30 38 1c 0f 07 00 00 00 00 00 00 00 00 00 18 18 38 78 fc d8 90 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +] + +@xrxs-logo [ + 00 00 00 00 00 00 00 00 00 60 70 38 1c 0e 07 03 00 00 00 00 00 00 00 00 00 00 06 0c 18 30 60 c0 + 00 00 00 00 00 00 00 00 00 01 63 36 1c 0c 0c 0c 00 00 00 00 00 00 00 00 00 e0 f0 1c 0c 00 00 00 + 00 00 00 00 00 00 00 00 03 06 0c 18 30 60 00 00 00 00 00 00 00 00 00 00 c0 e0 70 38 1c 0e 06 00 + 00 00 00 00 00 00 00 00 0c 0c 0c 0c 0c 1c 3e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 60 70 38 1c 0e 07 03 00 00 00 00 00 00 00 00 00 00 06 0c 18 30 60 c0 + 00 00 00 00 00 00 00 00 00 03 07 0e 18 18 18 1f 00 00 00 00 00 00 00 00 00 c0 f0 78 08 00 00 e0 + 00 00 00 00 00 00 00 00 03 06 0c 18 30 60 00 00 00 00 00 00 00 00 00 00 c0 e0 70 38 1c 0e 06 00 + 00 00 00 00 00 00 00 00 07 00 00 10 1e 0f 03 00 00 00 00 00 00 00 00 00 f8 18 18 18 70 e0 c0 00 +] + +@yes-btn [ + ff f8 f0 e0 e0 e1 e2 e2 00 07 08 10 10 11 12 12 ff 00 00 00 e0 10 08 08 00 ff 00 00 e0 10 08 08 + ff 00 00 00 00 00 00 00 00 ff 00 00 82 82 44 38 ff 00 00 00 00 00 00 00 00 ff 00 00 fe 80 80 f8 + ff 00 00 00 00 00 00 00 00 ff 00 00 7c 82 80 7c ff 3f 1f 0f 0f 0f 0f 0f 00 c0 20 10 10 10 10 10 + e2 e1 e0 e0 e0 f0 f8 ff 12 11 10 10 10 08 07 00 08 10 e0 00 00 00 00 ff 08 10 e0 00 00 00 ff 00 + 00 00 00 00 00 00 00 ff 10 10 10 00 00 00 ff 00 00 00 00 00 00 00 00 ff 80 80 fe 00 00 00 ff 00 + 00 00 00 00 00 00 00 ff 02 82 7c 00 00 00 ff 00 0f 0f 0f 0f 0f 1f 3f ff 10 10 10 10 10 20 c0 00 +] + +@no-btn [ + ff f8 f0 e0 e2 e1 e0 e0 00 07 08 10 12 11 10 10 ff 00 00 00 08 10 a0 40 00 ff 00 00 08 10 a0 40 + ff 00 00 00 00 00 00 00 00 ff 00 00 08 0c 0a 09 ff 00 00 00 00 00 00 00 00 ff 00 00 27 28 28 28 + ff 00 00 00 00 00 00 00 00 ff 00 00 c0 20 20 20 ff 3f 1f 0f 0f 0f 0f 0f 00 c0 20 10 10 10 10 10 + e0 e1 e2 e0 e0 f0 f8 ff 10 11 12 10 10 08 07 00 a0 10 08 00 00 00 00 ff a0 10 08 00 00 00 ff 00 + 00 00 00 00 00 00 00 ff 08 08 08 00 00 00 ff 00 00 00 00 00 00 00 00 ff a8 68 27 00 00 00 ff 00 + 00 00 00 00 00 00 00 ff 20 20 c0 00 00 00 ff 00 0f 0f 0f 0f 0f 1f 3f ff 10 10 10 10 10 20 c0 00 +] + +@yes-btn-active [ + ff ff f8 f0 f0 f1 f2 f2 00 07 08 10 10 11 12 12 ff ff 00 00 e0 10 08 08 00 ff 00 00 e0 10 08 08 + ff ff 00 00 00 00 00 00 00 ff 00 00 82 82 44 38 ff ff 00 00 00 00 00 00 00 ff 00 00 fe 80 80 f8 + ff ff 00 00 00 00 00 00 00 ff 00 00 7c 82 80 7c ff ff 3f 1f 1f 1f 1f 1f 00 c0 20 10 10 10 10 10 + f2 f1 f0 f0 f0 f8 ff ff 12 11 10 10 10 08 07 00 08 10 e0 00 00 00 ff ff 08 10 e0 00 00 00 ff 00 + 00 00 00 00 00 00 ff ff 10 10 10 00 00 00 ff 00 00 00 00 00 00 00 ff ff 80 80 fe 00 00 00 ff 00 + 00 00 00 00 00 00 ff ff 02 82 7c 00 00 00 ff 00 1f 1f 1f 1f 1f 3f ff ff 10 10 10 10 10 20 c0 00 +] + +@no-btn-active [ + ff ff f8 f0 f2 f1 f0 f0 00 07 08 10 12 11 10 10 ff ff 00 00 08 10 a0 40 00 ff 00 00 08 10 a0 40 + ff ff 00 00 00 00 00 00 00 ff 00 00 08 0c 0a 09 ff ff 00 00 00 00 00 00 00 ff 00 00 27 28 28 28 + ff ff 00 00 00 00 00 00 00 ff 00 00 c0 20 20 20 ff ff 3f 1f 1f 1f 1f 1f 00 c0 20 10 10 10 10 10 + f0 f1 f2 f0 f0 f8 ff ff 10 11 12 10 10 08 07 00 a0 10 08 00 00 00 ff ff a0 10 08 00 00 00 ff 00 + 00 00 00 00 00 00 ff ff 08 08 08 00 00 00 ff 00 00 00 00 00 00 00 ff ff a8 68 27 00 00 00 ff 00 + 00 00 00 00 00 00 ff ff 20 20 c0 00 00 00 ff 00 1f 1f 1f 1f 1f 3f ff ff 10 10 10 10 10 20 c0 00 +] + +@scrollbar [ + ff ff ff ff ff ff ff ff 3c 3c 3c 3c 3c 3c 3c 3c +] + +@scrollbar-trough [ + c3 c3 c3 c3 c3 c3 c3 c3 28 14 28 14 28 14 28 14 +] + +@cursor [ + 80c0 e0f0 f8e0 1000 + ] + +@font [ + 00 00 00 00 00 00 00 00 00 18 18 18 08 00 08 00 00 14 14 00 00 00 00 00 00 24 7e 24 24 7e 24 00 + 00 10 3c 50 38 14 78 10 00 00 44 08 10 20 44 00 00 18 20 32 2c 24 1a 00 00 18 10 20 00 00 00 00 + 00 04 08 08 08 08 04 00 00 20 10 10 10 10 20 00 00 00 44 28 10 28 44 00 00 00 10 10 7c 10 10 00 + 00 00 00 00 00 0c 08 10 00 00 00 00 3e 00 00 00 00 00 00 00 00 0c 0c 00 00 02 04 08 10 20 40 00 + 00 38 44 54 54 44 38 00 00 30 10 10 10 10 38 00 00 38 44 04 38 40 7c 00 00 38 44 18 04 44 38 00 + 00 08 18 28 48 7c 08 00 00 7c 40 78 04 44 38 00 00 38 40 78 44 44 38 00 00 7c 04 08 10 10 10 00 + 00 38 44 38 44 44 38 00 00 38 44 44 3c 04 38 00 00 18 18 00 00 18 18 00 00 18 18 00 00 18 10 20 + 00 00 08 10 20 10 08 00 00 00 00 3e 00 3e 00 00 00 00 10 08 04 08 10 00 00 38 44 1c 10 00 10 00 + 00 38 44 5c 58 40 3c 00 00 10 28 44 7c 44 44 00 00 78 44 78 44 44 78 00 00 38 44 40 40 44 38 00 + 00 78 44 44 44 44 78 00 00 7c 40 7c 40 40 7c 00 00 7c 40 7c 40 40 40 00 00 38 44 40 4c 44 3c 00 + 00 44 44 7c 44 44 44 00 00 7c 10 10 10 10 7c 00 00 7c 08 08 48 48 30 00 00 44 48 70 48 44 44 00 + 00 40 40 40 40 40 7c 00 00 44 6c 7c 54 44 44 00 00 44 64 74 5c 4c 44 00 00 38 44 44 44 44 38 00 + 00 78 44 44 78 40 40 00 00 38 44 44 4c 4c 3e 00 00 78 44 44 78 44 44 00 00 3c 40 38 04 04 78 00 + 00 7c 10 10 10 10 10 00 00 44 44 44 44 44 3c 00 00 44 44 28 28 10 10 00 00 44 44 44 54 6c 44 00 + 00 44 44 38 38 44 44 00 00 44 44 28 10 10 10 00 00 7c 04 18 30 40 7c 00 00 3c 30 30 30 30 3c 00 + 00 40 20 10 08 04 02 00 00 3c 0c 0c 0c 0c 3c 00 00 10 38 6c 00 00 00 00 00 00 00 00 00 00 7e 00 + 00 18 08 04 00 00 00 00 00 00 38 04 3c 44 3c 00 00 40 40 78 44 44 78 00 00 00 38 44 40 44 38 00 + 00 04 04 3c 44 44 3c 00 00 00 38 44 7c 40 3c 00 00 1c 20 78 20 20 20 00 00 00 3c 44 3c 04 44 38 + 00 40 40 78 44 44 44 00 00 30 00 70 10 10 18 00 00 0c 00 3c 04 04 44 38 00 00 44 48 70 48 44 00 + 00 70 10 10 10 10 1c 00 00 00 44 6c 7c 54 44 00 00 00 78 44 44 44 44 00 00 00 38 44 44 44 38 00 + 00 00 78 44 44 78 40 40 00 00 3c 44 44 3d 06 04 00 00 4c 50 60 40 40 00 00 00 3c 40 38 04 78 00 + 00 20 78 20 20 24 38 00 00 00 44 44 44 44 3c 00 00 00 44 44 28 28 10 00 00 00 44 44 54 7c 28 00 + 00 00 44 28 10 28 44 00 00 00 44 44 3c 04 78 00 00 00 7c 04 38 40 7c 00 00 1e 10 10 10 00 00 00 + 00 10 10 10 10 10 10 00 00 00 00 08 08 08 78 00 00 00 00 32 4c 00 00 00 3c 42 99 a1 a1 99 42 3c +] + +( big data ) +@word [ #0000 #0000 #0000 #0000 + #0000 #0000 #0000 #0000 + #0000 #0000 #0000 #0000 + #0000 #0000 #0000 #0000 ] +@list-buf $8192 +
M
uxn-client/xrxs.tal
→
uxn-client/xrxs.tal
@@ -670,6 +670,7 @@ &no-down
DUP #01 NEQ ,&no-a-btn JCN .state LDZ INC .state STZ + #00 .btn-state STZ ;set-button-state-by-key .Controller/vector DEO2 ;set-button-state-by-mouse .Mouse/vector DEO2 &no-a-btn@@ -679,25 +680,24 @@ BRK
@set-button-state-by-key ( -> ) + .Controller/button DEI #00 NEQ ,&action JCN + BRK + + &action .btn-state LDZ #ff EQU ,&from-null JCN .btn-state LDZ #00 EQU ,&from-no JCN ( from yes ) - .Controller/button DEI #80 NEQ ,&check-action JCN + .Controller/button DEI #10 MOD #00 NEQ ,&check-action JCN #00 .btn-state STZ BRK &from-no - .Controller/button DEI #40 NEQ ,&check-action JCN + .Controller/button DEI #10 MOD #00 NEQ ,&check-action JCN #01 .btn-state STZ BRK - &from-null - ( in from left ) - .Controller/button DEI #80 NEQ ,&in-from-right JCN - #01 .btn-state STZ - BRK - &in-from-right - .Controller/button DEI #40 NEQ ,&check-action JCN + &from-null + .Controller/button DEI #10 MOD #00 NEQ ,&check-action JCN #00 .btn-state STZ BRK