kodiak/kodiak.tal

1042 lines
39 KiB
Tal
Raw Normal View History

2024-07-27 15:09:40 -04:00
( kodiak.tal )
( TODO )
2024-07-30 22:25:37 -04:00
( * make bear react to moving cards )
( * move cards back from foundation? )
2024-07-27 15:09:40 -04:00
( * music? )
2024-07-28 00:06:54 -04:00
( * save game file? stats? )
2024-07-28 00:40:03 -04:00
( * animations? flash stock when clicked? )
2024-07-28 00:06:54 -04:00
( * sometimes movement feels stutter-y )
2024-07-28 15:19:05 -04:00
( * automatically keeping @auto up-to-date is arguably better than recalculating )
2024-08-03 00:45:00 -04:00
( BUGS )
( * reshuffle affects the stack )
|00 @System [ &vect $2 &expansion $2 &title $2 &metadata $2 &r $2 &g $2 &b $2 ]
|10 @Console [ &vect $2 &r $1 &exec $2 &mode $1 &dead $1 &exit $1 &w $1 ]
|20 @Screen [ &vect $2 &w $2 &h $2 &auto $1 &pad $1 &x $2 &y $2 &addr $2 &px $1 &sprite $1 ]
2024-08-03 00:14:32 -04:00
|30 @Audio1 [ &vect $2 &pos $2 &out $1 &dur $2 &pad $1 &adsr $2 &len $2 &addr $2 &vol $1 &pitch $1 ]
|40 @Audio2 [ &vect $2 &pos $2 &out $1 &dur $2 &pad $1 &adsr $2 &len $2 &addr $2 &vol $1 &pitch $1 ]
|50 @Audio3 [ &vect $2 &pos $2 &out $1 &dur $2 &pad $1 &adsr $2 &len $2 &addr $2 &vol $1 &pitch $1 ]
|60 @Audio4 [ &vect $2 &pos $2 &out $1 &dur $2 &pad $1 &adsr $2 &len $2 &addr $2 &vol $1 &pitch $1 ]
|80 @Controller [ &vect $2 &button $1 &key $1 &fn $1 ]
|90 @Mouse [ &vect $2 &x $2 &y $2 &state $1 &pad $3 &scrollx $2 &scrolly $2 ]
|a0 @File1 [ &vect $2 &ok $2 &stat $2 &del $1 &append $1 &name $2 &len $2 &r $2 &w $2 ]
|b0 @File2 [ &vect $2 &ok $2 &stat $2 &del $1 &append $1 &name $2 &len $2 &r $2 &w $2 ]
|c0 @DateTime [ &y $2 &m $1 &d $1 &hr $1 &min $1 &sec $1 &dow $1 &doy $2 &isdst $1 ]
( 1 byte per card )
( #01 ace ... #0d king )
( #00 club #10 diamond #20 spade #30 heart )
( #00 face up, #40 face down )
( #00 normal #80 held )
( examples: )
( - #00 no card )
( - #01 ace of clubs )
( - #1a ten of diamonds )
( - #24 four of spades )
( - #3d king of hearts )
( - #6c queen of hearts, face down )
( - #93 three of diamonds, held )
( zero page - currently using 232 of 256 bytes )
|0000
2024-07-15 10:14:09 -04:00
@stock $34 ( draw pile - 52 bytes, 24 bytes at start )
@waste $18 ( face up pile - 24 bytes )
@foundation $4 ( one per suit - 4 bytes, 4x1 )
@tableau $85 ( the main board - 133 bytes, 7x19 )
2024-07-16 10:06:58 -04:00
@held $2 ( first and last card in held stack )
2024-07-15 10:14:09 -04:00
@dragging [ $1 ( are we dragging? )
&x $2 ( x-coord for start of drag )
&y $2 ] ( y-coord for start of drag )
@prev [ &button $1 ( previous button press )
&mouse-state $1 ( previous mouse state )
&mouse-x $2 ( previous x-coordinate )
&mouse-y $2 ] ( previous y-coordinate )
2024-07-28 15:19:05 -04:00
@auto $4 ( sorted foundation for auto-move: C D S H )
2024-07-30 22:25:37 -04:00
@frame $1 ( frame counter; cycles 0-255 continually )
2024-07-31 01:29:42 -04:00
@move [ &card $1 ( card to move )
2024-07-30 22:25:37 -04:00
&dst $1 ( card destination address after move )
2024-07-31 01:29:42 -04:00
&time $2 ( time spent moving, 0-15 frames; )
&max-time $2 ( max time for this move, 16 frames )
2024-07-30 22:25:37 -04:00
&x0 $2 ( starting x coord )
&y0 $2 ( starting y coord )
&x1 $2 ( ending x coord )
&y1 $2 ] ( ending y coord )
2024-07-31 23:13:27 -04:00
@audio [ $1 ( is audio enabled? )
&pos $2 ] ( position in music )
|0100
2024-07-16 20:49:19 -04:00
2024-07-16 21:12:56 -04:00
( colors: gold, white, red, black )
2024-07-16 20:49:19 -04:00
#bd82 .System/r DEO2
#8d12 .System/g DEO2
#4d12 .System/b DEO2
2024-07-16 21:12:56 -04:00
( 256x192 )
#0100 .Screen/w DEO2
#00c0 .Screen/h DEO2
2024-07-31 23:13:27 -04:00
( set up vectors )
;on-mouse .Mouse/vect DEO2
;on-key .Controller/vect DEO2
;on-refresh .Screen/vect DEO2
( set up music )
2024-08-03 00:14:32 -04:00
;on-audio .Audio1/vect DEO2
#0000 .audio/pos STZ2
( adsr dur sample slen vol device )
2024-08-03 00:54:05 -04:00
#0231 #00b0 ;square #0008 #66 .Audio1 setup-audio
2024-08-03 00:14:32 -04:00
#0231 #00b0 ;saw #0010 #34 .Audio2 setup-audio
2024-08-03 00:54:05 -04:00
#0231 #0580 ;triangle #0004 #64 .Audio3 setup-audio
2024-08-03 00:14:32 -04:00
#011f #00b0 ;noise #0200 #44 .Audio4 setup-audio
2024-07-31 23:13:27 -04:00
2024-08-03 00:45:44 -04:00
start-audio
2024-07-28 00:47:43 -04:00
reset BRK
2024-08-03 00:14:32 -04:00
@setup-audio ( adsr* sample* slen* dur* vol^ dev^ -> )
STHk #0e ORA DEO ( [dev^] ; <-vol )
STHkr #0a ORA DEO2 ( [dev^] ; <-slen )
STHkr #0c ORA DEO2 ( [dev^] ; <-sample )
STHkr #05 ORA DEO2 ( [dev^] ; <-duration )
STHr #08 ORA DEO2 ( ; <-adsr )
JMP2r
2024-07-28 00:47:43 -04:00
@reset
init-rng-from-datetime
2024-07-14 00:26:36 -04:00
init-stock
.waste #18 initialize
.foundation #04 initialize
.tableau #85 initialize
2024-07-28 00:47:43 -04:00
.held #02 initialize
2024-07-15 10:14:09 -04:00
.dragging #05 initialize
.prev #06 initialize
2024-07-30 22:25:37 -04:00
.auto #04 initialize
.frame #01 initialize
2024-07-31 01:29:42 -04:00
.move #0e initialize
2024-07-14 00:26:36 -04:00
shuffle-stock
deal-tableau
2024-07-31 01:29:42 -04:00
( TODO: clear foreground )
2024-07-15 23:11:42 -04:00
draw
2024-07-31 01:29:42 -04:00
auto-move
2024-07-28 00:47:43 -04:00
JMP2r
2024-07-31 21:21:06 -04:00
@quit ( -> brk )
#010f DEO BRK ( TODO: save game? save stats? )
@dump-byte ( byte^ -- )
DUP #04 SFT ,&hex JSR #0f AND ,&hex JMP
&hex #30 ADD DUP #39 GTH #27 MUL ADD .Console/w DEO
JMP2r
@dump-mem ( start^ size^ -> )
OVR ADD SWP ( lim^ start^ )
LDZk dump-byte INC ( lim^ start+1^ )
&loop GTHk ?&ok POP2 #0a .Console/w DEO JMP2r ( lim^ pos^ )
&ok #20 .Console/w DEO LDZk dump-byte INC !&loop ( lim^ pos+1^ )
@dump-state ( -> )
,&count LDR2 INC2 ,&count STR2
LIT "d .Console/w DEO
LIT "u .Console/w DEO
LIT "m .Console/w DEO
LIT "p .Console/w DEO
#20 .Console/w DEO
LIT2 [ &count $2 ]
SWP dump-byte dump-byte
#0a .Console/w DEO
.stock #18 dump-mem
.stock #18 ADD #1c dump-mem
#0a .Console/w DEO
.waste #18 dump-mem
#0a .Console/w DEO
.foundation #04 dump-mem
#0a .Console/w DEO
.tableau
DUP #13 dump-mem #13 ADD
DUP #13 dump-mem #13 ADD
DUP #13 dump-mem #13 ADD
DUP #13 dump-mem #13 ADD
DUP #13 dump-mem #13 ADD
DUP #13 dump-mem #13 ADD
#13 dump-mem
#0a .Console/w DEO
.held #02 dump-mem
.dragging #05 dump-mem
.prev #06 dump-mem
2024-07-28 15:19:05 -04:00
.auto #04 dump-mem
2024-07-31 01:29:42 -04:00
.move #0e dump-mem
2024-07-30 22:25:37 -04:00
LIT "- .Console/w DEOk DEOk DEOk DEOk DEO
2024-07-30 22:25:37 -04:00
#0a .Console/w DEO JMP2r
2024-07-15 23:11:42 -04:00
@draw ( -> )
2024-07-16 20:49:19 -04:00
draw-background
2024-07-31 21:21:06 -04:00
draw-buttons
2024-07-28 22:37:52 -04:00
draw-decorations
2024-07-16 20:49:19 -04:00
draw-stock
draw-waste
draw-foundation
draw-tableau
2024-08-03 00:45:00 -04:00
draw-curr-mouse
JMP2r
2024-07-14 00:26:36 -04:00
@initialize ( start^ count^ -> )
OVR ADD SWP STH2 #00 ( 0^ [lim=start+count^ start^] )
&loop DUP STHkr STZ INCr GTHkr STHr ?&loop ( 0^ [lim^ pos^] )
POP POP2r JMP2r ( )
@init-stock ( -> )
LITr -stock #8000 #4e41
&outer DUP2
&inner DUP STHkr STZ INC INCr GTHk ?&inner
POP2 #1010 ADD2 GTH2k ?&outer
POP2 POP2 POPr JMP2r
@shuffle-stock ( -> )
.stock #33 OVR ADD SWP ( last^ start^ )
&loop ( last^ pos^ )
SUBk INC #00 SWP ( last^ pos^ n=last-pos+1* )
random SWP2 ( last^ pos^ r* n* )
DIV2k MUL2 SUB2 NIP ( last^ pos^ i=r%n^ )
OVR ADD LDZk ,&c STR ( last^ pos^ alt=pos+i^ ; c<-alt )
STH LDZk STHr STZ STH ( last^ [pos^] ; alt<-pos )
LIT [ &c $1 ] STHkr STZ ( last^ [pos^] ; pos<-c )
STHr INC GTHk ?&loop ( last^ pos+1^ )
POP2 JMP2r ( )
@deal-tableau ( -> )
2024-07-27 17:41:45 -04:00
top-stock LIT2r -tableau 00 ( top^ [tab^ 0^] )
&loop STH2kr deal-column ( top2^ [tab^ c^] )
LIT2r 1301 ADD2r ( top2^ [tab+19^ c+1^] )
STHkr #07 LTH ?&loop ( top2^ [tab+19^ c+1^] )
POP2r POP JMP2r ( )
@deal-column ( src^ dst^ count^ -> src2^ )
#00 SWP SUB STH SWP ( dst^ src^ [-count^] )
&loop STHkr ?&ok !&done ( d^ s^ [-c^] )
&ok DUP2 LDZ SWP STZ ( d^ s^ [-c^] ; d<-s|64 )
#00 OVR STZ ( d^ s^ [-c^] ; s<-0 )
#01 SUB SWP INC SWP ( d+1^ s-1^ [-c^] )
INCr !&loop ( d+1^ s-1^ [-c+1^] )
2024-07-28 00:05:06 -04:00
&done POPr SWP ( s^ d^ )
OVR LDZ #bf AND SWP STZ ( s^ ; d<-s )
#00 OVR STZ ( s^ ; s<-0 )
#01 SUB JMP2r ( s-1^ )
2024-07-28 22:37:52 -04:00
@draw-bear-head ( x* y* head* -> )
.Screen/addr DEO2 ( x* y* ; s/addr<-head )
.Screen/y DEO2 ( y* x* ; s/y<- )
.Screen/x DEO2 ( y* x* ; s/x<- )
#16 .Screen/auto DEO ( y* x* ; s/auto<-0x16 )
#80 .Screen/sprite DEOk DEO JMP2r ( y* x* ; draw 2x2 tiles )
@draw-bear ( x* y* head* -> )
STH2 OVR2 OVR2 STH2r draw-bear-head ( x* y* )
;sprites #0140 ADD2 .Screen/addr DEO2 ( x* y* ; s/addr<-body )
#0010 ADD2 .Screen/y DEO2 ( x* ; s/y<-y+16 )
#0008 SUB2 .Screen/x DEO2 ( ; s/x<-x-8 )
#36 .Screen/auto DEO ( ; s/auto<-0x36 )
#80 .Screen/sprite DEOk DEOk DEO JMP2r ( ; draw 4x3 tiles )
2024-07-31 21:21:06 -04:00
@draw-button ( x* y* addr* -> )
.Screen/addr DEO2
.Screen/y DEO2
.Screen/x DEO2
#36 .Screen/auto DEO
#8a .Screen/sprite DEO JMP2r
2024-07-31 23:13:27 -04:00
@restart-button-addr ( -> addr* )
game-won ?&won ;restart-button JMP2r
&won ;new-game-button JMP2r
2024-07-31 21:21:06 -04:00
@audio-button-addr ( -> addr* )
.audio LDZ ?&on ;audio-off-button JMP2r
&on ;audio-on-button JMP2r
@draw-buttons ( -> )
2024-07-31 23:13:27 -04:00
#0008 #00b4 restart-button-addr draw-button
2024-07-31 21:21:06 -04:00
#0030 #00b4 ;quit-button draw-button
#0058 #00b4 audio-button-addr draw-button
#0080 #00b4 ;about-button draw-button
JMP2r
2024-07-28 22:37:52 -04:00
@draw-decorations ( -> )
#00e8 #0098 ;sprites !draw-bear
@draw-stock ( -> )
.stock LDZk #00 EQU ?&empty ( stock^ )
#0008 ,&y STR2 ( ; y0<-8 )
#34 OVR ADD SWP LITr 01 ( stock+52 stock^ [n^] )
&loop LDZk DUP ?&ok !&done ( lim^ zp^ c^ [n^] )
&ok ( lim^ zp^ c^ [n^] )
#0008 .Screen/x DEO2 ( lim^ zp^ c^ [n^] ; x<-8 )
LIT2 [ &y $2 ] .Screen/y DEO2 ( lim^ zp^ c^ [n^] ; y<- )
draw-c STHkr ?&skip ( lim^ zp^ [n^] ; draw c )
,&y LDR2 #0001 SUB2 ,&y STR2 ( lim^ zp^ [n^] ; y<-y-1 )
&skip INC INCr LITr 07 ANDr GTHk ?&loop ( lim^ zp+1^ [(n+1)%8] )
2024-07-13 23:07:54 -04:00
&done POP POP2 POPr JMP2r ( )
&empty POP #0008 DUP2 ( 8* 8* )
.Screen/x DEO2 .Screen/y DEO2 ( ; x<-8, y<-8 )
2024-07-30 22:25:37 -04:00
#00 !maybe-draw-c ( )
@draw-waste ( -> )
#001c ,&x STR2 ( ; x0<-28 )
.waste #18 OVR ADD SWP ( waste+24^ waste^ )
&loop LDZk DUP ?&ok !&done ( lim^ zp^ c^ )
&ok ( lim^ zp^ c^ )
#0008 .Screen/y DEO2 ( lim^ zp^ c^ ; y<-8 )
LIT2 [ &x $2 ] .Screen/x DEO2 ( lim^ zp^ c^ ; x<- )
2024-07-16 22:03:21 -04:00
DUP #80 AND ?&done ( lim^ zp^ c^ )
draw-c ( lim^ zp^ ; draw c )
,&x LDR2 #0008 ADD2 ,&x STR2 ( lim^ zp^ ; x<-x+8 )
2024-08-03 00:45:00 -04:00
INC GTHk ?&loop POP2 JMP2r ( lim^ zp+1^ )
2024-07-13 23:07:54 -04:00
&done POP POP2 JMP2r ( )
@draw-foundation ( -> )
#0030 ,&y STR2 ( ; y0<-48 )
.foundation #04 OVR ADD SWP ( lim^ zp^ )
&loop ( lim^ zp^ )
#0008 .Screen/x DEO2 ( lim^ zp^ ; x<-8 )
LIT2 [ &y $2 ] .Screen/y DEO2 ( lim^ zp^ ; y<- )
LDZk maybe-draw-c ( lim^ zp^ ; draw )
,&y LDR2 #0020 ADD2 ,&y STR2 ( lim^ zp^ ; y<-y+32 )
INC GTHk ?&loop ( lim^ zp+1^ )
POP2 JMP2r ( )
@draw-tableau
2024-07-13 23:07:54 -04:00
#0700 &loop DUP draw-column INC GTHk ?&loop POP2 JMP2r
2024-07-30 23:24:57 -04:00
@column-x ( col^ -> x* )
2024-07-15 22:54:16 -04:00
#00 SWP #0018 MUL2 #0030 ADD2 JMP2r
2024-07-27 21:05:14 -04:00
@column-y ( col^ -> y* )
bot-column DUP #13 find-top SWP SUB
#00 SWP #0008 MUL2 #0024 ADD2 JMP2r
@draw-column ( idx^ -> )
2024-07-15 22:54:16 -04:00
DUP column-x ,&x STR2 ( idx^ ; x<-32+24*idx )
#0024 ,&y STR2 ( idx^ ; y<-32 )
2024-07-27 21:05:14 -04:00
bot-column DUP #13 ADD SWP ( lim=pos+19^ pos^ )
&loop ( lim^ pos^ )
LDZk DUP ?&ok !&done ( lim^ pos^ c^ )
2024-07-16 21:12:56 -04:00
&ok LIT2 [ &x $2 ] .Screen/x DEO2 ( lim^ pos^ c^ ; s/x<-x )
LIT2 [ &y $2 ] .Screen/y DEO2 ( lim^ pos^ c^ ; s/y<-y )
DUP #80 AND ?&done ( lim^ pos^ c^ )
draw-c INC ( lim^ pos+1^ )
,&y LDR2 #0008 ADD2 ,&y STR2 ( lim^ pos+1^ )
GTHk ?&loop ( lim^ pos+1^ )
&done POP POP2 JMP2r ( )
2024-08-03 00:45:00 -04:00
@maybe-draw-c ( card^ -> )
2024-07-16 10:06:58 -04:00
DUP ?{ POP !draw-spot-down } !draw-c
( assumes x/y already set )
@draw-c ( card^ -> )
DUP #40 LTH ?&norm
DUP #80 LTH ?&down
DUP #c0 LTH ?&held
POP !draw-mask-down
&norm adjust-c !draw-face-up
&down POP !draw-face-down
2024-07-13 23:07:54 -04:00
&held #3f AND adjust-c !draw-mask-up
( we map from our sparse, logical card format )
( to the dense, tile position card location )
( clubs: #01 -> #27 ... #0d -> #33 )
( diamonds: #11 -> #1a ... #1d -> #26 )
( spades: #21 -> #00 ... #2d -> #0c )
( hearts: #31 -> #0d ... #3d -> #19 )
@adjust-c ( card^ -> idx* )
#00 SWP
DUP #21 LTH ?&lt
DUP #31 LTH #03 MUL ADD #24 SUB JMP2r
&lt DUP #11 LTH #1d MUL ADD #09 ADD JMP2r
2024-07-30 23:24:57 -04:00
@stock-pos ( card^ -> x* y* )
#00 SWP #0008 SWP2 .stock SUB ( x=8* i* )
#03 SFT2 #fff8 SUB2 JMP2r ( x*, y=8-i/8* )
@waste-pos ( card^ -> x* y* )
#00 SWP .waste SUB #30 SFT2 ( 8i* )
#001c ADD2 #0008 JMP2r ( x=28+8i* y=8* )
@foundation-pos ( card^ -> x* y* )
2024-07-31 01:29:42 -04:00
.foundation SUB #00 SWP #0008 SWP2 ( x=8* i* )
#50 SFT2 #0030 ADD2 JMP2r ( x*, y=48+32i* )
2024-07-30 23:24:57 -04:00
@tableau-pos ( card^ -> x* y* )
2024-07-31 01:29:42 -04:00
.tableau SUB STHk #13 DIV STHk column-x ( x* [card^ col^] )
#00 STH2r #13 MUL SUB #30 SFT2 ( x* 8pos* )
#0024 ADD2 JMP2r ( x* y=36+8pos* )
2024-07-30 23:24:57 -04:00
2024-07-30 22:25:37 -04:00
@card-pos-xy ( card^ -> x* y* )
2024-07-31 01:29:42 -04:00
.stock
2024-07-30 23:24:57 -04:00
#33 ADD GTHk ?{ POP !stock-pos }
#18 ADD GTHk ?{ POP !waste-pos }
#04 ADD GTHk ?{ POP !foundation-pos }
#85 ADD GTHk ?{ POP !tableau-pos }
POP2 #010e DEO #0000 #0000 JMP2r ( ; error, x=0, y=0 )
2024-07-30 22:25:37 -04:00
2024-07-31 01:29:42 -04:00
( divides n by d with rounding )
@sdiv ( n* d* -> n/d* )
STH2 DUP2 #8000 LTH2 ?&non-neg
#ffff MUL2 STH2kr #01 SFT2 ADD2 STH2r DIV2 #ffff MUL2 JMP2r
&non-neg STH2kr #01 SFT2 ADD2 STH2r DIV2 JMP2r
@scale ( n1* n0* -> [t*dn]/m+n0* )
STH2k SUB2 .move/time LDZ2 MUL2 ( dn*t* [n0*] )
.move/max-time LDZ2 sdiv STH2r ADD2 JMP2r ( [dn*t]/m+n0* )
2024-07-30 22:25:37 -04:00
@move-pos-xy ( -> x* y* )
2024-07-31 01:29:42 -04:00
.move/x1 LDZ2 .move/x0 LDZ2 scale
.move/y1 LDZ2 .move/y0 LDZ2 !scale
2024-07-30 22:25:37 -04:00
2024-07-31 01:29:42 -04:00
@max ( x* y* -> max* )
GTH2k JMP SWP2 POP2 JMP2r
2024-07-30 22:25:37 -04:00
2024-07-31 01:29:42 -04:00
@dist ( a* b* -> |a-b|* )
GTH2k JMP SWP2 SUB2 JMP2r
@move-duration ( -> duration* )
.move/x1 LDZ2 .move/x0 LDZ2 dist ( dx* )
.move/y1 LDZ2 .move/y0 LDZ2 dist ( dx* dy* )
max #03 SFT2 JMP2r ( max[dx,dy]/8* )
@start-move ( src^ dst^ -> )
DUP card-pos-xy ( src^ dst^ x1* y1* )
.move/y1 STZ2 .move/x1 STZ2 ( src^ dst^ )
.move/dst STZ ( src^ ; write dst )
DUP card-pos-xy ( src^ x0* y* )
.move/y0 STZ2 .move/x0 STZ2 ( src^ )
LDZk .move/card STZ ( src^ ; write card )
#0000 .move/time STZ2 ( )
move-duration .move/max-time STZ2 ( )
!remove-card ( )
( from column 0: )
( 00 90 00 44 00 08 00 20 )
2024-07-30 22:25:37 -04:00
@update-move ( -> )
move-pos-xy ( x* y* )
.Screen/y DEO2 .Screen/x DEO2 ( ; set x,y )
;blank .Screen/addr DEO2 ( ; use blank tile )
#12 .Screen/auto DEO ( ; draw 2, inc x )
#41 .Screen/sprite DEOk DEOk DEO ( ; erase three rows )
2024-07-31 01:29:42 -04:00
.move/time LDZ2 ( t* )
.move/max-time LDZ2 ( t* max-t* )
LTH2 ?{ !end-move } ( ; continue if t < max-t )
.move/time LDZ2k INC ROT STZ2 ( ; time<-time+1 )
2024-07-30 22:25:37 -04:00
move-pos-xy ( x* y* )
.Screen/y DEO2 .Screen/x DEO2 ( ; set x,y )
2024-07-31 01:29:42 -04:00
.move/card LDZ ( card^ )
set-fg draw-c !set-bg ( ; draw card )
2024-07-30 22:25:37 -04:00
@end-move ( -> )
2024-07-31 01:29:42 -04:00
.move/card LDZ ( card^ [src^] )
2024-07-30 23:24:57 -04:00
.move/dst LDZ STZ ( [src^] ; dst<-card )
2024-07-31 01:29:42 -04:00
.move #0e initialize ( ; zero out move )
post-move !draw ( ; finish move and draw )
2024-07-30 22:25:37 -04:00
2024-07-31 23:13:27 -04:00
@stop-audio ( -> )
2024-08-03 00:14:32 -04:00
#00
DUP .audio STZ
DUP .Audio1/pitch DEO
DUP .Audio2/pitch DEO
DUP .Audio3/pitch DEO
DUP .Audio4/pitch DEO
JMP2r
2024-07-31 23:13:27 -04:00
@start-audio ( -> )
2024-08-02 01:05:33 -04:00
#0000 .audio/pos #01 .audio STZ STZ2 !play-audio
2024-07-31 23:13:27 -04:00
2024-08-03 23:58:22 -04:00
@play-track ( pos* track* dev^ mute^ -> )
?&muted
2024-08-03 00:14:32 -04:00
STH ADD2 LDA DUP #ff EQU ?{ STHr #0f ORA DEO JMP2r } POP POPr JMP2r
2024-08-03 23:58:22 -04:00
&muted #0f ORA #00 SWP DEO POP2 POP2 JMP2r
@muted ( k^ div^ pos* -> bool^ )
#06 SFT2 NIP SWP DIVk MUL SUB EQU JMP2r
2024-08-03 00:14:32 -04:00
2024-07-31 23:13:27 -04:00
@play-audio ( -> )
2024-08-03 23:58:22 -04:00
.audio/pos LDZ2 STH2k #003f AND2 ( pos* [orig*] )
DUP2 ;track-1 .Audio1 #040b STH2kr muted play-track ( pos* [orig*] )
DUP2 ;track-2 .Audio2 #0203 STH2kr muted play-track ( pos* [orig*] )
DUP2 ;track-3 .Audio3 #0305 STH2kr muted play-track ( pos* [orig*] )
;track-4 .Audio4 #090b STH2kr muted play-track ( [orig*] )
STH2r INC2 .audio/pos STZ2 JMP2r ( )
2024-07-31 23:13:27 -04:00
@on-audio ( -> brk )
.audio LDZ ?{ BRK } play-audio BRK
2024-07-28 22:37:52 -04:00
@on-refresh ( -> brk )
2024-07-31 01:29:42 -04:00
.move/card LDZ #00 EQU ?{ update-move }
2024-07-30 23:24:57 -04:00
on-refresh-bear ( ; possibly refresh bear )
.frame LDZk INC SWP STZ ( ; increment frame counter )
BRK
@on-refresh-bear ( -> )
2024-07-28 22:37:52 -04:00
.frame LDZ
2024-07-31 23:13:27 -04:00
DUP #e8 NEQ ?{ POP ;sprites #0040 ADD2 !&update }
DUP #f0 NEQ ?{ POP ;sprites #0080 ADD2 !&update }
DUP #f8 NEQ ?{ POP ;sprites #0040 ADD2 !&update }
DUP #00 NEQ ?{ POP ;sprites !&update }
POP JMP2r
2024-07-28 22:37:52 -04:00
&update .Screen/addr DEO2 ( ; s/addr<-addr )
#0098 .Screen/y DEO2 ( ; s/x<-0x98 )
#00e8 .Screen/x DEO2 ( ; s/y<-0xe8 )
#16 .Screen/auto DEO ( ; draw 2 tiles, inc addr and y )
#80 .Screen/sprite DEO ( ; draw it! )
2024-07-30 23:24:57 -04:00
JMP2r
2024-07-28 22:37:52 -04:00
@on-mouse ( -> brk )
on-move
2024-07-31 01:29:42 -04:00
.move/card LDZ ?&skip
2024-07-13 20:45:22 -04:00
on-click-down
on-click-up
2024-07-30 22:25:37 -04:00
&skip .Mouse/state DEI .prev/mouse-state STZ
BRK
@on-move ( -> )
2024-07-15 10:14:09 -04:00
.Mouse/x DEI2 .prev/mouse-x LDZ2 NEQ2 ?draw-mouse
.Mouse/y DEI2 .prev/mouse-y LDZ2 NEQ2 ?draw-mouse
JMP2r
2024-07-13 20:45:22 -04:00
@draw-mouse ( -> )
#00 .Screen/auto DEO
2024-07-16 10:06:58 -04:00
clear-prev-hold clear-prev-mouse
draw-curr-hold !draw-curr-mouse
@clear-prev-hold ( -> )
.dragging LDZ ?{ JMP2r } ( )
#12 .Screen/auto DEO ( ; draw 2 tiles, increment x )
;blank .Screen/addr DEO2 ( ; erase )
.dragging/x LDZ2 .prev/mouse-x LDZ2 ADD2 STH2 ( [x*] )
.dragging/y LDZ2 .prev/mouse-y LDZ2 ADD2 STH2 ( [x* y*] )
.held LDZ2 #02 ADD SWP ( last+2^ first^ [x* y*] )
&loop LTHk ?&done ( last+2^ pos^ [x* y*] )
STH2kr .Screen/y DEO2 ( last+2^ pos^ [x* y*] ; s/y<-y )
OVR2r STH2r .Screen/x DEO2 ( last+2^ pos^ [x* y*] ; s/x<-x )
#41 .Screen/sprite DEO ( last+2^ pos^ [x* y*] ; erase )
INC LIT2r 0008 ADD2r !&loop ( last+2^ pos+1^ [x* y+8*] )
&done POP2 POP2r POP2r JMP2r ( )
@curr-drag-x ( -> x* )
.Mouse/x DEI2 .dragging/x LDZ2 ADD2 JMP2r
@curr-drag-y ( -> x* )
.Mouse/y DEI2 .dragging/y LDZ2 ADD2 JMP2r
@draw-curr-hold ( -> )
.dragging LDZ ?{ JMP2r }
set-fg
curr-drag-x STH2 ( [x*] )
curr-drag-y STH2 ( [x* y*] )
.held LDZ2 SWP ( last^ first^ [x* y*] )
&loop LTHk ?&done ( last^ pos^ [x* y*] )
STH2kr .Screen/y DEO2 ( last^ pos^ [x* y*] ; s/y<-y )
OVR2r STH2r .Screen/x DEO2 ( last^ pos^ [x* y*] ; s/x<-x )
LDZk draw-c ( last^ pos^ [x* y*] ; draw )
INC LIT2r 0008 ADD2r !&loop ( last^ pos+1^ [x* y+8*] )
&done POP2 POP2r POP2r !set-bg ( )
@clear-prev-mouse ( -> )
2024-07-16 10:06:58 -04:00
#00 .Screen/auto DEO
;blank .Screen/addr DEO2
2024-07-15 10:14:09 -04:00
.prev/mouse-x LDZ2 .Screen/x DEO2
.prev/mouse-y LDZ2 .Screen/y DEO2
#41 .Screen/sprite DEO JMP2r
@draw-curr-mouse ( -> )
2024-07-15 10:14:09 -04:00
.Mouse/x DEI2 DUP2 .prev/mouse-x STZ2 .Screen/x DEO2
.Mouse/y DEI2 DUP2 .prev/mouse-y STZ2 .Screen/y DEO2
2024-07-16 20:49:19 -04:00
.dragging LDZ ?&skip
;cursor .Screen/addr DEO2
2024-07-16 20:49:19 -04:00
#43 .Screen/sprite DEO &skip JMP2r
@on-click-down ( -> )
.Mouse/state DEI ( state^ )
2024-07-15 10:14:09 -04:00
.prev/mouse-state LDZ #ff EOR AND ( down^ )
2024-07-13 23:07:54 -04:00
#01 AND ?&ok JMP2r &ok
2024-07-31 21:21:06 -04:00
maybe-select-button ?&skip
2024-07-27 21:05:14 -04:00
maybe-select-stock ?&skip
2024-07-15 10:14:09 -04:00
maybe-select-waste ?&found
2024-07-30 23:24:57 -04:00
( TODO: maybe-select-foundation )
2024-07-15 10:14:09 -04:00
maybe-select-tableau ?&found
2024-07-31 21:21:06 -04:00
( not found, end drag ) .dragging #05 !initialize
2024-07-16 21:12:56 -04:00
&found clear-prev-mouse !draw-curr-hold
2024-07-27 21:05:14 -04:00
&skip JMP2r
2024-07-13 20:45:22 -04:00
@distance ( a* b* -> max[a,b]-min[a,b]* )
GTH2k JMP SWP2 SUB2 JMP2r
@card-overlap ( x1* y1* x2* y2* -> bool^ )
STH2 ROT2 distance SWP2 STH2r distance ( dx* dy* )
#0018 LTH2 STH #0010 LTH2 STHr AND JMP2r ( dy<24&dx<16^ )
@held-xy ( -> x* y* )
curr-drag-x !curr-drag-y
( search waste and tableau for held cards )
@remove-card ( z^ -> )
DUP .foundation LTH ?&zero ( z^ ; waste, just zero )
DUP .tableau LTH ?&from-foundation ( z^ )
DUP .tableau SUB #13 DIVk MUL SUB ( z^ (z-tab)%19^ )
?&from-non-empty-col ( z^ )
&zero #00 SWP STZ JMP2r
&from-foundation LDZ #0f #01 GTH ?&above-ace !&zero
&from-non-empty-col #00 OVR STZ #01 SUB LDZk #bf AND SWP STZ JMP2r
&above-ace LDZk #01 SUB SWP STZ JMP2r
@valid-card-foundation ( below^ above^ -> bool^ )
2024-07-27 21:05:14 -04:00
DUP2 #0f0f AND2 #0001 EQU2 ?&aces ( below^ above^ )
#3030 OVR2 AND2 EQU STH ( below^ above^ [suit-match^] )
#0f0f AND2 SWP INC EQU ( face-match^ [suit-match^] )
STHr AND JMP2r ( match^ )
&aces POP2 #01 JMP2r ( 1^ )
2024-07-27 21:05:14 -04:00
@valid-card-tableau ( below^ above^ -> bool^ )
DUP2 #0f0f AND2 #000d EQU2 ?&king ( below^ above^ )
#1010 OVR2 AND2 NEQ STH ( below^ above^ [suit-match^] )
2024-07-27 21:05:14 -04:00
#0f0f AND2 INC EQU ( face-match^ [suit-match^] )
STHr AND JMP2r ( match^ )
&king POP2 #01 JMP2r ( 1^ )
2024-07-16 21:56:25 -04:00
@try-release-foundation ( -> bool^ )
.held LDZ2 NEQ ?&nope ( ; stack can only have one card )
held-xy ( hx* hy* )
#0030 ,&y STR2 ( hx* hy* ; y<-48 )
LIT2r 0400 ( hx* hy* [4^ 0^] )
&loop ( hx* hy* [lim^ i^] )
OVR2 OVR2 ( hx* hy* hx* hy* [lim^ i^] )
#0008 LIT2 [ &y $2 ] ( hx* hy* hx* hy* x* y* [lim^ i^] )
card-overlap ?&found ( hx* hy* [lim^ i^] ) ( POP2 POP2 POP2 POP2 )
,&y LDR2 #0020 ADD2 ,&y STR2 ( hx* hy* [lim^ i^] ; y<-y+32 )
INCr GTHkr STHr ?&loop ( hx* hy* [lim^ i+1^] )
POP2r POP2 POP2 &nope #00 JMP2r ( 0^ )
&found ( hx* hy* [lim^ i^] )
POP2 POP2 NIPr STHr ( i^ )
.foundation ADD ( z^ )
LDZk .held LDZ LDZ ( z^ below^ above^ )
valid-card-foundation ?&match ( z^ )
POP #00 JMP2r ( 0^ )
&match ( z^ )
.held LDZ LDZ #7f AND SWP STZ ( ; z<-held )
.held LDZ remove-card ( ; remove held from prev position )
#0000 .held STZ2 ( ; remove holding status )
2024-07-30 22:25:37 -04:00
post-move #01 JMP2r ( 1^ )
2024-07-16 21:56:25 -04:00
@try-release-tableau ( -> bool^ )
2024-07-27 21:05:14 -04:00
#0700 &loop
DUP try-release-column ?&success
INC GTHk ?&loop POP2 #00 JMP2r
2024-08-03 00:14:32 -04:00
&success POP2 post-move #01 JMP2r
2024-07-27 21:05:14 -04:00
@try-release-column ( col^ -> bool^ )
STHk column-x
STHkr column-y ( x0* y* [col^] )
held-xy card-overlap ?&found ( [col^] )
POPr #00 JMP2r ( 0^ )
&found ( [col^] )
STHkr top-column LDZ ( under^ [col^] )
.held LDZ LDZ ( under^ over^ [col^] )
2024-07-30 22:25:37 -04:00
valid-card-tableau ?&ok ( [col^] )
POPr #00 JMP2r ( 0^ )
2024-07-27 21:05:14 -04:00
&ok STHr top-column ( top^ )
inc-unless-empty STH ( [dst^] ; inc unless column is empty )
.held LDZ2 INC SWP ( lim^ src^ [dst^] )
&loop LDZk #7f AND STHkr STZ ( lim^ src^ [dst^] ; dst<-src )
DUP remove-card ( lim^ src^ [dst^] ; remove card )
INC INCr GTHk ?&loop ( lim^ src+1^ [dst+1^] )
#0000 .held STZ2 draw
POP2 POPr #01 JMP2r ( 1^ )
@inc-unless-empty ( zp^ -> zp1^ )
LDZk #00 EQU JMP INC JMP2r
2024-07-15 23:04:10 -04:00
@release ( -> )
2024-07-16 21:56:25 -04:00
clear-prev-hold ( )
2024-07-30 22:25:37 -04:00
try-release-foundation ?&done ( )
try-release-tableau ?&done ( )
2024-07-15 23:04:10 -04:00
.held LDZ2 SWP ( last^ first^ )
2024-07-16 21:56:25 -04:00
&loop DUP LDZk #80 EOR SWP STZ ( last^ pos^ ; pos<-c^0x80 )
INC LTHk #00 EQU ?&loop POP2 ( )
&done .dragging #05 initialize ( )
2024-07-15 23:11:42 -04:00
#0000 .held STZ2 !draw ( )
2024-07-16 21:56:25 -04:00
.held LDZ2 SWP LITr 00 ( last^ first^ [zero^] )
&loop2 STHkr OVR STZ ( last^ pos^ [zero^] ; pos<-zero )
2024-07-16 21:56:25 -04:00
INC LTHk #00 EQU ?&loop2 ( last^ pos+1^ [zero^] )
POP2 POPr !&done ( )
2024-07-15 23:04:10 -04:00
2024-07-27 15:09:40 -04:00
@find-top ( start^ size^ -> zp^ )
2024-07-27 21:05:14 -04:00
OVR LDZ ?&non-empty POP JMP2r
&non-empty OVR ADD SWP ( lim^ start^ )
2024-07-27 15:09:40 -04:00
&loop LDZk ?&ok !&done &ok INC GTHk ?&loop
&done NIP #01 SUB JMP2r
2024-07-13 20:45:22 -04:00
2024-07-27 15:09:40 -04:00
@top-stock ( -> zp^ ) .stock #34 !find-top
@top-waste ( -> zp^ ) .waste #18 !find-top
2024-07-13 23:07:54 -04:00
2024-07-13 23:43:09 -04:00
@bot-column ( i^ -> zp^ )
#13 MUL .tableau ADD JMP2r
2024-07-13 23:07:54 -04:00
@top-column ( i^ -> zp^ )
2024-07-27 15:09:40 -04:00
bot-column #13 !find-top
2024-08-03 00:45:00 -04:00
@reshuffle-stock ( -> )
2024-07-27 15:09:40 -04:00
.waste DUP #18 find-top LITr -stock ( root^ src^ [dst^] )
&loop LDZk #40 EOR STHkr STZ #00 OVR STZ ( root^ src^ [dst^] ; dst<-src, src<-0 )
#01 SUB INCr GTHk #00 EQU ?&loop ( root^ src-1^ [dst+1^] )
2024-08-03 00:45:00 -04:00
POP2 #00 STHr STZ JMP2r ( ; ensure stock ends with 00 )
2024-07-27 15:09:40 -04:00
@deal-from-stock
2024-07-27 17:41:45 -04:00
.stock LDZk ?&deal POP !reshuffle-stock ( root^ )
2024-07-27 21:05:14 -04:00
&deal DUP #34 find-top top-waste ( root^ src^ w^ )
inc-unless-empty STH ( root^ src^ [dst^] )
2024-07-27 15:09:40 -04:00
LDZk #40 EOR STHkr STZ #00 OVR STZ ( root^ src^ [dst^] ; dst<-src, src<-0 )
2024-07-27 17:41:45 -04:00
EQUk ?&done #01 SUB INCr ( root^ src-1^ [dst+1] )
2024-07-27 15:09:40 -04:00
LDZk #40 EOR STHkr STZ #00 OVR STZ ( root^ src-1^ [dst+1^] ; dst+1<-src-1, src-1<-0 )
2024-07-27 17:41:45 -04:00
EQUk ?&done #01 SUB INCr ( root^ src-2^ [dst+2] )
2024-07-27 15:09:40 -04:00
LDZk #40 EOR STHkr STZ #00 OVR STZ ( root^ src-2^ [dst+2^] ; dst+2<-src-2, src-2<-0 )
2024-08-03 00:45:44 -04:00
&done POP2 POPr JMP2r ( )
2024-07-13 23:07:54 -04:00
@maybe-select-stock ( -> bool^ )
2024-07-27 21:05:14 -04:00
.Mouse/x DEI2 #0008 LTH2 ?&no ( ; x<8 )
.Mouse/x DEI2 #0017 GTH2 ?&no ( ; x>=23 )
.Mouse/y DEI2 #0020 GTH2 ?&no ( ; y>=32 )
deal-from-stock draw #01 JMP2r ( 1^ )
&no #00 JMP2r ( 0^ )
2024-07-13 23:07:54 -04:00
2024-07-15 22:54:16 -04:00
@start-drag ( x* y* first^ last^ -> )
DUP2 .held STZ2 ( x* y* first^ last^ ; held<-first,last )
2024-07-16 10:06:58 -04:00
SWP ( x* y* last^ first^ )
&loop LTHk ?&done ( x* y* last^ z^ )
DUP LDZk #80 EOR SWP STZ ( x* y* last^ z^ ; z<-q )
INC !&loop ( x* y* last^ z+1^ )
2024-07-15 22:54:16 -04:00
&done POP2 ( x* y* )
2024-07-16 10:06:58 -04:00
.Mouse/y DEI2 SUB2 .dragging/y STZ2
.Mouse/x DEI2 SUB2 .dragging/x STZ2
2024-07-15 22:54:16 -04:00
#01 .dragging STZ JMP2r ( )
2024-07-15 10:14:09 -04:00
2024-07-13 23:07:54 -04:00
@maybe-select-waste ( -> bool^ )
2024-07-15 23:11:42 -04:00
.Mouse/y DEI2 #0008 LTH2 ?&no1 ( )
.Mouse/y DEI2 #0020 GTH2 ?&no1 ( )
top-waste STHk #00 EQU ?&no2 ( [t^] )
#001c #00 STHkr .waste SUB #0008 MUL2 ADD2 ( w=0x1c+8*index* [t^ w*] )
DUP2 ,&dx STR2 ( w* [t^ w*] ; dx<-w )
.Mouse/x DEI2 GTH2 ?&no2 ( [t^ w*] )
#002c #00 STHkr .waste SUB #0008 MUL2 ADD2 ( 0x2c+8*index* [t^ w*] )
.Mouse/x DEI2 LTH2 ?&no2 ( [t^] )
LIT2 [ &dx $2 ] #0008 STHr DUP ( dx* dy=8* t^ t^ )
start-drag draw #01 JMP2r ( 1^ )
&no2 POP2r POPr &no1 #00 JMP2r ( 0^ )
2024-07-13 23:07:54 -04:00
@maybe-select-tableau ( -> bool^ )
2024-07-14 00:03:28 -04:00
.Mouse/y DEI2 #0024 LTH2 ?&no1 ( )
.Mouse/x DEI2 #0030 LTH2 ?&no1 ( )
.Mouse/x DEI2 #00cf GTH2 ?&no1 ( )
#0040 LIT2r 0700 ( 64* [7^ 0^] )
2024-07-15 10:14:09 -04:00
&loop ( x* [lim^ i^] )
.Mouse/x DEI2 OVR2 LTH2 ?&col ( x* [lim^ i^] )
2024-07-14 00:03:28 -04:00
#0008 ADD2 ( y1=y+8* [lim^ i^] )
.Mouse/x DEI2 OVR2 LTH2 ?&no2 ( y1* [lim^ i^] )
#0010 ADD2 ( y2=y1+16* [lim^ i^] )
INCr GTHkr STHr ?&loop ( y2 [lim i+1^] )
&no2 POP2 POP2r &no1 #00 JMP2r ( 0^ )
2024-07-15 22:54:16 -04:00
&col ( x* [lim^ i^] )
POP2 NIPr STHr !maybe-select-column ( bool^ )
@maybe-select-column ( i^ -> bool^ )
2024-07-15 23:11:42 -04:00
.Mouse/y DEI2 #0024 LTH2 ?&no ( i^ )
DUP top-column OVR bot-column ( i^ top^ bot^ )
LIT2r 0001 ( i^ top^ bot^ [1*] )
&loop ( i^ top^ row^ [n*] )
GTHk ?&next !&done ( i^ top^ row^ [n*] )
&next ( i^ top^ row^ [n*] )
.Mouse/y DEI2 ( i^ top^ row^ y* [n*] )
STH2kr #0008 MUL2 #0024 ADD2 ( i^ top^ row^ y* lim=36+8n* [n*] )
LTH2 ?&match INC INC2r !&loop ( i^ top^ row+1^ [n+1*] )
&done ( i^ top^ row^ [n*] )
.Mouse/y DEI2 ( i^ top^ row^ y* [n*] )
STH2kr #0008 MUL2 #0034 ADD2 ( i^ top^ row^ y* lim=52+8n* [n*] )
LTH2 ?&match ( i^ top^ row^ [n*] )
POP2r POP2 &no POP #00 JMP2r ( 0^ )
&match ( i^ top^ row^ [n*] )
2024-07-27 15:09:40 -04:00
LDZk #00 EQU ?&cancel ( i^ top^ row^ [n*] )
2024-07-17 10:38:16 -04:00
LDZk #40 AND ?&cancel ( i^ top^ row^ [n*] )
2024-07-15 23:11:42 -04:00
STH2 SWP2r column-x ( x* [top^ row^ n*] )
STH2r #0008 MUL2 #001c ADD2 ( x* y=28+8n* [top^ row^] )
STH2r SWP ( x* y* row^ top^ )
start-drag draw #01 JMP2r ( 1^ )
2024-07-17 10:38:16 -04:00
&cancel ( i^ top^ row^ [n*] )
POP2 POP POP2r #00 JMP2r ( 0^ )
2024-07-15 22:54:16 -04:00
2024-07-31 21:21:06 -04:00
@maybe-select-button ( -> bool^ )
.Mouse/y DEI2
DUP2 #00b4 LTH2 ?&no
DUP2 #00bb GTH2 ?&no
POP2 .Mouse/x DEI2
DUP2 #0008 LTH2 ?&no
DUP2 #0028 LTH2 ?&restart
DUP2 #0030 LTH2 ?&no
DUP2 #0050 LTH2 ?&quit
DUP2 #0058 LTH2 ?&no
DUP2 #0078 LTH2 ?&audio
DUP2 #0080 LTH2 ?&no
DUP2 #00a0 LTH2 ?&about
&no POP2 #00 JMP2r
&restart POP2 reset #01 JMP2r
&quit POP2 quit #01 JMP2r
&audio POP2 toggle-audio #01 JMP2r
&about POP2 #010e DEO #01 JMP2r
2024-07-31 23:13:27 -04:00
@game-won ( -> bool^ )
.foundation #04 OVR ADD SWP ( lim^ start^ )
&loop ( lim^ pos^ )
LDZk #0f AND #0d NEQ ?&no ( lim^ pos^ )
INC GTHk ?&loop ( lim^ pos+1^ )
POP2 #01 JMP2r ( 1^ )
&no POP2 #00 JMP2r ( 0^ )
2024-07-31 21:21:06 -04:00
@toggle-audio ( -> )
2024-07-31 23:13:27 -04:00
.audio LDZ ?&disable
start-audio !&done
&disable stop-audio
&done !draw-buttons
2024-07-31 21:21:06 -04:00
2024-07-28 15:19:05 -04:00
@min ( x^ y^ -> min[x,y]^ )
LTHk JMP SWP POP JMP2r
@check-auto ( card^ -> ok^ )
DUP #30 AND ( card^ suit^ )
#04 SFT .auto ADD LDZ INC ( card^ base+1^ )
OVR #0f AND EQU ?&ok ( card^ ; base+1=face? )
POP #00 JMP2r ( 0^ )
&ok DUP #30 AND ( card^ suit^ )
#04 SFT INC #03 AND ( card^ alt1^ )
INCk INC #03 AND ( card^ alt1^ alt2^ )
.auto ADD LDZ SWP ( card^ face2^ alt1^ )
.auto ADD LDZ min ( card^ min-face^ )
INC INC INC SWP #0f AND ( min-face+3^ face^ )
GTH JMP2r ( min-face+3>face^ )
@auto-move-col ( col^ -> ok^ )
DUP top-column LDZ ( col^ card^ )
DUP check-auto ?&ok !&done ( col^ card^ )
&ok auto-dest STH top-column ( src^ [dst^] )
2024-07-31 01:29:42 -04:00
STHr start-move ( )
( LDZk STHr STZ remove-card ) #01 JMP2r ( 1^ )
2024-07-28 15:19:05 -04:00
&done POP2 #00 JMP2r ( 0^ )
@auto-dest ( card^ -> dst^ )
DUP #0f AND #01 EQU ?&aces ( card^ )
#30 AND STH ( [suit^] )
.foundation #04 OVR ADD SWP ( lim^ start^ [suit^] )
&loop LDZk #30 AND STHkr EQU ?&ok ( lim^ zp^ [suit^] )
INC GTHk ?&loop ( lim^ zp+1^ [suit^] )
&ok POPr NIP JMP2r ( zp^ )
&aces ( card^ )
POP .foundation #04 OVR ADD SWP ( lim^ start^ )
&loop2 LDZk ?&next NIP JMP2r ( zp^ )
&next INC GTHk ?&loop2 ( lim^ zp+1^ )
@auto-move ( -> )
prepare-auto #0700 ( lim^ col0^ )
&loop DUP auto-move-col ?&found INC GTHk ?&loop ( lim^ col+1^ )
2024-07-31 01:29:42 -04:00
POP2 JMP2r &found POP2 !draw ( )
2024-07-28 15:19:05 -04:00
@prepare-auto ( -> )
.auto #04 initialize ( ; reset auto )
.foundation #04 OVR ADD SWP ( lim^ start^ )
&loop LDZk update-auto ( lim^ pos^ )
INC GTHk ?&loop ( lim^ pos+1^ )
2024-07-28 15:19:40 -04:00
POP2 JMP2r ( )
2024-07-28 15:19:05 -04:00
@update-auto ( card^ -> )
DUP ?&ok POP JMP2r ( )
&ok DUP #30 AND ( card^ suit^ )
#04 SFT .auto ADD ( card^ zp^ )
SWP #0f AND SWP STZ JMP2r ( ; zp<-face )
2024-07-30 22:25:37 -04:00
@post-move ( -> )
2024-07-31 23:13:27 -04:00
auto-move game-won ?draw-buttons JMP2r
2024-07-30 22:25:37 -04:00
@on-click-up ( -> )
.Mouse/state DEI #ff EOR ( not-state^ )
2024-07-15 10:14:09 -04:00
.prev/mouse-state LDZ AND ( up^ )
#01 AND ?&ok JMP2r &ok
.dragging LDZ ?release
JMP2r
2024-07-15 10:14:09 -04:00
@on-key ( -> brk )
2024-07-28 15:19:05 -04:00
on-press
2024-07-15 10:14:09 -04:00
.Controller/button DEI .prev/button STZ
BRK
2024-07-15 10:14:09 -04:00
@on-release ( -> )
JMP2r
2024-07-15 10:14:09 -04:00
@on-press ( -> )
2024-07-28 15:19:05 -04:00
.Controller/key DEI #0d EQU ?dump-state ( ; 0x0d: return )
.Controller/key DEI #1b EQU ?reset ( ; 0x1b: esc )
.Controller/key DEI #20 EQU ?auto-move ( ; 0x20: space )
2024-07-15 10:14:09 -04:00
JMP2r
~cards.tal
2024-07-28 22:37:52 -04:00
@sprites ~sprites.tal
2024-07-31 21:21:06 -04:00
@restart-button
7f ff ff ff ff ff ff 7f 7f ce d5 cc d5 d6 ff 7f
ff ff ff ff ff ff ff ff ff 62 df 67 fb 47 ff ff
ff ff ff ff ff ff ff ff ff 36 6a 62 6a 6a ff ff
fe ff ff ff ff ff ff fe fe 63 b7 77 b7 b7 ff fe
@quit-button
7f ff ff ff ff ff ff 7f 7f ff ff ff ff ff ff 7f
ff ff ff ff ff ff ff ff ff cd b5 b5 b5 cc f7 ff
ff ff ff ff ff ff ff ff ff 51 5b 5b 5b 5b ff ff
fe ff ff ff ff ff ff fe fe ff ff ff ff ff ff fe
@audio-off-button
7f ff ff ff ff ff ff 7f 7f da aa 8a aa a8 ff 7f
ff ff ff ff ff ff ff ff ff 9b aa aa aa 9b ff ff
ff ff ff ff ff ff ff ff ff 3e d5 dd d5 3e ff ff
fe ff ff ff ff ff ff fe fe c9 5b 49 5b db ff fe
@audio-on-button
7f ff ff ff ff ff ff 7f 7f da aa 8a aa a8 ff 7f
ff ff ff ff ff ff ff ff ff 9b aa aa aa 9b ff ff
ff ff ff ff ff ff ff ff ff 3e d5 dd d5 3e ff ff
fe ff ff ff ff ff ff fe fe cf 57 57 57 d7 ff fe
@about-button
7f ff ff ff ff ff ff 7f 7f fe fd fc fd fd ff 7f
ff ff ff ff ff ff ff ff ff ce 55 4d 55 4e ff ff
ff ff ff ff ff ff ff ff ff d4 56 56 56 c6 ff ff
fe ff ff ff ff ff ff fe fe 7f ff ff ff ff ff fe
2024-07-31 23:13:27 -04:00
@new-game-button
7f ff ff ff ff ff ff 7f 7f 99 ab a9 ab a9 ff 7f
ff ff ff ff ff ff ff ff ff 57 56 56 56 af ff ff
ff ff ff ff ff ff ff ff ff 37 ea a2 aa 2a ff ff
fe ff ff ff ff ff ff fe fe 59 ab a9 ab a9 ff fe
2024-08-03 00:14:32 -04:00
@saw ff ee dd cc bb aa 99 88 77 66 55 44 33 22 11 00
@triangle 80 ff 80 00
@square ff ff ff ff ff 00 00 00
( 512 random bytes to create noise )
@noise
da 4c 58 30 58 a7 d6 7a fd b1 60 2a 8a de 22 2f
fb 52 8a f3 58 62 37 3b 0a fb 85 2b da 24 d9 a1
88 fa 79 d8 3b 40 0c 58 54 40 14 92 50 44 d2 68
f2 8b b8 50 d1 70 03 74 1e 61 90 96 e6 1a eb b3
09 6b 65 d8 f2 fb af 36 bb b6 9d 90 9b 3e c2 1a
a0 de 1f 20 89 1b 85 53 b9 c9 55 ae f5 c9 4b 0a
5f 11 40 ca 6e b1 b9 35 3e 99 eb 46 6a e0 1a 4f
9a 6e 31 28 cb b2 1f 4a 17 ee 3b 05 4a 6f 6f 56
28 b3 90 07 65 f6 25 ed 4a 43 4b 99 8f 1a 48 19
aa 3c 64 d4 e5 80 c4 c3 ce 52 5f 12 ad 34 78 5c
bb 3a aa 26 d4 ed 0d 81 ee 35 1b c9 17 7f 7c ec
c3 84 2a 0d 1e 9a 74 2c 42 ce 1e 6d 5f e9 7d a5
b2 14 55 5b 57 51 38 1d c2 ad 50 b6 6f 71 b3 a2
7e ae b6 fc 77 7e c6 51 ef ae e7 f5 8f 23 2d 1a
78 b1 fd e3 f4 a6 50 bb 48 91 00 95 2f 8a 3e 64
ab 32 27 03 a1 7a c4 11 30 b1 3e 24 39 b5 22 0f
5f a1 6e 2b 9e e4 43 07 b6 74 c8 f7 17 93 c7 d0
1f 25 e1 80 12 5b c9 10 53 a5 4e 3f 8c 91 c8 c7
51 74 38 99 6c c3 e7 0e 7b 7d 25 bc e7 10 75 d0
b0 ed 33 33 20 fb 4c 5d 1b 23 3b 8a bd ae 31 32
17 0f 38 9b 79 da 8f da af 54 47 8e 68 77 b5 25
47 c9 be 87 3d f1 3d 35 a1 d5 dd 84 ff b8 73 d5
1f 75 e5 b7 2f f3 17 a5 06 39 17 af 4d e5 b8 a1
e7 93 a0 f9 9f 95 b7 f6 d3 b2 04 75 2b 27 f9 86
4b 0a 61 57 77 11 d3 31 91 a9 9e 8f 26 d7 9b fa
7c 36 4e 47 a5 53 ea 86 a6 63 b3 ce 84 03 d1 3c
e6 0b 89 b7 51 dd 33 86 e2 11 6e b8 b4 e0 08 b4
68 8c fe d4 18 d3 ae d4 8e 90 fc 52 f3 8c e9 2c
92 95 44 a9 39 22 20 45 69 fc 30 5e 68 1b 1c b0
cc 76 9e 04 d0 24 7f ea 0a d2 f4 d8 96 98 27 dc
3e 8e 95 5d 78 12 6a 9b b2 f5 f4 a9 52 88 05 8f
38 50 6c f4 bb d9 0f ea f4 de 9d f6 55 fc 99 3a
49 f2 0f 99 e8 f5 3d e9 37 69 fb 92 34 1b 69 46
dd 5b 17 7b 0e 9b 38 9f d7 a3 14 03 ba e7 b0 e1
8a 5a 82 72 ea bf 8e 85 8f d0 06 bc 3b 2b 01 d7
a2 e2 74 ca 28 78 e0 38 59 e2 b8 dc 39 6c a7 f3
3a a1 86 82 4b 1c 78 56 09 14 59 a6 55 39 5e 51
89 07 81 c7 b6 11 d6 26 0b 2f 17 a5 10 af 73 03
6c 68 22 04 32 58 b4 e5 c6 f2 e1 6b 99 d5 bb 4c
2b e1 93 ad 3b 1d 62 e2 f1 6a fa 13 92 3c de 8b
0e 1c 4f 8d ea 20 ba c2 9a 65 b1 b1 29 f0 ce 6f
49 3d 06 f8 18 0b 0d 55 d4 ec 95 d3 fa cb 10 9b
bd 61 d7 3f 07 5b 47 cc bb ae b2 df db f5 20 43
2a 11 54 11 54 05 ff 33 44 0a 1b 92 26 87 f8 58
56 a4 84 2e c4 4f 86 04 b8 d6 bb 0c 82 23 56 8a
d8 77 2f fc 27 30 e2 5f 19 3e ff a5 b8 ca 4e 87
dc b2 e9 6c d8 8f a9 7a be ad 85 6c a2 76 9f 32
e8 d5 b3 de b9 3a ce 23 36 4a de 7a e6 47 40 7c
b3 8c 2c 10 b1 3f c9 81 74 79 0a 4d 5e 73 01 24
ed 17 d3 e8 83 7e 54 bf d9 47 59 f0 0c 60 f7 41
67 52 c2 2a f1 93 c3 ac 00 00 67 87 3a c8 62 d3
33 20 7c 36 d4 88 57 cc fa a5 8a 69 f7 f9 06 7b
56 a6 c9 8f db a0 c0 07 94 0c a2 96 e1 26 7c 49
18 c1 18 4e d1 76 87 e3 43 9a 4b d0 fc cf 11 5e
f8 83 0c 52 05 57 8b 3c 32 84 3b 88 14 75 dc f7
42 ec 6d 5f e9 11 8d 33 76 56 ae 46 f1 99 e9 1d
34 df 4d 7d c6 57 fe 82 fd 9b 97 8e 89 74 ce 5a
fa 85 74 38 b1 3f f5 72 69 87 93 d8 c2 c9 e0 b2
ce e1 de b2 15 f9 21 c4 37 70 1c 4b f4 5e 8c dc
d9 fc f3 13 50 41 b8 8e 90 0b 40 bf a8 57 b8 e8
25 b4 c0 1c 99 96 bd 8b 64 40 6f 42 cd f9 22 f2
9f 80 92 c7 64 73 d9 0d 10 ef 86 c1 9a be aa 12
04 1f 78 e0 20 c4 f1 36 5c cc 7c 3f 53 07 8a 94
fb 97 62 78 fe 6b 3b 3d a1 02 f1 5d e4 ca fe d1
2024-07-31 23:13:27 -04:00
( C C# D D# E F F# G G# A A# B )
( 01 02 03 04 05 06 07 08 09 0a 0b )
( 0c 0d 0e 0f 10 11 12 13 14 15 16 17 )
( 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 )
( 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f )
( 30 31 32 33 34 35 36 37 38 39 3a 3b )
( 3c 3d 3e 3f 40 41 42 43 44 45 46 47 )
( 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 )
( 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f )
( 60 61 62 63 64 65 66 67 68 69 6a 6b )
( 6c 6d 6e 6f 70 71 72 73 74 75 76 77 )
( 78 79 7a 7b 7c 7d 7e 7f )
2024-08-03 00:14:32 -04:00
@track-1
24 00 24 00 24 00 24 00 24 00 24 00 24 00 24 00
24 00 24 00 24 00 24 00 24 00 24 00 24 30 24 30
2024-08-03 00:54:05 -04:00
20 00 20 00 20 00 20 2c 20 00 20 00 20 00 20 00
1f 00 1f 00 1f 00 1f 00 1f 29 1f 2b 1f 2c 1f 2e
2024-08-03 00:14:32 -04:00
@track-2
48 00 4a 4b 00 00 00 4d 4a 00 4a 4b 00 00 4a 00
48 00 4a 4b 00 00 4a 00 48 00 00 00 00 00 4a 00
48 00 4a 4b 00 00 00 4d 4a 00 4a 4b 00 00 4a 00
48 00 4a 00 4b 00 4b 4d 4f 50 4d 4f 4b 4d 4a 4b
@track-3
43 ff ff ff ff ff ff ff 41 ff ff ff ff ff ff ff
3f ff ff ff ff ff ff ff 3e ff ff ff ff ff ff ff
3c ff ff ff ff ff ff ff 43 ff ff ff ff ff ff ff
41 ff ff ff ff ff ff ff 46 ff ff ff ff ff ff ff
@track-4
01 00 00 00 30 00 00 00 01 00 01 00 30 00 00 00
01 00 00 00 30 00 00 00 01 00 01 00 30 00 30 30
01 00 00 00 30 00 00 00 01 00 01 00 30 00 01 00
01 00 01 00 30 00 01 30 28 28 01 24 24 01 20 20