bullshit commit, sync for travel (to zn00H!) :)
[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 .equ    vic_vect_addr,  0xfffff030
45
46 #
47 # the startup code
48 #
49
50 .text
51 .arm
52
53         # exception handling must go to the very beginning
54         #
55         # concerning irq:
56         #  - the ldr is at 0x18
57         #  - pc will be 0x18 + 8 at the moment of ldr (pipeline)
58         #  - substract 0xff0 => 0xfffff030
59         #  - that's the vectored address register
60         #  - the vic put in there the address of our service routine
61
62 exception_vectors:
63
64         ldr pc, handler_reset
65         ldr pc, handler_undef_instruction
66         ldr pc, handler_soft_ir
67         ldr pc, handler_prefetch_abort
68         ldr pc, handler_data_abort
69         nop
70         ldr pc, [pc, #-0xff0]
71         #ldr pc, handler_irq
72         ldr pc, handler_fiq
73
74 handler_reset: .word handle_reset
75 handler_undef_instruction: .word interrupt_handler_undef_instruction
76 handler_soft_ir: .word interrupt_handler_soft_ir
77 handler_prefetch_abort: .word interrupt_handler_prefetch_abort
78 handler_data_abort: .word interrupt_handler_data_abort
79 handler_irq: .word vic_vect_addr
80 handler_fiq: .word interrupt_handler_fiq
81
82         # reset handling goes here
83
84 handle_reset:
85
86         # init stack pointer for each mode + set stack limit
87
88         ldr r0, =sram_top
89
90         msr cpsr_c, #mode_undefined|irq_disable|fiq_disable
91         mov sp, r0
92         sub r0, r0, #stack_size_undefined
93
94         msr cpsr_c, #mode_abort|irq_disable|fiq_disable
95         mov sp, r0
96         sub r0, r0, #stack_size_abort
97
98         msr cpsr_c, #mode_fiq|irq_disable|fiq_disable
99         mov sp, r0
100         sub r0, r0, #stack_size_fiq
101
102         msr cpsr_c, #mode_irq|irq_disable|fiq_disable
103         mov sp, r0
104         sub r0, r0, #stack_size_irq
105
106         msr cpsr_c, #mode_supervisor|irq_disable|fiq_disable
107         mov sp, r0
108         sub r0, r0, #stack_size_supervisor
109
110         msr cpsr_c, #mode_system|irq_disable|fiq_disable
111         mov sp, r0
112         sub r0, r0, #stack_size_system
113
114         ldr r0, =stack_limit
115         mov sl, r0
116
117         # enable irq and fiq
118         msr cpsr_c, #mode_system
119
120         # copy data section (only if we are in flash <=> _etext != _data)
121
122         ldr r1, =_etext
123         ldr r2, =_data
124         ldr r3, =_edata
125
126         cmp r1, r2
127         beq copy_exception_vectors
128
129 copy_data_loop:
130
131         cmp r2, r3
132         ldrlo r0, [r1], #4
133         strlo r0, [r2], #4
134         blo copy_data_loop
135         b start_of_c_code
136
137         # copy exception vectors (only if we are in ram <=> _etext = _data)
138
139 copy_exception_vectors:
140
141         mov r0, #sram_addr
142         ldr r1, =exception_vectors
143         ldmia r1!, {r2-r9}
144         stmia r0!, {r2-r9}
145         ldmia r1!, {r2-r8}
146         stmia r0!, {r2-r8}
147
148         # jump to c code
149
150 start_of_c_code:
151
152         adr lr, loop_forever
153         mov r0, #0
154         mov r1, #0
155         ldr r2, =main
156         bx r2
157
158 loop_forever:
159         b loop_forever
160