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 c9db31e..3d94aec 100644 Binary files a/emul/forth.bin and b/emul/forth.bin differ