From ecddfc5b1a457b1da12cd4cae0861e6a82347938 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sat, 23 Sep 2023 22:44:30 -0400 Subject: [PATCH] small constants, keyboard input, interactive minesweeper --- asm.jrt | 2 +- assemble.com | Bin 12769 -> 12797 bytes coredefs.jrt | 42 ++++++++++++++++++----------- keys.jrt | 38 ++++++++++++++++++++++++++ logic.jrt | 3 +-- mines.com | Bin 3521 -> 3985 bytes mines.jrt | 74 +++++++++++++++++++++++++++++++++++++++------------ reasm.bat | 2 ++ tinyjort.com | Bin 4709 -> 4754 bytes zipoff.com | Bin 15332 -> 15462 bytes zipoff.jrt | 1 + zipstub.seg | Bin 807 -> 829 bytes 12 files changed, 126 insertions(+), 36 deletions(-) create mode 100755 keys.jrt diff --git a/asm.jrt b/asm.jrt index 9e2413a..7d34bbb 100755 --- a/asm.jrt +++ b/asm.jrt @@ -205,7 +205,7 @@ var ignoreimm : diffaddr ( opsize -- diff ) oparg-val @ swap target + - ; : oparg-nearaddr? ( -- f ) oparg-mem? oparg-base @ -1 = and ; : >short-jmp* ( op -- ) oparg-nearaddr? if - 2 diffaddr dup dbg" jumping by" byteval? oparg-mempatch? or + 2 diffaddr dup byteval? oparg-mempatch? or if swap >t ' patch-r8 patchpoint >t 2ret then drop then drop ; : >near-reljmp* ( op -- ) oparg-nearaddr? if diff --git a/assemble.com b/assemble.com index f50cd91a893730287d4bebdf0c01e5fc8cb348a7..dd1bb142a095b72e3e606a656d4f70ddc11a71a8 100755 GIT binary patch literal 12797 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 tpG%}Y)_qKLUbfQw5!g;$Zm2v~# z@J2g5@}(h}N2b%j*5=#!pYk5f!@YanL|Ja4j-QRAa#3!j8<)$gI>M14NMg@>E+6l-01NG}<;xe2-{%`p@_aA)dOF|7 zzs;vUzK3SKKFG(-JFaIjnVVI*NBY2-#44y%EeUrPgZdCeJq2VY4OA;2L#zeKtU{LJ zI@bYktq@%DZa_}WUNs@%Ex<2K;A>F0JL~ro9r@k)(;e^SW2Y}L2|(^;D6G-ZbjKiX zFTmAxftghVyJL_eOU~sKY!e!irGYWk?TDUJmE3orD1=QMHNOBFj1f7Vkl+c949$n&yka$W+Y%Mgh zidB)$tH^MQ*l(Df-zV7rRM^d_gNvX91m&y{xr~)Yj`ASyoOGWrR3J!hkz8cwudv-& zH1XsRpA^!DvSgm*OD{_BT?M|uEBLCRj#9T!H$$-DW|@se&qh`${vwaCJs94Pi&RSL zg0ofU^b1ZCIQtQyI|Sbw`6|*XCAX9AyL7%e;3JM7*nNfcJmFUAa;} zbCA#=?w_ba#?4G#;($a4wZ!@0Tn?ofnL_CRc%YDCWi>87J!?WDqOP0d;}4+|&Wa}W z@_D(|TzVPuz@$NhKCbV^J(?$@h9d2zN$@37k4ugAE98$rUWL4rIgiZpj2@diCm|wm zUP<&;lIP=JP1>DBRz0JyvW()gLe8$GJ?y0W(j;1DJMUznNpa=kB$ZuTFA@7>iQFm> z+hmAP@o>^zssj-L6i+4*iOkoLs6eVngvybV?tl)&1aOlOk;rX2(j|~}gv_lGGWYAq zI)U6n$|?o$gbu71z~cl^<#*Eknhtae;IQaLBBym^gFsFa;*-66uOqh!Le1-kxc@*iImM3%5K+z%>ww`Wkku+ zAd9+_?)!D{v;glZrh2A9RCp)dPwCi40vjl%+E9N>Zb~~k76WMBMO?K zKpj!=sZhX2gi`Xc&x+#}rO|V^SPA7$cTm6_B?oQ}MLg?6;=sM7#K(VMLaE=!pDdx{ zX)oeD#Q#u2wE{MyB6^daxE6W{n&?BC4wWP^N~wv9CV71$vAavKEl4r+FZZ26KHV{d zeDyWtDw-p(AR;UngaxHjsOJ!$HRY2MvSij2**gOr7h_XM0ztPv5Rn;q{1hL*89Z9S zE=aGOLTP^Pl=P92;r1&8{bFP5<-~KB;O^xl`LKAV6tP#G?$}i_9oH9+3mvQf7acT% zJ8|CMq}#M_3X;avt0Lhp+{p%FtEEM+K<^j2UW3qUz&z1dj2=og({t!~jCf9DN1Mow zrJ(K3qWyZhgLW1ssPjBDBcpWE@kEw|70JyOiwm>puB**MTT_VNDg^vPqp?V>$R8Dq?Fb7o@86q0t{%Qj7+ zIkdt{@}`p6=Syk8cK&-tMVnJpRkXR&08*w(OkRXOc?AdUc(ljH*%7hlzJ}1J!fu)_ zaW`{10)7;VfeeF~l6M4$VQ~H%n9$WxTB~JG0bgzy(1#S@dt)(jSH!K#~f2-ru1a1`gHIq2g;n#K840xyLd^RSnajx8* z&grN_2&+Q)BXr)lRN~q+Y5F9AYXVoM(Wy&j$O0XoE^w2;PeA|T2AKeB1m3T_k3m&J zZn19FO@h8t(3cTiT$P-3cj@{#BZ*rDB8Ry{M^u5hfHW?Uef*1#7zDCMAX4VAj%WgT zkr2FBp(XiHM@#}a=AnB5Sr%QKCbu}w4q+L;f=qplbj@_HL{x$7!xAi9DlI6{5raTZ z7UBGxfNFF|6HqQ{iRxPEuea!kQ6QCG2qmD~bjT#2BiNDZYUDoufS1|X{){7|mf8;WCl>8E*L+OeV|Fd2o{wom~RM;%MNc(NL^ohyDlaQn`kb=&~r%|+- swdz*!L(T(b-Q2IzPY`yM;a6cKMn9;;43QkYJ7u`Er@w1ew^?%jH`uZhumAu6 literal 12769 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 diff --git a/coredefs.jrt b/coredefs.jrt index b3a3839..5bf7750 100755 --- a/coredefs.jrt +++ b/coredefs.jrt @@ -8,16 +8,6 @@ dbg" core" MOV BX AX JMP @[ BX] ; -L: $$CONST - INC BX INC BX - PUSH @[ BX] - NEXT - -: CONST DEF [ L@ $$CONST lit ] w>t w>t ; - -L@ $$CONST CONST $DOCONST -0 CONST 0 1 CONST 1 - L: $$VAR INC BX INC BX PUSH BX @@ -29,7 +19,33 @@ L: $$VAR ( "codepointer words" that evaluate to a pointer to the assembly - useful to define things like $DOCOLON. ) : :CP ARRAY ; + +:CP $DOCONST + INC BX INC BX + PUSH @[ BX] + NEXT + +:CP $DOBCONST + INC BX INC BX + MOV AL @[ BX] + CBW + PUSH AX + NEXT + +:CP $DOUBCONST + INC BX INC BX + XOR AX AX + MOV AL @[ BX] + PUSH AX + NEXT + +: CONST DEF + dup byteval? if [ t& $DOBCONST lit ] w>t >t return then + dup 0 >= over 255 <= and if [ t& $DOUBCONST lit ] w>t >t return then + [ t& $DOCONST lit ] w>t w>t ; + L@ $$VAR CONST $DOVAR +0 CONST 0 1 CONST 1 :CP $DOCOLON MOV @[ BP] SI @@ -71,7 +87,6 @@ L@ $$VAR CONST $DOVAR MOV SI AX NEXT - :ASM BZ_ POP CX JCXZ 0 @> @@ -126,11 +141,6 @@ DEF GOTO_ L@ GOTO_IMPL w>t ( this costs 1 extra byte but should save 20 clock cycles ) MOV BX SP PUSH @[ 2 @+ SS: BX] -( POP AX - POP BX - PUSH BX - PUSH AX - PUSH BX ) NEXT :ASM scan 8 >> ; +: key>ch 0xff & ; +: scanup 0x80 | ; + +0x4b const %left +0x4d const %right +0x48 const %up +0x50 const %down +0x1c const %enter +0x01 const %esc +0x1d const %lctrl +0x2a const %lshift +0x36 const %rshift +0x38 const %lalt +0x39 const %space +0x3a const %capslock +0x3b const %f1 +: %f %f1 + ; +0x47 const %home +0x49 const %pgup +0x4f const %end +0x51 const %pgdn +0x52 const %ins +0x53 const %del +0x0e const %bs + diff --git a/logic.jrt b/logic.jrt index 831f3d1..8b10d31 100755 --- a/logic.jrt +++ b/logic.jrt @@ -39,7 +39,7 @@ dbg" math" dbg" comparisons" L: TRUE 0xffff w>t L: FALSE 0 w>t -L: RETTRUE target .hex +L: RETTRUE PUSH TRUE NEXT L: RETFALSE @@ -49,7 +49,6 @@ L: RETFALSE :ASM not POP AX OR AX AX - L@ RETTRUE .hex JZ RETTRUE JMP RETFALSE diff --git a/mines.com b/mines.com index 59d1e21d6cee7210de325dcddca649c2796e7085..bf79fb2c4974e65910d13d9d91ae4b3ad5140f0f 100755 GIT binary patch literal 3985 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 ( x y -- x y ) swap pagew boardw @ - 2/ + swap pageh boardh @ - 2/ + ; - -: boardx! ( -- ) pagew boardw @ 2* 1+ - 2/ textx! ; -: boardy! ( -- ) pageh boardh @ 2* 1+ - 2/ texty! ; +: boardx ( -- x ) pagew boardw @ 2* 1+ - 2/ ; +: boardy ( -- y ) pageh boardh @ 2* 1+ - 2/ ; +: boardx! ( -- ) boardx textx! ; +: boardy! ( -- ) boardy texty! ; : next-row ( -- ) nextline boardx! ; -: draw-board-top tl boardw @ begin .- 1- dup while dT repeat tr drop next-row ; -: draw-board-bottom bl boardw @ begin .- 1- dup while uT repeat br drop next-row ; -: draw-rowborder rT boardw @ begin .- 1- dup while .+ repeat lT drop next-row ; +: draw-border ( end mid -- ) + boardw @ begin .- 1- dup while over execute repeat drop drop execute next-row ; +: draw-board-top tl ' tr ' dT draw-border ; +: draw-board-bottom bl ' br ' uT draw-border ; +: draw-rowborder rT ' lT ' .+ draw-border ; : draw-row ( p -- p ) .| begin dup draw-square .| 1+ dup square-pos drop not until next-row ; : draw-board ( -- ) @@ -93,8 +101,8 @@ array countcolors white b, lblue b, lgreen b, red b, blue b, drop draw-board-bottom ; 0 var, reveal-state -: reveal ( p -- ) dup b@ FREVEALED | swap b! ; -: reveal-square? ( x y -- ) +: reveal ( p -- ) FREVEALED swap b!| ; +: reveal-square? ( x y -- ) square-at b@ FREVEALED = if -1 reveal-state ! then ; : reveal-pass ( -- f ) 0 reveal-state ! @@ -108,24 +116,56 @@ array countcolors white b, lblue b, lgreen b, red b, blue b, 0 const IN-PROGRESS 1 const WON 2 const LOST -IN-PROGRESS var, game-state +3 const QUIT +IN-PROGRESS bvar, game-state : check-win ( -- ) 0 board begin dup board-lim < while dup b@ dup FMINE & swap FREVEALED & or not if swap 1+ swap then - 1+ repeat drop not if WON game-state ! then ; + 1+ repeat drop not if WON game-state b! then ; : on-reveal ( p -- ) - b@ FMINE & if LOST game-state ! else check-win then ; + b@ FMINE & if LOST game-state b! else check-win then ; : autoreveal begin reveal-pass not until ; -: reveal-at square-at dup reveal autoreveal on-reveal draw-board ; -: flag-at square-at dup b@ FFLAG | swap b! draw-board ; +: reveal-at square-at dup reveal autoreveal on-reveal ; +: flag-at square-at FFLAG swap b!^ ; + +0 bvar, cursx 0 bvar, cursy + +: draw-cursor ( -- ) + 1 boxstyle! blue fg! + cursx b@ 2* boardx + textx! + cursy b@ 2* boardy + texty! + textx tl .- tr nextline textx! + textx .| dup 2 + textx! .| nextline textx! + bl .- br + 0 boxstyle! white fg! ; + +: move-cursor ( dx dy -- ) + cursy b@ + swap cursx b@ + swap 2dup valid-pos? + if cursy b! cursx b! else drop drop then ; + +: curs@ cursx b@ cursy b@ ; +0x21 const %f +: await-command + wait-key key>scan + dup %esc = if QUIT game-state b! then + dup %left = if -1 0 move-cursor then + dup %right = if 1 0 move-cursor then + dup %up = if 0 -1 move-cursor then + dup %down = if 0 1 move-cursor then + dup %f = if curs@ flag-at then + dup %enter = swap %space = or if curs@ reveal-at then ; + +: play + begin game-state b@ IN-PROGRESS = while + draw-board draw-cursor await-command repeat draw-board ; : start textmode reseed! - 15 10 15 init-board - draw-board ; + 20 12 30 init-board + play ; ' start ' main redefine diff --git a/reasm.bat b/reasm.bat index c61f5f9..751480a 100755 --- a/reasm.bat +++ b/reasm.bat @@ -1,2 +1,4 @@ assemble.com < tinyjort.jrt tinyjort.com < assemble.jrt +assemble < zipoff.jrt + diff --git a/tinyjort.com b/tinyjort.com index c43cc28848926d315963424547457630b06b5737..5145478ca60ca8c76e41a7db2f96005c3ada803d 100755 GIT binary patch literal 4754 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 InE!wCZ!_?lJOBUy literal 4709 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 literal 15332 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 ; :timm array ARRAY ; :timm allot ALLOT ; :timm :asm :ASM ; diff --git a/zipstub.seg b/zipstub.seg index d5ab06cfed6098e76c920ce74582755ecadb666b..69721138384b7f7614f7504e5bd0b6792587cf7a 100755 GIT binary patch literal 829 zcmX|<&1(}u7{>RV*=EV5_76}?1>5M!^pM~opezXLR@}cp1 zY?9z*6bW8Yxh#L!#BsPD=oI08BHbFg66z$ZB;nK`m`Z}mKw6ivFZ9$wZW4A(QAj*? zNV^M!olx#Qbo*ZwN67g%{lD%R)fpa;7jPcxxc&q|oEru&tg2CXVNJm{VcAaOOT5d! z)mdxEdF`L0HTL$C@-GP9QGA`UuC`|pwL4Ee{l4x}FMVDu!AG`L;bUrf z<2v+Ia2i{uUel7d^PYNaR^ew6(e@8yHm-jpn4wmnQY9dDxJt!{S@RNEL%IPu^!A!L W9DM13In0KPkz4Ce3|KVO1O5lcEptWy literal 807 zcmX|4JYNp~qowRrSUdugJ0u$NR10qK$;tdZ4#OkBxH6ub$`dMQ{eh}#7N zMZ}AE6GRq@v=l{4A+?uUF^V*()Y=MlskwNmKOxg^ek{B2J?}g3{CvZt`&kdz5Qkk6 zc0~AhqHQhLOQc?+QJ9%{ZS@VzGw?;$al}XxHAFTC@*^Y%KpdxHyaE&;3Q4i(IMJH& zd?=UWkSH#I4}TL z{fbx7qKTqyjj z4T+7hX1Xfc3U4l@Z^Umz%r5qR4i?fGVKbDiU^aasT=+U9spP%b zbLQ7=bvq5_^E(>f%80Q)A@d>@QN?f?iWRJhtB|3+675b?QR;C|2pWm11 R<2~fS-FGhuydwGq?*emrW|05@