Explorar el Código

Make br cells 1 byte wide

The 1 byte limitation has been effective for a while now, but I
hadn't made the move yet, I wanted to see if the limitation would
cause me problems. It doesn't.

Doing this now slightly facilitates the IY->BC move in z80.

Bootstrapping: if you try to recreate the CVM binary from the
previous commit with this code, you'll have bootstrapping problems.
The first bootstrap will compile a binary with 2-bytes wide cells
but branching conditionals that yields 1-byte cells. That's bad.

I got around the issue by temporarily inserting a "397 399 LOADR"
instruction in cvm/xcomp.fs, right before the xcomp overrides. This
way, I force 1-byte cells everywhere on the first compiliation,
which then allows me to apply the logic change in cvm/vm.c and have
a properly running binary.
master
Virgil Dupras hace 3 años
padre
commit
a7dcb522c2
Se han modificado 10 ficheros con 25 adiciones y 19 borrados
  1. +4
    -3
      blk/297
  2. +1
    -1
      blk/298
  3. +1
    -1
      blk/397
  4. +4
    -4
      blk/398
  5. +2
    -2
      blk/399
  6. +1
    -1
      blk/753
  7. +4
    -3
      blk/806
  8. +1
    -1
      blk/807
  9. BIN
      cvm/forth.bin
  10. +7
    -3
      cvm/vm.c

+ 4
- 3
blk/297 Ver fichero

@@ -1,7 +1,8 @@
CODE (br)
L1 BSET ( used in ?br and loop )
PC ORG @ 0x3d + ! ( stable ABI JP )
E 0 IY+ LDrIXY, D 1 IY+ LDrIXY,
E 0 IY+ LDrIXY, D 0 LDri,
7 E BIT, IFNZ, D DECr, THEN,
DE ADDIYd,
;CODE
CODE (?br)
@@ -9,6 +10,6 @@ PC ORG @ 0x41 + ! ( stable ABI JP )
HL POP,
HLZ,
JRZ, L1 BWR ( br + 1. False, branch )
( True, skip next 2 bytes and don't branch )
IY INCd, IY INCd,
( True, skip next byte and don't branch )
IY INCd,
;CODE

+ 1
- 1
blk/298 Ver fichero

@@ -6,7 +6,7 @@ PC ORG @ 0x45 + ! ( stable ABI JP )
A 1 IX+ LDrIXY, 1 IX- CP(IXY+), JRNZ, L1 BWR ( branch )
( don't branch )
IX DECd, IX DECd, IX DECd, IX DECd,
IY INCd, IY INCd,
IY INCd,
;CODE



+ 1
- 1
blk/397 Ver fichero

@@ -1,7 +1,7 @@
( Now we have "as late as possible" stuff. See B70 and B260. )
: _bchk DUP 0x7f + 0xff > IF LIT< br-ovfl (print) ABORT THEN ;
: DO 0x33 ( 2>R ) , H@ ; IMMEDIATE
: LOOP 0x43 ( loop ) , H@ - _bchk , ; IMMEDIATE
: LOOP 0x43 ( loop ) , H@ - _bchk C, ; IMMEDIATE
( LEAVE is implemented in low xcomp )
: LITN 0x23 ( n ) , , ;
( gets its name at the very end. can't comment afterwards )


+ 4
- 4
blk/398 Ver fichero

@@ -1,12 +1,12 @@
: IF ( -- a | a: br cell addr )
0x3f ( ?br ) , H@ 2 ALLOT ( br cell allot )
0x3f ( ?br ) , H@ 1 ALLOT ( br cell allot )
; IMMEDIATE
: THEN ( a -- | a: br cell addr )
DUP H@ -^ _bchk SWAP ( a-H a ) !
DUP H@ -^ _bchk SWAP ( a-H a ) C!
; IMMEDIATE
: ELSE ( a1 -- a2 | a1: IF cell a2: ELSE cell )
0x3b ( br ) ,
2 ALLOT
1 ALLOT
[COMPILE] THEN
H@ 2- ( push a. -2 for allot offset )
H@ 1- ( push a. 1- for allot offset )
; IMMEDIATE

+ 2
- 2
blk/399 Ver fichero

@@ -1,7 +1,7 @@
: LIT< 0x2b ( s ) , WORD DUP C@ 1+ MOVE, ; IMMEDIATE
: BEGIN H@ ; IMMEDIATE
: AGAIN 0x3b ( br ) , H@ - _bchk , ; IMMEDIATE
: UNTIL 0x3f ( ?br ) , H@ - _bchk , ; IMMEDIATE
: AGAIN 0x3b ( br ) , H@ - _bchk C, ; IMMEDIATE
: UNTIL 0x3f ( ?br ) , H@ - _bchk C, ; IMMEDIATE
: [ INTERPRET ; IMMEDIATE
: ] R> DROP ;
: COMPILE ' LITN ['] , , ; IMMEDIATE


+ 1
- 1
blk/753 Ver fichero

@@ -1,7 +1,7 @@
: OP1 CREATE C, DOES> C@ A, ;
0xc3 OP1 RETn, 0xfa OP1 CLI, 0xfb OP1 STI,
0xf4 OP1 HLT, 0xfc OP1 CLD, 0xfd OP1 STD,
0x90 OP1 NOP,
0x90 OP1 NOP, 0x98 OP1 CBW,
0xf3 OP1 REPZ, 0xf2 OP1 REPNZ, 0xac OP1 LODSB,
0xad OP1 LODSW, 0xa6 OP1 CMPSB, 0xa7 OP1 CMPSW,
0xa4 OP1 MOVSB, 0xa5 OP1 MOVSW, 0xae OP1 SCASB,


+ 4
- 3
blk/806 Ver fichero

@@ -2,11 +2,12 @@
H@ 4 + XCURRENT ! ( make next CODE have 0 prev field )
CODE (br) L1 BSET ( used in ?br )
PC 0x3f - ORG @ 0x3d + ! ( stable abi )
DI DX MOVxx, DI [DI] MOVx[], DX DI ADDxx,
DI DX MOVxx, AL [DI] MOVr[], AH AH XORrr, CBW,
DX AX ADDxx,
;CODE
CODE (?br)
PC 0x43 - ORG @ 0x41 + ! ( stable abi )
AX POPx, AX AX ORxx, JZ, L1 @ RPCs, ( False, branch )
( True, skip next 2 bytes and don't branch )
DX INCx, DX INCx,
( True, skip next byte and don't branch )
DX INCx,
;CODE

+ 1
- 1
blk/807 Ver fichero

@@ -5,5 +5,5 @@ PC 0x47 - ORG @ 0x45 + ! ( stable abi )
AX [BP] 0 MOVx[]+, AX [BP] -2 CMPx[]+,
JNZ, L1 @ RPCs, ( branch )
( don't branch )
BP 4 SUBxi, DX INCx, DX INCx,
BP 4 SUBxi, DX INCx,
;CODE

BIN
cvm/forth.bin Ver fichero


+ 7
- 3
cvm/vm.c Ver fichero

@@ -119,13 +119,17 @@ static word find(word daddr, word waddr) {
}

static void EXIT() { vm.IP = popRS(); }
static void _br_() { vm.IP += gw(vm.IP); };
static void _cbr_() { if (!pop()) { _br_(); } else { vm.IP += 2; } };
static void _br_() {
word off = vm.mem[vm.IP];
if (off > 0x7f ) { off -= 0x100; }
vm.IP += off;
}
static void _cbr_() { if (!pop()) { _br_(); } else { vm.IP++; } }
static void _loop_() {
word I = gw(vm.RS); I++; sw(vm.RS, I);
if (I == gw(vm.RS-2)) { // don't branch
popRS(); popRS();
vm.IP += 2;
vm.IP++;
} else { // branch
_br_();
}


Cargando…
Cancelar
Guardar