From adaf3c8e6f0692685cfbb88356047c6d2baa6d4a Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sat, 16 Sep 2023 22:45:42 -0400 Subject: [PATCH] { and } for switching between host / target compilers better word-lookup logic endless bugfixes --- assemble.com | Bin 12705 -> 12722 bytes defs.jrt | 1 + game.jrt | 14 +++++---- text.jrt | 67 ++++++++++++++++++++++++------------------ zipoff.com | Bin 14917 -> 15227 bytes zipoff.jrt | 80 ++++++++++++++++++++++++++++++++++++++------------- zipstub.seg | Bin 732 -> 757 bytes 7 files changed, 109 insertions(+), 53 deletions(-) diff --git a/assemble.com b/assemble.com index 085c1c25c9d5a5db5ff146de95518a2f8a1d0114..7832df7dd6b1e729edef44f22b39b9b4aad67667 100755 GIT binary patch delta 7441 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 delta 7497 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 VMQl@3SOiRWT6Mm1VsGQ({{tIWgqZ*U diff --git a/defs.jrt b/defs.jrt index 0b88ebc..1463516 100755 --- a/defs.jrt +++ b/defs.jrt @@ -10,6 +10,7 @@ : array new-word $DOVAR , ; : create new-word $DOCREATE , 0 , ; +: var, array , ; : finishcreate ( ipfirst -- ) ( set cell after codepointer to first instruction of does> ) diff --git a/game.jrt b/game.jrt index 979947d..8a2f7f5 100755 --- a/game.jrt +++ b/game.jrt @@ -1,9 +1,13 @@ -s" text.jrt" loadfile +import text.jrt -key fill-page -nextline nextline nextline -t" Hello, inline assembler!" draw-text nextline -t" What a lovely day" draw-text 0xf5 textpen !t t" it is!" draw-text +:noname +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 diff --git a/text.jrt b/text.jrt index 8d20f77..9e7a428 100755 --- a/text.jrt +++ b/text.jrt @@ -1,46 +1,56 @@ -:ASM textmode +:asm textmode MOV AX 0x03 # INT 0x10 # NEXT -0 VAR, textpageid -0 VAR, textpage -:t page! dup textpageid ! 12 << textpage ! ; +0 var, textpageid +0 var, textpage -:ASM showpage +: page! dup textpageid ! 12 << textpage ! ; + +:asm showpage POP AX MOV AH 0x05 # INT 0x10 # NEXT -:ASM movecursor ( xy -- ) +:asm movecursor ( xy -- ) MOV BH textpageid @+ MOV AH 0x02 # POP DX INT 0x10 # NEXT -:ASM cursorshape! ( shape -- ) +:asm cursorshape! ( shape -- ) POP CX MOV AH 0x01 # INT 0x10 # NEXT -:t hidecursor 0x2607 cursorshape! ; -:t showcursor 0x0607 cursorshape! ; +: hidecursor 0x2607 cursorshape! ; +: showcursor 0x0607 cursorshape! ; -0x0f VAR, textpen +0x0f var, textpen -80 CONST pagew -25 CONST pageh + 0 const black 1 const blue 2 const green 3 const cyan + 4 const red 5 const magenta 6 const brown 7 const lgray + 8 const gray 9 const lblue 10 const lgreen 11 const lcyan +12 const lred 13 const lmagenta 14 const yellow 15 const white -0xb800 CONST TEXTMEM -: PREP-TEXTCOPY +: fg! textpen @ 0xf0 & | textpen ! ; +: bg! 4 << textpen @ 0x0f & | textpen ! ; + +80 const pagew +25 const pageh + +0xb800 const TEXTMEM + +} : PREP-TEXTCOPY MOV ES t& TEXTMEM @+ MOV AH textpen @+ - MOV DI textpage @+ ; + MOV DI textpage @+ ; { -:ASM fill-page ( char -- ) +:asm fill-page ( char -- ) INT 3 # POP AX PREP-TEXTCOPY @@ -48,29 +58,30 @@ REPZ STOSW NEXT -0 VAR, textpos -:t textx textpos @ 1 >> pagew % ; -:t texty textpos @ 1 >> pagew / ; -:t textx! texty pagew 1 << * + textpos ! ; -:t texty! pagew 1 << * textx + textpos ! ; -:t nextline texty 1+ pagew 1 << * textpos ! ; +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 ! ; -: PREP-TEXTCOPY-XY - PREP-TEXTCOPY - ADD DI textpos @+ ; +} : PREP-TEXTCOPY-XY + PREP-TEXTCOPY + ADD DI textpos @+ ; { -:ASM draw-text ( s -- ) +:asm draw-text ( s -- ) MOV BX SI POP SI PREP-TEXTCOPY-XY -L: draw-next-char +0 :> LODSB OR AL AL JZ 0 @> STOSW - JMP draw-next-char + JMP 0 <@ 0 <: SUB DI textpage @+ MOV textpos @+ DI MOV SI BX NEXT + diff --git a/zipoff.com b/zipoff.com index 533a9e8356d8decbe31b7fd51e5285f9e0d15e0d..387d9c5176616b980a2f5ca1be2ede344f631332 100755 GIT binary patch literal 15227 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

6;?_{PhUTv8v<){K=vzv}4V+we|Jx>RMVvU=70` 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 literal 14917 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 diff --git a/zipoff.jrt b/zipoff.jrt index eab6c38..39fe2d5 100755 --- a/zipoff.jrt +++ b/zipoff.jrt @@ -48,28 +48,41 @@ asm-com : tdict| ' tdict ' dictionary redefine ; : |tdict ' primary-dict ' dictionary redefine ; -: DEF asm-com tdict| new-word latest wordname lastlabel ! |tdict $DOFAR , target , ; +: DEF asm-com ' dictionary definition ( preserve the current dictionary ) + tdict| new-word latest wordname lastlabel ! |tdict $DOFAR , target , + ' dictionary redefine ; : :asm asm-here new-word here cell + , ; s" coredefs.jrt" loadfile -( now we have LIT_ and can hook the compiler ) -: chained-lookup +( now we have LIT_ and can hook the full compiler ) +: pri-targ-lookup primary-dict dict-lookup dup if return then drop tdict dict-lookup ; -: tcomp| tdict| - ' lookup-current ' lookup redefine +: targ-pri-lookup + ( only allow lookup from primary dict if not compiling - this allows + using assembly words without duplicating them in the target dictionary ) + tdict dict-lookup dup state or if return then + drop primary-dict dict-lookup ; + +: { tdict| asm-com + ' targ-pri-lookup ' lookup redefine :| cell + @ w>t |; ' compileword redefine :| t, LIT_ w>t |; ' compilenum redefine ; -: |tcomp |tdict - ' chained-lookup ' lookup redefine +: } |tdict asm-here + ' pri-targ-lookup ' lookup redefine ' , ' compileword redefine ' lit ' compilenum redefine ; -: :timm tcomp| new-word immediate |tcomp $DOCOLON , ] ; -:timm [[ |tcomp ['] [ ; : ]] tcomp| ] ; -:timm ; t, return |tcomp ['] [ ; +: >{ dictionary tdict = { ; +: }< if { else } then ; + +( 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 ; t, return ['] [ ; :timm ( ['] ( ; @@ -83,31 +96,58 @@ s" coredefs.jrt" loadfile :timm again t, GOTO_ w>t ; :timm until t, BZ_ w>t ; -:timm s" t' INLINEDATA_ w>t patchpt - begin key dup [ key " lit ] != while >t repeat drop patch!t ; +:timm s" t, INLINEDATA_ patchpt + begin key dup [ key " lit ] != while >t repeat drop 0 >t patch!t ; -:timm :| t, INLINEDATA_ patchpt t, $DOCOLON ; +:timm :| t, INLINEDATA_ patchpt t& $DOCOLON w>t ; :timm |; t, return patch!t ; -: :t DEF [ t& $DOCOLON lit ] w>t ]] ; -: CREATE DEF [ t& $DOCREATE lit ] w>t 0 w>t ; -: FINISHCREATE tcomp| latest |tcomp codepointer cell + @ cell + !t ; -: DOES> target lit ' FINISHCREATE , ' return , tcomp| ; immediate +: :t DEF t& $DOCOLON w>t ] { ; +:timm : :t ; +:timm ' ['] t' ; +:timm :noname target t& $DOCOLON w>t ] ; +:timm const CONST ; +:timm var, VAR, ; +:timm var 0 VAR, ; +:timm array ARRAY ; +:timm allot ALLOT ; +:timm :asm :ASM ; +:timm , w>t ; :timm b, >t ; +:timm lit compilenum ; -: t" target begin key dup [ key " lit ] != while >t repeat 0 >t drop ; +: CREATE DEF t& $DOCREATE w>t 0 w>t ; +: FINISHCREATE { latest } codepointer cell + @ cell + !t ; +: DOES> target lit ' FINISHCREATE , ' return , { ; immediate -s" logic.jrt" loadfile +: import >{ >r word loadfile t repeat drop close ; -:init comfilename @ readcom ; +:init comfilename @ readcom { ; : writeenv ( comfile wrapper -- ) swap comfilename ! dup type cr writeself comfilename @ dup type cr writecom ; +DEFERRED main terminate + +dbg" boot" + +9 <: ( actual entry point ) + MOV SI t& main # + PUSH CS + POP AX + ADD AX 4096 # + MOV SS AX + MOV SP 0x100 # + MOV BP 0x00 # + NEXT + here s", zipstub.seg" s" zipoff.com" writeenv + diff --git a/zipstub.seg b/zipstub.seg index 3105d9f46ae199ddb24961c5870335a74804523a..425cc9c53721889b431765883013a197a7bff4cf 100755 GIT binary patch delta 38 ucmcb^`jwUW