;
; Startup code for cc65 (C128 version)
-;
-; This must be the *first* file on the linker command line
;
.export _exit
- .import condes, initlib, donelib
- .import initconio, doneconio, zerobss
- .import push0, _main
+ .export __STARTUP__ : absolute = 1 ; Mark as startup
+ .import callirq, initlib, donelib
+ .import zerobss
+ .import push0, callmain
.import RESTOR, BSOUT, CLRCH
- .import __IRQFUNC_TABLE__, __IRQFUNC_COUNT__
+ .import __INTERRUPTOR_COUNT__
.import __RAM_START__, __RAM_SIZE__
.include "zeropage.inc"
.org $1BFF
.word Head ; Load address
Head: .word @Next
- .word 1000 ; Line number
+ .word .version ; Line number
.byte $9E,"7181" ; SYS 7181
.byte $00 ; End of BASIC line
@Next: .word 0 ; BASIC end marker
lda #14
jsr BSOUT
-; Set the bank for the file name our execution bank
-
- lda #0
- sta FNAM_BANK
-
; Before doing anything else, we have to setup our banking configuration.
; Otherwise just the lowest 16K are actually RAM. Writing through the ROM
; to the underlying RAM works, but it is bad style.
lda MMU_CR ; Get current memory configuration...
pha ; ...and save it for later
- lda #CC65_MMU_CFG ; Bank0 with kernal ROM
+ lda #MMU_CFG_CC65 ; Bank0 with kernal ROM
sta MMU_CR
; Save the zero page locations we need
lda #>(__RAM_START__ + __RAM_SIZE__)
sta sp+1 ; Set argument stack ptr
-; Call module constructors
-
- jsr initlib
-
-; Initialize conio stuff
-
- jsr initconio
-
; If we have IRQ functions, chain our stub into the IRQ vector
- lda #<__IRQFUNC_COUNT__
+ lda #<__INTERRUPTOR_COUNT__
beq NoIRQ1
lda IRQVec
ldx IRQVec+1
stx IRQVec+1
cli
-; Pass an empty command line
+; 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
-NoIRQ1: jsr push0 ; argc
- jsr push0 ; argv
+; Push arguments and call main()
- ldy #4 ; Argument size
- jsr _main ; call the users code
+ jsr callmain
-; 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: lda #<__IRQFUNC_COUNT__
+_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
ldx IRQInd+2
stx IRQVec+1
cli
-; Run module destructors
-
-NoIRQ2: jsr donelib
-
-; Reset the conio stuff
-
- jsr doneconio
-
-; Reset the stack
-
- ldx spsave
- txs
-
; Copy back the zero page stuff
- ldx #zpspace-1
+NoIRQ2: ldx #zpspace-1
L2: lda zpsave,x
sta sp,x
dex
bpl L2
-; Reset the memory configuration
+; Place the program return code into ST
- lda mmusave
- sta MMU_CR
+ pla
+ sta ST
+
+; Reset the stack and the memory configuration
+
+ ldx spsave
+ txs
+ ldx mmusave
+ stx MMU_CR
; Done, restore kernal vectors in an attempt to cleanup
cld ; Just to be sure
lda MMU_CR ; Get old register value
pha ; And save on stack
- lda #CC65_MMU_CFG ; Bank 0 with kernal ROM
+ lda #MMU_CFG_CC65 ; Bank 0 with kernal ROM
sta MMU_CR
- ldy #<(__IRQFUNC_COUNT__*2)
- lda #<__IRQFUNC_TABLE__
- ldx #>__IRQFUNC_TABLE__
- jsr condes ; Call the functions
+ jsr callirq ; Call the functions
pla ; Get old register value
sta MMU_CR
jmp IRQInd ; Jump to the saved IRQ vector
; ------------------------------------------------------------------------
; Data
-.data
+.segment "ZPSAVE"
+
zpsave: .res zpspace
.bss