source: trunk/libs/newlib/src/libgloss/xstormy16/crt0.s @ 646

Last change on this file since 646 was 444, checked in by satin@…, 7 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 2.1 KB
Line 
1# XSTORMY16 startup code
2
3# Interrupt vectors at 0x8000.
4        .section .int_vec,"ax"
5        .global _start
6        .align 1
7_start:
8        ;; Reset, watchdog timer interrupt
9        jmpf _int_reset
10        ;; base timer interrupt
11        jmpf _int_basetimer
12        ;; timer 0
13        jmpf _int_timer0
14        ;; timer 1
15        jmpf _int_timer1
16        ;; SIO0 interrupt
17        jmpf _int_sio0
18        ;; SIO1 interrupt
19        jmpf _int_sio1
20        ;; port0 interrupt
21        jmpf _int_port0
22        ;; port1 interrupt
23        jmpf _int_port1
24
25# Reset code, set up memory and call main.
26        .section        .rodata
272:      .word   __rdata
28        .text
29_int_reset:
30        ;; Set up the stack pointer.
31        mov r0,#__stack
32        bz  r0,#0,0f
33        mov sp,r0
340:
35        ;; Zero the data space
36        mov r0,#_edata
37        mov r1,#_end
38        mov r2,#0
390:      mov.w (r0++),r2
40        blt r0,r1,0b
41
42        ;; Copy data from ROM into RAM.  ROM area may be above 64k,
43        ;; but RAM may not.
44        mov r1,#__data
45        mov r3,#_edata
46        mov r4,#2b
47        mov.w r0,(r4++)
48        mov.w r2,(r4) 
49        mov r8,r2
50        ;; If _data == _rdata there's no need to copy anything.
51        bnz r0,r1,0f
52        bz r2,#0,1f
530:      movf.w r2,(r0++)
54        bnz r0,#0,2f
55        add r8,#1
562:      mov.w (r1++),r2
57        blt r1,r3,0b
581:     
59        ;; Call hardware init routine
60        callf _hwinit
61        ;; Call initialization routines
62        callf _init
63        ;; Set up fini routines to be called from exit
64        mov r2,#@fptr(_fini)
65        callf atexit
66        ;; Call main() with empty argc/argv/envp
67        mov r2,#0
68        mov r3,#0
69        mov r4,#0
70        callf main
71        ;; Exit.
72        callf exit
73        ;; Should never reach this code.
74        halt
751:      .size _int_reset,1b-_int_reset
76               
77# Stub interrupt routines.
78        .globl _int_timer0
79        .weak _int_timer0
80        .globl _int_timer1
81        .weak _int_timer1
82        .globl _int_sio0
83        .weak _int_sio0
84        .globl _int_sio1
85        .weak _int_sio1
86        .globl _int_port0
87        .weak _int_port0
88        .globl _int_port1
89        .weak _int_port1
90        .globl _int_basetimer
91        .weak _int_basetimer
92_int_timer0:
93_int_timer1:
94_int_sio0:
95_int_sio1:
96_int_port0:
97_int_port1:
98_int_basetimer:
99        iret
1001:      .size _int_timer0,1b-_int_timer0
101
102# Stub hardware init
103        .globl _hwinit
104        .weak _hwinit
105_hwinit:
106        ret
1071:      .size _hwinit,1b-_hwinit
108
109# The first word in .data has address 0, so it's not a good
110# idea to use it as its address conflicts with NULL.
111# Place a HALT instruction there to try to catch NULL pointer
112# dereferences.
113        .data
114        halt
Note: See TracBrowser for help on using the repository browser.