From bc608dc83191dfac351700c25257b0a61783e7d2 Mon Sep 17 00:00:00 2001 From: d_m Date: Mon, 15 Jul 2024 10:14:09 -0400 Subject: [PATCH] working toward held cards --- cards.tal | 16 +++---- kodiak.tal | 119 +++++++++++++++++++++++++++++------------------------ 2 files changed, 75 insertions(+), 60 deletions(-) diff --git a/cards.tal b/cards.tal index ecf5916..6f73dd6 100644 --- a/cards.tal +++ b/cards.tal @@ -381,15 +381,15 @@ ( fall-through ) ( @init-rng ( x* y* -> ) ) #0001 ROT2 OVR2 ( y* 1* x* 1* ) - ORA2 ;rng/x STA2 ( y* 1* ) - ORA2 ;rng/x STA2 JMP2r ( ) + ORA2 ;rng-x STA2 ( y* 1* ) + ORA2 ;rng-x STA2 JMP2r ( ) @random ( -> x* ) - ;rng/x LDA2 DUP2 #50 SFT2 EOR2 ( t=x^[x<<5]* ) - ;rng/y LDA2 DUP2 ;rng/x STA2 ( t* y* ; x<-y ) + ;rng-x LDA2 DUP2 #50 SFT2 EOR2 ( t=x^[x<<5]* ) + ;rng-y LDA2 DUP2 ;rng-x STA2 ( t* y* ; x<-y ) DUP2 #01 SFT2 EOR2 ( t* u=y^[y>>1]* ) SWP2 DUP2 #03 SFT2 EOR2 ( u* v=t^[t>>3]* ) - EOR2 DUP2 ;rng/y STA2 JMP2r ( u^v* ; y<-u^v ) + EOR2 DUP2 ;rng-y STA2 JMP2r ( u^v* ; y<-u^v ) ( 52 cards x 4 bytes per card = 208 bytes ) ( each card has: ) @@ -405,10 +405,12 @@ ( @cards $0cc &last $4 &end ) @cursor 80c0 e0f0 f8e0 1000 -@cursox 7f3f 1f0f 071f efff +( @cursox 7f3f 1f0f 071f efff ) @blank 0000 0000 0000 0000 -@rng &x $2 &y $2 +( @rng &x $2 &y $2 ) +@rng-x $2 +@rng-y $2 ( each tile is 16 bytes: a 2-bit 8x8 image ) @tiles ~card-sprites.tal diff --git a/kodiak.tal b/kodiak.tal index f55b2ef..f76ac8a 100644 --- a/kodiak.tal +++ b/kodiak.tal @@ -25,15 +25,18 @@ ( zero page - currently using 232 of 256 bytes ) |0000 - @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 ) - @held $0d ( stack of up to 13 held cards ) - @prev-button $1 ( previous button press ) - @prev-mouse-state $1 ( previous mouse state ) - @prev-mouse-x $2 ( previous x-coordinate ) - @prev-mouse-y $2 ( previous y-coordinate ) + @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 ) + @held $0d ( stack of up to 13 held cards ) + @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 ) |0100 #2d8b .System/r DEO2 @@ -49,6 +52,8 @@ .foundation #04 initialize .tableau #85 initialize .held #0d initialize + .dragging #05 initialize + .prev #06 initialize shuffle-stock deal-tableau @@ -64,11 +69,11 @@ draw-foundation draw-tableau ;on-mouse .Mouse/vect DEO2 -( ;on-key .Controller/vect DEO2 ) + ;on-key .Controller/vect DEO2 BRK -@not-holding-cards ( -> bool^ ) .held LDZ #00 EQU JMP2r -@holding-cards ( -> bool^ ) .held LDZ #00 NEQ JMP2r +( @not-holding-cards ( -> bool^ ) .held LDZ #00 EQU JMP2r ) +( @holding-cards ( -> bool^ ) .held LDZ #00 NEQ JMP2r ) @initialize ( start^ count^ -> ) OVR ADD SWP STH2 #00 ( 0^ [lim=start+count^ start^] ) @@ -112,13 +117,6 @@ #00 OVR STZ ( s^ ; s<-0 ) #01 SUB JMP2r ( s-1^ ) -@swap-c ( src^ dst^ -> ) - LDZk STH ( src^ dst^ [d^] ) - OVR LDZ ( src^ dst^ s^ [d^] ) - SWP STZ ( src^ [d^] ; dst<-s ) - STHr SWP ( d^ src^ ) - STZ JMP2r ( ; src<-d ) - @draw-stock ( -> ) #0008 ,&y STR2 ( ; y0<-8 ) .stock #34 OVR ADD SWP LITr 01 ( stock+52 stock^ [n^] ) @@ -200,12 +198,12 @@ on-move on-click-down ( on-click-up ) - .Mouse/state DEI .prev-mouse-state STZ + .Mouse/state DEI .prev/mouse-state STZ BRK @on-move ( -> ) - .Mouse/x DEI2 .prev-mouse-x LDZ2 NEQ2 ?draw-mouse - .Mouse/y DEI2 .prev-mouse-y LDZ2 NEQ2 ?draw-mouse + .Mouse/x DEI2 .prev/mouse-x LDZ2 NEQ2 ?draw-mouse + .Mouse/y DEI2 .prev/mouse-y LDZ2 NEQ2 ?draw-mouse JMP2r @draw-mouse ( -> ) @@ -213,25 +211,27 @@ clear-prev-mouse !draw-curr-mouse @clear-prev-mouse ( -> ) - .prev-mouse-x LDZ2 .Screen/x DEO2 - .prev-mouse-y LDZ2 .Screen/y DEO2 + .prev/mouse-x LDZ2 .Screen/x DEO2 + .prev/mouse-y LDZ2 .Screen/y DEO2 ;blank .Screen/addr DEO2 #41 .Screen/sprite DEO JMP2r @draw-curr-mouse ( -> ) - .Mouse/x DEI2 DUP2 .prev-mouse-x STZ2 .Screen/x DEO2 - .Mouse/y DEI2 DUP2 .prev-mouse-y STZ2 .Screen/y DEO2 + .Mouse/x DEI2 DUP2 .prev/mouse-x STZ2 .Screen/x DEO2 + .Mouse/y DEI2 DUP2 .prev/mouse-y STZ2 .Screen/y DEO2 ;cursor .Screen/addr DEO2 #43 .Screen/sprite DEO JMP2r @on-click-down ( -> ) .Mouse/state DEI ( state^ ) - .prev-mouse-state LDZ #ff EOR AND ( down^ ) + .prev/mouse-state LDZ #ff EOR AND ( down^ ) #01 AND ?&ok JMP2r &ok - maybe-select-stock ?&done - maybe-select-waste ?&done - maybe-select-tableau ?&done - &done JMP2r + maybe-select-stock ?&found + maybe-select-waste ?&found + maybe-select-tableau ?&found + ( not found ) + .dragging #05 initialize + &found JMP2r @find-top ( lim^ start^ -> zp^ ) &loop LDZk ?&ok !&done &ok INC GTHk ?&loop &done NIP #01 SUB JMP2r @@ -256,24 +256,32 @@ draw-stock #01 JMP2r ( 1^ ) &no2 POPr &no1 #00 JMP2r ( 0^ ) +@start-drag ( x* y* -> ) + ( TODO: take t^ input, update t, update held ) + .dragging/y STZ2 .dragging/x STZ2 + #01 .dragging STZ JMP2r + @maybe-select-waste ( -> bool^ ) .Mouse/y DEI2 #0008 LTH2 ?&no1 .Mouse/y DEI2 #0020 GTH2 ?&no1 - top-waste STHk #00 EQU ?&no2 - #001c #00 STHkr .waste SUB #0008 MUL2 ADD2 ( 0x1c+8*index* ) - .Mouse/x DEI2 GTH2 ?&no2 - #002c #00 STHkr .waste SUB #0008 MUL2 ADD2 ( 0x2c+8*index* ) - .Mouse/x DEI2 LTH2 ?&no2 - STHr LDZk #80 EOR SWP STZ draw-waste #01 JMP2r - &no2 POPr &no1 #00 JMP2r + 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^ w*] ) + LIT2 [ &dx $2 ] #0008 start-drag ( [^t] ) + STHr LDZk #80 EOR SWP STZ draw-waste #01 JMP2r ( 1^ ) + &no2 POP2r POPr &no1 #00 JMP2r ( 0^ ) @maybe-select-tableau ( -> bool^ ) .Mouse/y DEI2 #0024 LTH2 ?&no1 ( ) .Mouse/x DEI2 #0030 LTH2 ?&no1 ( ) .Mouse/x DEI2 #00cf GTH2 ?&no1 ( ) #0040 LIT2r 0700 ( 64* [7^ 0^] ) - &loop ( y* [lim^ i^] ) - .Mouse/x DEI2 OVR2 LTH2 ?&col ( y* [lim^ i^] ) + &loop ( x* [lim^ i^] ) + DUP2 #0010 SUB2 ,&dx STR2 ( x* [lim^ i^] ; dx<-x ) + .Mouse/x DEI2 OVR2 LTH2 ?&col ( x* [lim^ i^] ) #0008 ADD2 ( y1=y+8* [lim^ i^] ) .Mouse/x DEI2 OVR2 LTH2 ?&no2 ( y1* [lim^ i^] ) #0010 ADD2 ( y2=y1+16* [lim^ i^] ) @@ -284,35 +292,40 @@ DUPk top-column STHk SWP bot-column ( i^ top^ bot^ [top^] ) SUB #00 SWP ( i^ count* [top^] ) #0008 MUL2 #0024 ADD2 ( i^ min=0x24+8*i* [top^] ) + DUP2 ,&dy STR2 ( i^ min* [top^] ; dy<-min ) DUP2 #0018 ADD2 ( i^ min* max=min+0x18* [top^] ) .Mouse/y DEI2 LTH2 #00 EQU STH ( i^ min* [top^ max>=y^] ) .Mouse/y DEI2 GTH2 #00 EQU STHr ( i^ min<=y^ max>=y^ [top^] ) AND ?&ok ( i^ [top^] ) POP POPr #00 JMP2r ( 0^ ) - &ok STHr LDZk #80 EOR SWP STZ ( i^ ; top<-top^0x80 ) + &ok LIT2 [ &dx $2 ] LIT2 [ &dy $2 ] ( i^ dx* dy* ) + start-drag ( i^ ) + STHr LDZk #80 EOR SWP STZ ( i^ ; top<-top^0x80 ) draw-column #01 JMP2r ( 1^ ) -@on-click-up ( -> ) +( @on-click-up ( -> ) .Mouse/state DEI #ff EOR ( not-state^ ) - .prev-mouse-state LDZ AND ( up^ ) - #01 AND ?{ JMP2r } JMP2r ( TODO: anything to do here? ) + .prev/mouse-state LDZ AND ( up^ ) + #01 AND ?{ JMP2r } JMP2r ( TODO: anything to do here? ) ) -( @on-key ( -> brk ) +@on-key ( -> brk ) on-press on-release - .Controller/button DEI .prev-button STZ - BRK ) + .Controller/button DEI .prev/button STZ + BRK -( @on-release ( -> ) - .Controller/button DEI #ff EOR ( not-button^ ) - .prev-button LDZ AND ( release^ ) +@on-release ( -> ) + JMP2r +( .Controller/button DEI #ff EOR ( not-button^ ) + .prev/button LDZ AND ( release^ ) DUP #00 EQU ?&skip DUP #08 AND ?&start &skip POP JMP2r &start POP !draw-cards ) -( @on-press ( -> ) - .Controller/button DEI ( button^ ) - .prev-button LDZ #ff EOR AND ( press^ ) +@on-press ( -> ) + JMP2r +( .Controller/button DEI ( button^ ) + .prev/button LDZ #ff EOR AND ( press^ ) DUP #00 EQU ?&skip DUP #01 AND ?&ctrl DUP #02 AND ?&alt