]> git.sur5r.net Git - cc65/blob - libsrc/atari/crt0.s
Merge remote-tracking branch 'upstream/master'
[cc65] / libsrc / atari / crt0.s
1 ;
2 ; Startup code for cc65 (ATARI version)
3 ;
4 ; Contributing authors:
5 ;       Mark Keates
6 ;       Freddy Offenga
7 ;       Christian Groessler
8 ;       Stefan Haubenthal
9 ;
10
11         .export         _exit
12         .export         __STARTUP__ : absolute = 1      ; Mark as startup
13
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__
19         .import         zpsave
20         .import         sram_init
21
22
23         .include        "zeropage.inc"
24         .include        "atari.inc"
25         .include        "save_area.inc"
26
27 ; ------------------------------------------------------------------------
28 ; EXE header
29
30 .segment        "EXEHDR"
31
32         .word   $FFFF
33
34 .if .defined(__ATARIXL__)
35 .segment        "MAINHDR"
36 .endif
37
38         .word   __STARTUP_LOAD__
39 .if .defined(__ATARIXL__)
40         .word   __BSS_LOAD__ - 1
41 .else
42         .word   __ZPSAVE_LOAD__ - 1
43 .endif
44
45 ; ------------------------------------------------------------------------
46 ; Actual code
47
48 .segment        "STARTUP"
49
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.
54
55 ; Real entry point:
56
57 .if .not .defined(__ATARIXL__)          ; already done in previous load chunk
58
59 ; Save the zero page locations we need
60
61         ldx     #zpspace-1
62 L1:     lda     sp,x
63         sta     zpsave,x
64         dex
65         bpl     L1
66
67 .else
68
69         jsr     sram_init
70
71 .endif
72
73 ; Clear the BSS data
74
75         jsr     zerobss
76
77 ; Setup the stack
78
79         tsx
80         stx     spsave
81
82 .if .not .defined(__ATARIXL__)
83
84 ; Report memory usage
85
86         lda     APPMHI
87         sta     appmsav                 ; remember old APPMHI value
88         lda     APPMHI+1
89         sta     appmsav+1
90
91         sec
92         lda     MEMTOP
93         sbc     #<__RESERVED_MEMORY__
94         sta     APPMHI                  ; initialize our APPMHI value
95         sta     sp                      ; setup runtime stack part 1
96         lda     MEMTOP+1
97         sbc     #>__RESERVED_MEMORY__
98         sta     APPMHI+1
99         sta     sp+1                    ; setup runtime stack part 2
100
101 .else
102
103         lda     #<(__RAM_START__ + __RAM_SIZE__ - 1)
104         sta     sp
105         lda     #>(__RAM_START__ + __RAM_SIZE__ - 1)
106         sta     sp+1
107
108 .endif
109
110 ; Call module constructors
111
112         jsr     initlib
113
114 ; Set left margin to 0
115
116         lda     LMARGN
117         sta     old_lmargin
118         ldy     #0
119         sty     LMARGN
120
121 ; Set keyb to upper/lowercase mode
122
123         ldx     SHFLOK
124         stx     old_shflok
125         sty     SHFLOK
126
127 ; Initialize conio stuff
128
129         dey                             ; Set X to $FF
130         sty     CH
131
132 ; Push arguments and call main
133
134         jsr     callmain
135
136 ; Call module destructors. This is also the _exit entry.
137
138 _exit:  jsr     donelib         ; Run module destructors
139
140 ; Restore system stuff
141
142         ldx     spsave
143         txs                     ; Restore stack pointer
144
145 ; Restore left margin
146
147         lda     old_lmargin
148         sta     LMARGN
149
150 ; Restore kb mode
151
152         lda     old_shflok
153         sta     SHFLOK
154
155 .if .not .defined(__ATARIXL__)
156
157 ; Restore APPMHI
158
159         lda     appmsav
160         sta     APPMHI
161         lda     appmsav+1
162         sta     APPMHI+1
163
164 .else
165
166 ; Atari XL target stuff...
167
168         lda     PORTB_save
169         sta     PORTB
170         lda     MEMTOP_save
171         sta     MEMTOP
172         lda     MEMTOP_save+1
173         sta     MEMTOP+1
174         lda     APPMHI_save
175         sta     APPMHI
176         lda     APPMHI_save+1
177         sta     APPMHI+1
178 .endif
179
180
181 ; Copy back the zero page stuff
182
183         ldx     #zpspace-1
184 L2:     lda     zpsave,x
185         sta     sp,x
186         dex
187         bpl     L2
188
189 ; Turn on cursor
190
191         inx
192         stx     CRSINH
193
194 ; Back to DOS
195
196         rts
197
198 ; *** end of main startup code
199
200 ; ------------------------------------------------------------------------
201
202 .bss
203
204 spsave:         .res    1
205 appmsav:        .res    1
206 old_shflok:     .res    1
207 old_lmargin:    .res    1
208
209         .segment "AUTOSTRT"
210         .word   RUNAD                   ; defined in atari.h
211         .word   RUNAD+1
212         .word   __STARTUP_LOAD__ + 1