]> git.sur5r.net Git - cc65/blob - libsrc/atari/crt0.s
Use _file.inc and its constants
[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 ;
9 ; This must be the *first* file on the linker command line
10 ;
11
12         .export         _exit
13         .constructor    initsp,26
14
15         .import         getargs, argc, argv
16         .import         initlib, donelib
17         .import         zerobss, pushax
18         .import         _main,__filetab,getfd
19         .import         __CODE_LOAD__, __BSS_LOAD__
20
21         .include        "atari.inc"
22         .include        "../common/_file.inc"
23
24 ; ------------------------------------------------------------------------
25 ; Define and export the ZP variables for the runtime
26
27         .exportzp       sp, sreg, regsave
28         .exportzp       ptr1, ptr2, ptr3, ptr4
29         .exportzp       tmp1, tmp2, tmp3, tmp4
30         .exportzp       fntemp, regbank, zpspace
31
32
33 .zeropage
34
35 zpstart = *
36 sp:             .res    2       ; Stack pointer
37 sreg:           .res    2       ; Secondary register/high 16 bit for longs
38 regsave:        .res    2       ; slot to save/restore (E)AX into
39 ptr1:           .res    2
40 ptr2:           .res    2
41 ptr3:           .res    2
42 ptr4:           .res    2
43 tmp1:           .res    1
44 tmp2:           .res    1
45 tmp3:           .res    1
46 tmp4:           .res    1
47 fntemp:         .res    2       ; Pointer to file name
48 regbank:        .res    6       ; 6 byte register bank
49
50 zpspace = * - zpstart           ; Zero page space allocated
51
52 .code
53
54 ; ------------------------------------------------------------------------
55 ; EXE header
56
57         .segment "EXEHDR"
58         .word   $FFFF
59         .word   __CODE_LOAD__
60         .word   __BSS_LOAD__ - 1
61         .code
62         .reloc
63
64 ; ------------------------------------------------------------------------
65 ; Actual code
66
67         rts     ; fix for SpartaDOS / OS/A+
68                 ; they first call the entry point from AUTOSTRT and
69                 ; then the load addess (this rts here).
70                 ; We point AUTOSTRT directly after the rts.
71
72 ; Real entry point:
73
74 ; Save the zero page locations we need
75
76         ldx     #zpspace-1
77 L1:     lda     sp,x
78         sta     zpsave,x
79         dex
80         bpl     L1
81
82 ; Clear the BSS data
83
84         jsr     zerobss
85
86 ; setup the stack
87
88         tsx
89         stx     spsave
90
91 ; report memory usage
92
93         lda     APPMHI
94         sta     appmsav                 ; remember old APPMHI value
95         lda     APPMHI+1
96         sta     appmsav+1
97
98         lda     MEMTOP
99         sta     APPMHI                  ; initialize our APPMHI value
100         ldx     MEMTOP+1
101         stx     APPMHI+1
102
103 ; Call module constructors
104
105         jsr     initlib
106
107 ; set left margin to 0
108
109         lda     LMARGN
110         sta     old_lmargin
111         lda     #0
112         sta     LMARGN
113
114 ; set keyb to upper/lowercase mode
115
116         ldx     SHFLOK
117         stx     old_shflok
118         sta     SHFLOK
119
120 ; Initialize conio stuff
121
122         lda     #$FF
123         sta     CH
124
125 ; set stdio stream handles
126
127         lda     #0
128         jsr     getfd
129         sta     __filetab + (0 * _FILE_size)    ; setup stdin
130         lda     #0
131         jsr     getfd
132         sta     __filetab + (1 * _FILE_size)    ; setup stdout
133         lda     #0
134         jsr     getfd
135         sta     __filetab + (2 * _FILE_size)    ; setup stderr
136
137 ; Pass command line if present
138
139         jsr     getargs
140
141         lda     argc
142         ldx     argc+1
143         jsr     pushax          ; argc
144         lda     #<argv
145         ldx     #>argv
146         jsr     pushax          ; argv
147
148         ldy     #4              ; Argument size
149         jsr     _main           ; call the users code
150
151 ; Call module destructors. This is also the _exit entry.
152
153 _exit:  jsr     donelib         ; Run module destructors
154
155 ; Restore system stuff
156
157         ldx     spsave
158         txs                     ; Restore stack pointer
159
160 ; restore left margin
161
162         lda     old_lmargin
163         sta     LMARGN
164
165 ; restore kb mode
166
167         lda     old_shflok
168         sta     SHFLOK
169
170 ; restore APPMHI
171
172         lda     appmsav
173         sta     APPMHI
174         lda     appmsav+1
175         sta     APPMHI+1
176
177 ; Copy back the zero page stuff
178
179         ldx     #zpspace-1
180 L2:     lda     zpsave,x
181         sta     sp,x
182         dex
183         bpl     L2
184
185 ; Back to DOS
186
187         rts
188
189 ; *** end of main startup code
190
191 ; setup sp
192
193 initsp:
194         lda     APPMHI
195         sta     sp
196         lda     APPMHI+1
197         sta     sp+1
198         rts
199
200         .data
201
202 zpsave: .res    zpspace
203
204         .bss
205
206 spsave:         .res    1
207 appmsav:        .res    1
208 old_shflok:     .res    1
209 old_lmargin:    .res    1
210
211         .segment "AUTOSTRT"
212         .word   $02E0
213         .word   $02E1
214         .word   __CODE_LOAD__ + 1