瀏覽代碼

Use IY for IP instead of RAM+06

pull/102/head
Virgil Dupras 4 年之前
父節點
當前提交
0750e8d0c0
共有 3 個文件被更改,包括 27 次插入31 次删除
  1. +1
    -1
      blk/081
  2. 二進制
      emul/forth/z80c.bin
  3. +26
    -30
      forth/boot.fs

+ 1
- 1
blk/081 查看文件

@@ -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


二進制
emul/forth/z80c.bin 查看文件


+ 26
- 30
forth/boot.fs 查看文件

@@ -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…
取消
儲存