dc43ab6513ed417f0a404555e24ea50c1031b720
[my-code/arm.git] / betty / startup.s
1 #
2 # startup.s - starup code for the lpc2220
3 #
4 # author: hackbard@hackdaworld.org
5 #
6
7 #
8 # some definitions
9 #
10
11 # sram
12
13 .equ    sram_size,      (64*1024)
14 .equ    sram_addr,      0x40000000
15 .equ    sram_top,       (sram_addr+sram_size-4)
16
17 # stack
18
19 .equ    stack_size,     (4*1024)
20 .equ    stack_top,      sram_top
21 .equ    stack_limit,    (sram_top-stack_size)
22
23 .equ    stack_size_fiq,         64
24 .equ    stack_size_irq,         256
25 .equ    stack_size_supervisor,  64
26 .equ    stack_size_abort,       64
27 .equ    stack_size_undefined,   64
28 .equ    stack_size_system,      1024
29
30 # arm modes - control bits of the program status register
31 # ref: chapter 2.8, arm7tdmi-s technical reference manual
32
33 .equ    mode_user,              0x10
34 .equ    mode_fiq,               0x11
35 .equ    mode_irq,               0x12
36 .equ    mode_supervisor,        0x13
37 .equ    mode_abort,             0x17
38 .equ    mode_undefined,         0x1b
39 .equ    mode_system,            0x1f
40
41 .equ    fiq_disable,    0x40
42 .equ    irq_disable,    0x80
43
44 #
45 # the startup code
46 #
47
48 .text
49 .arm
50
51         # exception handling must go to the very beginning
52
53         ldr pc, handler_reset
54         ldr pc, handler_undef_instruction
55         ldr pc, handler_soft_ir
56         ldr pc, handler_prefetch_abort
57         ldr pc, handler_data_abort
58         nop
59         ldr pc, handler_irq
60         ldr pc, handler_fiq
61
62 handler_reset: .word handle_reset
63 handler_undef_instruction: .word interrupt_handler_undef_instruction
64 handler_soft_ir: .word interrupt_handler_soft_ir
65 handler_prefetch_abort: .word interrupt_handler_prefetch_abort
66 handler_data_abort: .word interrupt_handler_data_abort
67 handler_irq: .word interrupt_handler_irq
68 handler_fiq: .word interrupt_handler_fiq
69
70         # reset handling goes here
71
72 handle_reset:
73
74         # init stack pointer for each mode + set stack limit
75
76         ldr r0, =sram_top
77
78         msr cpsr_c, #mode_undefined|irq_disable|fiq_disable
79         mov sp, r0
80         sub r0, r0, #stack_size_undefined
81
82         msr cpsr_c, #mode_abort|irq_disable|fiq_disable
83         mov sp, r0
84         sub r0, r0, #stack_size_abort
85
86         msr cpsr_c, #mode_fiq|irq_disable|fiq_disable
87         mov sp, r0
88         sub r0, r0, #stack_size_fiq
89
90         msr cpsr_c, #mode_irq|irq_disable|fiq_disable
91         mov sp, r0
92         sub r0, r0, #stack_size_irq
93
94         msr cpsr_c, #mode_supervisor|irq_disable|fiq_disable
95         mov sp, r0
96         sub r0, r0, #stack_size_supervisor
97
98         msr cpsr_c, #mode_system|irq_disable|fiq_disable
99         mov sp, r0
100         sub r0, r0, #stack_size_system
101
102         ldr r0, =stack_limit
103         mov sl, r0
104
105         # copy data section (only if we are in flash <=> _etext = _data)
106
107         ldr r1, =_etext
108         ldr r2, =_data
109         ldr r3, =_edata
110
111         cmp r1, r2
112         beq start_of_c_code
113
114 copy_data_loop:
115
116         cmp r2, r3
117         ldrlo r0, [r1], #4
118         strlo r0, [r2], #4
119         blo copy_data_loop
120
121         # jump to c code
122
123 start_of_c_code:
124
125         adr lr, loop_forever
126         mov r0, #0
127         mov r1, #0
128         ldr r2, =main
129         bx r2
130
131 loop_forever:
132         b loop_forever
133