From 8eadd6171ad47b9f20a409f0581ed6810f06e312 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Fri, 22 Sep 2023 20:38:58 -0400 Subject: [PATCH] minesweeper, random number generator, debugging assembler --- asm.jrt | 4 +- assemble.com | Bin 12752 -> 12769 bytes debug.jrt | 3 ++ jort.com | Bin 4675 -> 4709 bytes logic.jrt | 3 +- mines.jrt | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++ random.jrt | 23 ++++++++++++ 7 files changed, 133 insertions(+), 3 deletions(-) create mode 100755 debug.jrt create mode 100755 mines.jrt create mode 100755 random.jrt diff --git a/asm.jrt b/asm.jrt index 72df354..9e2413a 100755 --- a/asm.jrt +++ b/asm.jrt @@ -36,7 +36,7 @@ array oparg2 3 cells allot : byteop? ( -- f ) oparg-breg? swap-args oparg-breg? or swap-args byteptr? or ; -: byteval? ( v -- f ) dup 0x7f <= swap -0x80 >= and ; +: byteval? ( v -- f ) dup 0x7f <= swap 0xff80 >= and ; : oparg-bwreg? ( -- f ) byteop? if oparg-breg? else oparg-wreg? then ; : operror ( err -- ) lastop @ type s" near " type lastlabel @ type s" : " type type cr ; @@ -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 byteval? oparg-mempatch? or + 2 diffaddr dup dbg" jumping by" 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 4d851c17da3a4f3ed9be2e4cfb68bfcc4af22ea8..f50cd91a893730287d4bebdf0c01e5fc8cb348a7 100755 GIT binary patch delta 2435 zcmYk8e{54#6vywquiY30VI8b3t7aSB+O>UMUnOY&V53_L+tRHI+jNX%gdq+WC$nsJ z6XY%aL4XK>_YkA_2TCFs!8wt@A1sIwg2pI+m~4?m9=}vD63xIU|LD2r-lEB}_1@3@ ze$Tn*-g~+$8?SHl-D!3{=|8P)iB3gVYE9)S@0r-H+C=PTu&Z=Lb7DRH&tF2P&C~vJ{aS#MF>28vvNB-M zs{w_yv}MR8I#KzTBrhYmA7G@V0fDndNU{hXtKkwsLXvDn;;#Wo4@y!J3?oRO1c_eR zE71s|9*!DPC>oXI6(qylErGz0ActTd2OS7Ll3*0UF$^Qfmy(Pj`J9t>9z~z1{86G; z5&eKjRzQ+%Nbd7EX^i6xiVAE;@K_MsR*RfNlDvk*&q-R4lq5TlB!XbJnq1PM(Ca19 zkzA-KAn8n|y-ieZR6+~kaL|rWus0>Uj_g3th72>Dl;{Scb%0tLyM^i-iEeVF)5|=^ z)^=3=jA+>9W%iIo?Zl%0kkKlO-XRCzGW`kyi{2&Y;kOOhvTB3wsI-yBL|PQaAL51K z2CKk8d1UYl8n8#AYfB5s;HJUsCbKlUx&DFc{s^Z)S$P(-=OzVu>lktvO)0cWGw7u4X|d$HxBBS@Qlx()#2iN zp6061f)FP|xJInsj-UDS%qb4{c*x=QvVEvbo8zG}y-&v6AD&O@miK43j0~xR8-_QF zh#x@2@1=tc9j4t5H_!Dh%o@~z_4pG%^WAnbi!LN8aHpDtH|}tM=ySMdd=@1*8&vs@ z|C>*mOTuowRki5z)p6E^)S~WnYWK2a?fPx@I^SjV`vMX#8X;S&9C)#2gx z7A=NMx%n(u@v6lcFt=U;yLAtEylj4i@4=!Es^Y9Z(hf6a5sS{?=q!v@M4DW@LMpB+ zV)4irt*_!|#n zyVRh32fv$NsG4h0tyr;-%(|9UTdrBxPGA9ZZlp|))bfn@IbI59Y{x$(Cn4OhGaJqp*aRb=e4&ZI?7Q( zpbJt|h~!gMA#IsXtmxIK_&Q+Z0KBGY(6pt*-FhI2f@D9OLTi^uVSy$zHY5{%8)?oX zy+$%Svfum)Nj8fcmz1OcNtFhwJnEIG5Yb8K>gkmDx*XGZ$p<{MuCsWh-_|U;m#l+E zxtU*^G;g{2%g-B%c_eBpJFEff{y!4$!k~Yc=c5&RN$jZRWlGGVbKu?P;6IBg7?;4f zNRIO_q8?YOv0N#?@%feYu|1&5<1^l5B3na;9S9irgYsHG>|995Y>_(7lrUM2a~g u;+ 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 QB$ekCtjj~7|0m7A01R|E@Bjb+ diff --git a/logic.jrt b/logic.jrt index 8b10d31..831f3d1 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 +L: RETTRUE target .hex PUSH TRUE NEXT L: RETFALSE @@ -49,6 +49,7 @@ L: RETFALSE :ASM not POP AX OR AX AX + L@ RETTRUE .hex JZ RETTRUE JMP RETFALSE diff --git a/mines.jrt b/mines.jrt new file mode 100755 index 0000000..bf3f822 --- /dev/null +++ b/mines.jrt @@ -0,0 +1,103 @@ +import text.jrt +import random.jrt + +30 const maxw 16 const maxh +array board maxw maxh * allot + +10 var, boardw +10 var, boardh +15 var, minecount + +: board-lim boardw @ boardh @ * board + ; +: square-at ( x y -- p ) boardw @ * + board + ; +: square-pos ( p -- x y ) board - boardw @ /mod swap ; + +: valid-pos? ( x y -- f ) + dup 0 >= swap boardh @ < and + swap dup 0 >= swap boardw @ < and and ; + +0x80 const FMINE +0x40 const FREVEALED +0x20 const FFLAG +0x0F const NEIGHBOUR-MASK + +: place-mine ( x y -- f ) + square-at dup b@ FMINE & not if FMINE swap b! 0 then not ; +: rand-mine ( -- ) + begin rand boardw @ % rand boardh @ % place-mine until ; + +: reset-board + board begin dup board-lim < while 0 over b! 1+ repeat drop ; +: populate-board + minecount @ begin rand-mine 1- dup not until drop ; +: mine-at? ( x y -- f ) + square-at b@ FMINE & ; + +: do-at ( x y cp -- ) + >rot 2dup valid-pos? if r over 1- over 1- r@ do-at + over 1- over r@ do-at + over 1- over 1+ r@ do-at + over over 1- r@ do-at + over over 1+ r@ do-at + over 1+ over 1- r@ do-at + over 1+ over r@ do-at + swap 1+ swap 1+ screen ( x y -- x y ) + swap pagew boardw @ - 2/ + + swap pageh boardh @ - 2/ + ; + +: draw-board ( -- ) + board begin dup board-lim < while + dup square-pos pos>screen textxy! + dup draw-square 1+ repeat drop ; + +0 var, reveal-state +: reveal ( p -- ) dup b@ FREVEALED | swap b! ; +: reveal-square? ( x y -- ) + square-at b@ FREVEALED = if -1 reveal-state ! then ; +: reveal-pass ( -- f ) + 0 reveal-state ! + board begin dup board-lim < while + dup b@ FREVEALED & not if + 0 reveal-state b! + dup square-pos ' reveal-square? do-at-neighbours + reveal-state b@ if dup reveal then then + 1+ repeat drop reveal-state @ ; + +: reveal-all begin reveal-pass not until ; +: reveal-at square-at reveal ( reveal-all ) draw-board ; + +: start + textmode + reseed! + 15 10 15 init-board + draw-board ; + diff --git a/random.jrt b/random.jrt new file mode 100755 index 0000000..320fc2b --- /dev/null +++ b/random.jrt @@ -0,0 +1,23 @@ +( https://codebase64.org/doku.php?id=base:16bit_xorshift_random_generator ) +1 var, prngstate +:asm rand + MOV AX prngstate @+ + MOV BX AX + RCR BX 1 # + XOR AH BL ( high part of x ^= x << 7 ) + MOV BH AH + RCR BH 1 # ( BH now has x >> 9 and high bit comes from low byte ) + XOR AL BH ( x ^= x >> 9 and the low part of x ^= x << 7 done ) + XOR AH AL ( x ^= x << 8 ) + MOV prngstate @+ AX + PUSH AX + NEXT + +:asm ticks + XOR AX AX + INT 0x1a # + PUSH DX + NEXT + +: reseed! ticks prngstate ! ; +