Fixed problems with the startup code (Greg King): Interrupts must be hooked
before calling initlib because initlib calls contructors and may install drivers, which enable hardware interrupts. Similar for donelib. git-svn-id: svn://svn.cc65.org/cc65/trunk@3897 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
@@ -84,17 +84,6 @@ L1: lda sp,x
|
|||||||
lda #>(__RAM_START__ + __RAM_SIZE__)
|
lda #>(__RAM_START__ + __RAM_SIZE__)
|
||||||
sta sp+1 ; Set argument stack ptr
|
sta sp+1 ; Set argument stack ptr
|
||||||
|
|
||||||
; Call module constructors
|
|
||||||
|
|
||||||
jsr initlib
|
|
||||||
|
|
||||||
; Set the bank for the file name to our execution bank. We must do this,
|
|
||||||
; *after* calling constructors, because some of them may depend on the
|
|
||||||
; original value of this register.
|
|
||||||
|
|
||||||
lda #0
|
|
||||||
sta FNAM_BANK
|
|
||||||
|
|
||||||
; If we have IRQ functions, chain our stub into the IRQ vector
|
; If we have IRQ functions, chain our stub into the IRQ vector
|
||||||
|
|
||||||
lda #<__INTERRUPTOR_COUNT__
|
lda #<__INTERRUPTOR_COUNT__
|
||||||
@@ -110,14 +99,28 @@ L1: lda sp,x
|
|||||||
stx IRQVec+1
|
stx IRQVec+1
|
||||||
cli
|
cli
|
||||||
|
|
||||||
|
; Call module constructors
|
||||||
|
|
||||||
|
NoIRQ1: jsr initlib
|
||||||
|
|
||||||
|
; Set the bank for the file name to our execution bank. We must do this,
|
||||||
|
; *after* calling constructors, because some of them may depend on the
|
||||||
|
; original value of this register.
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
sta FNAM_BANK
|
||||||
|
|
||||||
; Push arguments and call main()
|
; Push arguments and call main()
|
||||||
|
|
||||||
NoIRQ1: jsr callmain
|
jsr callmain
|
||||||
|
|
||||||
; Back from main (this is also the _exit entry). Reset the IRQ vector if we
|
; Back from main (this is also the _exit entry). Run module destructors
|
||||||
; chained it.
|
|
||||||
|
|
||||||
_exit: pha ; Save the return code on stack
|
_exit: jsr donelib
|
||||||
|
|
||||||
|
; Reset the IRQ vector if we chained it.
|
||||||
|
|
||||||
|
pha ; Save the return code on stack
|
||||||
lda #<__INTERRUPTOR_COUNT__
|
lda #<__INTERRUPTOR_COUNT__
|
||||||
beq NoIRQ2
|
beq NoIRQ2
|
||||||
lda IRQInd+1
|
lda IRQInd+1
|
||||||
@@ -127,13 +130,9 @@ _exit: pha ; Save the return code on stack
|
|||||||
stx IRQVec+1
|
stx IRQVec+1
|
||||||
cli
|
cli
|
||||||
|
|
||||||
; Run module destructors
|
|
||||||
|
|
||||||
NoIRQ2: jsr donelib
|
|
||||||
|
|
||||||
; Copy back the zero page stuff
|
; Copy back the zero page stuff
|
||||||
|
|
||||||
ldx #zpspace-1
|
NoIRQ2: ldx #zpspace-1
|
||||||
L2: lda zpsave,x
|
L2: lda zpsave,x
|
||||||
sta sp,x
|
sta sp,x
|
||||||
dex
|
dex
|
||||||
|
|||||||
@@ -73,10 +73,6 @@ L1: lda sp,x
|
|||||||
lda #>(__RAM_START__ + __RAM_SIZE__)
|
lda #>(__RAM_START__ + __RAM_SIZE__)
|
||||||
sta sp+1 ; Set argument stack ptr
|
sta sp+1 ; Set argument stack ptr
|
||||||
|
|
||||||
; Call module constructors
|
|
||||||
|
|
||||||
jsr initlib
|
|
||||||
|
|
||||||
; If we have IRQ functions, chain our stub into the IRQ vector
|
; If we have IRQ functions, chain our stub into the IRQ vector
|
||||||
|
|
||||||
lda #<__INTERRUPTOR_COUNT__
|
lda #<__INTERRUPTOR_COUNT__
|
||||||
@@ -92,14 +88,22 @@ L1: lda sp,x
|
|||||||
stx IRQVec+1
|
stx IRQVec+1
|
||||||
cli
|
cli
|
||||||
|
|
||||||
|
; Call module constructors
|
||||||
|
|
||||||
|
NoIRQ1: jsr initlib
|
||||||
|
|
||||||
; Push arguments and call main
|
; Push arguments and call main
|
||||||
|
|
||||||
NoIRQ1: jsr callmain
|
jsr callmain
|
||||||
|
|
||||||
; Back from main (This is also the _exit entry). Reset the IRQ vector if we
|
; Back from main (This is also the _exit entry). Run module destructors
|
||||||
; chained it.
|
|
||||||
|
|
||||||
_exit: pha ; Save the return code on stack
|
_exit: jsr donelib
|
||||||
|
|
||||||
|
|
||||||
|
; Reset the IRQ vector if we chained it.
|
||||||
|
|
||||||
|
pha ; Save the return code on stack
|
||||||
lda #<__INTERRUPTOR_COUNT__
|
lda #<__INTERRUPTOR_COUNT__
|
||||||
beq NoIRQ2
|
beq NoIRQ2
|
||||||
lda IRQInd+1
|
lda IRQInd+1
|
||||||
@@ -109,13 +113,9 @@ _exit: pha ; Save the return code on stack
|
|||||||
stx IRQVec+1
|
stx IRQVec+1
|
||||||
cli
|
cli
|
||||||
|
|
||||||
; Run module destructors
|
|
||||||
|
|
||||||
NoIRQ2: jsr donelib
|
|
||||||
|
|
||||||
; Copy back the zero page stuff
|
; Copy back the zero page stuff
|
||||||
|
|
||||||
ldx #zpspace-1
|
NoIRQ2: ldx #zpspace-1
|
||||||
L2: lda zpsave,x
|
L2: lda zpsave,x
|
||||||
sta sp,x
|
sta sp,x
|
||||||
dex
|
dex
|
||||||
|
|||||||
@@ -66,10 +66,6 @@ L1: lda sp,x
|
|||||||
lda #>(__RAM_START__ + __RAM_SIZE__)
|
lda #>(__RAM_START__ + __RAM_SIZE__)
|
||||||
sta sp+1 ; Set argument stack ptr
|
sta sp+1 ; Set argument stack ptr
|
||||||
|
|
||||||
; Call module constructors
|
|
||||||
|
|
||||||
jsr initlib
|
|
||||||
|
|
||||||
; If we have IRQ functions, chain our stub into the IRQ vector
|
; If we have IRQ functions, chain our stub into the IRQ vector
|
||||||
|
|
||||||
lda #<__INTERRUPTOR_COUNT__
|
lda #<__INTERRUPTOR_COUNT__
|
||||||
@@ -85,14 +81,21 @@ L1: lda sp,x
|
|||||||
stx IRQVec+1
|
stx IRQVec+1
|
||||||
cli
|
cli
|
||||||
|
|
||||||
|
; Call module constructors
|
||||||
|
|
||||||
|
NoIRQ1: jsr initlib
|
||||||
|
|
||||||
; Push arguments and call main()
|
; Push arguments and call main()
|
||||||
|
|
||||||
NoIRQ1: jsr callmain
|
jsr callmain
|
||||||
|
|
||||||
; Back from main (This is also the _exit entry). Reset the IRQ vector if we
|
; Back from main (This is also the _exit entry). Run module destructors
|
||||||
; chained it.
|
|
||||||
|
|
||||||
_exit: pha ; Save the return code on stack
|
_exit: jsr donelib
|
||||||
|
|
||||||
|
; Reset the IRQ vector if we chained it.
|
||||||
|
|
||||||
|
pha ; Save the return code on stack
|
||||||
lda #<__INTERRUPTOR_COUNT__
|
lda #<__INTERRUPTOR_COUNT__
|
||||||
beq NoIRQ2
|
beq NoIRQ2
|
||||||
lda IRQInd+1
|
lda IRQInd+1
|
||||||
@@ -102,13 +105,9 @@ _exit: pha ; Save the return code on stack
|
|||||||
stx IRQVec+1
|
stx IRQVec+1
|
||||||
cli
|
cli
|
||||||
|
|
||||||
; Run module destructors
|
|
||||||
|
|
||||||
NoIRQ2: jsr donelib
|
|
||||||
|
|
||||||
; Copy back the zero page stuff
|
; Copy back the zero page stuff
|
||||||
|
|
||||||
ldx #zpspace-1
|
NoIRQ2: ldx #zpspace-1
|
||||||
L2: lda zpsave,x
|
L2: lda zpsave,x
|
||||||
sta sp,x
|
sta sp,x
|
||||||
dex
|
dex
|
||||||
|
|||||||
Reference in New Issue
Block a user