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