Added code to check the 6502 stack

git-svn-id: svn://svn.cc65.org/cc65/trunk@638 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
cuz
2001-03-20 22:34:08 +00:00
parent fb76e97575
commit 9528c379c1
5 changed files with 61 additions and 30 deletions

View File

@@ -1,9 +1,10 @@
;
; Ullrich von Bassewitz, 19.03.2001
;
; Stack checking code.
; Stack checking code. These are actually two routines, one to check the C
; stack, and the other one to check the 6502 hardware stack.
; For performance reasons (to avoid having to pass a parameter), the compiler
; calls the stkchk routine *after* allocating space on the stack. So the
; calls the cstkchk routine *after* allocating space on the stack. So the
; stackpointer may already be invalid if this routine is called. In addition
; to that, pushs and pops that are needed for expression evaluation are not
; checked (this would be way too much overhead). As a consequence we will
@@ -12,7 +13,7 @@
; its' bounds.
;
.export stkchk
.export stkchk, cstkchk
.constructor initstkchk, 25
.import __STACKSIZE__ ; Linker defined
.import pusha0, _exit
@@ -29,51 +30,64 @@
.proc initstkchk
lda sp
sta initialsp
sub #<__STACKSIZE__
sta lowwater
lda sp+1
sta initialsp+1
sbc #>__STACKSIZE__
add #1 ; Add 256 bytes safety area
sta lowwater+1
lda sp
sta initialsp
sub #<__STACKSIZE__
sta lowwater
lda sp+1
sta initialsp+1
sbc #>__STACKSIZE__
add #1 ; Add 256 bytes safety area
sta lowwater+1
rts
.endproc
; ----------------------------------------------------------------------------
; Stack checking routine. Does not need to save any registers.
; 6502 stack checking routine. Does not need to save any registers.
; Safety zone for the hardware stack is 10 bytes.
.proc stkchk
stkchk: tsx
cpx #10
bcc Fail ; Jump on stack overflow
rts ; Return if ok
lda lowwater+1
cmp sp+1
bcs @L1
rts
; ----------------------------------------------------------------------------
; C stack checking routine. Does not need to save any registers.
cstkchk:
; Check the high byte of the software stack
@L0: lda lowwater+1
cmp sp+1
bcs @L1
rts
; Check low byte
@L1: bne @Overflow
lda lowwater
cmp sp
bcs @Overflow
rts
@L1: bne CStackOverflow
lda lowwater
cmp sp
bcs CStackOverflow
Done: rts
; We have a stack overflow. Set the stack pointer to the initial value, so
; We have a C stack overflow. Set the stack pointer to the initial value, so
; we can continue without worrying about stack issues.
@Overflow:
CStackOverflow:
lda initialsp
sta sp
lda initialsp+1
sta sp+1
lda #4
; Generic abort entry. We should output a diagnostic here, but this is
; difficult, since we're operating at a lower level here.
Fail: lda #4
jsr pusha0
jmp _exit
.endproc
; ----------------------------------------------------------------------------
; Data