From 141315b6fb8616ec0919a61078f26763026e80a4 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Fri, 1 Sep 2023 21:51:22 -0400 Subject: [PATCH] more core forth words (memory access, return stack, inline data) --- asm.jrt | 15 +++--- build.bat | 2 + minijort.c | 15 +++--- minijort.exe | Bin 81642 -> 81709 bytes minijort.prj | Bin 3743 -> 3796 bytes tinyjort.com | Bin 551 -> 1106 bytes tinyjort.jrt | 149 ++++++++++++++++++++++++++++++++++++++++++++++++--- 7 files changed, 158 insertions(+), 23 deletions(-) create mode 100755 build.bat diff --git a/asm.jrt b/asm.jrt index da665f1..5bd500f 100755 --- a/asm.jrt +++ b/asm.jrt @@ -84,14 +84,10 @@ array patchtable 10 2 cells * allot : patch-a16 ( tptr targ -- ) swap !t ; : patch-r16 ( tptr targ -- ) over 2 + - swap !t ; : patch-r8 ( tptr targ -- ) over 1 + - swap b!t ; -' patch-a16 dbg" patch-a16" drop -' patch-r16 dbg" patch-r16" drop -' patch-r8 dbg" patch-r8 " drop -: apply-patch ( tptr type -- ) target @ swap dbg" applying patch" execute ; +: apply-patch ( tptr type -- ) target @ swap execute ; : @> ( patchid -- ) 0x13 set-oparg! @] ; -: <: - ( patchid -- ) find-patch dup @ swap cell + @ swap apply-patch ; +: <: ( patchid -- ) find-patch dup @ swap cell + @ swap apply-patch ; : L: here create wordname lastlabel ! target @ , does> @ @+ ; : L@ [ ' ' , ] 2 cells + @ ; @@ -212,7 +208,7 @@ var ignoreimm : oparg-nearaddr? ( -- f ) oparg-mem? oparg-base @ -1 = and ; : >short-jmp* ( op -- ) oparg-nearaddr? if 2 diffaddr dup byteval? oparg-mempatch? or - if swap >t ' patch-r8 patchpoint cr >t 2ret then drop + if swap >t ' patch-r8 patchpoint >t 2ret then drop then drop ; : >near-reljmp* ( op -- ) oparg-nearaddr? if 3 diffaddr swap >t ' patch-r16 patchpoint w>t 2ret then drop ; @@ -299,7 +295,7 @@ var ignoreimm then swap-args 'extregmem 1 ignoreimm ! *? 0 ignoreimm ! if 2ret then ; 2 :op XCHG - arg2 oparg-reg? oparg-val @ 0x00 = arg1 oparg-wreg? and + arg2 oparg-reg? oparg-val @ 0x00 = and arg1 oparg-wreg? and if 0x90 >wreg+op* then 0x86 >bar-war* ; 2 :op MOV @@ -309,7 +305,8 @@ var ignoreimm oparg-breg? if oparg-val @ 0x0f & 0xb0 | >t arg2 oparg-val @ >t return then 0 0xc6 >extbmem* 0 0xc7 >extmem* - then ; + then + oparg-segreg? if oparg-val @ 0x8e arg2 >extwreg|mem* arg1 then ; 2 :op ADD 0x00 >6group-math* 0 >grp1* ; 2 :op ADC 0x10 >6group-math* 2 >grp1* ; 2 :op AND 0x20 >6group-math* 4 >grp1* ; diff --git a/build.bat b/build.bat new file mode 100755 index 0000000..c242798 --- /dev/null +++ b/build.bat @@ -0,0 +1,2 @@ +minijort < tinyjort.jrt + diff --git a/minijort.c b/minijort.c index a388370..25c53c6 100755 --- a/minijort.c +++ b/minijort.c @@ -5,6 +5,7 @@ #include #include #include +#include #include "minijort.h" #define STACK_OFFSET 0 @@ -517,10 +518,10 @@ void f_lookup() { // name -- (codepointer flags) | (name 0) f_wordname(); f_streq(); if (TOP().i) { - TOP().p = entry; - f_codepointer(); - f_swap(); - return; + TOP().p = entry; + f_codepointer(); + f_swap(); + return; } DROP(2); } else { @@ -796,6 +797,10 @@ void f_segalloc() { unsigned long linearaddr = ((unsigned long)FP_SEG(ptr) << 4) + ((unsigned long)FP_OFF(ptr)); int segment = ((linearaddr & 0x000ffff0UL) >> 4); + if (ptr == NULL) { + exit(1); + } + PUSHI(segment); } @@ -836,7 +841,6 @@ void f_init() { CDEF("!=", f_neq); CDEF(">=", f_ge); CDEF(">", f_gt); - CDEF("=", f_eq); CDEF("<", f_lt); CDEF("<=", f_le); CDEF("u>=", f_uge); @@ -872,7 +876,6 @@ void f_init() { CDEF("r@", f_rtop); CDEF("rdrop", f_rdrop); CDEF("rswap", f_rswap); - CDEF("fputc", f_fputc); CDEF("gets", f_gets); CDEF("number", f_number); CDEF("LIT_", f_lit_); diff --git a/minijort.exe b/minijort.exe index d90fa0669386d13132bdee24cf7d95b0a98c27ff..62876b98104ed12d47158573be0ed89347adddd3 100755 GIT binary patch delta 9949 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 r8L@>8>LRL0#JGr2Br%HG(dJZZ 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 WoP9!FTw{VmTs-~tJSNxiDFOf^(M84p delta 223 zcmca2J70E#IvdOTne)9jYqLeO@h$*F0VX*aF3lAV|NlQmOiz!2frWva!DX&kI7Aep^Z$QmhU`86LBQA1(@)PCXeSV` k`+E9$die)UHslkZ{DU`c@;p8se`H)Ll7}LwAo$=zyCApu7#{)tvFO4W4eApNqZPV&kkh9iGlc7 zd>T8fJnr6ATkkQ5S0<-XV-pWUWrfPkEgD^WH8Yl(#x9FefzVQZamKRo40rdY#_xq9 zJc{1iy}$Nut#96Vf2X()r@gp;=B>_R?NlMU*AwAvCtm%-a~r)|BP#mguG^R#4%Wr} zwS3z;uUN0!gg^p`civ@7rrmno-W)vsBToh_C95hb9QbSpK(KF zZg7aX{4&bi7(P6%T)CWG#%*qx!@>Ke@nvq6hQCkDG)!f!P}Vs+=b%b(;zDyUUurGR zJMeggPj1JQl%Tj|T|t|uM7Cq6{tP;O!O`Ma_Tu~!-7rpyO6n_Y$96fw)|xe&C#DP2 z>uwQX&tpg!Cfhk2k)6P6!ZeQmk30vP$X@MHWLHOeU6$E7e z>scGuMcC{*5MC9~W)!~T<3lwag2nJN^>D-LRNo3pjNvaL>jC+Z0%Lw)ot#EjQ}>%6 zsBoL~aZ?=S;OA|0OT$gl2dg3<5Ibk%tW2j%Nd!}dCAi&>j4UM^0ZB?|wz|eS5-OwN zBXw<;eO+m)?oKt_WL<5>8MLm8mTl2jKC1aQqzZR+L%uCOV%Ny)gBW~rpGXHy>?lnq z^Sl=%Ld~DhT}?CJa!(>0Am5Z`zUddmR-6^<4eA4Y!x5o%c3~kmOQOfr>n1~MN?hlU tRhKVS-?h_yB&Wx5?J52V|CgT-S5Nn7M-2_FAO7Tq>hgyMZX)<={{x9jc^d!# delta 432 zcmcb_v7ANer8E-*5FBNk$@G@#29W)Lk(n7J!oY9{$a}}QcA}CJBilqbh57)-2u21D z6&HVJe;Gcs@k^|-jY zxdsKfx&XB~J9o?fS9fG&VDa$`iD%fyxHbT+vW1a>*(oZX;XGsHW45(mp|zdIU}m#U zVq}xN!N>)28CzayZc=Iy!*9mU?{Q(r+1@ZtmS>b>0#f#jy7g}u1sGm#`QPx`vF2>U zVJ<7VH;gsA8eWUl?1%BzyxjbMHqic*qWl7eMy3d`9c4@m%qgV>3=^3m0w4|o+Qd>^ zo>;)Jgef9AAQM(r7|sF(BO-$X0^w>?b2CdA9y4uW ziaM(Z7Hnr?;4Dck%FWD6EJjVJHZIgun diff --git a/tinyjort.jrt b/tinyjort.jrt index d3b93e6..567c61a 100755 --- a/tinyjort.jrt +++ b/tinyjort.jrt @@ -1,6 +1,8 @@ s" defs.jrt" loadfile +dbg" loading asm.jrt" s" asm.jrt" loadfile +dbg" assembling..." ( tinyjort calling convention: SP - data stack pointer, grows down BP - return stack pointer, grows up @@ -54,6 +56,7 @@ L: LATEST 0 w>t : t' word dup strlen over DICTLIST ( word len tptr-next-entry ) begin dup while 3dup WORD= if 5 + + swap drop return then @t repeat drop drop drop 0 ; +: t& t' cell + ; : :ASM DEF target @ 2 + w>t ; @@ -65,7 +68,7 @@ L: $$CONST : CONST DEF [ L@ $$CONST lit ] w>t w>t ; L@ DICTIONARY CONST dictionary -L@ LATEST CONST latest +L@ LATEST CONST &latest L: $$VAR INC BX INC BX @@ -81,7 +84,6 @@ L: $$VAR L@ $$VAR CONST $DOVAR :CP $DOCOLON -L: $$COLON MOV @[ BP] SI INC BP INC BP INC BX INC BX @@ -93,6 +95,11 @@ L: $$COLON MOV @[ BP] SI NEXT +( some helpers for making manually defining colon words slightly less ugly ) +: '>t t' w>t ; +: @>t t& @t w>t ; +: :t DEF [ t& $DOCOLON @t lit ] w>t ; + :CP $DODEFERRED INC BX INC BX MOV BX @[ BX] @@ -103,6 +110,12 @@ L: $$COLON PUSH AX NEXT +:ASM INLINEDATA_ + LODSW + PUSH SI + MOV SI AX + NEXT + :ASM BZ_ POP CX JCXZ 0 @> @@ -221,24 +234,144 @@ L: fail-digit 0 <: INT 0x21 # NEXT +:ASM key + MOV AH 8 # + INT 0x21 # + XOR AH AH + PUSH AX + NEXT + :ASM terminate MOV AH 0x4c # MOV AL 0 # ( todo: pop ) INT 0x21 # +:ASM execute + POP BX + JMP @[ BX] + +:ASM + + POP AX POP BX + ADD AX BX + PUSH AX + NEXT + +:ASM - + POP BX POP AX + SUB AX BX + PUSH AX + NEXT + +:ASM * + POP BX POP AX + IMUL BX + PUSH AX + NEXT + +:ASM @ + POP BX + MOV AX @[ BX] + PUSH AX + NEXT + +:ASM b@ + POP BX + MOV AL @[ BX] + CBW + PUSH AX + NEXT + +:ASM @far + POP ES POP BX + MOV AX @[ ES: BX] + PUSH AX + NEXT + +:ASM b@far + POP ES POP BX + MOV AL @[ ES: BX] + CBW + PUSH AX + NEXT + +:ASM ! + POP BX POP AX + MOV @[ BX] AX + NEXT + +:ASM b! + POP BX POP AX + MOV @[ BX] AL + NEXT + +:ASM !far + POP ES POP BX POP AX + MOV @[ ES: BX] AX + NEXT + +:ASM b!far + POP ES POP BX POP AX + MOV @[ ES: BX] AL + NEXT + +:ASM >r + POP AX + MOV @[ BP] AX + INC BP INC BP + NEXT + +:ASM t &here '>t @ '>t return +:t here! '>t &here '>t ! '>t return +0xffff CONST there + +:t latest '>t &latest '>t @ '>t return +:t latest! '>t &latest '>t ! '>t return + +0 VAR, lastseg +:t segalloc '>t lastseg '>t @ '>t LIT_ 4096 w>t '>t + + '>t dup '>t lastseg '>t ! '>t return + ( test program ) -ARRAY hex65 key 0 >t key x >t key 6 >t key 5 >t 0 >t +ARRAY hex65 key 6 >t key 5 >t 0 >t L: test-word t' hex65 w>t t' number w>t t' drop w>t t' emit w>t t' terminate w>t -0x101 @t . 9 <: ( actual entry point ) -0x101 @t . LEA SI test-word - ( TODO: configure stacks ) - NEXT + PUSH CS + POP AX + ADD AX 4096 # + MOV SS AX + MOV t& lastseg @+ AX + MOV SP 0xfe # + MOV BP 0x00 # + NEXT -.s +target @ t& &here !t +dbg" Program assembled, saving tinyjort.com" s" tinyjort.com" overwrite 0x100 target @ :noname for i tseg b@far fputc next ; execute close