1
0
mirror of https://github.com/cc65/cc65.git synced 2025-01-11 11:30:13 +00:00

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:
uz 2008-08-31 18:22:51 +00:00
parent 0cc2bf015e
commit 7e9b6e7311
3 changed files with 44 additions and 46 deletions

View File

@ -84,17 +84,6 @@ L1: lda sp,x
lda #>(__RAM_START__ + __RAM_SIZE__)
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
lda #<__INTERRUPTOR_COUNT__
@ -110,14 +99,28 @@ L1: lda sp,x
stx IRQVec+1
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()
NoIRQ1: jsr callmain
jsr callmain
; Back from main (this is also the _exit entry). Reset the IRQ vector if we
; chained it.
; Back from main (this is also the _exit entry). Run module destructors
_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__
beq NoIRQ2
lda IRQInd+1
@ -127,13 +130,9 @@ _exit: pha ; Save the return code on stack
stx IRQVec+1
cli
; Run module destructors
NoIRQ2: jsr donelib
; Copy back the zero page stuff
ldx #zpspace-1
NoIRQ2: ldx #zpspace-1
L2: lda zpsave,x
sta sp,x
dex

View File

@ -73,10 +73,6 @@ L1: lda sp,x
lda #>(__RAM_START__ + __RAM_SIZE__)
sta sp+1 ; Set argument stack ptr
; Call module constructors
jsr initlib
; If we have IRQ functions, chain our stub into the IRQ vector
lda #<__INTERRUPTOR_COUNT__
@ -92,14 +88,22 @@ L1: lda sp,x
stx IRQVec+1
cli
; Call module constructors
NoIRQ1: jsr initlib
; 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
; chained it.
; Back from main (This is also the _exit entry). Run module destructors
_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__
beq NoIRQ2
lda IRQInd+1
@ -109,13 +113,9 @@ _exit: pha ; Save the return code on stack
stx IRQVec+1
cli
; Run module destructors
NoIRQ2: jsr donelib
; Copy back the zero page stuff
ldx #zpspace-1
NoIRQ2: ldx #zpspace-1
L2: lda zpsave,x
sta sp,x
dex

View File

@ -66,10 +66,6 @@ L1: lda sp,x
lda #>(__RAM_START__ + __RAM_SIZE__)
sta sp+1 ; Set argument stack ptr
; Call module constructors
jsr initlib
; If we have IRQ functions, chain our stub into the IRQ vector
lda #<__INTERRUPTOR_COUNT__
@ -85,14 +81,21 @@ L1: lda sp,x
stx IRQVec+1
cli
; Call module constructors
NoIRQ1: jsr initlib
; 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
; chained it.
; Back from main (This is also the _exit entry). Run module destructors
_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__
beq NoIRQ2
lda IRQInd+1
@ -102,13 +105,9 @@ _exit: pha ; Save the return code on stack
stx IRQVec+1
cli
; Run module destructors
NoIRQ2: jsr donelib
; Copy back the zero page stuff
ldx #zpspace-1
NoIRQ2: ldx #zpspace-1
L2: lda zpsave,x
sta sp,x
dex