From 6d6f73040dd3c5a1d35adf0b3eddaf8a1d14e5aa Mon Sep 17 00:00:00 2001 From: Devine Lu Linvega Date: Fri, 17 Mar 2023 21:20:28 -0700 Subject: [PATCH] Added wireworld --- gui/calendar/build.sh | 3 - gui/clock/build.sh | 3 - gui/life/build.sh | 3 - gui/soroban/build.sh | 3 - gui/wireworld/build.sh | 32 +++++ gui/wireworld/wireworld.tal | 246 ++++++++++++++++++++++++++++++++++++ 6 files changed, 278 insertions(+), 12 deletions(-) create mode 100755 gui/wireworld/build.sh create mode 100644 gui/wireworld/wireworld.tal diff --git a/gui/calendar/build.sh b/gui/calendar/build.sh index 5c4eb54..6d1e9af 100755 --- a/gui/calendar/build.sh +++ b/gui/calendar/build.sh @@ -3,7 +3,6 @@ ASM="uxncli $HOME/roms/drifblim.rom" EMU="uxnemu" LIN="uxncli $HOME/roms/uxnlin.rom" -APP="$HOME/bin/butler push" SRC="calendar.tal" DST="calendar.rom" @@ -12,8 +11,6 @@ CPY="$HOME/roms" ARG="" echo ">> Cleaning" -rm -rf bin -mkdir bin if [[ "$*" == *"--lint"* ]] then diff --git a/gui/clock/build.sh b/gui/clock/build.sh index 9c43269..85d887d 100755 --- a/gui/clock/build.sh +++ b/gui/clock/build.sh @@ -3,7 +3,6 @@ ASM="uxncli $HOME/roms/drifblim.rom" EMU="uxnemu" LIN="uxncli $HOME/roms/uxnlin.rom" -APP="$HOME/bin/butler push" SRC="clock.tal" DST="clock.rom" @@ -12,8 +11,6 @@ CPY="$HOME/roms" ARG="" echo ">> Cleaning" -rm -rf bin -mkdir bin if [[ "$*" == *"--lint"* ]] then diff --git a/gui/life/build.sh b/gui/life/build.sh index 02caae1..97879fd 100755 --- a/gui/life/build.sh +++ b/gui/life/build.sh @@ -3,7 +3,6 @@ ASM="uxncli $HOME/roms/drifblim.rom" EMU="uxnemu" LIN="uxncli $HOME/roms/uxnlin.rom" -APP="$HOME/bin/butler push" SRC="life.tal" DST="life.rom" @@ -12,8 +11,6 @@ CPY="$HOME/roms" ARG="" echo ">> Cleaning" -rm -rf bin -mkdir bin if [[ "$*" == *"--lint"* ]] then diff --git a/gui/soroban/build.sh b/gui/soroban/build.sh index 68de3b6..5a63c24 100755 --- a/gui/soroban/build.sh +++ b/gui/soroban/build.sh @@ -3,7 +3,6 @@ ASM="uxncli $HOME/roms/drifblim.rom" EMU="uxnemu" LIN="uxncli $HOME/roms/uxnlin.rom" -APP="$HOME/bin/butler push" SRC="soroban.tal" DST="soroban.rom" @@ -12,8 +11,6 @@ CPY="$HOME/roms" ARG="" echo ">> Cleaning" -rm -rf bin -mkdir bin if [[ "$*" == *"--lint"* ]] then diff --git a/gui/wireworld/build.sh b/gui/wireworld/build.sh new file mode 100755 index 0000000..8df1c1c --- /dev/null +++ b/gui/wireworld/build.sh @@ -0,0 +1,32 @@ +#!/bin/sh -e + +ASM="uxncli $HOME/roms/drifblim.rom" +EMU="uxnemu" +LIN="uxncli $HOME/roms/uxnlin.rom" + +SRC="wireworld.tal" +DST="wireworld.rom" + +CPY="$HOME/roms" +ARG="" + +echo ">> Cleaning" + +if [[ "$*" == *"--lint"* ]] +then + echo ">> Linting $SRC" + $LIN $SRC +fi + +echo ">> Assembling $SRC" +$ASM $SRC $DST + +if [[ "$*" == *"--save"* ]] +then + echo ">> Saving $DST" + cp $DST $CPY +fi + +echo ">> Running $DST" +$EMU $DST $ARG + diff --git a/gui/wireworld/wireworld.tal b/gui/wireworld/wireworld.tal new file mode 100644 index 0000000..2fa2183 --- /dev/null +++ b/gui/wireworld/wireworld.tal @@ -0,0 +1,246 @@ +( uxnemu wireworld.rom ) + +( + Wireworld: + - electron head<3>, becomes electron tail<2> + - electron tail<2>, becomes conductor<1> + - conductor<1>, becomes electron head<3> + if there are exactly 1 or 2 electron heads around it. ) + +( devices ) + +|00 @System &vector $2 &wst $1 &rst $1 &pad $4 &r $2 &g $2 &b $2 &debug $1 &halt $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 &func $1 +|90 @Mouse &vector $2 &x $2 &y $2 &state $1 &pad $3 &modx $2 &mody $2 + +|0000 + + @color $1 + @pointer &x $2 &y $2 + @timer &frame $1 &play $1 + +|0100 ( -> ) + + ( theme ) + #07fe .System/r DEO2 + #07b6 .System/g DEO2 + #0fc6 .System/b DEO2 + ( size ) + #0100 .Screen/width DEO2 + #0100 .Screen/height DEO2 + ( vectors ) + ;on-frame .Screen/vector DEO2 + ;on-mouse .Mouse/vector DEO2 + ;on-button .Controller/vector DEO2 + ( setup ) + #00 .timer/play STZ + #01 .color STZ + ( start ) + ;world ;get-addr/current STA2 + #1000 ;run/future STA2 + redraw + +BRK + +@on-frame ( -> ) + + .timer/play LDZ [ JMP BRK ] + ( every 4th ) + .timer/frame LDZk + #03 AND ?&no-run + run + &no-run + LDZk INC SWP STZ + +BRK + +@on-mouse ( -> ) + + ;pointer-icn .Screen/addr DEO2 + ( clear last cursor ) + .pointer/x LDZ2 .Screen/x DEO2 + .pointer/y LDZ2 .Screen/y DEO2 + #40 .Screen/sprite DEO + ( draw new cursor ) + .Mouse/x DEI2 DUP2 .pointer/x STZ2 .Screen/x DEO2 + .Mouse/y DEI2 DUP2 .pointer/y STZ2 .Screen/y DEO2 + #40 .color LDZ ADD .Screen/sprite DEO + ( paint ) + .Mouse/state DEI ?on-mouse-down + +BRK + +@on-mouse-down ( -> ) + + .Mouse/x DEI2 #03 SFT2 NIP + .Mouse/y DEI2 #03 SFT2 NIP + #0202 NEQ2k NIP2 ?&no-color1 + #01 .color STZ + #00 .Mouse/state DEO + POP2 BRK + &no-color1 + #0302 NEQ2k NIP2 ?&no-color2 + #02 .color STZ + #00 .Mouse/state DEO + POP2 BRK + &no-color2 + #0402 NEQ2k NIP2 ?&no-color3 + #03 .color STZ + #00 .Mouse/state DEO + POP2 BRK + &no-color3 + #0602 NEQ2k NIP2 ?&no-toggle + .timer/play LDZk #00 EQU SWP STZ + #00 .Mouse/state DEO + draw-ui + POP2 BRK + &no-toggle + POP2 + + ( color ) .color LDZ .Mouse/state DEI #01 GTH #00 EQU MUL + ( cell* ) .Mouse/x DEI2 #02 SFT2 NIP .Mouse/y DEI2 #02 SFT2 NIP + get-addr STA + redraw + +BRK + +@on-button ( -> ) + + .Controller/button DEI + [ #01 ] NEQk NIP ?&no-a #01 .color STZ &no-a + [ #02 ] NEQk NIP ?&no-b #02 .color STZ &no-b + [ #04 ] NEQk NIP ?&no-select #03 .color STZ &no-select + [ #08 ] NEQk NIP ?&no-start ;world #2000 mclr redraw &no-start + POP + ( space ) + .Controller/key DEI #20 NEQ ?&no-space .timer/play LDZk #00 EQU SWP STZ &no-space + +BRK + +( +@|core ) + +@run ( -- ) + + #40 #00 + &ver + STHk + #40 #00 + &hor + ( x,y ) DUP STHkr + ( cell ) DUP2 get-addr STH2k LDA + ( transform ) transform STH2r [ LIT2 &future $2 ] ADD2 STA + INC GTHk ?&hor + POP2 + POPr + INC GTHk ?&ver + POP2 + ( Swap worlds ) + ;get-addr/current LDA2k ;run/future LDA2 STH2k ADD2 SWP2 STA2 + #0000 STH2r SUB2 ;run/future STA2 + redraw + +JMP2r + +@get-addr ( x y -- addr* ) + + #00 SWP #60 SFT2 ROT #00 SWP ADD2 [ LIT2 ¤t $2 ] ADD2 + +JMP2r + +@transform ( xy cell -- cell ) + + DUP ?&no-null NIP NIP JMP2r &no-null + DUP #03 NEQ ?&no-head POP POP2 #02 JMP2r &no-head + DUP #02 NEQ ?&no-tail POP POP2 #01 JMP2r &no-tail + DUP #01 NEQ ?&no-cond POP + LITr 00 + DUP2 #01 SUB get-addr + ( tl ) #0001 SUB2 LDAk #03 NEQ JMP INCr + ( tc ) INC2 LDAk #03 NEQ JMP INCr + ( tr ) INC2 LDA #03 NEQ JMP INCr + DUP2 get-addr + ( ml ) #0001 SUB2 LDAk #03 NEQ JMP INCr + ( mr ) INC2 INC2 LDA #03 NEQ JMP INCr + INC get-addr + ( bl ) #0001 SUB2 LDAk #03 NEQ JMP INCr + ( bc ) INC2 LDAk #03 NEQ JMP INCr + ( br ) INC2 LDA #03 NEQ JMP INCr + STHkr #02 EQU STHr #01 EQU ORA + DUP ADD INC JMP2r + &no-cond + ( unknown ) + NIP NIP + +JMP2r + +( +@|drawing ) + +@redraw ( -- ) + + ;cell-icn .Screen/addr DEO2 + #4000 + &ver + #00 OVR #20 SFT2 .Screen/y DEO2 + STHk + #4000 + &hor + #00 OVR #20 SFT2 .Screen/x DEO2 + DUP STHkr get-addr LDA .Screen/sprite DEO + INC GTHk ?&hor + POP2 + POPr + INC GTHk ?&ver + POP2 + +( >> ) + +@draw-ui ( -- ) + + ( colors ) + #01 .Screen/auto DEO + #0010 DUP2 .Screen/x DEO2 .Screen/y DEO2 + ;color-icn .Screen/addr DEO2 + #01 .Screen/sprite DEO + #02 .Screen/sprite DEO + #03 .Screen/sprite DEO + ( toggle ) + #0030 .Screen/x DEO2 + ;toggle-icn #00 .timer/play LDZ #30 SFT2 ADD2 .Screen/addr DEO2 + #01 .Screen/sprite DEO + +JMP2r + +@mclr ( addr* len* -- ) + + OVR2 ADD2 SWP2 + &loop + STH2k #00 STH2r STA + INC2 GTH2k ?&loop + POP2 POP2 + +JMP2r + +( +@|assets ) + +@pointer-icn [ + 80c0 e0f0 f8e0 1000 ] +@cell-icn [ + e0e0 e000 0000 0000 ] +@color-icn [ + 7cfe fefe fefe 7c00 ] +@toggle-icn [ + ( pause ) 6666 6666 6666 6600 + ( play ) 4666 767e 7666 4600 ] + +( + I live in the atom with the happy protons and neutrons. + I'm also so negative all the freakin time. + What do I do? + How do I find peace? ) + +@world +