From 218fd0a8ef3292103b28b5c0f525cc023b7875f9 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sun, 17 Sep 2023 22:24:14 -0400 Subject: [PATCH] invert { and }, more immediate word helpers, box-drawing --- assemble.com | Bin 12722 -> 12756 bytes game.jrt | 10 +++-- logic.jrt | 12 ++++++ testgame.com | Bin 0 -> 1297 bytes text.jrt | 105 +++++++++++++++++++++++++++++++++++++++++++++------ tinyjort.com | Bin 4675 -> 4709 bytes tinyjort.jrt | 2 +- zipoff.com | Bin 15227 -> 15336 bytes zipoff.jrt | 64 ++++++++++++++++++------------- zipstub.seg | Bin 757 -> 807 bytes 10 files changed, 151 insertions(+), 42 deletions(-) create mode 100755 testgame.com diff --git a/assemble.com b/assemble.com index 7832df7dd6b1e729edef44f22b39b9b4aad67667..cbfb0cec176e17bf05eee2d2a3000d645b156593 100755 GIT binary patch literal 12756 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 literal 12722 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 ZV)RiZW{BkI{VBtxJ^fy2IAvCx{|k==V|V}n diff --git a/game.jrt b/game.jrt index 8a2f7f5..33f2010 100755 --- a/game.jrt +++ b/game.jrt @@ -1,13 +1,15 @@ import text.jrt -:noname +:noname textmode 30 textx! 12 texty! blue bg! lgray fg! [ key lit ] fill-page s" Hello, inline assembler!" draw-text nextline s" What a lovely day" draw-text lblue bg! white fg! -s" it is!" draw-text -; execute -terminate +s" it is!" draw-text ; + +' main redefine + +{ s" testgame.com" writecom } diff --git a/logic.jrt b/logic.jrt index a3e014d..8b10d31 100755 --- a/logic.jrt +++ b/logic.jrt @@ -129,6 +129,18 @@ dbg" bitwise" PUSH AX NEXT +:ASM 2* + POP AX + SHL AX 1 # + PUSH AX + NEXT + +:ASM 2/ + POP AX + SHR AX 1 # + PUSH AX + NEXT + dbg" mem" :ASM @ POP BX diff --git a/testgame.com b/testgame.com new file mode 100755 index 0000000000000000000000000000000000000000..c371e18c4f02b62577fd06983e8bce9d8a477d36 GIT binary patch literal 1297 zcmYjRU1$_n6u#&F>==I%CHPPTGeJzY)(6EB&BKP`lAw%{)qu`85=hOqM%F~kvLPTC z>PsdICWwD8rHG{fEZ+L4Y@t{-bs|*kNchPeD~gS z4l@(Jrvfa<=jLT@PUikQH4}R<*hB`KXprNl?#0Th?lACWZ89mh7J|F7HV*1XNF0D9 zlP!^!fCL0N(%6_x27hSHhvw#dj%c2MWHMhRYZpEFtqWVffkH}q@}QS9P}mpT*YsQP zUc?HT79!~fxDKvXZiAaL8^^%)TT(41n83i>(~`o!w*7^1$`ttz1TX4j57qj=%7-=` z#3%;1MF*9%xa%4juU zEw$pgFlh=oLftP6%TnL{G*bJhyThmhsFtP;KaYI#uch~?z2;;%ORs?k4z7QKVp0+! z>u#7Z|I1!MDiGNw)*3`q>v7*-`&OT>7x+Zl4#|ljb?^w*lA%(j> zL6DIWf9Rf$&GLboUY>7Q&u=}lW``I1b)Z7DvwCn@$cOdlKE#)GTn{({5puQm(}T1^ zsChWBpi~N#`Jk^8hv`DjczZ=K+xl?{tYMY7x@0uVhr^Qm3~LHdh(0B%skLN_P{Vh` zN&XAJz<=a@V3W6e2%d@^=}e|;qutS&>F7+`ZQb4JqhDsy$E!(?I3$LkB=#R}%i3*r hrYo1u^xExhy_oq9kGYA*48e++-I29Bx|QF9{{f2a+PeS% literal 0 HcmV?d00001 diff --git a/text.jrt b/text.jrt index 9e7a428..a7c2df9 100755 --- a/text.jrt +++ b/text.jrt @@ -45,10 +45,10 @@ 0xb800 const TEXTMEM -} : PREP-TEXTCOPY +{ : PREP-TEXTCOPY MOV ES t& TEXTMEM @+ MOV AH textpen @+ - MOV DI textpage @+ ; { + MOV DI textpage @+ ; } :asm fill-page ( char -- ) INT 3 # @@ -59,15 +59,20 @@ NEXT 0 var, textpos -: textx textpos @ 1 >> pagew % ; -: texty textpos @ 1 >> pagew / ; -: textx! 1 << texty pagew 1 << * + textpos ! ; -: texty! pagew 1 << * textx 1 << + textpos ! ; -: nextline texty 1+ pagew 1 << * textpos ! ; +: textx textpos @ 2/ pagew % ; +: texty textpos @ 2/ pagew / ; +: textx! texty pagew * + 2* textpos ! ; +: texty! pagew * textx + 2* textpos ! ; +: textxy! pagew * + 2* textpos ! ; +: nextline texty 1+ pagew * 2* textpos ! ; -} : PREP-TEXTCOPY-XY +{ : PREP-TEXTCOPY-XY PREP-TEXTCOPY - ADD DI textpos @+ ; { + ADD DI textpos @+ ; + + : CORRECT-TEXTPOS + SUB DI textpage @+ + MOV textpos @+ DI ; } :asm draw-text ( s -- ) MOV BX SI @@ -80,8 +85,86 @@ STOSW JMP 0 <@ 0 <: - SUB DI textpage @+ - MOV textpos @+ DI + CORRECT-TEXTPOS MOV SI BX NEXT +:asm draw-char ( char -- ) + POP AX + PREP-TEXTCOPY-XY + STOSW + ADD textpos @+ 2 # + NEXT + +:asm draw-hrepeat ( count char -- ) + POP AX + POP CX + JCXZ 1 @> + PREP-TEXTCOPY-XY + SHL CX 1 # + ADD textpos @+ CX + SHR CX 1 # + REPZ STOSW +1 <: + NEXT + +:asm draw-vrepeat ( count char -- ) + POP AX + POP CX + JCXZ 1 @> + PREP-TEXTCOPY-XY +0 :> + STOSW + ADD DI pagew 1- 1 << # + DEC CX + JNZ 0 <@ + CORRECT-TEXTPOS +1 <: + NEXT + +( box drawing words ) +var boxstyle +: hstyle boxstyle @ 0x01 & ; +: hstyle! 1 & boxstyle @ 0xfe & | boxstyle ! ; +: vstyle boxstyle @ 0x02 & 1 >> ; +: vstyle! 1 & 1 << boxstyle @ 0xfd & | boxstyle ! ; +: boxstyle! dup hstyle! vstyle! ; +: filled? boxstyle @ 0x04 & ; +: filled boxstyle @ 0x04 | boxstyle ! ; +: hollow boxstyle @ 0xfb & boxstyle ! ; + +: hchar hstyle if 0xcd else 0xc4 then ; +: vchar vstyle if 0xba else 0xb3 then ; +: hline ( count -- ) hchar draw-char ; +: vline ( count -- ) vchar draw-char ; + +dictionary .hex +{ : :corner CREATE >t >t >t >t DOES} boxstyle @ 0x03 & + b@ draw-char ; +dictionary .hex +0xda 0xd6 0xd5 0xc9 :corner tl +dictionary .hex +0xbf 0xb7 0xb8 0xbb :corner tr +0xc0 0xd4 0xd3 0xc8 :corner bl +0xd9 0xbe 0xbd 0xbc :corner br + +: boxtop ( w -- ) textx swap tl 2 - hline tr nextline textx! ; +: boxbottom ( w -- ) bl 2 - hline br ; + +: hollow-boxmiddle ( h w -- ) + textpos @ >r + textx + textx! dup vline + r + 2 - swap + begin dup while 1- + vchar draw-char over 2 - 32 swap draw-hrepeat vchar draw-char + nextline r@ textx! + repeat 2drop rdrop ; +: boxmiddle filled? if filled-boxmiddle else hollow-boxmiddle then ; + +: draw-box ( w h -- ) + swap dup boxtop ( h w ) + swap over boxmiddle + boxbottom ; + diff --git a/tinyjort.com b/tinyjort.com index 2164fffe07ba08335bdc565929e4046a4515573e..c43cc28848926d315963424547457630b06b5737 100755 GIT binary patch literal 4709 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 QB$ekCtjj~7|0m7A01R|E@Bjb+ diff --git a/tinyjort.jrt b/tinyjort.jrt index d06bead..6177379 100755 --- a/tinyjort.jrt +++ b/tinyjort.jrt @@ -98,7 +98,7 @@ DEFERRED dictionary primary-dict :t segalloc lastseg @ 4096 + dup lastseg ! ; 2 CONST cell -:t cells cell * ; +:t cells 2* ; :t allot [ target ] dup BZ_ [ patchpt ] 1- 0 here b! here 1+ here! GOTO_ [ swap w>t patch!t ] drop ; diff --git a/zipoff.com b/zipoff.com index 387d9c5176616b980a2f5ca1be2ede344f631332..a95a09c74047d7515d70303b8efd23163307a46c 100755 GIT binary patch literal 15336 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

6;?_{PhUTv8v<){K=vzv}4V+we|Jx>RMVvU=70` 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 diff --git a/zipoff.jrt b/zipoff.jrt index 39fe2d5..ff83f39 100755 --- a/zipoff.jrt +++ b/zipoff.jrt @@ -45,12 +45,15 @@ asm-com : t, tlookup state if lit ' w>t , else w>t then ; immediate : '>t tlookup w>t ; -: tdict| ' tdict ' dictionary redefine ; -: |tdict ' primary-dict ' dictionary redefine ; +: with-dict ( cp dictcp ) + ' dictionary definition >r + ' dictionary redefine + execute + t |; ' compileword redefine - :| t, LIT_ w>t |; ' compilenum redefine ; - -: } |tdict asm-here +: { ' primary-dict ' dictionary redefine ' pri-targ-lookup ' lookup redefine ' , ' compileword redefine ' lit ' compilenum redefine ; -: >{ dictionary tdict = { ; -: }< if { else } then ; +: } asm-com + ' tdict ' dictionary redefine + ' targ-pri-lookup ' lookup redefine + :| cell + @ w>t |; ' compileword redefine + :| t, LIT_ w>t |; ' compilenum redefine ; ( we mark all target words with no associated code in the target segment as immediate, as it is impossible to compile a reference to them. ) -: :timm >{ new-word immediate } $DOCOLON , ] }< ; -:timm [ ['] [ ; :timm ] ] ; :timm } } ; +: :timm } new-word immediate { $DOCOLON , ] ; +:timm [ ['] [ ; :timm ] ] ; :timm ; t, return ['] [ ; - :timm ( ['] ( ; :timm if t, BZ_ patchpt ; @@ -96,14 +96,14 @@ s" coredefs.jrt" loadfile :timm again t, GOTO_ w>t ; :timm until t, BZ_ w>t ; -:timm s" t, INLINEDATA_ patchpt - begin key dup [ key " lit ] != while >t repeat drop 0 >t patch!t ; +: t", begin key dup [ key " lit ] != while >t repeat drop 0 >t ; +:timm s" state if t, INLINEDATA_ patchpt t", patch!t else target t", then ; :timm :| t, INLINEDATA_ patchpt t& $DOCOLON w>t ; :timm |; t, return patch!t ; -: :t DEF t& $DOCOLON w>t ] { ; -:timm : :t ; +:noname DEF t& $DOCOLON w>t ] ; +:timm : [ dup , ] ; :timm :t [ , ] ; :timm ' ['] t' ; :timm :noname target t& $DOCOLON w>t ] ; :timm const CONST ; @@ -114,21 +114,31 @@ s" coredefs.jrt" loadfile :timm :asm :ASM ; :timm , w>t ; :timm b, >t ; :timm lit compilenum ; +:timm deferred DEFERRED ; +dbg" CREATE" : CREATE DEF t& $DOCREATE w>t 0 w>t ; -: FINISHCREATE { latest } codepointer cell + @ cell + !t ; -: DOES> target lit ' FINISHCREATE , ' return , { ; immediate +: FINISHCREATE ' latest ' tdict with-dict codepointer cell + @ cell + !t ; +: DOES} target lit ' FINISHCREATE , ' return , } ; immediate -: import >{ >r word loadfile t repeat drop close ; -:init comfilename @ readcom { ; +:init comfilename @ readcom } ; : writeenv ( comfile wrapper -- ) swap comfilename ! @@ -139,8 +149,10 @@ DEFERRED main terminate dbg" boot" +} : start main terminate ; { + 9 <: ( actual entry point ) - MOV SI t& main # + MOV SI t& start # PUSH CS POP AX ADD AX 4096 # diff --git a/zipstub.seg b/zipstub.seg index 425cc9c53721889b431765883013a197a7bff4cf..d5ab06cfed6098e76c920ce74582755ecadb666b 100755 GIT binary patch delta 207 zcmey$x}1&qB|q~<=47V&h>H&b)^;BLuU^O;aq$I&S;HLt-yAI1#vI+nJ_8~;3B)#d z0^!VOW{*~bDq0O|hORnWG~*Aj};gB~albKz4*0RN^8~4KsTuL{&PYAk)5k%zP07tPBEu7xpkP K?qy&A8wCI_*+L)y