diff --git a/gui/sand/build.sh b/gui/sand/build.sh new file mode 100755 index 0000000..76d96e9 --- /dev/null +++ b/gui/sand/build.sh @@ -0,0 +1,26 @@ +#!/bin/sh -e + +ID="sand" + +ASM="uxncli $HOME/roms/drifblim.rom" +EMU="uxnemu" +LIN="uxncli $HOME/roms/uxnlin.rom" +SRC="${ID}.tal" +DST="${ID}.rom" +CPY="$HOME/roms" +ARG="" + +if [[ "$*" == *"--lint"* ]] +then + $LIN $SRC +fi + +$ASM $SRC $DST + +if [[ "$*" == *"--save"* ]] +then + cp $DST $CPY +fi + +$EMU $DST $ARG + diff --git a/gui/sand/sand.tal b/gui/sand/sand.tal new file mode 100644 index 0000000..99dbe8e --- /dev/null +++ b/gui/sand/sand.tal @@ -0,0 +1,210 @@ +( usage: uxnemu sand.rom + mouse1 water + mouse2 sand + mouse3 rock ) + +|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 &pad $3 &scrollx $2 &scrolly $2 +|a0 @File &vector $2 &success $2 &stat $2 &delete $1 &append $1 &name $2 &length $2 &read $2 &write $2 +|c0 @DateTime &year $2 &month $1 &day $1 &hour $1 &minute $1 &second $1 &dotw $1 &doty $2 &isdst $1 + +|0100 + +( +@|vectors ) + +@on-reset + + ( theme ) + #07cf .System/r DEO2 + #0caf .System/g DEO2 + #0faf .System/b DEO2 + + #0100 .Screen/width DEO2 + #0100 .Screen/height DEO2 + + ;on-frame .Screen/vector DEO2 + ;on-mouse .Mouse/vector DEO2 + + prng-init + + #010e DEO + +BRK + +@on-frame ( -> ) + + eval + redraw + +BRK + +@on-mouse ( -> ) + + [ LIT2 00 -Mouse/state ] DEI NEQ #41 ADD ;cursor-icn update-cursor + + ( read mouse state ) + .Mouse/state DEI ?&on-touch BRK + +&on-touch ( -> ) + + ( A mouse button was pressed ) + .Mouse/state DEI DUP #04 EQU SUB + .Mouse/y DEI2 NIP + .Mouse/x DEI2 NIP + set-cell + +BRK + +( +@|core ) + +@eval-sand ( y x cell -- y x ) + + POP + OVR #ff EQU ?eval/resume + ( south ) + SWPk INC SWP STH2k get-cell #01 GTH ?&has-s + DUP2 STH2r swap-cells !eval/resume + &has-s + POP2r + ( south sides ) + SWPk INC SWP #01ff prng ADD #01 AND [ JMP SWP POP ] ADD STH2k get-cell #01 GTH ?&has-s2 + DUP2 STH2r swap-cells !eval/resume + &has-s2 + POP2r + +!eval/resume + +@eval-water ( y x cell -- y x ) + + POP + OVR #ff EQU ?eval/resume + ( south ) + SWPk INC SWP STH2k get-cell ?&has-s + DUP2 STH2r swap-cells !eval/resume + &has-s + POP2r + ( south sides ) + DUP2 #01ff prng ADD #01 AND [ JMP SWP POP ] ADD STH2k get-cell ?&has-s2 + DUP2 STH2r swap-cells !eval/resume + &has-s2 + POP2r + +!eval/resume + +@eval-rock ( y x cell -- y x ) + + POP + OVR #ff EQU ?eval/resume + ( south ) + SWPk INC SWP STH2k get-cell #01 GTH ?&has-s + DUP2 STH2r swap-cells !eval/resume + &has-s + POP2r + +!eval/resume + +@eval ( -- ) + + #ffff + &l + DUP2 get-cell + DUP #01 EQU ?eval-water + DUP #02 EQU ?eval-sand + DUP #03 EQU ?eval-rock + POP + &resume + #0001 SUB2 ORAk ?&l + POP2 + +@redraw ( -- ) + + #0000 + &l + DUP2 #00ff AND2 .Screen/x DEO2 + DUP2 #0100 DIV2 .Screen/y DEO2 + DUP2 get-cell .Screen/pixel DEO + INC2 ORAk ?&l + POP2 + +JMP2r + +@swap-cells ( a* b* -- ) + + #02 SFT2 ;world ADD2 LDAk STH ,&a STR2 + #02 SFT2 ;world ADD2 LDAk STH ,&b STR2 + STHr [ LIT2 &a $2 ] STA + STHr [ LIT2 &b $2 ] STA + +JMP2r + +@set-cell ( type y x -- ) + + #02 SFT2 ;world ADD2 STA + +JMP2r + +@get-cell ( y x -- type ) + + #02 SFT2 ;world ADD2 LDA + +JMP2r + +( +@|drawing ) + +@update-cursor ( color addr* -- ) + + [ LIT2 00 -Screen/auto ] DEO + #40 draw-cursor + .Mouse/x DEI2 ,draw-cursor/x STR2 + .Mouse/y DEI2 ,draw-cursor/y STR2 + .Screen/addr DEO2 + +@draw-cursor ( color -- ) + + [ LIT2 &x $2 ] .Screen/x DEO2 + [ LIT2 &y $2 ] .Screen/y DEO2 + .Screen/sprite DEO + +JMP2r + +( +@|stdlib ) + +@prng-init ( -- ) + + ( seed ) + #00 .DateTime/second DEI + #00 .DateTime/minute DEI #60 SFT2 EOR2 + #00 .DateTime/hour DEI #c0 SFT2 EOR2 ,prng/x STR2 + #00 .DateTime/hour DEI #04 SFT2 + #00 .DateTime/day DEI #10 SFT2 EOR2 + #00 .DateTime/month DEI #60 SFT2 EOR2 + .DateTime/year DEI2 #a0 SFT2 EOR2 ,prng/y STR2 + +JMP2r + +@prng ( -- number* ) + + LIT2 &x $2 + DUP2 #50 SFT2 EOR2 + DUP2 #03 SFT2 EOR2 + LIT2 &y $2 DUP2 ,&x STR2 + DUP2 #01 SFT2 EOR2 EOR2 + ,&y STR2k POP + +JMP2r + +( +@|assets ) + +@cursor-icn [ + 80c0 e0f0 f8e0 1000 ] + +@world +