]> git.sur5r.net Git - cc65/commitdiff
Added an exit handler - code from Oliver Schmidt
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 21 Dec 2004 15:56:48 +0000 (15:56 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 21 Dec 2004 15:56:48 +0000 (15:56 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@3341 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/apple2/apple2.inc
libsrc/apple2/crt0.s

index 4ec8c17d28743d2ad02d8cacc4e2c7a18a23975d..45b36efeea52ea98afca367ac925ee286eb1199b 100644 (file)
@@ -14,6 +14,8 @@ HIMEM :=      $73     ; Highest available memory address+1
 ;-----------------------------------------------------------------------------
 ; Vectors
 
+SOFTEV :=      $03F2   ; Vector for warm start
+PWREDUP        :=      $03F4   ; This must be = EOR #$A5 of SOFTEV+1
 DOSWARM        :=      $03D0   ; DOS warmstart vector
 BRKVec :=      $03F0   ; Break vector
 MLI    :=      $BF00   ; ProDOS Machine Language Interface
index 3e428449f58eee8da1a79f901c12c8c99dc8d73d..106642d79b532f95e7e4100fbdb0f844b466d842 100644 (file)
@@ -4,7 +4,7 @@
 ; This must be the *first* file on the linker command line
 ;
 
-       .export         _exit
+       .export         _exit, __Exit
        .import         initlib, donelib
        .import         zerobss
                .import         __STARTUP_LOAD__, __BSS_LOAD__  ; Linker generated
 ; Save the zero page locations we need
 
                ldx     #zpspace-1
-L1:    lda     sp,x
+:      lda     sp,x
        sta     zpsave,x
        dex
-               bpl     L1
+               bpl     :-
 
+; Save the original RESET vector
+
+       ldx     #$02
+:      lda     SOFTEV,x
+       sta     rvsave,x
+       dex
+       bpl     :-
+
+; ProDOS TechRefMan, chapter 5.3.5:
+; "Your system program should place in the RESET vector the address of a
+;  routine that ... closes the files."
+
+       ldx     #<_exit
+       lda     #>_exit
+       jsr     reset           ; Setup RESET vector
+               
 ; Clear the BSS data
 
        jsr     zerobss
 
-; Save system stuff and setup the stack
+; Setup the stack
 
        lda     HIMEM
        sta     sp
@@ -60,17 +76,31 @@ L1: lda     sp,x
 
        jsr     callmain
 
-; Call module destructors. This is also the _exit entry.
+; Avoid re-entrance of donelib. This is also the _exit entry
+
+_exit: ldx     #<__Exit
+       lda     #>__Exit
+       jsr     reset           ; Setup RESET vector
+
+; Call module destructors
+
+       jsr     donelib
 
-_exit: jsr     donelib
+; Restore the original RESET vector. This is also the __Exit entry
+
+__Exit:        ldx     #$02
+:      lda     rvsave,x
+       sta     SOFTEV,x
+       dex
+       bpl     :-
 
 ; Copy back the zero page stuff
 
        ldx     #zpspace-1
-L2:    lda     zpsave,x
+:      lda     zpsave,x
        sta     sp,x
        dex
-               bpl     L2
+               bpl     :-
 
 ; ProDOS TechRefMan, chapter 5.2.1:
 ; "System programs should set the stack pointer to $FF at the warm-start
@@ -83,9 +113,20 @@ L2: lda     zpsave,x
 
        jmp     DOSWARM
 
+; ------------------------------------------------------------------------
+; Setup RESET vector
+
+reset: stx     SOFTEV
+       sta     SOFTEV+1
+       eor     #$A5
+       sta     PWREDUP
+       rts
+
 ; ------------------------------------------------------------------------
 ; Data
 
 .data
 
 zpsave:        .res    zpspace
+
+rvsave:        .res    3