Skip to content

Commit

Permalink
Apple II: Move _exit out of STARTUP segment
Browse files Browse the repository at this point in the history
  • Loading branch information
colinleroy authored and oliverschmidt committed Aug 25, 2024
1 parent b688cfa commit 622793e
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 40 deletions.
75 changes: 75 additions & 0 deletions libsrc/apple2/callmain.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
;
; Ullrich von Bassewitz, 2003-03-07
;
; Push arguments and call main()
;


.export callmain, _exit
.export __argc, __argv

.import _main, pushax, done, donelib
.import zpsave, rvsave, reset

.include "zeropage.inc"
.include "apple2.inc"


;---------------------------------------------------------------------------
; Setup the stack for main(), then jump to it

callmain:
lda __argc
ldx __argc+1
jsr pushax ; Push argc

lda __argv
ldx __argv+1
jsr pushax ; Push argv

ldy #4 ; Argument size
jsr _main

; Avoid a re-entrance of donelib. This is also the exit() entry.
_exit: ldx #<exit
lda #>exit
jsr reset ; Setup RESET vector

; Switch in LC bank 2 for R/O in case it was switched out by a RESET.
bit $C080

; Call the module destructors.
jsr donelib

; Switch in ROM.
bit $C082

; Restore the original RESET vector.
exit: ldx #$02
: lda rvsave,x
sta SOFTEV,x
dex
bpl :-

; Copy back the zero-page stuff.
ldx #zpspace-1
: lda zpsave,x
sta sp,x
dex
bpl :-

; ProDOS TechRefMan, chapter 5.2.1:
; "System programs should set the stack pointer to $FF at the
; warm-start entry point."
ldx #$FF
txs ; Re-init stack pointer

; We're done
jmp done

;---------------------------------------------------------------------------
; Data

.data
__argc: .word 0
__argv: .addr 0
44 changes: 4 additions & 40 deletions libsrc/apple2/crt0.s
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@
; Startup code for cc65 (Apple2 version)
;

.export _exit, done, return
.export done, return
.export zpsave, rvsave, reset
.export __STARTUP__ : absolute = 1 ; Mark as startup

.import initlib, donelib
.import initlib, _exit
.import zerobss, callmain
.import __ONCE_LOAD__, __ONCE_SIZE__ ; Linker generated
.import __LC_START__, __LC_LAST__ ; Linker generated
Expand All @@ -33,44 +34,7 @@
jsr zerobss

; Push the command-line arguments; and, call main().
jsr callmain

; Avoid a re-entrance of donelib. This is also the exit() entry.
_exit: ldx #<exit
lda #>exit
jsr reset ; Setup RESET vector

; Switch in LC bank 2 for R/O in case it was switched out by a RESET.
bit $C080

; Call the module destructors.
jsr donelib

; Switch in ROM.
bit $C082

; Restore the original RESET vector.
exit: ldx #$02
: lda rvsave,x
sta SOFTEV,x
dex
bpl :-

; Copy back the zero-page stuff.
ldx #zpspace-1
: lda zpsave,x
sta sp,x
dex
bpl :-

; ProDOS TechRefMan, chapter 5.2.1:
; "System programs should set the stack pointer to $FF at the
; warm-start entry point."
ldx #$FF
txs ; Re-init stack pointer

; We're done
jmp done
jmp callmain

; ------------------------------------------------------------------------

Expand Down

0 comments on commit 622793e

Please sign in to comment.