uxn/projects/examples/demos/life.tal

222 lines
5.2 KiB
Tal
Raw Normal View History

2024-03-02 22:57:59 -05:00
( uxnemu life.rom )
( Any live cell with fewer than two live neighbours dies, as if by underpopulation. )
( Any live cell with two or three live neighbours lives on to the next generation. )
( Any live cell with more than three live neighbours dies, as if by overpopulation. )
( Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction. )
2021-05-05 21:38:28 -04:00
|00 @System &vector $2 &expansion $2 &wst $1 &rst $1 &metadata $2 &r $2 &g $2 &b $2 &debug $1 &state $1
2022-03-26 00:36:33 -04:00
|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
|80 @Controller &vector $2 &button $1 &key $1
|90 @Mouse &vector $2 &x $2 &y $2 &state $1 &wheel $1
2024-03-02 22:57:59 -05:00
|000
2021-05-05 21:38:28 -04:00
2024-03-02 22:57:59 -05:00
@world &count $2
@anchor &x $2 &y $2 &x2 $2 &y2 $2
2021-05-05 21:38:28 -04:00
2024-03-02 22:57:59 -05:00
|100
2021-05-05 21:38:28 -04:00
2024-03-02 22:57:59 -05:00
@on-reset ( -> )
( | theme )
2022-02-08 23:04:18 -05:00
#02cf .System/r DEO2
#02ff .System/g DEO2
2021-08-07 23:03:13 -04:00
#024f .System/b DEO2
2024-03-02 22:57:59 -05:00
( | resize )
#00c0 DUP2 .Screen/width DEO2
.Screen/height DEO2
( | vectors )
2022-03-26 00:36:33 -04:00
;on-frame .Screen/vector DEO2
;on-mouse .Mouse/vector DEO2
2021-05-06 13:38:38 -04:00
;on-control .Controller/vector DEO2
2024-03-02 22:57:59 -05:00
( | glider )
#0703 <set-cell>
#0704 <set-cell>
#0504 <set-cell>
#0705 <set-cell>
#0605 <set-cell>
( | center )
.Screen/width DEI2 #01 SFT2 #0040 SUB2 DUP2 .anchor/x STZ2
#007e ADD2 .anchor/x2 STZ2
.Screen/height DEI2 #01 SFT2 #0040 SUB2 DUP2 .anchor/y STZ2
#007e ADD2 .anchor/y2 STZ2
BRK
2021-05-05 21:38:28 -04:00
@on-frame ( -> )
2024-03-02 23:12:47 -05:00
[ LIT2 00 -Mouse/state ] DEI EQU ?{ BRK }
2022-03-26 00:36:33 -04:00
#0000 .world/count STZ2
2024-03-02 22:57:59 -05:00
[ LIT &f $1 ] INCk ,&f STR
( ) #03 AND #00 EQU ?{ BRK }
<run>
2024-03-02 23:44:47 -05:00
BRK
2021-05-05 23:16:27 -04:00
@on-mouse ( -> )
2024-03-02 22:57:59 -05:00
[ LIT2 00 -Mouse/state ] DEI NEQ #42 ADD ;cursor-icn <update-cursor>
( | on touch in rect )
.Mouse/state DEI ?{ BRK }
.Mouse/x DEI2 .Mouse/y DEI2 .anchor within-rect ?{ BRK }
( | paint )
2022-03-26 00:36:33 -04:00
.Mouse/x DEI2 .anchor/x LDZ2 SUB2 #01 SFT NIP
2024-03-02 22:57:59 -05:00
( ) .Mouse/y DEI2 .anchor/y LDZ2 SUB2 #01 SFT NIP <set-cell>
2024-03-02 23:44:47 -05:00
<redraw>
2024-03-02 22:57:59 -05:00
BRK
2021-05-05 23:16:27 -04:00
2021-05-06 13:38:38 -04:00
@on-control ( -> )
.Controller/key DEI
( ) DUP #20 NEQ ?{
#0000 ;on-frame .Screen/vector DEI2 ORA ?{ SWP2 }
POP2 .Screen/vector DEO2 }
2024-03-02 23:44:47 -05:00
( ) #1b NEQ ?{ ;MMU/clear1 .System/expansion DEO2 }
2024-03-02 22:57:59 -05:00
BRK
(
@|core )
@<run> ( -- )
2024-03-02 23:44:47 -05:00
;MMU/clear2 .System/expansion DEO2
2022-03-26 00:36:33 -04:00
#4000
2024-03-02 22:57:59 -05:00
&ver ( -- )
2024-03-02 23:44:47 -05:00
DUP ,&y STR
#4000
2024-03-02 22:57:59 -05:00
&hor ( -- )
2024-03-02 23:44:47 -05:00
DUP [ LIT &y $1 ] <run-cell>
2024-03-02 22:57:59 -05:00
INC GTHk ?&hor
2024-03-02 23:44:47 -05:00
POP2 INC GTHk ?&ver
2024-03-03 00:05:33 -05:00
POP2
( move ) ;MMU/move21 .System/expansion DEO2
2024-03-02 23:44:47 -05:00
!<redraw>
2021-05-05 21:38:28 -04:00
2024-03-02 22:57:59 -05:00
@<run-cell> ( x y -- )
2024-03-02 23:44:47 -05:00
( x y ) DUP2 STH2k
( neighbours ) get-neighbours
2024-03-02 23:44:47 -05:00
( state ) STH2r get-index LDA #00 EQU ?&dead
2024-03-02 22:57:59 -05:00
DUP #02 LTH ?&dies
DUP #03 GTH ?&dies
POP !&save
&dies POP POP2 JMP2r
&dead ( -- )
DUP #03 EQU ?&birth
POP POP2 JMP2r
&birth POP !&save
&save ( x y -- )
2024-03-02 22:57:59 -05:00
STH2
#01 STH2r get-index #1000 ADD2 STA
2022-03-26 00:36:33 -04:00
.world/count LDZ2 INC2 .world/count STZ2
2024-03-02 22:57:59 -05:00
JMP2r
2022-03-26 00:36:33 -04:00
@get-index ( x y -- index* )
2024-03-02 23:57:25 -05:00
( y ) #3f AND #00 SWP #60 SFT2 ROT
( x ) #3f AND #00 SWP ADD2 ;bank1 ADD2 JMP2r
2024-03-02 22:57:59 -05:00
@<set-cell> ( x y -- )
2024-03-02 23:57:25 -05:00
get-index STH2
#01 STH2r STA
2024-03-02 22:57:59 -05:00
JMP2r
2021-11-26 17:29:20 -05:00
2021-05-05 21:38:28 -04:00
@get-neighbours ( x y -- neighbours )
2024-03-02 23:44:47 -05:00
,&y STR
,&x STR
[ LITr 00 ] #0800
&l ( -- )
#00 OVRk ADD2 ;&mask ADD2 LDA2
( ) [ LIT &y $1 ] ADD SWP
( ) [ LIT &x $1 ] ADD SWP get-index LDA [ STH ADDr ]
2024-03-03 00:05:33 -05:00
( stop at 3 ) DUPr [ LITr 03 ] GTHr [ LITr _&end ] JCNr
2024-03-02 23:44:47 -05:00
( ) INC GTHk ?&l
2024-03-03 00:05:33 -05:00
&end POP2 STHr JMP2r
2024-03-02 22:57:59 -05:00
&mask [
ffff 00ff 01ff ff00 0100 ff01 0001 0101 ]
2024-03-02 23:44:47 -05:00
@within-rect ( x* y* rect -- flag )
STH
( y < rect.y1 ) DUP2 STHkr INC INC LDZ2 LTH2 ?&skip
( y > rect.y2 ) DUP2 STHkr #06 ADD LDZ2 GTH2 ?&skip
SWP2
( x < rect.x1 ) DUP2 STHkr LDZ2 LTH2 ?&skip
( x > rect.x2 ) DUP2 STHkr #04 ADD LDZ2 GTH2 ?&skip
POP2 POP2 POPr #01 JMP2r
&skip POP2 POP2 POPr #00 JMP2r
2024-03-02 22:57:59 -05:00
(
@|drawing )
2024-03-02 23:44:47 -05:00
@<redraw> ( -- )
2024-03-02 23:57:25 -05:00
( | draw count )
2024-03-02 23:44:47 -05:00
.anchor/x LDZ2 .Screen/x DEO2
2022-03-26 00:36:33 -04:00
.anchor/y2 LDZ2 #0008 ADD2 .Screen/y DEO2
2024-03-02 23:12:47 -05:00
[ LIT2 01 -Screen/auto ] DEO
2024-03-02 22:57:59 -05:00
.world/count LDZ2 <draw-short>
2024-03-02 23:44:47 -05:00
( | draw grid )
[ LIT2 01 -Screen/auto ] DEO
2024-03-02 23:57:25 -05:00
.anchor/y LDZ2 .Screen/y DEO2
;bank2 ;bank1
&l ( -- )
DUP #3f AND ?{
.Screen/y DEI2k INC2 INC2 ROT DEO2
.anchor/x LDZ2 .Screen/x DEO2 }
LDAk INC .Screen/pixel DEO
2024-03-02 23:44:47 -05:00
[ LIT2 00 -Screen/pixel ] DEO
2024-03-02 23:57:25 -05:00
INC2 GTH2k ?&l
POP2 POP2 JMP2r
2024-03-02 22:57:59 -05:00
@<draw-short> ( short* -- )
SWP <draw-byte>
( >> )
2024-03-02 22:57:59 -05:00
@<draw-byte> ( byte color -- )
DUP #04 SFT <draw-hex>
#0f AND
( >> )
2024-03-02 22:57:59 -05:00
@<draw-hex> ( char color -- )
2022-03-26 00:36:33 -04:00
#00 SWP #30 SFT2 ;font-hex ADD2 .Screen/addr DEO2
[ LIT2 03 -Screen/sprite ] DEO
2024-03-02 22:57:59 -05:00
JMP2r
2021-05-06 13:38:38 -04:00
2024-03-02 22:57:59 -05:00
@<update-cursor> ( color addr* -- )
[ LIT2 00 -Screen/auto ] DEO
;fill-icn .Screen/addr DEO2
#40 <draw-cursor>
.Mouse/x DEI2 ,<draw-cursor>/x STR2
.Mouse/y DEI2 ,<draw-cursor>/y STR2
.Screen/addr DEO2
( >> )
2024-03-02 22:57:59 -05:00
@<draw-cursor> ( color -- )
[ LIT2 &x $2 ] .Screen/x DEO2
[ LIT2 &y $2 ] .Screen/y DEO2
.Screen/sprite DEO
JMP2r
2022-03-26 00:36:33 -04:00
2024-03-02 22:57:59 -05:00
(
@|assets )
2022-02-08 23:04:18 -05:00
2024-03-02 23:44:47 -05:00
@MMU ( programs )
&clear1 [ 01 1000 0000 =bank3 0000 =bank1 ]
&clear2 [ 01 1000 0000 =bank3 0000 =bank2 ]
&move21 [ 01 1000 0000 =bank2 0000 =bank1 ]
2024-03-02 22:57:59 -05:00
@cursor-icn [ 80c0 e0f0 f8e0 1000 ]
@fill-icn [ ffff ffff ffff ffff ]
2021-05-12 21:28:45 -04:00
@font-hex [
2024-03-02 22:57:59 -05:00
7c82 8282 8282 7c00 3010 1010 1010 3800
7c82 027c 8080 fe00 7c82 021c 0282 7c00
2242 82fe 0202 0200 fe80 807c 0282 7c00
7c82 80fc 8282 7c00 fe82 0408 0810 1000
7c82 827c 8282 7c00 7c82 827e 0202 0200
7c82 82fe 8282 8200 fc82 82fc 8282 fc00
7c82 8080 8082 7c00 fc82 8282 8282 fc00
fe80 80f0 8080 fe00 fe80 80f0 8080 8000 ]
(
@|memory )
2024-03-02 23:57:25 -05:00
|8000 @bank1 $1000
2024-03-02 22:57:59 -05:00
@bank2 $1000
@bank3 $1000
2024-03-02 22:57:59 -05:00