From 1094ec9c57de0363ccb481bce1ca5611e38bfcde Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Tue, 12 May 2020 10:37:24 -0400 Subject: [PATCH] Make DO..LOOP stable DO and LOOP now only compile words from stable ABI, which make them suitable for xcomp. This will greatly simplify driver writing and allow us to mostly avoid the low/high divide in drivers. LEAVE is still xcomp-incompatible though. This make us very very tight for "<0x100" limit for literal words. Hopefully, we won't need more stuff in that area of the binary... --- blk/208 | 4 ++-- blk/218 | 2 ++ blk/219 | 1 + blk/284 | 8 ++++++-- blk/285 | 19 ++++++++++++++----- blk/286 | 28 ++++++++++++++++------------ blk/288 | 2 +- blk/326 | 17 ----------------- blk/391 | 2 +- blk/431 | 4 ++-- blk/432 | 16 ---------------- blk/433 | 2 -- emul/forth.bin | Bin 5964 -> 5899 bytes 13 files changed, 45 insertions(+), 60 deletions(-) delete mode 100644 blk/326 delete mode 100644 blk/432 diff --git a/blk/208 b/blk/208 index 5696477..0bde6fe 100644 --- a/blk/208 +++ b/blk/208 @@ -8,9 +8,9 @@ LD [rr, rn, ddnn, (nn)HL, HL(nn), dd(nn), (nn)dd, rIXY, IXYr, (DE)A, A(DE)] ADD [r, n, HLss, IXss, IXIX, IYss, IYIY] ADC [r, HLss] -CP [r, n] +CP [r, n, (IXY+)] SBC [r, HLss] SUB [r, n] PUSH [qq] POP [qq] -INC [r, ss] DEC [r, ss] +INC [r, ss, (IXY+)] DEC [r, ss, (IXY+)] AND [r, n] OR [r, n] XOR [r, n] (cont.) diff --git a/blk/218 b/blk/218 index 02d28f1..1acc685 100644 --- a/blk/218 +++ b/blk/218 @@ -8,3 +8,5 @@ OR A, ; 0x04 OP1r INCr, 0x05 OP1r DECr, +: INC(IXY+), INCr, A, ; +: DEC(IXY+), DECr, A, ; diff --git a/blk/219 b/blk/219 index 89c1bc2..6121510 100644 --- a/blk/219 +++ b/blk/219 @@ -11,3 +11,4 @@ 0xa0 OP1r0 ANDr, 0xb8 OP1r0 CPr, 0xb0 OP1r0 ORr, 0x90 OP1r0 SUBr, 0x98 OP1r0 SBCr, 0xa8 OP1r0 XORr, +: CP(IXY+), CPr, A, ; diff --git a/blk/284 b/blk/284 index 1039e61..122eb60 100644 --- a/blk/284 +++ b/blk/284 @@ -2,11 +2,15 @@ these words' offset need to be stable, so they're part of the "stable ABI" ) 'E' A, 'X' A, 'I' A, 'T' A, -0 A,, ( prev ) +0 A,, ( prev ) 4 A, H@ XCURRENT ! ( set current tip of dict, 0x42 ) 0x17 A, ( nativeWord ) 0x14 BCALL, ( popRS ) HL PUSHqq, IY POPqq, ( --> IP ) JPNEXT, - +CODE (br) ( 0x53 ) +L2 BSET ( used in CBR ) + E 0 IY+ LDrIXY, D 1 IY+ LDrIXY, + DE ADDIYss, + JPNEXT, diff --git a/blk/285 b/blk/285 index 49d4fb4..1bb3bce 100644 --- a/blk/285 +++ b/blk/285 @@ -1,6 +1,15 @@ -CODE (br) ( 0x53 ) -L2 BSET ( used in CBR ) - E 0 IY+ LDrIXY, - D 1 IY+ LDrIXY, - DE ADDIYss, +CODE (?br) ( 0x67 ) + HL POPqq, chkPS, + HLZ, + JRZ, L2 BWR ( BR + 2. False, branch ) + L1 BSET ( loop will jump here ) + ( True, skip next 2 bytes and don't branch ) + IY INCss, IY INCss, JPNEXT, +CODE (loop) ( 0x77 ) + 0 IX+ INC(IXY+), IFZ, 1 IX+ INC(IXY+), THEN, ( I++ ) + ( Jump if I <> I' ) + A 0 IX+ LDrIXY, 2 IX- CP(IXY+), JRNZ, L2 BWR ( branch ) + A 1 IX+ LDrIXY, 1 IX- CP(IXY+), JRNZ, L2 BWR ( branch ) + ( don't branch ) + IX DECss, IX DECss, IX DECss, IX DECss, JR, L1 BWR diff --git a/blk/286 b/blk/286 index 428b893..2b35008 100644 --- a/blk/286 +++ b/blk/286 @@ -1,12 +1,16 @@ -CODE (?br) ( 0x67 ) - HL POPqq, - chkPS, - HLZ, - JRZ, L2 BWR ( BR + 2. False, branch ) - ( True, skip next 2 bytes and don't branch ) - IY INCss, - IY INCss, - JPNEXT, - -( END OF STABLE ABI ) - +CODE >R ( 0xa8 ) + HL POPqq, chkPS, + 17 BCALL, ( 17 == pushRS ) +;CODE +CODE 2>R ( 0xb9 ) + DE POPqq, HL POPqq, chkPS, + 17 BCALL, ( 17 == pushRS ) EXDEHL, 17 BCALL, +;CODE +CODE R> ( 0xce ) + 20 BCALL, ( 20 == popRS ) + HL PUSHqq, +;CODE +CODE 2R> ( 0xdc ) + 20 BCALL, ( 20 == popRS ) EXDEHL, 20 BCALL, + HL PUSHqq, DE PUSHqq, +;CODE ( END OF STABLE ABI ) diff --git a/blk/288 b/blk/288 index b6333a3..d26471b 100644 --- a/blk/288 +++ b/blk/288 @@ -1,4 +1,4 @@ -PC ORG @ 0x22 + ! ( litWord ) +PC ORG @ 0x22 + ! ( litWord, 0xf7, very tight on the 0x100 limit ) ( Like numberWord, but instead of being followed by a 2 bytes number, it's followed by a null-terminated string. When called, puts the string's address on PS ) diff --git a/blk/326 b/blk/326 deleted file mode 100644 index 180c820..0000000 --- a/blk/326 +++ /dev/null @@ -1,17 +0,0 @@ -CODE >R - HL POPqq, chkPS, - 17 BCALL, ( 17 == pushRS ) -;CODE -CODE 2>R - DE POPqq, HL POPqq, chkPS, - 17 BCALL, ( 17 == pushRS ) EXDEHL, 17 BCALL, -;CODE -CODE R> - 20 BCALL, ( 20 == popRS ) - HL PUSHqq, -;CODE -CODE 2R> - 20 BCALL, ( 20 == popRS ) EXDEHL, 20 BCALL, - HL PUSHqq, DE PUSHqq, -;CODE - diff --git a/blk/391 b/blk/391 index 394668d..f76c157 100644 --- a/blk/391 +++ b/blk/391 @@ -11,6 +11,6 @@ system. More details in B260. These rules result in some practicals do's and dont's: -1. IF, UNTIL, AGAIN are fine, but *not* LOOP. +1. No LEAVE in DO..LOOP (cont.) diff --git a/blk/431 b/blk/431 index b62f8af..5b89d16 100644 --- a/blk/431 +++ b/blk/431 @@ -4,5 +4,5 @@ ( In addition to pushing H@ this compiles 2>R so that loop variables are sent to PS at runtime ) : DO COMPILE 2>R H@ ; IMMEDIATE - - +: LOOP COMPILE (loop) H@ - , ; IMMEDIATE +: LEAVE R> R> DROP I 1- >R >R ; diff --git a/blk/432 b/blk/432 deleted file mode 100644 index d058dc3..0000000 --- a/blk/432 +++ /dev/null @@ -1,16 +0,0 @@ -( Increase loop counter and returns whether we should loop. ) -: _ - R> ( IP, keep for later ) - R> 1+ ( ip i+1 ) - DUP >R ( ip i ) - I' = ( ip f ) - SWAP >R ( f ) -; -( One could think that we should have a sub word to avoid all - these COMPILE, but we can't because otherwise it messes with - the RS ) -: LOOP - COMPILE _ COMPILE (?br) - H@ - , - COMPILE 2R> COMPILE 2DROP -; IMMEDIATE diff --git a/blk/433 b/blk/433 index a6690f1..2e22895 100644 --- a/blk/433 +++ b/blk/433 @@ -1,5 +1,3 @@ -: LEAVE R> R> DROP I 1- >R >R ; - : ROLL DUP NOT IF EXIT THEN 1+ DUP PICK ( n val ) diff --git a/emul/forth.bin b/emul/forth.bin index c9db31e0c321c61d7d93a3b3cad6b07e162bb2f1..3d94aec43dac1e3a225acf831bb6e80bfc1428eb 100644 GIT binary patch literal 5899 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 literal 5964 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 nZ^!q~Ya7ML