; its' bounds.
;
- .export stkchk, cstkchk
- .constructor initstkchk, 25
- .import __STACKSIZE__ ; Linker defined
- .import pusha0, _exit
- .importzp sp
-
- ; Use macros for better readability
- .macpack generic
+ .export stkchk, cstkchk
+ .constructor initstkchk, 25
+ .import __STACKSIZE__ ; Linker defined
+ .import pusha0, _exit
+ .importzp sp
+
+ ; Use macros for better readability
+ .macpack generic
.macpack cpu
.segment "INIT"
-.proc initstkchk
+.proc initstkchk
- lda sp
- sta initialsp
- sub #<__STACKSIZE__
- sta lowwater
- lda sp+1
- sta initialsp+1
- sbc #>__STACKSIZE__
+ lda sp
+ sta initialsp
+ sub #<__STACKSIZE__
+ sta lowwater
+ lda sp+1
+ sta initialsp+1
+ sbc #>__STACKSIZE__
.if (.cpu .bitand ::CPU_ISET_65SC02)
- ina ; Add 256 bytes safety area
+ ina ; Add 256 bytes safety area
.else
- add #1 ; Add 256 bytes safety area
+ add #1 ; Add 256 bytes safety area
.endif
- sta lowwater+1
- rts
+ sta lowwater+1
+ rts
.endproc
.code
-stkchk: tsx
- cpx #12
- bcc Fail ; Jump on stack overflow
- rts ; Return if ok
+stkchk: tsx
+ cpx #12
+ bcc Fail ; Jump on stack overflow
+ rts ; Return if ok
; ----------------------------------------------------------------------------
; C stack checking routine. Does not need to save any registers.
; Check the high byte of the software stack
-@L0: lda lowwater+1
- cmp sp+1
- bcs @L1
- rts
+@L0: lda lowwater+1
+ cmp sp+1
+ bcs @L1
+ rts
; Check low byte
-@L1: bne CStackOverflow
- lda lowwater
- cmp sp
- bcs CStackOverflow
-Done: rts
+@L1: bne CStackOverflow
+ lda lowwater
+ cmp sp
+ bcs CStackOverflow
+Done: rts
; We have a C stack overflow. Set the stack pointer to the initial value, so
; we can continue without worrying about stack issues.
CStackOverflow:
- lda initialsp
- sta sp
- lda initialsp+1
- sta sp+1
+ 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.
-Fail: lda #4
+Fail: lda #4
ldx #0
- jmp _exit
+ jmp _exit
; ----------------------------------------------------------------------------
; Data
; Initial stack pointer value. Stack is reset to this in case of overflows to
; allow program exit processing.
-initialsp: .word 0
+initialsp: .word 0
; Stack low water mark.
-lowwater: .word 0
+lowwater: .word 0