struct / union in initializer, RFE #901.
[sdcc.git] / sdcc / device / lib / tlcs90 / crt0.s
blob3bafe51b8002822f8c9e3eb36a99c0e0ee130105
1 ;; crt0_asm.s - tlcs90
3 .t90
5 .module crt0
7 ; .globl _meminit
8 .globl _main
9 ;; .globl _xxaddr
10 ;; .globl _xxby
11 ;; .globl _xxdata
13 ; .globl _ser_putchar_irq
14 ; .globl _ser_puts
16 ;; put as abs in dat at end of file..
17 ;.globl _ser_irq_flags
18 ;.globl _ser_char
20 ; .globl _xget_byte_asm
21 ; .globl _xset_byte_asm
24 ;; for interrupts the pc and af are pushed on the stack
26 ; .globl _irq_info_swi
27 ; .globl _irq_info_intwd
28 ; .globl _irq_info_intt0
29 ; .globl _irq_info_intt1
30 ; .globl _timer1_irq
31 ; .globl _irq_info_intt3
32 ; .globl _irq_info_intt4
33 ; .globl _irq_info_int1
34 ; .globl _irq_info_intt5
36 .globl _ticks16
37 .globl _xflag
39 ;; NOTE: header might get trashed by linker when code loc ist not used!?
40 .area _HEADER (ABS)
42 .org 0
44 .include "t90regs.s"
46 ;; _ser_irq_flags
47 TX_ACTIVE .equ 0
48 RX_READY .equ 1
50 L0:
51 ;halt
52 ;jr L0
53 jp _astart
54 nop
55 nop
56 nop
57 nop
58 nop
59 nop
60 nop
61 nop
62 nop
63 nop
64 nop
65 nop
66 nop
67 L10:
68 ; SWI
69 ;jp _swi_irq
70 nop
71 nop
72 nop
74 nop
75 nop
76 nop
77 nop
78 nop
80 L18:
81 nop ; NMI
82 nop
83 nop
84 nop
85 nop
86 nop
87 nop
88 nop
90 L20:
91 ; INTWD
92 ;jp _intwd_irq
93 nop
94 nop
95 nop
97 nop
98 nop
99 nop
100 nop
102 L28:
103 reti ; INT0
104 nop
105 nop
106 nop
107 nop
108 nop
109 nop
110 nop
111 L30:
112 ; INTT0
113 ;jp _intt0_irq
118 nop
119 nop
120 nop
121 nop
123 L38:
124 ; INTT1
125 ;jp _intt1_irq
130 nop
131 nop
132 nop
133 nop
135 L40:
136 ; INTAD
137 reti
138 nop
139 nop
140 nop
141 nop
142 nop
143 nop
145 L48:
146 ; INTT3
147 ;jp _intt3_irq
152 nop
153 nop
154 nop
155 nop
157 L50:
158 ; INTT4
159 ;jp _intt4_irq
164 nop
165 nop
166 nop
167 nop
169 L58:
170 ; INT1
171 ;jp _int1_irq
176 nop
177 nop
178 nop
179 nop
181 L60:
182 ; INTT5
183 ;jp _intt5_irq
188 nop
189 nop
190 nop
191 nop
193 L68:
194 reti ; INT2
195 nop
196 nop
197 nop
198 nop
199 nop
200 nop
202 L70:
203 ;jp _serial_rx_irq
208 nop
209 nop
210 nop
211 nop
213 L78:
214 ;jp _serial_tx_irq
219 nop
220 nop
221 nop
222 nop
224 L80:
225 nop
227 .org 0x100
229 _astart:
230 ld sp, #0x0FFA0 ; stack
232 call ___sdcc_external_startup
233 ld l, a
234 push hl
236 ;halt
237 ;swi
239 ; or (P01CR), #0x04 ;
241 ; ld (P3), #0xF7
242 ; ld (P3CR), #0xA5 ; P30 = RXD, P31 = IN:PaperOut CN3, P32 = TXD, P33 = OUT:CN2.LF P34:IN, P37:IN
244 ; ld (P4), #0x00
245 ; ld (P4CR), #0x03 ; address output
246 ; ld (P7), #0x03
247 ; ld (P67CR), #0xF0
248 ; ld (SMMOD), #0xA0
249 ; ld (SMCR), #0x00
250 ; ld (T4MOD), #0x35
251 ; ld (P8), #0x08
252 ; ld (P8CR), #0x08
253 ; ld (T4FFCR), #0x01
255 ; ld (TMOD), #0x40
257 ;ld (SCMOD), #0x03 ; 9600
258 ; ld (SCMOD), #0x01 ; 19200
259 ; or (SCMOD), #0x08 ; 8-bit data
260 ; or (SCMOD), #0x20 ; receiver enable
262 ; ld (SCCR), #0x00
264 ; ld (WDMOD), #0xC0
265 ; ld (TRUN), #0x20 ; PRRUN, start prescaler
266 ; or (TRUN), #0xE0 ; BRATE, 19200 baud
268 ;; enable rx/tx irqs
269 ; set 0,(INTEL) ; tx
270 ; set 1,(INTEL) ; rx
272 ;call _boot1
274 call _wd_reset_asm
276 ; res TX_ACTIVE,(_ser_irq_flags)
278 ;call _boot2
279 ; call _meminit
281 call _wd_reset_asm
283 ;; Initialise global variables. Skip if __sdcc_external_startup returned
284 ;; non-zero value. Note: calling convention version 0 only.
286 ;call _boot3
288 pop hl
289 ld a, l
290 or a, a
291 call Z, gsinit
293 ;call _boot4
295 call _main
296 halt
298 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
300 .area _CODE
302 ;; get far byte using by
304 ;; _xget_byte_asm:
305 ;; push bc
306 ;; ld iy, (_xxaddr)
307 ;; ld b, (BY)
308 ;; ld a, (_xxby)
309 ;; ld (BY), a
310 ;; ld a,(iy)
311 ;; ld (BY), b
312 ;; ld (_xxdata), a
313 ;; pop bc
314 ;; ret
316 ;; _xset_byte_asm:
317 ;; push bc
318 ;; ld iy, (_xxaddr)
319 ;; ld b, (BY)
320 ;; ld a, (_xxby)
321 ;; ld (BY), a
322 ;; ld a, (_xxdata)
323 ;; ld (iy), a
324 ;; ld (BY), b
325 ;; pop bc
326 ;; ret
328 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
330 ;; _serial_rx_irq:
331 ;; ld a, (SCBUF)
332 ;; ld (_ser_char), a
333 ;; set RX_READY, (_ser_irq_flags)
334 ;; reti
336 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
338 ;; _serial_tx_irq:
339 ;; res TX_ACTIVE,(_ser_irq_flags)
340 ;; ld (IRFH), #0x0F ; clear tx request flag (vector 0x78/8 = 0x0F)
341 ;; reti
343 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
345 ;; _swi_irq:
346 ;; push hl
347 ;; ld hl, 4(sp)
348 ;; ld (_swi_pc), hl ; pc
349 ;; ld hl, 2(sp)
350 ;; ld (_swi_af), hl ; af
351 ;; call _irq_info_swi
352 ;; pop hl
353 ;; reti
354 ;; _intwd_irq:
355 ;; call _irq_info_intwd
356 ;; reti
357 ;; _intt0_irq:
358 ;; call _irq_info_intt0
359 ;; reti
360 ;; _intt1_irq:
361 ;; ;call _irq_info_intt1
362 ;; ;exx
364 ;; ; hangs when exx is used?
365 ;; incw (_ticks16)
367 ;; ; hangs when exx is used?
368 ;; ;; ld hl, (_ticks16)
369 ;; ;; inc hl
370 ;; ;; ld (_ticks16), hl
372 ;; ld (WDCR), #0x4E
373 ;; ld (IRFL), #0x10;
374 ;; ;call _timer1_irq
375 ;; ;exx
376 ;; reti
377 ;; _intt3_irq:
378 ;; call _irq_info_intt3
379 ;; reti
380 ;; _intt4_irq:
381 ;; call _irq_info_intt4
382 ;; reti
383 ;; _int1_irq:
384 ;; call _irq_info_int1
385 ;; reti
386 ;; _intt5_irq:
387 ;; call _irq_info_intt5
388 ;; reti
390 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
392 ;; _ser_putchar_irq:
393 ;; ld a, 2(sp)
395 ;; _ser_putchar_asm:
397 ;; loop1:
399 ;; ;; check tx active flag
400 ;; bit TX_ACTIVE,(_ser_irq_flags)
401 ;; jr z, send1
403 ;; di
404 ;; bit 0,(IRFH) ; check irq
405 ;; jr nz, send1
406 ;; ei
408 ;; nop
409 ;; nop
410 ;; call _wd_reset_asm
411 ;; jr loop1 ; loop, wait for irq
413 ;; send1:
414 ;; di
415 ;; ld (IRFH),#0x0F ; clear tx request flag (vector 0x78/8 = 0x0F)
416 ;; ld (SCBUF),a ; send
417 ;; set TX_ACTIVE,(_ser_irq_flags) ; tx active..
418 ;; ei
419 ;; ret
421 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
423 ;; _ser_puts:
424 ;; ld hl, 2(sp)
426 ;; ser_puts1:
427 ;; ld a,(hl)
428 ;; or a, a
429 ;; ret z
431 ;; call _ser_putchar_asm
432 ;; inc hl
433 ;; jr ser_puts1
435 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
437 _WatchDogDisable:
438 ld (WDMOD), #0x00 ; wd disable code
439 ld (WDCR), #0xB1 ; wd disable code
442 _wd_reset_asm:
443 ld (WDCR), #0x4E ; wd clear code
445 .if 0
446 ; STAR ASIC? Not needed..
447 push bc
448 push iy
450 ld b,(BY)
451 ld (BY), #0x01
452 ld iy, #0x4001
453 set 1,(iy)
454 nop
455 nop
456 res 1,(iy)
457 ld (BY),b
459 pop iy
460 pop bc
462 .endif
466 ;; Ordering of segments for the linker.
467 .area _HOME
468 .area _CODE
469 .area _INITIALIZER
470 .area _GSINIT
471 .area _GSFINAL
473 .area _DATA
474 .area _INITIALIZED
475 .area _BSEG
476 .area _BSS
477 .area _HEAP
479 .area _CODE
481 .area _GSINIT
482 gsinit::
484 ; Default-initialized global variables.
485 ld bc, #l__DATA
486 ld a, b
487 or a, c
488 jr Z, zeroed_data
489 ld hl, #s__DATA
490 ld (hl), #0x00
491 dec bc
492 ld a, b
493 or a, c
494 jr Z, zeroed_data
495 ld de, hl
496 inc de
497 ldir
498 zeroed_data:
500 ; Explicitly initialized global variables.
501 ld bc, #l__INITIALIZER
502 ld a, b
503 or a, c
504 jr Z, gsinit_next
505 ld de, #s__INITIALIZED
506 ld hl, #s__INITIALIZER
507 ldir
509 gsinit_next:
511 .area _GSFINAL
514 .area _DATA
515 ; __sfr __at
516 _ser_irq_flags = 0xffbf
517 _ser_char = 0xffbe
518 _swi_pc = 0xffbc
519 _swi_af = 0xffba
520 _ticks16 = 0xffb8
521 _xflag = 0xffb7