]> git.sur5r.net Git - cc65/blob - libsrc/atari/crt0.s
66222d2489a55e72bbb51b8b885a32003da44936
[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         .import         getargs, argc, argv
14         .import         __hinit, initconio, zerobss, pushax, doatexit
15         .import         _main,__filetab,getfd
16         .import         __CODE_LOAD__, __BSS_LOAD__
17
18         .include        "atari.inc"
19
20 ; ------------------------------------------------------------------------
21 ; Define and export the ZP variables for the runtime
22
23         .exportzp       sp, sreg, regsave
24         .exportzp       ptr1, ptr2, ptr3, ptr4
25         .exportzp       tmp1, tmp2, tmp3, tmp4
26         .exportzp       fntemp, regbank, zpspace
27
28 sp      = $D2           ; (2bytes) stack pointer
29 sreg    = $D4           ; (2bytes) secondary register/high 16 bit for longs
30 regsave = $D6           ; (4bytes) slot to save/restore (E)AX into
31 ptr1    = $DA           ; (2bytes)
32 ptr2    = $DC           ; (2bytes)
33 ptr3    = $DE           ; (2bytes)
34 ptr4    = $E0           ; (2bytes)
35 tmp1    = $E2           ; (1byte)
36 tmp2    = $E3           ; (1byte)
37 tmp3    = $E4           ; (1byte)
38 tmp4    = $E5           ; (1byte)
39 fntemp  = $E6           ; (2bytes) pointer to file name
40 regbank = $E8           ; (6bytes) 6 byte register bank
41 zpspace = $EE - sp      ; Zero page space allocated
42
43 ; ------------------------------------------------------------------------
44 ; EXE header
45
46         .segment "EXEHDR"
47         .word   $FFFF
48         .word   __CODE_LOAD__
49         .word   __BSS_LOAD__ - 1
50         .code
51         .reloc
52
53 ; ------------------------------------------------------------------------
54 ; Actual code
55
56         rts     ; fix for SpartaDOS / OS/A+
57                 ; they first call the entry point from AUTOSTRT and
58                 ; then the load addess (this rts here).
59                 ; We point AUTOSTRT directly after the rts.
60
61 ; Real entry point:
62
63 ; Save the zero page locations we need
64
65         ldy     #zpspace-1
66 L1:     lda     sp,y
67         sta     zpsave,y
68         dey
69         bpl     L1
70
71 ; Clear the BSS data
72
73         jsr     zerobss
74
75 ; setup the stack
76
77         tsx
78         stx     spsave
79
80 ; report memory usage and initialize stack pointer
81
82         lda     APPMHI
83         sta     appmsav
84         lda     APPMHI+1
85         sta     appmsav+1
86         
87         lda     #<$8000
88         sta     sp
89         sta     APPMHI
90         lda     #>$8000
91         sta     sp+1            ; Set argument stack ptr
92         sta     APPMHI+1
93         
94 ; set left margin to 0
95
96         lda     LMARGN
97         sta     old_lmargin
98         lda     #0
99         sta     LMARGN
100
101 ; set keyb to upper/lowercase mode
102
103         ldx     SHFLOK
104         stx     old_shflok
105         sta     SHFLOK
106         
107 ; Initialize the heap
108
109         jsr     __hinit
110
111 ; Initialize conio stuff
112
113         jsr     initconio
114
115         lda     #$FF
116         sta     CH
117
118 ; set stdio stream handles
119
120         lda     #0
121         jsr     getfd
122         sta     __filetab               ; setup stdin
123         lda     #0
124         jsr     getfd
125         sta     __filetab + 2           ; setup stdout
126         lda     #0
127         jsr     getfd
128         sta     __filetab + 4           ; setup stderr
129
130 ; Pass command line if present
131
132         jsr     getargs
133
134         lda     argc
135         ldx     argc+1
136         jsr     pushax          ; argc
137         lda     #<argv
138         ldx     #>argv
139         jsr     pushax          ; argv
140
141         ldy     #4              ; Argument size
142         jsr     _main           ; call the users code
143
144 ; fall thru to exit...
145
146 _exit:  jsr     doatexit        ; call exit functions
147
148         ldx     spsave
149         txs                     ; Restore stack pointer
150
151 ; restore left margin
152
153         lda     old_lmargin
154         sta     LMARGN
155
156 ; restore kb mode
157
158         lda     old_shflok
159         sta     SHFLOK
160
161 ; restore APPMHI
162         
163         lda     appmsav
164         sta     APPMHI
165         lda     appmsav+1
166         sta     APPMHI+1
167
168 ; Copy back the zero page stuff
169
170         ldy     #zpspace-1
171 L2:     lda     zpsave,y
172         sta     sp,y
173         dey
174         bpl     L2
175
176 ; Back to DOS
177
178         rts
179
180 .data
181
182 zpsave: .res    zpspace
183         
184 .bss
185
186 spsave:         .res    1
187 appmsav:        .res    1
188 old_shflok:     .res    1
189 old_lmargin:    .res    1
190
191         .segment "AUTOSTRT"
192         .word   $02E0
193         .word   $02E1
194         .word   __CODE_LOAD__ + 1