;
; 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
; its' bounds.
;
- .export stkchk
+ .export stkchk, cstkchk
.constructor initstkchk, 25
- .import __STACKSIZE__ ; Linker defined
- .import pusha0, exit
+ .import __STACKSIZE__ ; Linker defined
+ .import pusha0, _exit
.importzp sp
; Use macros for better readability
.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 12 bytes.
-.proc stkchk
+stkchk: tsx
+ cpx #12
+ 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 low water mark, so
-; we have
+; We have a C stack overflow. Set the stack pointer to the initial value, so
+; we can continue without worrying about stack issues.
-@Overflow:
- lda #4
- jsr pusha0
- jmp exit
+CStackOverflow:
+ lda initialsp
+ sta sp
+ lda initialsp+1
+ sta sp+1
+; Generic abort entry. We should output a diagnostic here, but this is
+; difficult, since we're operating at a lower level here.
-.endproc
+Fail: lda #4
+ jsr pusha0
+ jmp _exit
; ----------------------------------------------------------------------------
; Data
; Stack low water mark.
lowwater: .word 0
-
+