interrupts
[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         b handler_reset
54         b interrupt_handler_undef_instruction
55         b interrupt_handler_soft_ir
56         b interrupt_handler_prefetch_abort
57         b interrupt_handler_data_abort
58         nop
59         b interrupt_handler_irq
60         b interrupt_handler_fiq
61
62         # reset handling goes here
63
64 handler_reset:
65
66         # init stack pointer for each mode + set stack limit
67
68         ldr r0, =sram_top
69
70         msr cpsr_c, #mode_undefined|irq_disable|fiq_disable
71         mov sp, r0
72         sub r0, r0, #stack_size_undefined
73
74         msr cpsr_c, #mode_abort|irq_disable|fiq_disable
75         mov sp, r0
76         sub r0, r0, #stack_size_abort
77
78         msr cpsr_c, #mode_fiq|irq_disable|fiq_disable
79         mov sp, r0
80         sub r0, r0, #stack_size_fiq
81
82         msr cpsr_c, #mode_irq|irq_disable|fiq_disable
83         mov sp, r0
84         sub r0, r0, #stack_size_irq
85
86         msr cpsr_c, #mode_supervisor|irq_disable|fiq_disable
87         mov sp, r0
88         sub r0, r0, #stack_size_supervisor
89
90         msr cpsr_c, #mode_system|irq_disable|fiq_disable
91         mov sp, r0
92         sub r0, r0, #stack_size_system
93
94         ldr r0, =stack_limit
95         mov sl, r0
96
97         # copy data section
98
99         ldr r1, =_etext
100         ldr r2, =_data
101         ldr r3, =_edata
102
103 copy_data_loop:
104
105         cmp r2, r3
106         ldrlo r0, [r1], #4
107         strlo r0, [r2], #4
108         blo copy_data_loop
109
110         # jump to c code
111
112         adr lr, loop_forever
113         mov r0, #0
114         mov r1, #0
115         ldr r2, =main
116         bx r2
117
118 loop_forever:
119         b loop_forever
120