From 04416807fcb517c6c8f2a7773b191476f6b86529 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Tue, 5 Sep 2023 20:59:38 -0400 Subject: [PATCH] cleanup and bufixes, simple test program for the interpreter --- tinyjort.com | Bin 3158 -> 3260 bytes tinyjort.jrt | 41 +++++++++++++++++++++++------------------ 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/tinyjort.com b/tinyjort.com index c7570b14d4396d32a9f6c827365d89ebe94a4299..3eb0a75b9d10b1551be37f496b40fdbde0eaf64c 100755 GIT binary patch literal 3260 zcma)9dvH`&8UN1N``Ep^3n^-e;|xs#L|Yn$O;ZXqPxCS(d5|z+!wy+D$tGRc?1s(V zgtVz-CY^SdC@735tyD57qiI87X2lT^uu+ssD1BI>ok28V%tFmLlp$k6bN#+^7pkLw zm?4vUe&>6i@B5uY@`$5dT9B`66OO&kOOCHP%Cru7lk*{m*EwkayZx|s67kYfC-*bFP#O17G5&=zRb1L2S_(ua_R0jQ82^y&U?9oNfQX=#JdEn*7k zHkQ;Q+`_iAl&OuiHPFK1Jy2d=S{lEW@}oe+uSX*xILfN4hk8K3eaucK%E~Ls>+8$Q zP_49d=n)D_f{j(1y>Nw%)};*Cp{izMRZV$W$>tI-B-vjY_gzcy z1fkmyZQ9gOhyR3udM-hCudfSwaHGyF3Pm37@kd|}k58^OdbyDN4I0jmgmpMVCeVUF zNw$#CQ-q>ffj-7hCiWpW-6})y6%UM zggrB_F+`eS0TEY9W{Pa)!$VS&`@QR?&|R`y2rCGh{rVn~yXo&_PJ$}&XE{+Fw(1(Z&ZXyB*hp^Al}=6mtxg?Pn1vH7k=hU{nj5kC&) z87H->Sj1SpoF@&lM${!B6OXB0K7`1xxD2|GS;-9Jj-)_}Gw>W4sk|hsDTtJs87aLi zux`EE-+_Jrc5o};w=WnBx1!K#^mUm*+6>R-r-hfZvIMREU=S&X!=Et-T6Cl6w7dj6 z>8DsTQq~di$}@bYJj{;E3?3KjL(;TtRfgFr84tjOM$kS30uNYhVsd*U0i3ZaC6VvC zxOF_!Jn!`ij&+wm1U@BEaDqR;KcWbN;ch=Xt0W3N z-`55|P!dI+txe;Zapl{J5IvxvsOj>Ik|_Sq%}tU8%4;hySHpNiQK7vh+TM=bLY0~z zqaA*o%0wwlDX;Rw%9PS1?Njoke9Ih5Q?vN{nAkK)c14Ax&ZiVJWs*OQyCKB^t>I92 zIOxyucLsDQRTGq-i0%@mEx>cEL|voWA4u--_d!riSjRK(PsCNc4FaL|K#&>+V3$hE z9FmK%K{Zdx<#X(Z7}0ihnBAtRaI9$e9NVvI0Dr-L2}L_wFuPx?@!96a-zo{jUFTgN zx-Q0)Q)+DN^%o}wkWn%wpBR{5zq@4M)|!58c6CB!6D7&(Mts3_(WKSMI|GHMRM7eC zM0{auifaevbE3Z!c=QjkWvA5SabsY9SM)Q3|76ic$W~DsIZT7(L1W-nN&m@#F>S-L zgxde=z^#Y-kKSK>EBRf60p5@>ZAn847C%2zRSLbZTaUni_1q3Ck?8Zv1vzJSqO$R< z6@KBf{#*jryR+-akuoV&B^7X8l-IyW{7Owt-woIKk!IA}B5K};9j^Cv`LS-fyj;}n zuhvGD&Ul6|<(I5kJc|#rh?T)=l=-^#E$d~L0gYH!C$~fIGuXb}UA|U-5iGK~3o<}o zT;K#pSyJwZ5HymlB*}=JlEPg`GUtq}6}=1>iB+bbWFsYtmzT}fBGa)-?;>l`fm<>lHTX}`Qq z8`5%l9)8hE=fs#FVt%=S(EYKW;d;uwj`rP}0@#LT++XEdQ7CgmmsI5Y{ys)%e4=)C0M-*Z&h`5d0AD- z=5k~-U@xgQ2y}Mhfzm@K#wcsb_L%*q#mx1fU4iUwowkWnKG9^%&J@0Crz@orZ`N(7 zN(XS&PUZQr%9uwWkU|_NvjLG2?M0TZe2l>ucE+9-GQ)_-4lJr2X&gzA&TK?`8qsv@ z+e>x}^x&mTSQIfTDB&Y^CvqD$K^H!0Q%8BsK4H0G&$m$T#~qVcW|C}mEdEq7MQ<^7 z!#>B}a9mD#X+(}K@<+%GO>z-V@@3`}^ZcaE0PH~EgQ${ts zE3n?KjNFV>8LOed#E{%tSe0|R!%DPm3dNYmnI{oP%~&axZ#ZdfPJ_ou$MLw+3VI;a jw>=!8+CJ=j8{M8g>|ErQA#LxKxN=551MHVz{&(PCcE|i3 literal 3158 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 diff --git a/tinyjort.jrt b/tinyjort.jrt index ef7c5e2..c762f83 100755 --- a/tinyjort.jrt +++ b/tinyjort.jrt @@ -34,9 +34,9 @@ JMP 9 @> NAME - bytes ending in \0 CODE POINTER - pointer to machine code routine ) -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 -0 w>t 0 w>t 0 w>t 0 w>t 0 w>t 0 w>t 0 w>t 0 w>t +: ALLOT ( n -- ) 0 for 0 >t next ; + +L: DICTIONARY 0x10 cells ALLOT L: LATEST 0 w>t 0x0f const BUCKETMASK @@ -49,7 +49,8 @@ L: LATEST 0 w>t : str>t ( word -- ) begin dup b@ dup while >t 1 + repeat >t drop ; : 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 +: DEF target @ [ L@ LATEST lit ] !t + word dup savelabel dup DICTLIST link>t dup strlen w>t str>t target @ cell + .hex cr ; : WORD= ( word len tptr -- f ) @@ -193,7 +194,7 @@ DEF GOTO_ L@ GOTO_IMPL w>t :ASM over ( this costs 1 extra byte but should save 20 clock cycles ) MOV BX SP - PUSH @[ 4 @+ SS: BX] + PUSH @[ 2 @+ SS: BX] ( POP AX POP BX PUSH BX @@ -259,7 +260,7 @@ L: RETFALSE :ASM not POP AX - CMP AX FALSE + CMP AX 0 # JZ RETTRUE JMP RETFALSE @@ -287,9 +288,9 @@ L: RETFALSE :ASM and POP AX POP BX - CMP AX FALSE + CMP AX 0 # JZ RETFALSE - CMP BX FALSE + CMP BX 0 # JZ RETFALSE JMP RETTRUE @@ -518,6 +519,7 @@ DEFERRED emit console-emit NEXT 0 VAR, infile ( 0 is a predefined file handle meaning stdin ) +( TODO: whoops, this always calls fgetc, which works way better ) :t in-key infile @ dup BZ_ [ 3 skip>t ] drop console-key return fgetc ; DEFERRED key in-key @@ -603,8 +605,9 @@ L: fail-digit 0 <: JMP fail-digit L: DECDIVISORS 1 w>t 10 w>t 100 w>t 1000 w>t 10000 w>t +L: NUMBUF 7 ALLOT ( 5 digits, - sign, ending null ) :ASM num>str - MOV DI t& &here @+ + MOV DI L@ NUMBUF # POP AX CMP AX 0 # JGE 0 @> @@ -625,7 +628,7 @@ L: write-next-digit DEC CX ( if we haven't written any digits this will hit 0 on the ones place ) JMP 2 @> 1 <: 0 <: - XOR CX CX + XOR CX CX ( we've started outputting digits - set CX to 0 ) ADD AX key 0 # STOSB 2 <: @@ -636,7 +639,8 @@ L: write-next-digit XOR AX AX STOSB ( trailing 0 ) POP SI - PUSH t& &here @+ + MOV DI L@ NUMBUF # + PUSH DI NEXT :t type [ target @ ] @@ -682,8 +686,9 @@ L: write-next-digit [ 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! ; +ARRAY wordbuf 48 ALLOT +:t redir-here ( cp buf -- buf ) here >r dup >r here! execute t repeat drop 0 >t ; -ARRAY input t" +" +ARRAY input t" 1 2 + ." 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 ; +:t keyinput inptr @ b@ dup . dup BZ_ [ patchpt ] inptr @ 1 + inptr ! [ patch!t ] ; +( t' keyinput t& key !t ) +:t tinyjort interpreter terminate ; 9 <: ( actual entry point ) MOV SI t& tinyjort # @@ -801,7 +806,7 @@ t' keyinput t& key !t ADD AX 4096 # MOV SS AX MOV t& lastseg @+ AX - MOV SP 0xfe # + MOV SP 0x100 # MOV BP 0x00 # NEXT