2 ; Startup code for cc65 (ATARI version)
4 ; Contributing authors:
12 .export __STARTUP__ : absolute = 1 ; Mark as startup
14 .import initlib, donelib
15 .import callmain, zerobss
16 .import __STARTUP_LOAD__, __ZPSAVE_LOAD__, __BSS_LOAD__
17 .import __RESERVED_MEMORY__
18 .import __RAM_START__, __RAM_SIZE__
23 .include "zeropage.inc"
25 .include "save_area.inc"
27 ; ------------------------------------------------------------------------
34 .if .defined(__ATARIXL__)
38 .word __STARTUP_LOAD__
39 .if .defined(__ATARIXL__)
40 .word __BSS_LOAD__ - 1
42 .word __ZPSAVE_LOAD__ - 1
45 ; ------------------------------------------------------------------------
50 rts ; fix for SpartaDOS / OS/A+
51 ; they first call the entry point from AUTOSTRT and
52 ; then the load addess (this rts here).
53 ; We point AUTOSTRT directly after the rts.
57 .if .not .defined(__ATARIXL__) ; already done in previous load chunk
59 ; Save the zero page locations we need
82 .if .not .defined(__ATARIXL__)
87 sta appmsav ; remember old APPMHI value
93 sbc #<__RESERVED_MEMORY__
94 sta APPMHI ; initialize our APPMHI value
95 sta sp ; setup runtime stack part 1
97 sbc #>__RESERVED_MEMORY__
99 sta sp+1 ; setup runtime stack part 2
103 lda #<(__RAM_START__ + __RAM_SIZE__ - 1)
105 lda #>(__RAM_START__ + __RAM_SIZE__ - 1)
110 ; Call module constructors
114 ; Set left margin to 0
121 ; Set keyb to upper/lowercase mode
127 ; Initialize conio stuff
132 ; Push arguments and call main
136 ; Call module destructors. This is also the _exit entry.
138 _exit: jsr donelib ; Run module destructors
140 ; Restore system stuff
143 txs ; Restore stack pointer
145 ; Restore left margin
155 .if .not .defined(__ATARIXL__)
166 ; Atari XL target stuff...
181 ; Copy back the zero page stuff
198 ; *** end of main startup code
200 ; ------------------------------------------------------------------------
210 .word RUNAD ; defined in atari.h
212 .word __STARTUP_LOAD__ + 1