Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'libgloss/xstormy16/crt0.s')
-rw-r--r--libgloss/xstormy16/crt0.s94
1 files changed, 94 insertions, 0 deletions
diff --git a/libgloss/xstormy16/crt0.s b/libgloss/xstormy16/crt0.s
new file mode 100644
index 000000000..28f8c8a8d
--- /dev/null
+++ b/libgloss/xstormy16/crt0.s
@@ -0,0 +1,94 @@
+# XSTORMY16 startup code
+
+# Interrupt vectors at 0x8000.
+ .section .int_vec,"ax"
+ .global _start
+ .align 1
+_start:
+ ;; Reset, watchdog timer interrupt
+ jmpf _int_reset
+ ;; base timer interrupt
+ jmpf _int_basetimer
+ ;; timer 0
+ jmpf _int_timer0
+ ;; timer 1
+ jmpf _int_timer1
+ ;; SIO0 interrupt
+ jmpf _int_sio0
+ ;; SIO1 interrupt
+ jmpf _int_sio1
+ ;; port0 interrupt
+ jmpf _int_port0
+ ;; port1 interrupt
+ jmpf _int_port1
+
+ .text
+# Reset code, set up memory and call main.
+_int_reset:
+ ;; Set up the stack pointer.
+ mov r0,#__stack
+ bz r0,#0,0f
+ mov sp,r0
+0:
+ ;; Zero the data space
+ mov r0,#_edata
+ mov r1,#_end
+ mov r2,#0
+0: mov.w (r0++),r2
+ blt r0,r1,0b
+ ;; Call hardware init routine
+ callf _hwinit
+ ;; Call initialization routines
+ callf _init
+ ;; Set up fini routines to be called from exit
+ mov r2,#@fptr(_fini)
+ callf atexit
+ ;; Call main() with empty argc/argv/envp
+ mov r2,#0
+ mov r3,#0
+ mov r4,#0
+ callf main
+ ;; Exit.
+ callf exit
+ ;; Should never reach this code.
+ halt
+1: .size _int_reset,1b-_int_reset
+
+# Stub interrupt routines.
+ .globl _int_timer0
+ .weak _int_timer0
+ .globl _int_timer1
+ .weak _int_timer1
+ .globl _int_sio0
+ .weak _int_sio0
+ .globl _int_sio1
+ .weak _int_sio1
+ .globl _int_port0
+ .weak _int_port0
+ .globl _int_port1
+ .weak _int_port1
+ .globl _int_basetimer
+ .weak _int_basetimer
+_int_timer0:
+_int_timer1:
+_int_sio0:
+_int_sio1:
+_int_port0:
+_int_port1:
+_int_basetimer:
+ iret
+1: .size _int_timer0,1b-_int_timer0
+
+# Stub hardware init
+ .globl _hwinit
+ .weak _hwinit
+_hwinit:
+ ret
+1: .size _int_hwinit,1b-_int_hwinit
+
+# The first word in .data has address 0, so it's not a good
+# idea to use it as its address conflicts with NULL.
+# Place a HALT instruction there to try to catch NULL pointer
+# dereferences.
+ .data
+ halt