]> git.sur5r.net Git - cc65/blob - libsrc/atari/crt0.s
8edc4046f09841e2d14242272a54f58864ba6409
[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
10         .export         _exit
11         .export         __STARTUP__ : absolute = 1      ; Mark as startup
12         .constructor    initsp, 26
13
14         .import         initlib, donelib, callmain
15         .import         zerobss, pushax
16         .import         _main, __filetab, getfd
17         .import         __STARTUP_LOAD__, __ZPSAVE_LOAD__
18         .import         __RESERVED_MEMORY__
19 .ifdef  DYNAMIC_DD
20         .import         __getdefdev
21 .endif
22
23         .include        "zeropage.inc"
24         .include        "atari.inc"
25         .include        "_file.inc"
26
27 ; ------------------------------------------------------------------------
28 ; EXE header
29
30         .segment "EXEHDR"
31         .word   $FFFF
32         .word   __STARTUP_LOAD__
33         .word   __ZPSAVE_LOAD__ - 1
34
35 ; ------------------------------------------------------------------------
36 ; Actual code
37
38         .segment        "STARTUP"
39
40         rts     ; fix for SpartaDOS / OS/A+
41                 ; they first call the entry point from AUTOSTRT and
42                 ; then the load addess (this rts here).
43                 ; We point AUTOSTRT directly after the rts.
44
45 ; Real entry point:
46
47 ; Save the zero page locations we need
48
49         ldx     #zpspace-1
50 L1:     lda     sp,x
51         sta     zpsave,x
52         dex
53         bpl     L1
54
55 ; Clear the BSS data
56
57         jsr     zerobss
58
59 ; setup the stack
60
61         tsx
62         stx     spsave
63
64 ; report memory usage
65
66         lda     APPMHI
67         sta     appmsav                 ; remember old APPMHI value
68         lda     APPMHI+1
69         sta     appmsav+1
70
71         sec
72         lda     MEMTOP
73         sbc     #<__RESERVED_MEMORY__
74         sta     APPMHI                  ; initialize our APPMHI value
75         lda     MEMTOP+1
76         sbc     #>__RESERVED_MEMORY__
77         sta     APPMHI+1
78
79 ; Call module constructors
80
81         jsr     initlib
82 .ifdef  DYNAMIC_DD
83         jsr     __getdefdev
84 .endif
85
86 ; set left margin to 0
87
88         lda     LMARGN
89         sta     old_lmargin
90         lda     #0
91         sta     LMARGN
92
93 ; set keyb to upper/lowercase mode
94
95         ldx     SHFLOK
96         stx     old_shflok
97         sta     SHFLOK
98
99 ; Initialize conio stuff
100
101         lda     #$FF
102         sta     CH
103
104 ; set stdio stream handles
105
106         lda     #0
107         jsr     getfd
108         sta     __filetab + (0 * .sizeof(_FILE)); setup stdin
109         lda     #0
110         jsr     getfd
111         sta     __filetab + (1 * .sizeof(_FILE)); setup stdout
112         lda     #0
113         jsr     getfd
114         sta     __filetab + (2 * .sizeof(_FILE)); setup stderr
115
116 ; Push arguments and call main
117
118         jsr     callmain
119
120 ; Call module destructors. This is also the _exit entry.
121
122 _exit:  jsr     donelib         ; Run module destructors
123
124 ; Restore system stuff
125
126         ldx     spsave
127         txs                     ; Restore stack pointer
128
129 ; restore left margin
130
131         lda     old_lmargin
132         sta     LMARGN
133
134 ; restore kb mode
135
136         lda     old_shflok
137         sta     SHFLOK
138
139 ; restore APPMHI
140
141         lda     appmsav
142         sta     APPMHI
143         lda     appmsav+1
144         sta     APPMHI+1
145
146 ; Copy back the zero page stuff
147
148         ldx     #zpspace-1
149 L2:     lda     zpsave,x
150         sta     sp,x
151         dex
152         bpl     L2
153
154 ; turn on cursor
155
156         inx
157         stx     CRSINH
158
159 ; Back to DOS
160
161         rts
162
163 ; *** end of main startup code
164
165 ; setup sp
166
167 .segment        "INIT"
168
169 initsp:
170         lda     APPMHI
171         sta     sp
172         lda     APPMHI+1
173         sta     sp+1
174         rts
175
176 .segment        "ZPSAVE"
177
178 zpsave: .res    zpspace
179
180         .bss
181
182 spsave:         .res    1
183 appmsav:        .res    1
184 old_shflok:     .res    1
185 old_lmargin:    .res    1
186
187         .segment "AUTOSTRT"
188         .word   RUNAD                   ; defined in atari.h
189         .word   RUNAD+1
190         .word   __STARTUP_LOAD__ + 1