|
Last change
on this file since 562 was
444,
checked in by satin@…, 8 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 |
|---|
| 27 | 2: .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 |
|---|
| 34 | 0: |
|---|
| 35 | ;; Zero the data space |
|---|
| 36 | mov r0,#_edata |
|---|
| 37 | mov r1,#_end |
|---|
| 38 | mov r2,#0 |
|---|
| 39 | 0: 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 |
|---|
| 53 | 0: movf.w r2,(r0++) |
|---|
| 54 | bnz r0,#0,2f |
|---|
| 55 | add r8,#1 |
|---|
| 56 | 2: mov.w (r1++),r2 |
|---|
| 57 | blt r1,r3,0b |
|---|
| 58 | 1: |
|---|
| 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 |
|---|
| 75 | 1: .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 |
|---|
| 100 | 1: .size _int_timer0,1b-_int_timer0 |
|---|
| 101 | |
|---|
| 102 | # Stub hardware init |
|---|
| 103 | .globl _hwinit |
|---|
| 104 | .weak _hwinit |
|---|
| 105 | _hwinit: |
|---|
| 106 | ret |
|---|
| 107 | 1: .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.