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