From 7e9b6e73115511e0ec86644c9da8719bb2cc2f4d Mon Sep 17 00:00:00 2001 From: uz Date: Sun, 31 Aug 2008 18:22:51 +0000 Subject: [PATCH] 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 --- libsrc/c128/crt0.s | 39 +++++++++++++++++++-------------------- libsrc/c64/crt0.s | 26 +++++++++++++------------- libsrc/vic20/crt0.s | 25 ++++++++++++------------- 3 files changed, 44 insertions(+), 46 deletions(-) diff --git a/libsrc/c128/crt0.s b/libsrc/c128/crt0.s index 83598c127..81e1d4dcf 100644 --- a/libsrc/c128/crt0.s +++ b/libsrc/c128/crt0.s @@ -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). Run module destructors -; Back from main (this is also the _exit entry). Reset the IRQ vector if we -; chained it. +_exit: jsr donelib -_exit: pha ; Save the return code on stack +; 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 diff --git a/libsrc/c64/crt0.s b/libsrc/c64/crt0.s index 9c6464523..8b094148d 100644 --- a/libsrc/c64/crt0.s +++ b/libsrc/c64/crt0.s @@ -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 diff --git a/libsrc/vic20/crt0.s b/libsrc/vic20/crt0.s index a0f61c06a..2bd80e942 100644 --- a/libsrc/vic20/crt0.s +++ b/libsrc/vic20/crt0.s @@ -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). Run module destructors + +_exit: jsr donelib -; Back from main (This is also the _exit entry). Reset the IRQ vector if we -; chained it. +; Reset the IRQ vector if we chained it. -_exit: pha ; Save the return code on stack + 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 -- 2.39.5