From 3d47c28a28d798e17ad4117cf67a6428f806e470 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sat, 2 Jan 2021 13:30:32 -0500 Subject: [PATCH] Revisit RDLN words It's been a long while since I visited this part of the code and it has become a bit messy after having gone through all evolutions of the core code. It is now simpler, more compact. --- blk.fs | 67 ++++++++++++++++++---------------------------------------- cvm/stage.bin | Bin 4988 -> 4947 bytes doc/dict.txt | 2 ++ 3 files changed, 23 insertions(+), 46 deletions(-) diff --git a/blk.fs b/blk.fs index 32e2727..e854f9d 100644 --- a/blk.fs +++ b/blk.fs @@ -812,7 +812,7 @@ CREATE PREVPOS 0 , CREATE PREVBLK 0 , CREATE xoff 0 , 3 OVER AT-XY KEY DUP EMIT DUP SPC < IF 2DROP DROP EXIT THEN ( buf ln c ) 4 col- nspcs SWAP 4 SWAP AT-XY ( buf c ) - SWAP C!+ IN( _zbuf (rdln) IN( SWAP 63 MOVE ; + SWAP C!+ IN( _zbuf RDLN IN( SWAP 63 MOVE ; : bufp ( buf -- ) DUP 3 col- + SWAP DO I @emit LOOP ; : bufs @@ -872,7 +872,7 @@ CREATE PREVPOS 0 , CREATE PREVBLK 0 , CREATE xoff 0 , : VE 1 XYMODE C! clrscr 0 ACC ! 0 PREVPOS ! nums bufs contents BEGIN xoff? status setpos KEY handle UNTIL - 0 XYMODE C! 19 aty (infl) ; + 0 XYMODE C! 19 aty IN$ ; ( ----- 160 ) ( AVR Programmer, load range 160-163. doc/avr.txt ) ( page size in words, 64 is default on atmega328P ) @@ -1684,9 +1684,9 @@ with "390 LOAD" : IN> 0x30 RAM+ ; ( current position in INBUF ) : IN( 0x32 RAM+ @ ; ( points to INBUF ) : IN) 0x40 ( buffer size ) IN( + ; ( INBUF's end ) -: (infl) 0 IN( DUP IN> ! ! ; ( flush input buffer ) +: IN$ 0 IN( DUP IN> ! ! ; ( flush input buffer ) : QUIT - (resRS) 0 0x08 RAM+ ! ( C<* override ) (infl) + (resRS) 0 0x08 RAM+ ! ( C<* override ) IN$ LIT" (main)" FIND DROP EXECUTE ; 1 33 LOADR+ @@ -1972,63 +1972,38 @@ SYSVARS 0x0c + :** C<* SWAP 8 /MOD SWAP IF 1+ THEN 0 DO _ LOOP ; ( ----- 378 ) -( handle backspace: go back one char in IN>, if possible, then - emit BS + SPC + BS ) -: _bs - ( already at IN( ? ) - IN> @ IN( = IF EXIT THEN - IN> @ 1- IN> ! - BS EMIT SPC> BS EMIT -; -( del is same as backspace ) -: BS? DUP 0x7f = SWAP BS = OR ; SYSVARS 0x55 + :** KEY? : KEY BEGIN KEY? UNTIL ; -( cont.: read one char into input buffer and returns whether we - should continue, that is, whether CR was not met. ) +( del is same as backspace ) +: BS? DUP 0x7f = SWAP BS = OR ; ( ----- 379 ) -: (rdlnc) ( -- c ) +: RDLN ( Read 1 line in input buff and make IN> point to it ) + IN$ BEGIN ( buffer overflow? same as if we typed a newline ) - IN> @ IN) = IF LF ELSE KEY THEN ( c ) - DUP LF = IF DROP CR THEN ( lf? same as cr ) - ( backspace? handle and exit ) - DUP BS? IF _bs EXIT THEN - ( echo back ) - DUP EMIT ( c ) - ( write and advance ) - DUP ( keep as result ) ( c c ) -( We take advantage of the fact that c's MSB is always zero and - thus ! automatically null-terminates our string ) - IN> @ ! 1 IN> +! ( c ) - ( if newline, replace with zero to indicate EOL ) - DUP CR = IF DROP 0 THEN ; + IN> @ IN) 1- = IF CR ELSE KEY THEN ( c ) + DUP BS? IF + IN> @ IN( > IF -1 IN> +! BS EMIT THEN SPC> BS EMIT + ELSE DUP LF = IF DROP CR THEN ( same as CR ) + DUP EMIT ( echo back ) + DUP IN> @ ! 1 IN> +! THEN ( c ) + DUP CR = SWAP EOT? OR UNTIL IN( IN> ! ; ( ----- 380 ) -( Read one line in input buffer and make IN> point to it ) -: (rdln) - ( EOT or less triggers line flush ) - (infl) BEGIN (rdlnc) 5 < UNTIL IN( IN> ! ; -( And finally, implement C<* ) : RDLN< - IN> @ C@ + IN> @ C@ ( c ) DUP IF ( not EOL? good, inc and return ) 1 IN> +! ELSE ( EOL ? readline. we still return null though ) - (rdln) - THEN + RDLN + THEN ( c ) ( update C @ C@ 0 > 0x06 RAM+ ! ( 06 == C @ C@ 0 > 0x06 RAM+ ! ( 06 == Cy< zEcyC<&-XdcIp=!&wJ%=VMfm(a(5c62_+))9tnd1T;^-Tw_mL`ZD^am7|D=QqpD7{g zG)RaK#Wsbg!#*yFEzpmz~p08>xVqPY-SHyn# zwsxd0ujRB5B~JHcs!7wocrlbYH<&O;7iCq7ES1$|`Ki{eZfeUv*Y_5dwFas(sfw00 zliYYhHJz?UXg9T|NbTU&@yWTSDsqT^^3TlXMkgXyr!J38k5A_3T6FO9%nw_9pUuy| z`x1L@YP{(cIKQbuKQfn}z8sm#&ql`cumb&kbn(jN+~{a644BkLhA0xpq02QrQYfpd z)Gnkbf!0D>N{rMMTsM%$D)kCQw2NQq+Y}?u0ZRU@*nS)ny(=%gD zW8@TJ2eJ>*b^GV9_Rk-5i+D}G<2)jYa>*H;`cw@mVPtT)t_rDLce2Ymt9JSVn(Cgj zfi^>QcBm_a_)I!LI;tU;?; zu!bXPG?3aM%Z6E#HS&n2k!S611{X}dCSMr!==Z3r(W$!_KV6=2y;I0(B^q&s==|8! z?DTsVcA;Wr^<(w7uADNA88$@OdC$pbuFXM9sHqM@S>pk;PNoyxnFM$FGuTv6r4YT< zo$l*4lZhHMrQ&8P&(*0^x;KHzf+R95qV2eQ3bNBZwz~|ilc|BBO!q*h(b6hAi}J2J zEVA;EdsZBk{hnGx>NTW@dctB!RO1;UGx_F$2Gp(E6BPpAS@ae2;Vn5l^u|7nPZVTi zU+}!7b7Bv4io{wx8Wy}aJWL3Suib3MHVxalSgcq)o9r7zqMA7BF^M!O^4gakKnH41 z*KVY>C=#Bdo-D?z9Uh$vh~=por+;#4gXe0YdBanpTORgOkl*rl^zhEGCjus0utJuE zPaN}d<9!$FtP&Y7n!ksrD-JB9BIm_KGOR4+qM*F(Z7Gz!%Nl<})H<>s&HFF$(EE@D zdA+h=9L9_E(EA*_N<&~-_>GDume_Oc4#w~61&A3ItE?7j6N2woW(}!u?=5TC5Dsjv zp5fDjZy_C?UW4|ElFU}Q3tQeeZHMU1#JMiysy}*xlLM1-wJOGRbEwN>%{4H`q?G8s zwxv8lq0>FdfxWP{u6%%YTT<36OdOAqwfcTlk*-6(mRTPuToT~;fwEt_uPtlOt!D#8 ziuAemy$X_#ktgTM8ew3M)25AN`B&|=8(PqZ;NXABY$+@7CO}4BVm|m^)rB+#sBiz^o>|( zGnG$vmc5W>Nqb zTcc#nAJ^a;zf1*=V94hK?Ree}98xxY^3Q=|gPG!YCY+^Tirkp&>*L}tY~7E??u7uHuFYepau~E1LYHST;_r`LuDuP+JZR@ znH5{zUMuE)OHU$z2Y5lT{2E|shD>W+Ei7k)Cf(FHkZv=T&eT=YPsKcFPnEL#EEqn_ zHQ32`cp%f4+(SP>DeQ1|80UjX9JmH*_BA~-?pE&<A}8a;=&&K8D0(S<$U7> OH+_i9U3sSF(0>6WT|TS; delta 2746 zcmYjTYiL{N8GgTWk&bSbd`lW~lqi-RUviPvvCt`YWGj{vxr*hbS& zj=t~x-uvbG&c}z#hwBKx$G$Foq?T9K@4~IRUn!23m$I{St<_|cx0GP+j?zcAmX{}9 z%C^octF%NWb;nZaOcUwiMe#?)q)vl`cukaX(otEii*3+PIW78{wQ28gks@OBO|D+W zQ77*V)spFSU|nym+fQ{mNfkkBbE*RejgV337S*d;;MszW&Ql$o^`!04!=Q)dvf3-8 z{GECT??-9`@BP{_aa|^~{lb(p+OrJ{+O%d;{9GbaO`87k*MphSfw+MfN~#nWsH7I< zyIQyUL@UZ|ZLhzmHIXMq9x7@va^elybh;6~-PWGUuzpaq%kS$48rpS}T9&i3t^1+s zw$?}9!1DaUbRavw6qud=adx_0{!-s34EeSm$d%L$3JWO;6r*Fbt%OJ|V!H+V8+1k} zA}rSRGKI*sN}D)v!)k=K3J}^A&>^j^36suWni_yNc`8CGM$J&S0ktYpxx3#Y)&&WZ z-T`q<_StHl$*Li8#HgJNkn@n3z%xr(xnv89ZTY#a;Y7xkry#SvPZb~7UyVM3gAw}M z^&Rt*Lp$b!FyB7OqDT9)DBQOMD|QOBCMv>zt_ZhWnpjwzX`Lav2-uJWlU6E!f3N&~ zs9VIV@`v_k#SMAW9?bn-H5ETRKHA_xge!LTyunJLzKWi>XK$i^nlwBZHQ`l^4v_(^ z@l+=2u{uQqtF=G6yT4~QDU%vbrF*<&L#|hemHyjaMk&6rKSmT!kmTjb{gyr%HEM>U zhF?StSb-3l2E)(~0g_ zGG2?0(49=>LFrAU&%`k*;6#LZv?F&_PDY$F-zh=rbgF+a)7_tGwxmk-8_pmMjwO1> zy~vDJKETFU=4`xwJWo^dBj=JhAtZX{ zWZ2!&!`M(67^pl3s8|VOEc1NfTlaq@F(D<*SrB)ORs7&I` zCP;qqfmYPY8o!a@!Dur$*}WWwtUw=V+sb34{`vT5bT6Rx;n!H%!1A6a#Hw2srsuL# ztzI-GYh1U~+a4l4>K{D0JUxWGm9tL~>sye~mpzA|3iCFc@k32_}WnOaq!RGDX_jeCReN={uzJlT$BVtU*MTE>%Ph z-yzm$di%&exe%CtWp)ntIxx5=)kxRi0KNzSqa1E(z)N{hA{NCEE7gpe$wa2V@(~gP zo$a=`>1U#kMC+7s1<3IgJn>>~zjUmLdv-21&Q9_PE_c{BA;uLCQB9uyYM|^(gtC`V zdp%`;RNX`$qG5WYmNy~G_L^X1W=O4tM|ql13hGLA0ap&Lw&WlXoc(M9FLRF8OemW; zfu{|7t&=`Wi-bGj`?%{^d=qtJ@#75#Vd(Xm7~R&`FY61hp_+a!-UjWdQj%}h_;Z|+ z-2@EvXA;RhbR8Be-t8WY)gTXb=%aBP!mo7M>D0M_L^57QH*lRis@_f6*baSs550~9 dHaylm?xfc&t_nf|!5ah3fq3s=myFcz`#;|3N(TS{ diff --git a/doc/dict.txt b/doc/dict.txt index bfd0ed6..cf06af8 100644 --- a/doc/dict.txt +++ b/doc/dict.txt @@ -249,6 +249,7 @@ C< -- c Read one char from buffered input. EMIT c -- Spit char c to output stream IN> -- a Address of variable containing current pos in input buffer. +IN$ -- Flush input buffer KEY? -- c? f Polls the keyboard for a key. If a key is pressed, f is true and c is the char. Other- wise, f is false and c is *not* on the stack. @@ -256,6 +257,7 @@ KEY -- c Get char c from direct input NL> -- Emit newline PC! c a -- Spit c to port a PC@ a -- c Fetch c from port a +RDLN -- Read a line in IN( SPC> -- Emit space character WORD -- a Read one word from buffered input and push its addr. Always null terminated. If ASCII EOT is