From 3d908cef3a8e1cecc379dd8e1d36870eaebfd802 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sat, 2 May 2020 21:21:47 -0400 Subject: [PATCH] Move all parsing words to Inner core This allows us to get rid of the (parse*) indirection. --- blk/060 | 4 ++-- blk/081 | 2 +- blk/089 | 6 +++--- blk/090 | 8 ++++---- blk/265 | 2 +- blk/393 | 3 +-- blk/394 | 8 +++++++- blk/398 | 21 ++++++++------------- blk/399 | 20 +++++++++++--------- blk/400 | 29 ++++++++++++++--------------- blk/401 | 14 +++++++------- blk/402 | 27 ++++++++++++++------------- blk/403 | 15 +++++++-------- blk/404 | 17 +++++++++-------- blk/405 | 23 ++++++++++------------- blk/406 | 30 ++++++++++++++++-------------- blk/407 | 26 ++++++++++---------------- blk/408 | 15 +++++++++++++++ blk/409 | 9 +++++++++ blk/410 | 11 +++++++++++ blk/411 | 14 ++++++++++++++ blk/412 | 14 ++++++++++++++ blk/413 | 16 ++++++++++++++++ blk/436 | 4 ---- blk/438 | 3 --- blk/446 | 11 ----------- blk/447 | 14 -------------- blk/448 | 15 --------------- blk/449 | 10 ---------- blk/450 | 16 ---------------- blk/451 | 10 ---------- emul/forth.bin | Bin 5705 -> 5642 bytes 32 files changed, 204 insertions(+), 213 deletions(-) create mode 100644 blk/408 create mode 100644 blk/409 create mode 100644 blk/410 create mode 100644 blk/411 create mode 100644 blk/412 create mode 100644 blk/413 delete mode 100644 blk/446 delete mode 100644 blk/447 delete mode 100644 blk/448 delete mode 100644 blk/449 delete mode 100644 blk/450 delete mode 100644 blk/451 diff --git a/blk/060 b/blk/060 index 2bbca54..25b341f 100644 --- a/blk/060 +++ b/blk/060 @@ -4,8 +4,6 @@ I/O result in n as well as whether parsing was a success in f (false = failure, true = success) -(parse*) -- a Variable holding the current pointer for - system number parsing. By default, (parse). (print) a -- Print string at addr a. . n -- Print n in its decimal form .x n -- Print n's LSB in hex form. Always 2 @@ -13,4 +11,6 @@ I/O .X n -- Print n in hex form. Always 4 characters. Numbers are never considered negative. "-1 .X" --> ffff + + (cont.) diff --git a/blk/081 b/blk/081 index c1aa219..4ab6143 100644 --- a/blk/081 +++ b/blk/081 @@ -4,7 +4,7 @@ RAMSTART INITIAL_SP +55 (key) override +04 HERE +59 blk's variables +06 C CMP 1 = ; : 0< 32767 > ; +: >= < NOT ; +: <= > NOT ; +: 0>= 0< NOT ; - +( a -- a+1 c ) +: C@+ DUP C@ SWAP 1+ SWAP ; +( c a -- a+1 ) +: C!+ SWAP OVER C! 1+ ; diff --git a/blk/398 b/blk/398 index a544ed8..d7cb9b0 100644 --- a/blk/398 +++ b/blk/398 @@ -1,16 +1,11 @@ -( This is only the "early parser" in earlier stages. No need - for an abort message ) -: (parse) (parsed) NOT IF ABORT THEN ; +( strings being sent to parse routines are always null + terminated ) -: C DROP ( exit : ) -; IMMEDIATE - +( Read word from C<, copy to WORDBUF, null-terminate, and + return, make HL point to WORDBUF. ) +: WORD + 0x0e RAM+ ( 0e == WORDBUF ) + TOWORD ( a c ) + BEGIN + ( We take advantage of the fact that char MSB is + always zero to pre-write our null-termination ) + OVER ! 1+ ( a+1 ) + C< ( a c ) + DUP WS? + UNTIL + ( a this point, PS is: a WS ) + ( null-termination is already written ) + 2DROP + 0x0e RAM+ ; diff --git a/blk/407 b/blk/407 index d74dae5..f6a7134 100644 --- a/blk/407 +++ b/blk/407 @@ -1,16 +1,10 @@ -XCURRENT @ ( to PSP ) -: : - (entry) - ( We cannot use LITN as IMMEDIATE because of bootstrapping - issues. Same thing for ",". - 32 == NUMBER 14 == compiledWord ) - [ 32 H@ ! 2 ALLOT 14 H@ ! 2 ALLOT ] C, - BEGIN - WORD - (find) - ( is word ) - IF DUP IMMED? IF EXECUTE ELSE , THEN - ( maybe number ) - ELSE (parse*) @ EXECUTE LITN THEN - AGAIN ; -( from PSP ) ';' SWAP 4 - C! +: SCPY + BEGIN ( a ) + DUP C@ ( a c ) + DUP C, ( a c ) + NOT IF DROP EXIT THEN + 1+ ( a+1 ) + AGAIN +; + + diff --git a/blk/408 b/blk/408 new file mode 100644 index 0000000..1fce040 --- /dev/null +++ b/blk/408 @@ -0,0 +1,15 @@ +: [entry] + HERE @ ( w h ) + SWAP SCPY ( h ) + ( Adjust HERE -1 because SCPY copies the null ) + HERE @ 1- ( h h' ) + DUP HERE ! ( h h' ) + SWAP - ( sz ) + ( write prev value ) + HERE @ CURRENT @ - , + ( write size ) + C, + HERE @ CURRENT ! +; + +: (entry) WORD [entry] ; diff --git a/blk/409 b/blk/409 new file mode 100644 index 0000000..f93ab0e --- /dev/null +++ b/blk/409 @@ -0,0 +1,9 @@ +: INTERPRET + BEGIN + WORD + (find) + NOT IF (parse) ELSE EXECUTE THEN + C DROP ( exit : ) +; IMMEDIATE + diff --git a/blk/413 b/blk/413 new file mode 100644 index 0000000..e109431 --- /dev/null +++ b/blk/413 @@ -0,0 +1,16 @@ +XCURRENT @ ( to PSP ) +: : + (entry) + ( We cannot use LITN as IMMEDIATE because of bootstrapping + issues. Same thing for ",". + 32 == NUMBER 14 == compiledWord ) + [ 32 H@ ! 2 ALLOT 14 H@ ! 2 ALLOT ] C, + BEGIN + WORD + (find) + ( is word ) + IF DUP IMMED? IF EXECUTE ELSE , THEN + ( maybe number ) + ELSE (parse) LITN THEN + AGAIN ; +( from PSP ) ';' SWAP 4 - C! diff --git a/blk/436 b/blk/436 index 1bbd442..8ea4b45 100644 --- a/blk/436 +++ b/blk/436 @@ -8,7 +8,3 @@ DROP ; -( a -- a+1 c ) -: C@+ DUP C@ SWAP 1+ SWAP ; -( c a -- a+1 ) -: C!+ SWAP OVER C! 1+ ; diff --git a/blk/438 b/blk/438 index ffe20dd..e69de29 100644 --- a/blk/438 +++ b/blk/438 @@ -1,3 +0,0 @@ -: >= < NOT ; -: <= > NOT ; -: 0>= 0< NOT ; diff --git a/blk/446 b/blk/446 deleted file mode 100644 index d7cb9b0..0000000 --- a/blk/446 +++ /dev/null @@ -1,11 +0,0 @@ -( strings being sent to parse routines are always null - terminated ) - -: (parsec) ( a -- n f ) - ( apostrophe is ASCII 39 ) - DUP C@ 39 = OVER 2+ C@ 39 = AND ( a f ) - NOT IF 0 EXIT THEN ( a 0 ) - ( surrounded by apos, good, return ) - 1+ C@ 1 ( n 1 ) -; - diff --git a/blk/447 b/blk/447 deleted file mode 100644 index bac471c..0000000 --- a/blk/447 +++ /dev/null @@ -1,14 +0,0 @@ -( returns negative value on error ) -: _ ( c -- n ) - ( '0' is ASCII 48 ) - 48 - - DUP 0< ( bad ) OVER 10 < ( good ) OR IF EXIT THEN - ( 'a' is ASCII 97. 59 = 97 - 48 ) - 49 - - DUP 0< IF EXIT THEN ( bad ) - DUP 6 < IF 10 + EXIT THEN ( good ) - ( bad ) - 255 - -; - - diff --git a/blk/448 b/blk/448 deleted file mode 100644 index e400a39..0000000 --- a/blk/448 +++ /dev/null @@ -1,15 +0,0 @@ -: (parseh) ( a -- n f ) - ( '0': ASCII 0x30 'x': 0x78 0x7830: 30768 ) - DUP @ 30768 = NOT IF 0 EXIT THEN ( a 0 ) - ( We have "0x" prefix ) - 2+ - 0 ( a r ) - BEGIN - SWAP C@+ ( r a+1 c ) - DUP NOT IF 2DROP 1 EXIT THEN ( r, 1 ) - _ ( r a n ) - DUP 0< IF ROT 2DROP 0 EXIT THEN ( a 0 ) - ROT 16 * + ( a r*16+n ) - AGAIN -; - diff --git a/blk/449 b/blk/449 deleted file mode 100644 index eb50ae5..0000000 --- a/blk/449 +++ /dev/null @@ -1,10 +0,0 @@ -( returns negative value on error ) -: _ ( c -- n ) - ( '0' is ASCII 48 ) - 48 - - DUP 0< ( bad ) OVER 2 < ( good ) OR IF EXIT THEN - ( bad ) - 255 - -; - - diff --git a/blk/450 b/blk/450 deleted file mode 100644 index e8788f9..0000000 --- a/blk/450 +++ /dev/null @@ -1,16 +0,0 @@ -: (parseb) ( a -- n f ) - ( '0': ASCII 0x30 'b': 0x62 0x6230: 25136 ) - DUP @ 25136 = NOT IF 0 EXIT THEN ( a 0 ) - ( We have "0b" prefix ) - 2+ - 0 ( a r ) - BEGIN - SWAP C@+ ( r a+1 c ) - DUP NOT IF 2DROP 1 EXIT THEN ( r 1 ) - _ ( r a n ) - DUP 0< IF ROT 2DROP 0 EXIT THEN ( a 0 ) - ROT 2 * + ( a r*2+n ) - AGAIN -; - - diff --git a/blk/451 b/blk/451 deleted file mode 100644 index 7f308d4..0000000 --- a/blk/451 +++ /dev/null @@ -1,10 +0,0 @@ -: (parse) ( a -- n ) - (parsec) IF EXIT THEN - (parseh) IF EXIT THEN - (parseb) IF EXIT THEN - (parsed) IF EXIT THEN - ( nothing works ) - LIT< (wnf) (find) IF EXECUTE ELSE ABORT THEN -; - -' (parse) (parse*) ! diff --git a/emul/forth.bin b/emul/forth.bin index 6c12adf3aab7b9abe6073f6494b02c17ca4135ae..fd113c766b6500f8decb09ab0f8f9aee64ba5c50 100644 GIT binary patch delta 3033 zcma)8Urbx)6+id-+P=QF@3k=|p`>uJoMJZwXtQ-~1O#6&t{Db|9R@?lq=ulV2oNOd z8cn!O*G6k3q;Vgjd4DAGkO?K7I%$%pzHCw@CZw*)OWH{-(Nsm+G*!*sBBh$V-}$Zy zecXeu?>XQ1o%1{A{LcCAe&_q0zK?%NAAdwd+8=y>QS1YyyWyc?xGYLsytJ~A43bBG ztk|vYMA_@UBVCm&N?GHRh3Ckv|Jl{-wx~}fN&m0wnru<8^IB4J(D!RXKP7~oUO&mY zNwxAKFZHoB?G|VHe0X0J?>+r}8oBfhAq)iT>jvT^Sf;0kjTMB#s9sIIRrDO6Gv>$kI(mriG?{h56I5}^e z{69`kc=_aABhkC*aXi=R|C`=Avbr3j#2YIYljIe-x+>)vCu%X+d#=}>@w{~M9;#lG z`MIUsQ)(#ZU}qGiVU6kH=bCcQ{-Y=6iK`XqC#wCWr&Zrl_obS=rqorc_e8mzXqH|JvH73QkaXDS;kD;0@dRZ$t1ALDmh&ZtGP`dENSh@;7uarCbG zt!hzrtdO3Zm`oQ!!$~qa&sCiWWzW0Qdrw8y~?6DuH9c2y{k>qmep=_#<=14ep&Ij}C zEt*13Ol+AwPH*cBWX=O$j$2^L`vs;LFnxxUK+|i`&ybC8G$Ey&^|-)nQOCI;3dsoZ zjvg)Rt$v3cN33vqd$wcl1ihmt{kk9ZAJ0u>N7Fi87m7n`vvvJk6a5?u833@-ne14A z-qm;EKb1*k$216W$^*cz#wE4r{8%A7+9=e=mcFA;gb-qkl5|(KpV3~JxTkyq-`Qaw zU4sQ@r%5tBg0}E#dMt`SE7Gp^4}TTZvnV~9Plus%yg56M)^|1gSK6~OY=5MgGh8e` zie=Hzcsk!7!Voj*6mjlN!9J5*bQ4^x$+uh#dMY)UOlp1>r|v|*M=+SuHqjx8Xuo%7NDDgeBdY{abnML z@Q}xmYE0d9E?a059Lm#&Sm8P7aF&_B1?Y*j^-C+4liae0&W?^m4LcWyCZxehM+(-Z(cvJ1STW`ei}DkLd|z;<@S3Im;ym#U z!BSb_T{nzL!~S)st^6BK`})H2N=c-hcQlFp8e-DWObRW+vPor;ZNBk1O{~$rqX|N@ zBko7FUX_6m-$-n)hWqA;@d+qnQt)Zb_-0D155sfv3Vw zY_DRCSGSa=;1d0-#;wFZC-H~-xj&e8)A%enXVNAR^LK$$pDwuI!(To<%p4m!pPP6a z%$qm%r72}vM99rGV|PW)l(h)jVDyLW&j-YSlBurfXSQ=X>+(=xh6%@?8g)&=*`XfF z_%;nDdVZ3=6YP)D6}djAisH>H~T@OKYkG5v~`Ij#pzO`vyc17*;kXZK06p~)!DR; zLCwrKh}f@0PpNz1P2=50%;)9kS#3U2a@~|o7sL;v-&=G~BOQG0D(*FQF C4ux?5 delta 3122 zcma)8TTC3+8UAPH?CgE^!h(%~bXcv;t}kFasT#Y0*@4B`4J?RVNE{1OycmkXfWel9 z6?bLF4Q(Da7E{U1J`~AGQ6;3Rl`5^&7dJ|8y!0tmTM{WRytH;NQl!dC8*RUTW(j`m z!|t5(pa1;l`)}Vl?;PJg?*8aK`skNLl>WKk2TheXGprkQ0l0QNY?XhygVNjQgB<)M(o@`L3JuHYx z$h$q3e9W4h?DUe1GpfZ^EKMv;O%@6Pm@Z2?wbHy}hFr8IjR}KvI!T*ySz4>f3Xrju zTc%a>zmAULBo@L@UJ_3n8L=j9$`ydhh>G-{qb#wZ19AqNwxkMl%2J22hLOGYw90VS zq%G{Qolm?$PVI@~o;*W>#(=H2^IVV=KvfYAjze#!--7P4=4G?pb?EReR;n`pm&C59 z!u8(c_0VF8uJHeo*fp=YqNnH7vh-NB%`>JP{iABoYeOS_O(bxN2CIKmx23AQBy3&t zLszrBshXd;T8eC`BDFaATZAusRs|mO-0KJ^n{r9rRP7m~h+kQ_vAmji89sfk8cu`K z*?ekbcqEk%k{hBX%Tbj+#{S#VMGIGmq7+}8OHdO6E9f>L{s|D{mlqesjn2f^&AaXs z2cO|!s9E*Gnp@Jxkf1Pr;XZwir#kuINmU*bcH~$+olWO0t1io`3ilrX(?B|(y>B_M zQ%NnU=3!53vZOvzI4fs0RLvbH2WC@cz%$f<{I9tJ5QV)K8&zk3?juNPw}mljug5Hm z2DP2zGGIg)bDgicIa~%u@7BV!9TaYli*4i0^ptdG8{3G7RrPo}dTOk$J+0O96L8#J2Drw1aIc;-2AJV;oaeVDDezb@Qn zkFQ0B?FpZLfpgUn%;xJXX-R$RG5_p~kC)UKtz(=0&ykooXeI3tI;t$KD=W&Rqk=C|G&D5a zXo0@&t0i6lV|R`%hHCAA%D;3byyL3 zJ)Lho2;XA#z*&~KXbQ@YP+iPE|EhAO_Vyfm!Thm9Kib{Jl`)Uj0t0rrF)rK+n*7eaP+F5!)>v1w29upfe`4P{4o1#6|tarqo`D?R*em~kJtO?Da+;A^Drh}__qgDPIVs+Ku zfdg(WE>GzTi#PP?#hVLLK*dKf!RRo+3X5}bNTV=h^GPAmfFfX`)~OA?Zc8Om8=F5+ zqlq<0_;#9ij9Dzrcf_f$?g(x{j*?3A=4Wc6ZL&sjdS1FhdW5@dPY4yjD`G~q*p8-gXl)A;Pd^n8Nv%Z%s`mZdYns%+8y?84=hL_OqZ zf&ryJ$aTW;;8{_yR)_X)zd0WKTJafI-SX7@Lcyv!))=+)J&2|UBqQhpSk|d%RU6;N zTo^3zJSXu(lJc|ERjbM(@G&C35XW$4n}=8Zwbd<&^AKO|$H|GC06G)g4syAFQ59N$ zkRcj0(l?OpJcI&bD;)}7;y$u%F|K6DmS@DOnG8i5gB>6SrgY*O{wje6WLl0K2=!gIWdFEHM87Dtt(xo`)Th4nsJ zSJvTN0Ay&$H-m3TS02|l4or!iByY8K#PpeEt{Nw)V8yy_J zi>?ydHr`JBin3Ychvq-SFBa2vXz_tpTaWrIj+Ut==;lslOtpDm{sNa4w@^(Iw>4aQ zbG!nDwowP%;vw<{qp<)Vi$q+o5`l6M8F0G*L1o0dbyc|_ig)m_5hS2|r!Jse!|yh7 z!U_iU4~*tsVUB$lVlLdj+kksQP?yM(`UAolJS+DqgV`jV zPXZfX%6zMRSQn$a^_LL782zUH8op*IN)s!qD`YsM)Vnx8Ke@DWMIXvp#LRD{i7t}< E2mbAjzW@LL