2 ; Startup code for cc65 (C16 version)
4 ; Note: The C16 is actually the Plus/4 with just 16KB of memory. So many
5 ; things are similar here, and we even use the plus4.inc include file.
9 .export __STARTUP__ : absolute = 1 ; Mark as startup
10 .import initlib, donelib, callirq
11 .import callmain, zerobss
12 .import MEMTOP, RESTOR, BSOUT, CLRCH
13 .import __INTERRUPTOR_COUNT__
16 .include "zeropage.inc"
20 ; ------------------------------------------------------------------------
27 ; Save the zero page locations we need
35 ; Switch to second charset
44 ; Save system stuff and setup the stack
47 stx spsave ; save system stk ptr
50 jsr MEMTOP ; Get top memory
51 cpy #$80 ; We can only use the low 32K :-(
56 sty sp+1 ; set argument stack ptr
58 ; If we have IRQ functions, chain our stub into the IRQ vector
60 lda #<__INTERRUPTOR_COUNT__
73 ; Call module constructors
77 ; Push arguments and call main()
81 ; Call module destructors. This is also the _exit entry.
83 _exit: pha ; Save the return code on stack
84 jsr donelib ; Run module destructors
86 ; Reset the IRQ vector if we chained it.
88 pha ; Save the return code on stack
89 lda #<__INTERRUPTOR_COUNT__
98 ; Copy back the zero page stuff
100 NoIRQ2: ldx #zpspace-1
106 ; Store the return code into ST
111 ; Restore the stack pointer
120 ; ------------------------------------------------------------------------
121 ; The IRQ vector jumps here, if condes routines are defined with type 2.
124 cld ; Just to be sure
125 jsr callirq ; Call the functions
126 jmp IRQInd ; Jump to the saved IRQ vector
128 ; ------------------------------------------------------------------------