From 74171670b2ff2e41c4aadb04a69c26d9771c357e Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Mon, 4 Sep 2023 23:24:12 -0400 Subject: [PATCH] dictionary words, limited "target" compiler --- boot.jor | 5 +- defs.jrt | 4 +- lookup.jrt | 14 +++ minijort.c | 8 +- minijort.exe | Bin 80839 -> 80923 bytes minijort.h | 4 +- minijort.prj | Bin 3796 -> 3796 bytes tinyjort.com | Bin 1995 -> 3158 bytes tinyjort.jrt | 320 ++++++++++++++++++++++++++++++++++++++++----------- 9 files changed, 281 insertions(+), 74 deletions(-) create mode 100755 lookup.jrt diff --git a/boot.jor b/boot.jor index 71f07ee..a63697f 100755 --- a/boot.jor +++ b/boot.jor @@ -7,8 +7,7 @@ 13 const '\r' key const sp -128 const F_IMMEDIATE -0x100 const F_USERWORD +0x100 const F_IMMEDIATE : cr '\n' emit ; : bl sp emit ; @@ -60,7 +59,7 @@ key const sp ( image loading ) : noop ; -: defer word new-word $DODEFERRED , ' noop , ; +: defer new-word $DODEFERRED , ' noop , ; : redefine ( cp cpdeferred ) cell + ! ; : definition ( cpdeferred ) cell + @ ; diff --git a/defs.jrt b/defs.jrt index 9585aaa..f0737f0 100755 --- a/defs.jrt +++ b/defs.jrt @@ -27,8 +27,8 @@ : :noname here $DOCOLON , ] ; -: array word new-word $DOVAR , ; -: create word new-word $DOCREATE , 0 , ; +: array new-word $DOVAR , ; +: create new-word $DOCREATE , 0 , ; : finishcreate ( ipfirst -- ) ( set cell after codepointer to first instruction of does> ) diff --git a/lookup.jrt b/lookup.jrt new file mode 100755 index 0000000..470c6c1 --- /dev/null +++ b/lookup.jrt @@ -0,0 +1,14 @@ +:t entry= ( name len entry -- f ) + dup wordname swap wordlen t ] + ( fail ) [ patch!t swap patch!t ] drop drop 0 return + ( success ) [ patch!t ] drop drop 1 ; + +:t lookup ( name -- cp meta | name 0 ) + dup strlen over dictbucket + [ target @ ] @ dup . dup BZ_ [ patchpt ] + 3dup entry= BZ_ [ swap w>t ] + ( entry found ) >rot drop drop dup codepointer swap wordflags @ return + ( end of list ) [ patch!t ] drop drop 0 ; diff --git a/minijort.c b/minijort.c index 267c2a3..1900834 100755 --- a/minijort.c +++ b/minijort.c @@ -345,7 +345,7 @@ void f_bcomma() { DROP(1); } -void f_create() { // name -- +void f_create() { // word -- int namelen; HERE->p = LATEST; LATEST = HERE; @@ -357,6 +357,10 @@ void f_create() { // name -- DROP(1); } +void f_newword() { + f_word(); + f_create(); +} void f_cdef() { // func name -- f_create(); f_comma(); @@ -765,7 +769,7 @@ void f_init() { CDEF("word", f_word); CDEF("immediate", f_immediate); CDEF("execute", f_execute); - CDEF("new-word", f_create); + CDEF("new-word", f_newword); CDEF("here", f_here); CDEF("here!", f_here_set); CDEF("there", f_there); diff --git a/minijort.exe b/minijort.exe index ca92ae2396c5617bc79212e0181c8c4441755e9d..f50beb65d958834dd4ff0fea283a783cd1ee63f5 100755 GIT binary patch delta 12035 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 delta 149 zcmca2dqsAGIvaD?7NyNvY*B2iTnuLyC{FI=$>a^$q7=>`&A{+#5d%Zh=Z7`8K9W%$UT$;ikk%lQAl9D^JK0|O5O2ZPrZrOEBQ>detI6(?`xm7L7TCp`Hl wZ;K8C0}BH;L-b6=a85AE!l1wrBliElGs7LL{~%#sM^8UJX9f^^axb4d0FYfPb^rhX diff --git a/tinyjort.com b/tinyjort.com index a292488707d3e46b53bf04f6942f34085abb8189..c7570b14d4396d32a9f6c827365d89ebe94a4299 100755 GIT binary patch literal 3158 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 diff --git a/tinyjort.jrt b/tinyjort.jrt index 9fae020..ef7c5e2 100755 --- a/tinyjort.jrt +++ b/tinyjort.jrt @@ -28,8 +28,9 @@ JMP 9 @> bits. Entry: LINK - pointer to next word in the dictionary - FLAGS - byte - LENGTH - byte + META - word, made up of: + LENGTH - byte + FLAGS - byte NAME - bytes ending in \0 CODE POINTER - pointer to machine code routine ) @@ -38,26 +39,30 @@ L: DICTIONARY 0 w>t 0 w>t 0 w>t 0 w>t 0 w>t 0 w>t 0 w>t 0 w>t L: LATEST 0 w>t +0x0f const BUCKETMASK + : savelabel ( word -- ) dup type s" : " type here swap begin dup b@ dup while b, 1 + repeat b, drop lastlabel ! ; -: DICTLIST ( word -- tptr ) b@ 0x0f & cells [ L@ DICTIONARY lit ] + ; +: DICTLIST ( word -- tptr ) b@ BUCKETMASK & cells [ L@ DICTIONARY lit ] + ; : strlen ( word -- len ) 0 swap begin dup b@ while swap 1 + swap 1 + repeat drop ; : str>t ( word -- ) begin dup b@ dup while >t 1 + repeat >t drop ; -: link>t ( tptr-head -- ) dup @t swap target @ swap !t w>t ; -: DEF word dup savelabel dup DICTLIST link>t 0 >t dup strlen >t str>t +: patch!t ( tptr -- ) target @ swap !t ; +: link>t ( tptr-head -- ) dup @t swap patch!t w>t ; +: DEF word dup savelabel dup DICTLIST link>t dup strlen w>t str>t target @ cell + .hex cr ; : WORD= ( word len tptr -- f ) - 3 + dup b@t t ; @@ -71,6 +76,7 @@ L: $$CONST : CONST DEF [ L@ $$CONST lit ] w>t w>t ; +L@ $$CONST CONST $DOCONST L@ DICTIONARY CONST dictionary L@ LATEST CONST &latest @@ -99,22 +105,35 @@ L@ $$VAR CONST $DOVAR MOV SI @[ BP] NEXT -( some helpers for making manually defining colon words slightly less ugly ) -: '>t t' w>t ; -: :t DEF [ t& $DOCOLON lit ] w>t ; - :CP $DODEFERRED INC BX INC BX MOV BX @[ BX] JMP @[ BX] -: DEFERRED DEF [ t& $DODEFERRED lit ] w>t '>t ; - :ASM LIT_ LODSW PUSH AX NEXT +( some helpers for making manually defining colon words less ugly ) +: '>t t' w>t ; + +: stch? ( str -- f ) ' @ , key lit ' = , ; immediate +( DOES NOT SUPPORT ARBITRARY IMMEDIATE WORDS. + Supports [], comments, ; and numeric literals ONLY. + You must use [ for anything fancy. ) +: :t DEF [ t& $DOCOLON lit ] w>t ] + begin word dup stch? ; not while + state if dup stch? [ if drop [ ' [ , ] else + dup stch? ( if drop [ ' ( , ] else + dup tlookup dup if w>t drop else drop + number if [ t' LIT_ lit ] w>t w>t else + type s" ?" type cr then then then then else + compileword then + repeat drop [ t' return lit ] w>t [ ' [ , ] ; + +: DEFERRED DEF [ t& $DODEFERRED lit ] w>t '>t ; + :ASM INLINEDATA_ LODSW PUSH SI @@ -143,6 +162,27 @@ DEF GOTO_ L@ GOTO_IMPL w>t PUSH AX NEXT +:ASM 2dup + POP AX + POP BX + PUSH BX + PUSH AX + PUSH BX + PUSH AX + NEXT + +:ASM 3dup + POP AX + POP BX + POP CX + PUSH CX + PUSH BX + PUSH AX + PUSH CX + PUSH BX + PUSH AX + NEXT + :ASM swap POP AX POP BX @@ -151,11 +191,14 @@ DEF GOTO_ L@ GOTO_IMPL w>t NEXT :ASM over - POP AX - POP BX - POP BX - POP AX + ( this costs 1 extra byte but should save 20 clock cycles ) + MOV BX SP + PUSH @[ 4 @+ SS: BX] +( POP AX POP BX + PUSH BX + PUSH AX + PUSH BX ) NEXT :ASM t PUSH CX NEXT +:ASM >rot + POP AX + POP BX + POP CX + PUSH AX + PUSH CX + PUSH BX + NEXT + :ASM terminate MOV AH 0x4c # - MOV AL 0 # ( todo: pop ) + MOV AL 0 # ( todo: pop? ) INT 0x21 # :ASM execute @@ -248,9 +300,9 @@ L: RETFALSE JZ RETFALSE JMP RETTRUE -:t != '>t = '>t not '>t return -:t <= '>t > '>t not '>t return -:t >= '>t < '>t not '>t return +:t != = not ; +:t <= > not ; +:t >= < not ; dbg" bitwise" :ASM & @@ -281,7 +333,7 @@ dbg" bitwise" PUSH AX NEXT -:ASM >> +:ASM >> ( val count ) POP CX POP AX SHR AX CL @@ -291,8 +343,7 @@ dbg" bitwise" dbg" mem" :ASM @ POP BX - MOV AX @[ BX] - PUSH AX + PUSH @[ BX] NEXT :ASM b@ @@ -311,8 +362,7 @@ dbg" mem" :ASM @far POP ES POP BX - MOV AX @[ ES: BX] - PUSH AX + PUSH @[ ES: BX] NEXT :ASM b@far @@ -323,8 +373,8 @@ dbg" mem" NEXT :ASM ! - POP BX POP AX - MOV @[ BX] AX + POP BX + POP @[ BX] NEXT :ASM b! @@ -333,8 +383,8 @@ dbg" mem" NEXT :ASM !far - POP ES POP BX POP AX - MOV @[ ES: BX] AX + POP ES POP BX + POP @[ ES: BX] NEXT :ASM b!far @@ -344,20 +394,17 @@ dbg" mem" dbg" return stack" :ASM >r - POP AX - MOV @[ BP] AX + POP @[ BP] INC BP INC BP NEXT :ASM t &here '>t @ '>t return -:t here! '>t &here '>t ! '>t return +:t here &here @ ; +:t here! &here ! ; 0xffff CONST there -:t latest '>t &latest '>t @ '>t return -:t latest! '>t &latest '>t ! '>t return +:t latest &latest @ ; +:t latest! &latest ! ; 0 VAR, lastseg -:t segalloc '>t lastseg '>t @ '>t LIT_ 4096 w>t '>t + - '>t dup '>t lastseg '>t ! '>t return +:t segalloc lastseg @ 4096 + dup lastseg ! ; 2 CONST cell -:t allot '>t here '>t + '>t here! '>t return -:t , '>t here '>t ! '>t cell '>t allot '>t return -:t b, '>t here '>t b! '>t LIT_ 1 w>t '>t allot '>t return +:t cells cell * ; +:t allot here + here! ; +:t , here ! cell allot ; +:t b, here b! 1 allot ; dbg" i/o" :ASM overwrite @@ -450,12 +497,11 @@ dbg" i/o" -1 CONST EOF 0 VAR, fbuffer -:t fgetc '>t LIT_ 1 w>t '>t fbuffer '>t t fread - '>t fbuffer '>t ub@ - '>t fcount '>t @ '>t not '>t BZ_ target @ 3 cells + w>t - '>t drop '>t EOF '>t return -:t fputc '>t swap '>t fbuffer '>t b! - '>t LIT_ 1 w>t '>t fbuffer '>t t fwrite '>t return +: skip>t 1 + cells target @ + w>t ; +:t fgetc ( fp -- c ) + 1 fbuffer t ] drop EOF ; +:t fputc ( c fp -- ) swap fbuffer b! 1 fbuffer t infile '>t @ '>t dup '>t BZ_ target @ 4 cells + w>t - '>t drop '>t console-key '>t return - '>t fgetc '>t return +:t in-key infile @ dup BZ_ [ 3 skip>t ] drop console-key return fgetc ; DEFERRED key in-key -dbg" number" +dbg" parsing" L: BASE 10 w>t L: ISNEG? 0 >t :ASM number ( str -- num 1 | str 0 ) ( AX - current number @@ -595,17 +639,163 @@ L: write-next-digit PUSH t& &here @+ NEXT -:t type target @ '>t dup '>t b@ '>t dup '>t BZ_ target @ 7 cells + w>t - '>t emit '>t LIT_ 1 w>t '>t + '>t GOTO_ w>t '>t drop '>t drop '>t return -:t . '>t num>str '>t type '>t LIT_ key w>t '>t emit '>t return +:t type [ target @ ] + dup b@ dup BZ_ [ 6 skip>t ] + emit 1 + GOTO_ [ w>t ] + drop drop ; +:t . num>str type LIT_ [ key w>t ] emit ; -dbg" test" -( test program ) -ARRAY hex65 key - >t key 6 >t key 5 >t 0 >t -L: test-word '>t hex65 '>t number '>t . '>t . '>t terminate +:ASM whitespace? + POP AX + CMP AX key # + JZ 0 @> + CMP AX 13 # ( newline ) + JZ 1 @> + CMP AX 10 # ( linefeed ) + JZ 2 @> + CMP AX 9 # ( tab ) + JNZ 3 @> +0 <: 1 <: 2 <: + PUSH TRUE + NEXT +3 <: + PUSH FALSE + NEXT + +:ASM eoi? ( end of input ) + POP AX + CMP AX 0 # ( null ) + JZ 0 @> + CMP AX -1 # ( EOF ) + JNZ 1 @> +0 <: + PUSH TRUE + NEXT +1 <: + PUSH FALSE + NEXT + +:t word, + ( consume leading whitespace ) + 0 [ target @ ] drop key dup whitespace? not BZ_ [ w>t ] + ( consume non-whitespace / eoi characters ) + [ target @ ] dup whitespace? over eoi? or + ( if whitespace or eoi, end ) BZ_ [ 5 skip>t ] drop 0 b, return + ( otherwise, write byte and continue ) b, key GOTO_ [ w>t ] ; + +:t word here word, dup here! ; + +dbg" compiler" +:t wordflags cell + ; +:t wordname 2 cells + ; +:t wordlen wordflags ub@ ; +:t codepointer dup wordname swap wordlen + ( trailing null ) 1 + ; +:t dictbucket ( word -- p ) ub@ LIT_ [ BUCKETMASK w>t ] & cells dictionary + ; +:t new-word + ( set latest ) here latest! + ( create entry ) 0 dup , , + ( save word + calc length ) here word, here swap - + ( save length ) latest wordflags ! + ( find bucket ) latest wordname dictbucket + ( link to prev ) dup @ latest ! + ( link bucket to new ) latest swap ! ; +:t 2inc ( x y -- x+1 y+1 ) 1 + swap 1 + swap ; +:t strlen ( name -- len ) + 0 swap [ target @ ] dup b@ BZ_ [ 3 skip>t ] + 2inc GOTO_ [ w>t ] drop ; + +: patchpt target @ 0 w>t ; + +:ASM dict-lookup ( name dict -- cp meta | name 0 ) + POP BX ( dictionary ) + POP DI ( name ) + ( strlen - in DI: str, out CX: len, clobbers AX ) + XOR CX CX DEC CX ( start CX at -1 so we search until we find the 0 ) + XOR AX AX ( search for 0 ) + REPNZ SCASB + NEG CX DEC CX + SUB DI CX ( restore DI ) + DEC CX ( ignore trailing zero ) + + ( keeping CX + DI, find the next entry pointer and store in BX ) + MOV AL @[ DI] + AND AL BUCKETMASK # + SHL AX 1 # + ADD BX AX + + ( save SI ) + MOV DX SI + +L: check-next-entry + MOV BX @[ BX] + CMP BX 0 # + JZ 0 @> + CMP CL @[ 2 @+ BX] + JNZ check-next-entry + + ( we have a matching length; compare the string ) + PUSH CX + PUSH DI + MOV SI BX + ADD SI 4 # + REPZ CMPSB + POP DI + POP CX + JNZ check-next-entry + + ( we have a matching word! return success ) + MOV AX @[ 2 @+ BX] ( read flag word ) + ADD BX CX ( strlen ) + ADD BX 5 # ( header + null byte ) + PUSH BX + PUSH AX + MOV SI DX ( restore SI ) + NEXT + +0 <: ( failure; we've hit a null pointer in our linked list ) + PUSH DI ( push word pointer back onto the stack ) + PUSH FALSE + MOV SI DX ( restore SI ) + NEXT + +:t lookup dictionary dict-lookup ; + +0x100 CONST F_IMMEDIATE +:t immediate latest wordflags dup @ F_IMMEDIATE | swap ! ; +: IMMEDIATE [ L@ LATEST lit ] @t cell + dup @t 0x100 | swap !t ; + +0 VAR, &state +:t state &state @ ; +:t ] 1 &state ! ; +:t [ 0 &state ! ; IMMEDIATE +:t : new-word $DOCOLON , ] ; +:t ; LIT_ return , [ '>t [ ] ; IMMEDIATE +:t const new-word $DOCONST , , ; +:t var new-word $DOVAR , 0 , ; +:t interpretword ( cp meta -- ) F_IMMEDIATE & state not or + BZ_ [ patchpt ] execute return [ patch!t ] , ; +:t interpretnumber ( n -- n? ) state BZ_ [ patchpt ] LIT_ , , [ patch!t ] ; +:t ?err ( word -- ) type LIT_ [ key ? w>t ] emit 13 emit ; +DEFERRED err ?err +:t compileword ( word -- ) + lookup dup BZ_ [ patchpt ] interpretword return [ patch!t ] + drop number BZ_ [ patchpt ] interpretnumber return [ patch!t ] + err ; +:t interpreter + [ target @ ] word dup b@ BZ_ [ patchpt ] compileword GOTO_ [ swap w>t ] + [ patch!t ] drop ; + +dbg" boot stub" +:ASM debug NEXT +: t" begin key dup [ key " lit ] != while >t repeat drop 0 >t ; +ARRAY input t" +" +t& input VAR, inptr +:t keyinput inptr @ b@ dup BZ_ [ patchpt ] inptr @ 1 + inptr ! [ patch!t ] ; +t' keyinput t& key !t +:t tinyjort 1 2 word lookup drop execute . terminate ; 9 <: ( actual entry point ) - LEA SI test-word + MOV SI t& tinyjort # PUSH CS POP AX ADD AX 4096 #