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...
This commit is contained in:
parent
b760c2d353
commit
1094ec9c57
4
blk/208
4
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.)
|
||||
|
2
blk/218
2
blk/218
@ -8,3 +8,5 @@
|
||||
OR A,
|
||||
;
|
||||
0x04 OP1r INCr, 0x05 OP1r DECr,
|
||||
: INC(IXY+), INCr, A, ;
|
||||
: DEC(IXY+), DECr, A, ;
|
||||
|
1
blk/219
1
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, ;
|
||||
|
8
blk/284
8
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,
|
||||
|
19
blk/285
19
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
|
||||
|
28
blk/286
28
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 )
|
||||
|
2
blk/288
2
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 )
|
||||
|
17
blk/326
17
blk/326
@ -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
|
||||
|
2
blk/391
2
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.)
|
||||
|
4
blk/431
4
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 ;
|
||||
|
16
blk/432
16
blk/432
@ -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
|
2
blk/433
2
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 )
|
||||
|
BIN
emul/forth.bin
BIN
emul/forth.bin
Binary file not shown.
Loading…
Reference in New Issue
Block a user