From 2d17b4e8ec1dbb518e0ded7acd0a3e932a817c80 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Mon, 25 May 2020 20:34:52 -0400 Subject: [PATCH] Make string length-prefixed instead of null-terminated I'm not sure why I chose null-terminated initially. Probably because the z80asm version had null-terminated strings. Length-prefixes strings are the traditional form of strings in Forth and it's a bit easier to work with them with traditional forth words when they're under this form. --- blk/288 | 12 +++--------- blk/289 | 2 +- blk/291 | 16 ++++++++-------- blk/292 | 8 -------- blk/298 | 2 +- blk/328 | 23 ++++++++++++----------- blk/354 | 1 + blk/357 | 25 ++++++++++--------------- blk/358 | 4 ++-- blk/360 | 21 ++++++++------------- blk/362 | 22 ++++++++-------------- blk/366 | 16 ++++++++-------- blk/367 | 9 +++++++++ blk/368 | 12 ------------ blk/369 | 23 ++++++++++++----------- blk/370 | 26 ++++++++++++++------------ blk/371 | 24 ++++++++++-------------- blk/381 | 8 +------- blk/382 | 5 ++++- blk/392 | 2 +- blk/399 | 2 +- emul/forth.bin | Bin 6147 -> 6196 bytes emul/stage.c | 3 ++- 23 files changed, 116 insertions(+), 150 deletions(-) create mode 100644 blk/367 delete mode 100644 blk/368 diff --git a/blk/288 b/blk/288 index af8d5b6..9891b95 100644 --- a/blk/288 +++ b/blk/288 @@ -3,14 +3,8 @@ PC ORG @ 0x22 + ! ( litWord, 0xf7, tight on the 0x100 limit ) number, it's followed by a null-terminated string. When called, puts the string's address on PS ) IY PUSHqq, HL POPqq, ( <-- IP ) + E (HL) LDrr, D 0 LDrn, + DE INCss, + DE ADDIYss, HL PUSHqq, - ( skip to null char ) - A XORr, ( look for null ) - B A LDrr, - C A LDrr, - CPIR, - ( CPIR advances HL regardless of comparison, so goes one - char after NULL. This is good, because that's what we - want... ) - HL PUSHqq, IY POPqq, ( --> IP ) JPNEXT, diff --git a/blk/289 b/blk/289 index 465de47..771ae6b 100644 --- a/blk/289 +++ b/blk/289 @@ -1,5 +1,5 @@ ( Name of BOOT word ) -L1 BSET 'B' A, 'O' A, 'O' A, 'T' A, 0 A, +L1 BSET 4 A, 'B' A, 'O' A, 'O' A, 'T' A, PC ORG @ 1 + ! ( main ) ( STACK OVERFLOW PROTECTION: See B76 ) diff --git a/blk/291 b/blk/291 index d4e025f..3a22926 100644 --- a/blk/291 +++ b/blk/291 @@ -5,12 +5,12 @@ PC ORG @ 4 + ! ( find ) BC PUSHqq, HL PUSHqq, ( First, figure out string len ) - BC 0 LDddnn, - A XORr, - CPIR, - ( C has our length, negative, -1 ) - A C LDrr, - NEG, - A DECr, + A (HL) LDrr, A ORr, ( special case. zero len? we never find anything. ) - IFNZ, ( fail-B296 ) ( cont. ) + IFNZ, ( fail-B296 ) +( Let's do something weird: We'll hold HL by the *tail*. + Because of our dict structure and because we know our + lengths, it's easier to compare starting from the end. ) + C A LDrr, B 0 LDrn, ( C holds our length ) + BC ADDHLss, HL INCss, ( HL points to after-last-char ) + ( cont . ) diff --git a/blk/292 b/blk/292 index 51e1b0c..a86812e 100644 --- a/blk/292 +++ b/blk/292 @@ -1,11 +1,3 @@ - C A LDrr, ( C holds our length ) -( Let's do something weird: We'll hold HL by the *tail*. - Because of our dict structure and because we know our - lengths, it's easier to compare starting from the end. - Currently, after CPIR, HL points to char after null. Let's - adjust. Because the compare loop pre-decrements, instead - of DECing HL twice, we DEC it once. ) - HL DECss, BEGIN, ( inner ) ( DE is a wordref, first step, do our len correspond? ) HL PUSHqq, ( --> lvl 1 ) diff --git a/blk/298 b/blk/298 index 07762c6..79401ea 100644 --- a/blk/298 +++ b/blk/298 @@ -1,4 +1,4 @@ -'(' A, 'u' A, 'f' A, 'l' A, 'w' A, ')' A, 0 A, +6 A, '(' A, 'u' A, 'f' A, 'l' A, 'w' A, ')' A, L2 BSET ( abortUnderflow ) HL PC 7 - LDddnn, DE RAMSTART 0x02 + LDdd(nn), ( RAM+02 == CURRENT ) diff --git a/blk/328 b/blk/328 index 2ac50ad..5b2d2a5 100644 --- a/blk/328 +++ b/blk/328 @@ -1,14 +1,15 @@ CODE S= - DE POPqq, - HL POPqq, - chkPS, - BEGIN, - LDA(DE), - (HL) CPr, - JRNZ, BREAK, ( not equal? break early. NZ is set. ) - A ORr, ( if our char is null, stop ) - HL INCss, - DE INCss, - JRNZ, AGAIN, + DE POPqq, HL POPqq, chkPS, + LDA(DE), + (HL) CPr, + IFZ, ( same size? ) + B A LDrr, ( loop A times ) + BEGIN, + HL INCss, DE INCss, + LDA(DE), + (HL) CPr, + JRNZ, BREAK, ( not equal? break early. NZ is set. ) + DJNZ, AGAIN, + THEN, PUSHZ, ;CODE diff --git a/blk/354 b/blk/354 index b08e2fc..6c1919a 100644 --- a/blk/354 +++ b/blk/354 @@ -11,3 +11,4 @@ : C!+ ( c a -- a+1 ) TUCK C! 1+ ; : C@- ( a -- a-1 c ) DUP C@ SWAP 1- SWAP ; : C!- ( c a -- a-1 ) TUCK C! 1- ; +: LEAVE R> R> DROP I 1- >R >R ; : UNLOOP R> 2R> 2DROP >R ; diff --git a/blk/357 b/blk/357 index 7bf7b59..0d3eaf3 100644 --- a/blk/357 +++ b/blk/357 @@ -1,16 +1,11 @@ -: (parsed) ( a -- n f ) - DUP C@ ( a c ) - DUP '-' = IF - DROP 1+ ( a+1 ) (parsed) 0 ROT ( f 0 n ) +: _ ( a+1 len -- n f ) + OVER C@ ( a len c ) + '-' = IF + 1- SWAP 1+ SWAP ( a+1 len-1 ) _ 0 ROT ( f 0 n ) - SWAP EXIT ( 0-n f ) - THEN - 0 SWAP _pdacc ( a r f ) - ?DUP IF 2DROP 0 EXIT THEN - BEGIN ( a r ) - SWAP 1+ ( r a+1 ) - DUP C@ ( r a c ) - ROT SWAP ( a r c ) - _pdacc ( a r f ) - ?DUP UNTIL - 1 = ( a r f ) - ROT DROP ( r f ) ; + THEN ( a len ) + 0 SWAP ( len ) 0 DO ( a r ) + OVER I + C@ ( a r c ) _pdacc ( a r f ) + IF DROP 1- 0 UNLOOP EXIT THEN LOOP ( a r ) + NIP 1 ; +: (parsed) ( a -- n f ) C@+ ( a+1 l ) _ ; diff --git a/blk/358 b/blk/358 index d7cb9b0..63ed549 100644 --- a/blk/358 +++ b/blk/358 @@ -3,9 +3,9 @@ : (parsec) ( a -- n f ) ( apostrophe is ASCII 39 ) - DUP C@ 39 = OVER 2+ C@ 39 = AND ( a f ) + DUP 1+ C@ 39 = OVER 3 + C@ 39 = AND ( a f ) NOT IF 0 EXIT THEN ( a 0 ) ( surrounded by apos, good, return ) - 1+ C@ 1 ( n 1 ) + 2+ C@ 1 ( n 1 ) ; diff --git a/blk/360 b/blk/360 index 59b1089..4e44983 100644 --- a/blk/360 +++ b/blk/360 @@ -1,15 +1,10 @@ : (parseh) ( a -- n f ) - ( '0': ASCII 0x30 'x': 0x78 0x7830: 30768 ) - DUP @ 30768 = NOT IF 0 EXIT THEN ( a 0 ) + ( '0': ASCII 0x30 'x': 0x78 0x7830 ) + DUP 1+ @ 0x7830 = 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 DROP 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 -; - + DUP C@ ( a len ) + 0 SWAP 1+ ( len+1 ) 3 DO ( a r ) + OVER I + C@ ( a r c ) _ ( a r n ) + DUP 0< IF 2DROP 0 UNLOOP EXIT THEN + SWAP 4 LSHIFT + ( a r*16+n ) LOOP + NIP 1 ; diff --git a/blk/362 b/blk/362 index e940db4..556905b 100644 --- a/blk/362 +++ b/blk/362 @@ -1,16 +1,10 @@ : (parseb) ( a -- n f ) - ( '0': ASCII 0x30 'b': 0x62 0x6230: 25136 ) - DUP @ 25136 = NOT IF 0 EXIT THEN ( a 0 ) + ( '0': ASCII 0x30 'b': 0x62 0x6230 ) + DUP 1+ @ 0x6230 = 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 DROP 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 -; - - + DUP C@ ( a len ) + 0 SWAP 1+ ( len+1 ) 3 DO ( a r ) + OVER I + C@ ( a r c ) _ ( a r n ) + DUP 0< IF 2DROP 0 UNLOOP EXIT THEN + SWAP 1 LSHIFT + ( a r*2+n ) LOOP + NIP 1 ; diff --git a/blk/366 b/blk/366 index 784528c..bd40900 100644 --- a/blk/366 +++ b/blk/366 @@ -1,13 +1,13 @@ ( Read word from C<, copy to WORDBUF, null-terminate, and return WORDBUF. ) +: _wb 0x0e RAM+ ; +: _eot 0x0401 _wb ! _wb ; : WORD - 0x0e RAM+ TOWORD ( a c ) - DUP EOT? IF OVER ! EXIT THEN + _wb 1+ TOWORD ( a c ) + DUP EOT? IF 2DROP _eot EXIT THEN BEGIN - ( We take advantage of the fact that char MSB is - always zero to pre-write our null-termination ) - OVER ! 1+ C< ( a c ) - OVER 0x2d ( 2e-1 for NULL ) RAM+ = OVER WS? OR + OVER C! 1+ C< ( a c ) + OVER 0x2e RAM+ = OVER WS? OR UNTIL ( a c ) - NIP 0x0e RAM+ ( ws a ) - SWAP EOT? IF 4 OVER ! THEN ; + SWAP _wb - 1- ( ws len ) _wb C! + EOT? IF _eot ELSE _wb THEN ; diff --git a/blk/367 b/blk/367 new file mode 100644 index 0000000..619d14e --- /dev/null +++ b/blk/367 @@ -0,0 +1,9 @@ +: IMMEDIATE + CURRENT @ 1- + DUP C@ 128 OR SWAP C! ; +: IMMED? 1- C@ 0x80 AND ; +: +! TUCK @ + SWAP ! ; +: -^ SWAP - ; +: / /MOD NIP ; +: MOD /MOD DROP ; +: ALLOT HERE +! ; diff --git a/blk/368 b/blk/368 deleted file mode 100644 index 6121c98..0000000 --- a/blk/368 +++ /dev/null @@ -1,12 +0,0 @@ -: +! TUCK @ + SWAP ! ; -: [entry] ( w -- ) - H@ SWAP - BEGIN C@+ ( w+1 c ) ?DUP IF C, 0 ELSE 1 THEN UNTIL DROP - H@ SWAP - ( sz ) - ( write prev value ) - H@ CURRENT @ - , - C, ( write size ) - H@ CURRENT ! -; - -: (entry) WORD [entry] ; diff --git a/blk/369 b/blk/369 index 35f6b3f..2aad0d2 100644 --- a/blk/369 +++ b/blk/369 @@ -1,11 +1,12 @@ -: IMMEDIATE - CURRENT @ 1- - DUP C@ 128 OR SWAP C! ; -: IMMED? 1- C@ 0x80 AND ; -: -^ SWAP - ; -: / /MOD NIP ; -: MOD /MOD DROP ; -: ALLOT HERE +! ; -: CREATE (entry) 11 ( 11 == cellWord ) C, ; -: VARIABLE CREATE 2 ALLOT ; -: LEAVE R> R> DROP I 1- >R >R ; +: '? WORD FIND ; +: ' + '? (?br) [ 4 , ] EXIT + LIT< (wnf) FIND DROP EXECUTE +; +: ROLL + ?DUP NOT IF EXIT THEN + 1+ DUP PICK ( n val ) + SWAP 2 * (roll) ( val ) + NIP ; +: 2OVER 3 PICK 3 PICK ; +: 2SWAP 3 ROLL 3 ROLL ; diff --git a/blk/370 b/blk/370 index 2aad0d2..b488aa3 100644 --- a/blk/370 +++ b/blk/370 @@ -1,12 +1,14 @@ -: '? WORD FIND ; -: ' - '? (?br) [ 4 , ] EXIT - LIT< (wnf) FIND DROP EXECUTE -; -: ROLL - ?DUP NOT IF EXIT THEN - 1+ DUP PICK ( n val ) - SWAP 2 * (roll) ( val ) - NIP ; -: 2OVER 3 PICK 3 PICK ; -: 2SWAP 3 ROLL 3 ROLL ; +: MOVE ( a1 a2 u -- ) + ( u ) 0 DO ( a1 a2 ) + SWAP C@+ ( a2 a1+1 x ) + ROT C!+ ( a1+1 a2+1 ) + LOOP 2DROP ; +: MOVE- ( a1 a2 u -- ) + TUCK + 1- ( a1 u a2+u-1 ) + ROT 2 PICK + 1- ( u a2+u-1 a1+u-1 ) + ROT ( u ) 0 DO ( a2 a1 ) + C@- ( a2 a1-1 x ) + ROT C!- ( a1-1 a2-1 ) SWAP ( a2 a1 ) + LOOP 2DROP ; +: MOVE, ( a u -- ) H@ OVER ALLOT SWAP MOVE ; +: PREV 3 - DUP @ - ; diff --git a/blk/371 b/blk/371 index b488aa3..f1669c6 100644 --- a/blk/371 +++ b/blk/371 @@ -1,14 +1,10 @@ -: MOVE ( a1 a2 u -- ) - ( u ) 0 DO ( a1 a2 ) - SWAP C@+ ( a2 a1+1 x ) - ROT C!+ ( a1+1 a2+1 ) - LOOP 2DROP ; -: MOVE- ( a1 a2 u -- ) - TUCK + 1- ( a1 u a2+u-1 ) - ROT 2 PICK + 1- ( u a2+u-1 a1+u-1 ) - ROT ( u ) 0 DO ( a2 a1 ) - C@- ( a2 a1-1 x ) - ROT C!- ( a1-1 a2-1 ) SWAP ( a2 a1 ) - LOOP 2DROP ; -: MOVE, ( a u -- ) H@ OVER ALLOT SWAP MOVE ; -: PREV 3 - DUP @ - ; +: [entry] ( w -- ) + C@+ ( w+1 len ) TUCK MOVE, ( len ) + ( write prev value ) + H@ CURRENT @ - , + C, ( write size ) + H@ CURRENT ! +; +: (entry) WORD [entry] ; +: CREATE (entry) 11 ( 11 == cellWord ) C, ; +: VARIABLE CREATE 2 ALLOT ; diff --git a/blk/381 b/blk/381 index 51224e5..e5f4045 100644 --- a/blk/381 +++ b/blk/381 @@ -1,13 +1,7 @@ : EMIT ( 0x53==(emit) override ) 0x53 RAM+ @ ?DUP IF EXECUTE ELSE (emit) THEN ; -: (print) - BEGIN - C@+ ( a+1 c ) - ( exit if null or 0xd ) - DUP 0xd = OVER NOT OR IF 2DROP EXIT THEN - EMIT ( a ) - AGAIN ; +: (print) C@+ ( a len ) 0 DO C@+ EMIT LOOP DROP ; : BS 8 EMIT ; : LF 10 EMIT ; : CR 13 EMIT ; : CRLF CR LF ; : SPC 32 EMIT ; : NL 0x0a RAM+ @ ( NLPTR ) ?DUP IF EXECUTE ELSE CRLF THEN ; diff --git a/blk/382 b/blk/382 index b397eee..7084dd5 100644 --- a/blk/382 +++ b/blk/382 @@ -2,6 +2,9 @@ BEGIN C< DUP 34 ( ASCII " ) = IF DROP EXIT THEN C, AGAIN ; -: LIT" 34 , ( litWord ) ," 0 C, ; IMMEDIATE +: LIT" + 34 , ( litWord ) H@ 0 C, ," + DUP H@ -^ 1- ( a len ) SWAP C! +; IMMEDIATE : ." [COMPILE] LIT" COMPILE (print) ; IMMEDIATE : ABORT" [COMPILE] ." COMPILE ABORT ; IMMEDIATE diff --git a/blk/392 b/blk/392 index 4e7bad7..9b1af66 100644 --- a/blk/392 +++ b/blk/392 @@ -1,6 +1,6 @@ : INTERPRET BEGIN - WORD DUP C@ EOT? IF DROP EXIT THEN + WORD DUP @ 0x0401 = ( EOT ) IF DROP EXIT THEN FIND NOT IF (parse) ELSE EXECUTE THEN CS19x7?~~X;exNl>-GPU4>V|E-fU>ZY^tzO5N=9 zd0(4Qoiwc}_WL~V^E~hK`+Z)|=V|j>H6hl@#ry?r{-3n@A#MJMwsJ?z|CKg>TDv2@ z5O;(S^Z5T)pyT&>^&Q?FNeN+=zrR5&Wftcj5&ogES|<>h=R~Go%WNd71Gpk#DPR2l z8~%?ozKjn@{O3PBI(oFWOjyg)j|-2Heq2kR6zR9V_RObGYU#JuJpYoeQ-2k|YENtt zdimn}MMCkmv?rXxD8EX~$^&eoy%Eti`&2g*9^DSN9^vFjOv!47- zn*y8a9(l{7yYF3H^p`Dd+O+BV%5%Q{#h3rVZ>%O(7CqO_w=T}Tm-gZBxJVz<-b;^& z^sq*|-n06T4<9~J>wQsM9nf#9Q-0&UxAu$GvEN*&xcz>mNG~lG3BZXbK3La%1zN9^ z+{r9S<8hh~uCKU5ldiA$d_YwEM|gKQ)Rzi>Eo|jiA*bR}BA#-<8;e)x0A62u2gF@{ zy>6m_SfUF$fMDn(0-@4~>`KIYi;2WK`AncUk86sQ4vqJR6RsTQx*z_loyRTJXVy#zXyMqlXXIK8Bz#cJ(~zOYNzvTm5I?TX@h0CJ9e!fhvxN!U3+Bu%t{%d6Z>WlVD9D1f)m4 zP7g~z{t-<|k9?IL&Tu>UY?x*BT`c`$2gZ}VwFSr^ltmViNTRrHr7 zZ>O(BmBP9MLp{BooVVdKZ1^q46MBCBJ7C{Cd}w6(7hx*X_}+bs=r2&wDj zej@pFq&roF{G1~)U|RgvORbkG-CvSBDt9-1a~FB8b`yb~x{bngdW5)LX#_IYTCf+&L=O-H}*VJ_P<0P@_I! z21O*+j(~x?NpeSGeiQ=07J%fA#1JqdI>i+Wb?_e=89t0|Y<13)oav!Anyt6E|$pQhmf%dx}D)v6sf+@F1ou>4}d<@iNrFT8SOlLzhE{J<*h>p zb#AtuH5L$zP$zONM{z4l(U7CK1&U}m(2okUI4_IK!l&OfZkgxAIS~|nv1mNrTaK_? z7B|Fcow&V6_Ydyd$53T74>}C>w1aCFf*A06gLnthye&F6I6`qe`uRAm$iBr6BILmXUtgd}fOSoEa03e%ONJF>@~!Ldy*4oF|9Ll`Lg%=>*6 zW=*BQjc<6m_K(pCB6g;2Q2cB5JCvv3Z)M>sVey|B8J5*&NA)FX4azCh+R=)H^uX(? z9fVrZ?EtgB&lpY_5jwm;!YuIm$6)p}ihtVji8+dINU1LZ)3oI*a0^*nFp}zIyI?Jp zT0BA%tUzGB#L}M{yt>1(tTB<8fH(A{aN?*n@hQsbyz#EysGo)OXObOFQb#5@I!Zj% zk?WCc7J%z>aJ3^SQt@Zvi7uDyUq1bJ@Z%|m-3aJEaoo@kivL zk0}9~dCf6pT!RpbD1x5X91G?fj*Rvb2kYmw{#)z?pw)u;yF8}vc1U0%pOV5qT5Hs= zIqFff*BoaJ#q(PSeNCB>o}O@5B#;XCi#*w&Z<$O$4{GN|)>KK-Q3>5|$tszYPOHNW zuA_&XLFF~-ba=ya#5C&6v_^K$L8Ay+idljUXwYEy3PhvvQ~^54sO40CP}Fp=C*E_s z4vTBZaxq_}$a-q12A+sVqm?jS#hyvE06kOCkPWrXIIi=k77ljRkj~0UVT+$Ya{|PW zCee5EiN1@&dqB;wvx7iu+p^YSn-rg~odyf{8Xf`5W?LmZw~U%*cUEgM#6Ui1Yt$cR zsNW8TX-hzVGrv*aSr8PxiEuvy#uM50&KUH~z=4rtV=wI~Lxt4aHrrk;n6~g{tT)__ zY6sVJre6}(;);TM-iEADB8(^%A_^ZDctpNnR`mxGkw7pCE9}lMfYrsDu#0KpcSDto zrUEvBfKi1?d3<*~u``@vI2ZEKs|r~ye_x;j zGrHq&G+B60S<&Ws1yJC7QiKxg-3sPec^YGT~%4BbdU4)8}F&51+svBWlgO9MQ z9;ln);40x7KQ_4U1<&!3{RhT|509ScM0b|A4n}zAwCk>`N;pr9j_vo1j2`n0kAjXA z^;M5TP4;PzsFD+iiflC+=Q6wifNHzRGMK+kbduA6|1dDQQtk;_%@>`kSJsm>N&W6ycOhjfinPgejC5dp3=>7BjZ= z4Rx8qKskrIkUWJC5{<*AJh=8aEcncFw3x-mN&54(i>@mc>K_z|u4t_FF{CjCoyYyc zp+$+KYPX9Oe#RWPs#z+>RNcbdM>phqYsy%(T(Q&}Z{~kysTO%9YOJDO>rC5Q8WCn? zmwI>Hbuov+@n{F%E;;QRF`C^#1B^zJsZ!v7h}?F|$lk{xF#|Su!feU$>})c`c93 zY3;*2!i9n*u8+Pj?b6&y@h)>?Xms>gYi$@IWoog5sOQlvt_y{sr=sxye+7}(!8rt6 zO`lw;xs)r#eNOyPUN?lMjA{|upr{{q;{B4#S$f{0IoICAc}gx5)G41=mmw_)w~h1kX&l_3Pzhf3d>PS+8O>Itxesob6#oN5X+ffnSG{6s)N|kYrRYbU z+bU$@w?l1$Y^mL)y!QZkx2Y$2r`q&#b6;+g;}P#^Ry8{pFQQcGvbNdA)ptr+)f}VL zE4&5@+%It>r}=B8y4rMzJq2f}@j^Ln{Rz(%FPAC2ggkyxR;#9<&k>fV+(MI6oD)+VhhM&LGun4B`{wRZH|`m$crEX5%aY>X!4m0i zmghq^oR*vPIA4`Q3w7^A%G4YljwUe?Qa5CgL(%4yPg^wV9Z9ur#NIvNd2=!E7tB{N zUk1ZFBe4oGg}#93?+ip@4ggBVx_y1IR3us^Hn z@0=N6+p6U;bHDF=@7MY6Oyz4+K23<(axryPoBDfgYCxMB)t2swsUK=nZ)*3%Z^S(z z#1#Hr10BCFsPD+0Xj%xf{A#IKe7G>RPWTQE`<*~M>=O@rw1;bnY6Y%H*vc1P{m^&k zVb#MbAo0g{d}!!|zf9zm&p#_HWByrf{xvcG@$amu`Pa1hk5{d~o3B-WEB>)1xl!ol z3s;MT;%#V2I)zbwjhLlJ*knsFsAvnQ8j>yfAOW;Q%nhJ2M!^CJEiNp+w==Q)zOp=+ zNTkKqZ&v3$V%0Ntx6-^@lP41-4CuU_{tX7uU~&-sjsSM;gt`3#&U9L!TRjIriIJX^HunJQp}HP z)ANI3zF(tz)4r4a$4~o(=Zv=8tKU_sKKDFW{b+gk^Pg4Ry}CinFD?`bz{%&ncBFL}P92VcCQQK@fu==gE})5!foxO00|dS7kr@=t+pprTUN3NC zX-TTyg&ac|f$EflfDqdW1>)fX=^X6(&cx6we{+=BM3O}zjs4DtL$CZqBKIVcC67pd zJoL(sBsQK%ODyk0s(@-_(gLqv^}2u2i^w7C5swT13q@06MFc%+_@s$uZ7IS4=| z63Lu~JWlDx2%p>Re8%D6GqTpZLLL{~xxBDEfa9)E8!Mj%JtLNn(Sj&VR5d5T>Ou&Z zAN<{Xzl`G_(xv&q-_G|xWAP z27}bK@;sU9h_zH2KP7Qj>*&YzkiAvSEtE9XYE>HIxQjYdX1n6 zM&q@G3KoPrBFTt?O_8((MW{QOjKtG5MIsM8&p(NCi(Ka$wsT}+x}C%Fxjh;W=R@E* zK#lr$&7g?JTaYYp*Gukb+=nIr*Z`2+(KwPtM4Py7qYb`+!T#eI$T`kQ^SaH{Ke3G) zIUZY+E^3K4XVu>7h0vV5D(iu)gk?s!dVz?Xi4$z0%P*{f3)Gr|Rb7mt^ zo?1*#XJzhrV-Cp(wV~Fs6pI;(x-7*aDE6N?eBjU_7ouzZ3giU z;9Z6~nZ`+@#Dxv7F$u_b;=u68k;DEFs)ojpqfYceQZXdWnU``W%@u7Mj0}oN7;!3h zjZRr_>g1;Ba65^li|rNqxxVN(1FleRum%?SU#>Vy93$Epwh|EjMahJ(V@p3w@{tGLdtl)LAI|GUY&55IAh&*=yZmk zbLM$_hphIbjaAtqd4I85nrp$tq^(hMFfL|>tJaf12r6^Wp)eYyoZcgYqr)%nD@ArD zz`)94wcfN(nvDJ>^QidcYK_jbZHOBu?KWe^e$&op8sd`z{4Ef0*73CiBet_M5{?Ga z5x20*$-F2V%o1bbRwh=Gq;&(FUzCkBCZk^0hh+vaXGw11fIMcD=3*`-!kjb53^rsS z7E7cHFmH!#KZmYRG6F?~5VRxT68SJYD0%|PXdoDil%S3;0IQ34@`EB43G~1sn{!so zqSx*ii{`uHUDRTAYYDWTb$oyesG3^;Bmch_qZ;+eL@dU9sA^*wb8_^;CF%$puj;h6 zf$N_adMsgJ>Z(tmxhGdOV}pSc2+?{FfLYN?Q()C!ivd4r#dnS`@q23ZIt;;D2X zp5`>UkUwMh74rJ+jkfQ@ZtToPxHsJqiSNTqJnIOf(jK7FKqQe~Xh$c;cD3QngK>Kn z6)h1Ste8YJW)Ur_v7XDq;q+cMmL+y%F+N4n1ej((s-I?jUWnDil&eW>mzS6c%m7l2 z!y#e5li%l6 z#DWU+W4dn7UIpfW1FI=Mp{Y}CPnJl@kgFS44fH=pTr%sCg`u$}mp5XeyjES9t_%>% zKjun_+b}wqszQHq)W=-FwyX8XA)!!GL4_G8*3LY??|K`Qsjd*m2F)a6JeFltHwGuE zvga~R)m!Jc5bjDbGJ4?93)acO!$*euj}M&|Axv+1Enzix4!LGsmE!c!@L_9kXw>Q- z0-dDTRQVLl<6})#l0~@m*)1+bf1# z>>9aF0{4b<7`Vn9;`ZZp1Z;OOuuZHiETKF&RgdUrVWoi~ZnZfqi z{8F_{lFU=57OlN736nAX>@#$>l3OKgU$G4b=&FQGEr-Pv^jmGHKU(a4igVN1@* z);L-;CVmS?vHBkz@oz-ZKfzSEjw@7+B|?iPUj*Jlw%>xhU6H+BSxepjqndxnY92m( zeDDz7%W|cp+fov*T?fkF6zhr^!ZWfcxZKhrVjNFkP`47V2E@N3NT$x%(3Wv5m7n0c zBL(|JB}}fqRO~+q4<6W>i`jf!pubvu+jZSW`-37Gj>VgvM&VKrcVn(GN*qo5uvp%X>-FCq*?i;-XLaOtf5FE z*2=e#to4o9TyL?zqp9>7;M1sWx6JGvEHup}tc5mIdlND?<*x(BPrSp@8Y!JSFf_XjprEWPMRzLNcwop7OGLl3=x z2K*8YFvGeyI5afcRS1;4mFyKl_Io@OV ztE0NsbclTe!BVS*3f$utaX#^48OIBtCD@ee$swOqfK`Qh#RbE)hCx4XY{K{BioH^j zUs5UdkGwo0zIIfK5PpI?aAM?0A|)%~3dL-I(DAhwFw; z^&bZ@Ur@q{jhN$JaS^k90>O$U5?wA#doPw=VzwE@Wt`=>1>!7vj;|RzG5CGrk8$bv zh1!6=LRxmXg(mk|C-zw`rbk5?#=(o&OS5;@3~D$>^x6-XrNlq8@Y}aa{YRy??9R(Q zY7ML~vA&1#>)}ihx4%?fuPrj0?SunCQ z8h=`R50e2kurm;iI{+w2kG<@Ur=zhld7uo+y5Cz2XRnk5#l9T4m?_(6I-qjy&4eVB z=`GW~^**=w6UnA-ugp(MR-45i an=Fro)z52HTU?;{+*Sje1m%&3p!r`EpnPEf diff --git a/emul/stage.c b/emul/stage.c index fe00dea..c0f3af4 100644 --- a/emul/stage.c +++ b/emul/stage.c @@ -42,7 +42,8 @@ static uint8_t iord_stdio() static void iowr_stdio(uint8_t val) { - // we don't output stdout in stage0 + // uncomment when you need to debug staging + // putc(val, stderr); } static void iowr_here(uint8_t val)