compilation errors fixed, debug now!
[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         # concerning irq:
54         #  - the ldr is at 0x18
55         #  - pc will be 0x18 + 8 at the moment of ldr (pipeline)
56         #  - substract 0xff0 => 0xfffff030
57         #  - that's the vectored address register
58         #  - the vic put in there the address of our service routine
59
60         ldr pc, handler_reset
61         ldr pc, handler_undef_instruction
62         ldr pc, handler_soft_ir
63         ldr pc, handler_prefetch_abort
64         ldr pc, handler_data_abort
65         nop
66         ldr pc, [pc, #-0xff0]
67         ldr pc, handler_fiq
68
69 handler_reset: .word handle_reset
70 handler_undef_instruction: .word interrupt_handler_undef_instruction
71 handler_soft_ir: .word interrupt_handler_soft_ir
72 handler_prefetch_abort: .word interrupt_handler_prefetch_abort
73 handler_data_abort: .word interrupt_handler_data_abort
74 handler_fiq: .word interrupt_handler_fiq
75
76         # reset handling goes here
77
78 handle_reset:
79
80         # init stack pointer for each mode + set stack limit
81
82         ldr r0, =sram_top
83
84         msr cpsr_c, #mode_undefined|irq_disable|fiq_disable
85         mov sp, r0
86         sub r0, r0, #stack_size_undefined
87
88         msr cpsr_c, #mode_abort|irq_disable|fiq_disable
89         mov sp, r0
90         sub r0, r0, #stack_size_abort
91
92         msr cpsr_c, #mode_fiq|irq_disable|fiq_disable
93         mov sp, r0
94         sub r0, r0, #stack_size_fiq
95
96         msr cpsr_c, #mode_irq|irq_disable|fiq_disable
97         mov sp, r0
98         sub r0, r0, #stack_size_irq
99
100         msr cpsr_c, #mode_supervisor|irq_disable|fiq_disable
101         mov sp, r0
102         sub r0, r0, #stack_size_supervisor
103
104         msr cpsr_c, #mode_system|irq_disable|fiq_disable
105         mov sp, r0
106         sub r0, r0, #stack_size_system
107
108         ldr r0, =stack_limit
109         mov sl, r0
110
111         # copy data section (only if we are in flash <=> _etext != _data)
112
113         ldr r1, =_etext
114         ldr r2, =_data
115         ldr r3, =_edata
116
117         cmp r1, r2
118         beq start_of_c_code
119
120 copy_data_loop:
121
122         cmp r2, r3
123         ldrlo r0, [r1], #4
124         strlo r0, [r2], #4
125         blo copy_data_loop
126
127         # jump to c code
128
129 start_of_c_code:
130
131         adr lr, loop_forever
132         mov r0, #0
133         mov r1, #0
134         ldr r2, =main
135         bx r2
136
137 loop_forever:
138         b loop_forever
139