Browse Source

Use IY for IP instead of RAM+06

pull/102/head
Virgil Dupras 4 years ago
parent
commit
0750e8d0c0
3 changed files with 27 additions and 31 deletions
  1. +1
    -1
      blk/081
  2. BIN
      emul/forth/z80c.bin
  3. +26
    -30
      forth/boot.fs

+ 1
- 1
blk/081 View File

@@ -2,7 +2,7 @@
RAMSTART INITIAL_SP +53 readln's variables
+02 CURRENT +55 adev's variables
+04 HERE +57 blk's variables
+06 IP +59 z80a's variables
+06 FUTURE USES +59 z80a's variables
+08 FLAGS +5b FUTURE USES
+0a PARSEPTR +70 DRIVERS
+0c CINPTR +80 RAMEND


BIN
emul/forth/z80c.bin View File


+ 26
- 30
forth/boot.fs View File

@@ -1,6 +1,13 @@
( Configuration words: RAMSTART, RS_ADDR )
H@ 256 /MOD 2 PC! 2 PC!

( RESERVED REGISTERS

At all times, IX points to RSP TOS and IY is IP. SP points
to PSP TOS, but you can still use the stack in native code.
you just have to make sure you've restored it before "next".
)

( STABLE ABI
Those jumps below are supposed to stay at these offsets,
always. If they change bootstrap binaries have to be
@@ -44,10 +51,10 @@ NOP, ( unused )
'E' A, 'X' A, 'I' A, 'T' A,
0 A,, ( prev )
4 A,
L1 BSET ( EXIT )
L1 BSET ( EXIT, 0x43 )
0x17 A, ( nativeWord )
0x14 CALLnn, ( popRS )
RAMSTART 0x06 + LD(nn)HL, ( RAMSTART+0x06 == IP )
0x14 CALLnn, ( popRS )
HL PUSHqq, IY POPqq, ( --> IP )
JPNEXT,

NOP, NOP, NOP, NOP, ( unused )
@@ -58,13 +65,13 @@ PC L1 @ - A,, ( prev )
L1 BSET ( BR )
0x17 A, ( nativeWord )
L2 BSET ( used in CBR )
RAMSTART 0x06 + LDHL(nn), ( RAMSTART+0x06 == IP )
IY PUSHqq, HL POPqq, ( <-- IP )
E (HL) LDrr,
HL INCss,
D (HL) LDrr,
HL DECss,
DE ADDHLss,
RAMSTART 0x06 + LD(nn)HL, ( RAMSTART+0x06 == IP )
HL PUSHqq, IY POPqq, ( --> IP )
JPNEXT,

NOP, ( unused )
@@ -80,10 +87,8 @@ H@ XCURRENT ! ( set current tip of dict )
L ORr,
JRZ, L2 BWR ( BR + 2. False, branch )
( True, skip next 2 bytes and don't branch )
RAMSTART 0x06 + LDHL(nn), ( RAMSTART+0x06 == IP )
HL INCss,
HL INCss,
RAMSTART 0x06 + LD(nn)HL, ( RAMSTART+0x06 == IP )
IY INCss,
IY INCss,
JPNEXT,

( END OF STABLE ABI )
@@ -101,12 +106,10 @@ PC ORG @ 0x24 + ! ( addrWord )
compiled word list. What we need to do to fetch that number
is to play with the IP.
)
RAMSTART 0x06 + LDHL(nn), ( RAMSTART+0x06 == IP )
E (HL) LDrr,
HL INCss,
D (HL) LDrr,
HL INCss,
RAMSTART 0x06 + LD(nn)HL, ( RAMSTART+0x06 == IP )
E 0 IY+ LDrIXY,
D 1 IY+ LDrIXY,
IY INCss,
IY INCss,
DE PUSHqq,
JPNEXT,

@@ -115,7 +118,7 @@ PC ORG @ 0x22 + ! ( litWord )
string literal. 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 )
RAMSTART 0x06 + LDHL(nn), ( RAMSTART+0x06 == IP )
IY PUSHqq, HL POPqq, ( <-- IP )
HL PUSHqq,
( skip to null char )
A XORr, ( look for null )
@@ -125,7 +128,7 @@ PC ORG @ 0x22 + ! ( litWord )
( CPIR advances HL regardless of comparison, so goes one
char after NULL. This is good, because that's what we
want... )
RAMSTART 0x06 + LD(nn)HL, ( RAMSTART+0x06 == IP )
HL PUSHqq, IY POPqq, ( --> IP )
JPNEXT,

( Name of BOOT word )
@@ -294,17 +297,10 @@ PC ORG @ 0x1b + ! ( next )
( Before we continue: are stacks within bounds? )
0x1d CALLnn, ( chkPS )
L2 @ CALLnn, ( chkRS )
DE RAMSTART 0x06 + LDdd(nn), ( RAMSTART+0x06 == IP )
H D LDrr,
L E LDrr,
DE INCss,
DE INCss,
RAMSTART 0x06 + DE LD(nn)dd, ( RAMSTART+0x06 == IP )
( HL is an atom list pointer. We need to go into it to
have a wordref )
E (HL) LDrr,
HL INCss,
D (HL) LDrr,
E 0 IY+ LDrIXY,
D 1 IY+ LDrIXY,
IY INCss,
IY INCss,
( continue to execute )

PC ORG @ 0x34 + ! ( execute )
@@ -324,7 +320,7 @@ PC ORG @ 0x0f + ! ( compiledWord )
1. Push current IP to RS
2. Set new IP to the second atom of the list
3. Execute the first atom of the list. )
RAMSTART 0x06 + LDHL(nn), ( RAMSTART+0x06 == IP )
IY PUSHqq, HL POPqq, ( <-- IP )
0x11 CALLnn, ( 11 == pushRS )
EXDEHL, ( HL points to PFA )
( While we increase, dereference into DE for execute call
@@ -333,7 +329,7 @@ PC ORG @ 0x0f + ! ( compiledWord )
HL INCss,
D (HL) LDrr,
HL INCss,
RAMSTART 0x06 + LD(nn)HL, ( RAMSTART+0x06 == IP )
HL PUSHqq, IY POPqq, ( --> IP )
0x33 JPnn, ( 33 == execute )

PC ORG @ 0x0c + ! ( cellWord )


Loading…
Cancel
Save