瀏覽代碼

z80: implement stack overflow error condition

Also, remove underflow checks from next: it's taxing and useless
because underflow check already takes place in each relevant native
word.
master
Virgil Dupras 3 年之前
父節點
當前提交
d1de99d8c9
共有 4 個檔案被更改,包括 20 行新增16 行删除
  1. +11
    -6
      blk/076
  2. +0
    -1
      blk/284
  3. +8
    -8
      blk/286
  4. +1
    -1
      blk/287

+ 11
- 6
blk/076 查看文件

@@ -1,6 +1,11 @@
STACK OVERFLOW PROTECTION: To avoid having to check for stack
underflow after each pop operation (which can end up being
prohibitive in terms of costs), PS_ADDR should be set to
at least 6 bytes before its actual limit. 6 bytes because we
seldom have words requiring more than 3 items from the stack.
Then, at each "exit" call we check for stack underflow.
Stack underflow and overflow: In each native word involving
PSP popping, we check whether the stack is big enough. If it's
not we go in "uflw" (underflow) error condition, then abort.

We don't check RSP for underflow because the cost of the check
is significant and its usefulness is dubious: if RSP isn't
tightly in control, we're screwed anyways, and that, well
before we reach underflow.

Overflow condition happen when RSP and PSP meet somewhere in
the middle. That check is made at each "next" call.

+ 0
- 1
blk/284 查看文件

@@ -1,5 +1,4 @@
PC ORG @ 1 + ! ( main )
( STACK OVERFLOW PROTECTION: See B76 )
SP PS_ADDR LDdn, IX RS_ADDR LDdn,
( LATEST is a label to the latest entry of the dict. It is
written at offset 0x08 by the process or person building


+ 8
- 8
blk/286 查看文件

@@ -2,14 +2,14 @@ lblnext BSET PC ORG @ 0x1b + ! ( next )
( This routine is jumped to at the end of every word. In it,
we jump to current IP, but we also take care of increasing
it by 2 before jumping. )
( Before we continue: are stacks within bounds? )
( PS ) HL PS_ADDR LDdn,
SP SUBHLd,
JRC, lblofl BWR ( abortUnderflow-B285 )
( RS ) IX PUSH, HL POP,
DE RS_ADDR LDdn,
DE SUBHLd,
JRC, lblofl BWR ( IX < RS_ADDR? abortUnderflow-B285 )
( Before we continue: are we overflowing? )
IX PUSH, EX(SP)HL, ( do EX to count the IX push in SP )
SP SUBHLd, HL POP,
IFNC, ( SP <= IX? overflow )
SP PS_ADDR LDdn, IX RS_ADDR LDdn,
DE BIN( @ 0x13 ( oflw ) + LDdd(n),
JR, L3 FWR ( execute, B287 )
THEN,
LDA(BC), E A LDrr, BC INCd,
LDA(BC), D A LDrr, BC INCd,
( continue to execute )

+ 1
- 1
blk/287 查看文件

@@ -1,4 +1,4 @@
lblexec BSET L1 FSET ( B284 ) L2 FSET ( B285 )
lblexec BSET L1 FSET ( B284 ) L2 FSET ( B285 ) L3 FSET ( B286 )
( DE -> wordref )
( When we have a BIN( offset, we need to adjust stable
ABI offsets. )


Loading…
取消
儲存