forked from z88dk/z88dk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
z80_crt0.hdr
395 lines (359 loc) · 9.59 KB
/
z80_crt0.hdr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
;
; Header file which contains all required variables from the
; startup that need to be exposed to individual C files
;
; Stick in this file any routines which are needed or implicitly
; implied by sccz80.
;
; This file is included by every module
; To handle multi module programs which use floating point
; routines in different modules, we have got rid of
; the conditional assembly around the float routines
;
; $Id: z80_crt0.hdr,v 1.12 2015-11-24 06:47:17 stefano Exp $
EXTERN base_graphics ; Address of graphics screen
EXTERN _cpfar2near ; Far->near conversion (z88)
EXTERN packintrout ; Process interrupt (z88 apps)
EXTERN l_dcal ; jp(hl)
EXTERN cleanup ; cleanup before program exit
EXTERN l_jphl ; another jp(hl)
EXTERN l_jpix ; jp(ix)
EXTERN l_jpiy ; jp(iy)
EXTERN l_ldi
EXTERN l_ldi_128
EXTERN l_ldi_256
EXTERN l_outi
EXTERN l_outi_128
EXTERN l_outi_256
EXTERN l_ini
EXTERN l_ini_128
EXTERN l_ini_256
EXTERN l_ini_512
; Used for banked calls for __banked for sccz80 + sdcc
EXTERN banked_call
;------------------------------------
; Scopes for integer library routines
;------------------------------------
EXTERN l_getptr ;Get 3 byte pointer
EXTERN l_putptr ;Put 3 byte pointer
EXTERN l_gchar ;Get signed char
EXTERN l_gcharsp ;Get signed char (peephole opt)
EXTERN l_gcharspsp ;Get signed char and push (peephole opt)
EXTERN l_g2charspsp ;Get 2 signed char and push (peephole opt)
EXTERN l_sxt ;Sign extend char
EXTERN l_gint ;Get int
EXTERN l_gintsp ;Get int (peephole opt)
EXTERN l_gintspchar ;Get int,char (peephole opt)
EXTERN l_gintspsp ;Get int and push (peephole opt)
EXTERN l_g2intspsp ;Get 2 int and push (peephole opt)
EXTERN l_gintsp2de ;Get int, multiply by 2 and add from SP by de
EXTERN l_gint7de ;Get int, multiply by 7 and add from SP by de
EXTERN l_gint_eq ;Get int and test == 0
EXTERN l_ghtonsint ;Get reverse order int
EXTERN l_pint ;Put int
EXTERN l_pint_eq ;Put int and test == 0
EXTERN l_pint_pop ;Put int and pop place address
EXTERN l_pint_ex ;Put int hl to addr de return addr in hl
EXTERN l_or ;Int logical or
EXTERN l_xor ;Int logical xor
EXTERN l_and ;Int logical and
EXTERN l_eq ;Int equality
EXTERN l_ne ;Int inequality
EXTERN l_gt ;Int signed >
EXTERN l_le ;Int signed <=
EXTERN l_ge ;Int signed >=
EXTERN l_lt ;Int signed <
EXTERN l_uge ;Int unsigned >=
EXTERN l_ult ;Int unsigned <
EXTERN l_ugt ;Int unsigned >
EXTERN l_ule ;Int unsigned <=
EXTERN l_cmp ;Int signed compare
EXTERN l_ucmp ;Int unsigned compare
EXTERN l_asr ;Int signed >>
EXTERN l_asr_hl_by_e ;Int signed >>
EXTERN l_asr_u ;Int unsigned >>
EXTERN l_asr_u_hl_by_e ;Int unsigned >>
EXTERN l_asl ;Int <<
EXTERN l_sub ;Int subtract
EXTERN l_neg ;Int negate
EXTERN l_com ;Int ~
EXTERN l_lneg ;Int logical negate
EXTERN l_bool ;Int boolean tetst
EXTERN l_cm_de ;
EXTERN l_cm_bc
EXTERN l_deneg
EXTERN l_bcneg
EXTERN l_case ;Integer case
EXTERN l_mult ;Integer *
EXTERN l_div ;Integer signed /
EXTERN l_div_u ;Integer unsigned /
EXTERN l_mod ;Integer % (for gbz80)
EXTERN l_mod_u ;Integer unsigned % (for gbz80)
;------------------
;Long functions now
;------------------
EXTERN lpush2 ;Push a long under the stack
EXTERN l_int2long_s ;Int->long signed conversion
EXTERN l_int2long_s_float ;Int->long->float signed conversion (optimizer: use -O3)
EXTERN l_int2long_u_float ;uInt->ulong->float signed conversion
EXTERN l_glong ;Get long
EXTERN l_glongsp ;Get long (peephole opt)
EXTERN l_glonghlp ;Get pointer, then get long
EXTERN l_glong2sp ;Get long and copy on stack (peephole opt)
EXTERN l_glong2sp_hlp
EXTERN l_long_add
EXTERN l_long_and
EXTERN l_long_asl
EXTERN l_long_asr
EXTERN l_long_aslo ;Long << shift in c
EXTERN l_long_asro ;Long >> shift in c (signed)
EXTERN l_long_bool
EXTERN l_long_cmp
EXTERN l_long_com
EXTERN l_long_eq
EXTERN l_long_ge
EXTERN l_long_gt
EXTERN l_long_le
EXTERN l_long_lneg
EXTERN l_long_lt
EXTERN l_long_ne
EXTERN l_long_neg
EXTERN l_long_or
EXTERN l_long_sub
EXTERN l_long_ucmp
EXTERN l_long_uge
EXTERN l_long_ugt
EXTERN l_long_ule
EXTERN l_long_ult
EXTERN l_long_xor
EXTERN l_plong
EXTERN l_inclong ;Increment long
EXTERN l_declong ;Decrement long
EXTERN l_long_div
EXTERN l_long_div_u
EXTERN l_long_mod
EXTERN l_long_mod_u
EXTERN l_long_mult
EXTERN l_long_asr_u ;Long unsigned >>
EXTERN l_long_asr_uo ;Long unsigned >> shift in c
EXTERN l_long_case
;--------------------------------------------------------------
; Floating point support routines, mostly in library
;--------------------------------------------------------------
EXTERN dadd
EXTERN ddiv
EXTERN dsub
EXTERN dmul
EXTERN dge
EXTERN dgt
EXTERN dleq
EXTERN dlt
EXTERN deq
EXTERN dne
EXTERN minusfa ;FA=-FA
EXTERN dswap ;Exchange FA with top of stack
EXTERN float ;Convert int to float
EXTERN ufloat ;unsigned int to float
EXTERN ifix ;Convert float to int
EXTERN dstore ;FA->(de)
EXTERN dload ;FA<-(hl)
EXTERN dldpsh ;(hl)->(stack)
EXTERN dpush ;FA->(stack)
EXTERN dpush2 ;FA->(stack under)
EXTERN dpush3 ;FA->(stack under,long)
EXTERN fa ;may not be needed in this file
EXTERN extra ;ditto
EXTERN __atof2 ;string->fa conversion
EXTERN l_f48_ldexp ;FA * pow2(N)
EXTERN l_f48_f16tof ;Convert _Float16 to float
EXTERN l_f48_ftof16 ;Convert float to _Float16
; 16 bit float ABI
EXTERN l_f16_add
EXTERN l_f16_sub
EXTERN l_f16_mul
EXTERN l_f16_div
EXTERN l_f16_le
EXTERN l_f16_lt
EXTERN l_f16_ge
EXTERN l_f16_gt
EXTERN l_f16_eq
EXTERN l_f16_ne
EXTERN l_f16_swap
EXTERN l_f16_schar2f
EXTERN l_f16_uchar2f
EXTERN l_f16_sint2f
EXTERN l_f16_uint2f
EXTERN l_f16_slong2f
EXTERN l_f16_ulong2f
EXTERN l_f16_f2sint
EXTERN l_f16_f2uint
EXTERN l_f16_f2slong
EXTERN l_f16_f2ulong
EXTERN l_f16_ldexp
EXTERN l_f16_invf ;Only for ieee16
EXTERN l_f16_f16tof ;A noop
EXTERN l_f16_ftof16 ;A noop
; 32 bit float ABI
EXTERN l_f32_add
EXTERN l_f32_sub
EXTERN l_f32_mul
EXTERN l_f32_div
EXTERN l_f32_le
EXTERN l_f32_lt
EXTERN l_f32_ge
EXTERN l_f32_gt
EXTERN l_f32_eq
EXTERN l_f32_ne
EXTERN l_f32_swap
EXTERN l_f32_negate
EXTERN l_f32_schar2f
EXTERN l_f32_uchar2f
EXTERN l_f32_sint2f
EXTERN l_f32_uint2f
EXTERN l_f32_slong2f
EXTERN l_f32_ulong2f
EXTERN l_f32_f2sint
EXTERN l_f32_f2uint
EXTERN l_f32_f2slong
EXTERN l_f32_f2ulong
EXTERN l_f32_ldexp
EXTERN l_f32_invf ;Only for math32
EXTERN l_f32_f16tof ;Convert _Float16 to float
EXTERN l_f32_ftof16 ;Convert float to _Float16
; 64 bit float ABI
EXTERN l_f64_load
EXTERN l_f64_add
EXTERN l_f64_sub
EXTERN l_f64_mul
EXTERN l_f64_div
EXTERN l_f64_le
EXTERN l_f64_lt
EXTERN l_f64_ge
EXTERN l_f64_gt
EXTERN l_f64_eq
EXTERN l_f64_ne
EXTERN l_f64_negate
EXTERN l_f64_swap
EXTERN l_f64_store
EXTERN l_f64_dpush
EXTERN l_f64_dldpsh
EXTERN l_f64_dpush2
EXTERN l_f64_dpush3
EXTERN l_f64_schar2f
EXTERN l_f64_uchar2f
EXTERN l_f64_sint2f
EXTERN l_f64_uint2f
EXTERN l_f64_slong2f
EXTERN l_f64_ulong2f
EXTERN l_f64_f2sint
EXTERN l_f64_f2uint
EXTERN l_f64_f2slong
EXTERN l_f64_f2ulong
EXTERN l_f64_ldexp
EXTERN l_f64_f16tof ;Convert _Float16 to float
EXTERN l_f64_ftof16 ;Convert float to _Float16
;--------------------------------------------------
; Routines for picking up variables from far memory
;--------------------------------------------------
EXTERN lp_gchar
EXTERN lp_gdoub
EXTERN lp_gint
EXTERN lp_glong
EXTERN lp_gptr
EXTERN lp_pchar
EXTERN lp_pdoub
EXTERN lp_pint
EXTERN lp_plong
EXTERN lp_pptr
EXTERN l_farcall ; Long call
;--------------------------------------------------
; Routines for handling 64 bit integers for sccz80
;--------------------------------------------------
EXTERN __i64_acc
EXTERN l_i64_load
EXTERN l_i64_store
EXTERN l_i64_push
EXTERN l_i64_add
EXTERN l_i64_sub
EXTERN l_i64_mult
EXTERN l_i64_mod
EXTERN l_i64_mod_u
EXTERN l_i64_div
EXTERN l_i64_div_u
EXTERN l_i64_or
EXTERN l_i64_xor
EXTERN l_i64_and
EXTERN l_i64_asr_u
EXTERN l_i64_asr_uo
EXTERN l_i64_asr
EXTERN l_i64_asro
EXTERN l_i64_asl
EXTERN l_i64_aslo
EXTERN l_i64_inc
EXTERN l_i64_dec
EXTERN l_i64_eq0
EXTERN l_i64_eq
EXTERN l_i64_ne
EXTERN l_i64_ge
EXTERN l_i64_gt
EXTERN l_i64_uge
EXTERN l_i64_ugt
EXTERN l_i64_le
EXTERN l_i64_lt
EXTERN l_i64_ule
EXTERN l_i64_ult
EXTERN l_i64_lneg
EXTERN l_i64_neg
EXTERN l_i64_com
EXTERN l_i64_case
EXTERN l_i64_push_under_int
EXTERN l_i64_push_under_int_mhl
EXTERN l_i64_copy
EXTERN l_i64_slong2i64
EXTERN l_i64_ulong2i64
EXTERN l_i64_sint2i64
EXTERN l_i64_uint2i64
;-------------------
; Routines for SDCC
;-------------------
EXTERN __divsint_rrx_s
EXTERN __divsint_rrx_hds
EXTERN __divuint_rrx_s
EXTERN __divuint_rrx_hds
EXTERN __divsuchar_rrx_s
EXTERN __divuschar_rrx_s
EXTERN __divuchar_rrx_s
EXTERN __divuchar_rrx_hds
EXTERN __moduchar_rrx_s
EXTERN __moduchar_rrx_hds
EXTERN __moduschar_rrx_s
EXTERN __modsuchar_rrx_s
EXTERN __modschar_rrx_s
EXTERN __modschar_rrx_hds
EXTERN __modsint_rrx_s
EXTERN __modsint_rrx_hds
EXTERN __moduint_rrx_s
EXTERN __moduint_rrx_hds
EXTERN __get_remainder
EXTERN __divunsigned
EXTERN __div_signexte
EXTERN __divu16
EXTERN __div16
EXTERN __div8
EXTERN __muluchar_rrx_s
EXTERN __muluchar_rrx_hds
EXTERN __mulsuchar_rrx_s
EXTERN __muluschar_rrx_s
EXTERN __mulschar_rrx_s
EXTERN __mulschar_rrx_hds
EXTERN __mulint_rrx_s
EXTERN __mulint_rrx_hds
EXTERN __mul16
EXTERN __rrulong_rrx_s
EXTERN __rrslong_rrx_s
EXTERN __rlslong_rrx_s
EXTERN __rlulong_rrx_s
EXTERN __muluchar
EXTERN __mulschar
EXTERN l_push_di
EXTERN l_pop_ei