Просмотр исходного кода

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...
pull/102/head
Virgil Dupras 4 лет назад
Родитель
Сommit
1094ec9c57
13 измененных файлов: 45 добавлений и 60 удалений
  1. +2
    -2
      blk/208
  2. +2
    -0
      blk/218
  3. +1
    -0
      blk/219
  4. +6
    -2
      blk/284
  5. +14
    -5
      blk/285
  6. +16
    -12
      blk/286
  7. +1
    -1
      blk/288
  8. +0
    -17
      blk/326
  9. +1
    -1
      blk/391
  10. +2
    -2
      blk/431
  11. +0
    -16
      blk/432
  12. +0
    -2
      blk/433
  13. Двоичные данные
      emul/forth.bin

+ 2
- 2
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
- 0
blk/218 Просмотреть файл

@@ -8,3 +8,5 @@
OR A,
;
0x04 OP1r INCr, 0x05 OP1r DECr,
: INC(IXY+), INCr, A, ;
: DEC(IXY+), DECr, A, ;

+ 1
- 0
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, ;

+ 6
- 2
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,

+ 14
- 5
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

+ 16
- 12
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 )

+ 1
- 1
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 )


+ 0
- 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


+ 1
- 1
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.)

+ 2
- 2
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 ;

+ 0
- 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

+ 0
- 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 )


Двоичные данные
emul/forth.bin Просмотреть файл


Загрузка…
Отмена
Сохранить