# betty deps
BETTY_DEPS = system.o uart.o buttons.o spi.o display.o flash.o functions.o
-#BETTY_DEPS += pffs.o
+BETTY_DEPS += interrupts.o #pffs.o
# all projects
all: $(HOST_TARGET) $(CROSS_TARGET)
$(CROSS_AS) $(CROSS_ASLAGS) -o $@ $<
# .elf out of .o
-%.elf: %.o startup.o
- $(CROSS_LD) $(CROSS_RAM_LDFLAGS) startup.o -o $@ $<
+%.elf: %.o startup.o interrupts.o
+ $(CROSS_LD) $(CROSS_RAM_LDFLAGS) startup.o interrupts.o -o $@ $<
# betty is special ;)
betty.elf: betty.o startup.o $(BETTY_DEPS)
# stack
-.equ stack_size, (2*1024)
+.equ stack_size, (4*1024)
.equ stack_top, sram_top
.equ stack_limit, (sram_top-stack_size)
+.equ stack_size_fiq, 64
+.equ stack_size_irq, 256
+.equ stack_size_supervisor, 64
+.equ stack_size_abort, 64
+.equ stack_size_undefined, 64
+.equ stack_size_system, 1024
+
+# arm modes - control bits of the program status register
+# ref: chapter 2.8, arm7tdmi-s technical reference manual
+
+.equ mode_user, 0x10
+.equ mode_fiq, 0x11
+.equ mode_irq, 0x12
+.equ mode_supervisor, 0x13
+.equ mode_abort, 0x17
+.equ mode_undefined, 0x1b
+.equ mode_system, 0x1f
+
+.equ fiq_disable, 0x40
+.equ irq_disable, 0x80
+
#
# the startup code
#
.text
.arm
- # init stack pointer
+ # exception handling must go to the very beginning
+
+ b handler_reset
+ b handler_undef_instruction
+ b handler_soft_ir
+ b handler_prefetch_abort
+ b handler_data_abort
+ nop
+ b handler_irq
+ b handler_fiq
+
+ handler_undef_instruction: .word interrupt_handler_undef_instruction
+ handler_soft_ir: .word interrupt_handler_soft_ir
+ handler_prefetch_abort: .word interrupt_handler_prefetch_abort
+ handler_data_abort: .word interrupt_handler_data_abort
+ handler_irq: .word interrupt_handler_irq
+ handler_fiq: .word interrupt_handler_fiq
+
+ # reset handling goes here
+
+handler_reset:
+
+ # init stack pointer for each mode + set stack limit
ldr r0, =sram_top
+
+ msr cpsr_c, #mode_undefined|irq_disable|fiq_disable
mov sp, r0
+ sub r0, r0, #stack_size_undefined
+
+ msr cpsr_c, #mode_abort|irq_disable|fiq_disable
+ mov sp, r0
+ sub r0, r0, #stack_size_abort
+
+ msr cpsr_c, #mode_fiq|irq_disable|fiq_disable
+ mov sp, r0
+ sub r0, r0, #stack_size_fiq
+
+ msr cpsr_c, #mode_irq|irq_disable|fiq_disable
+ mov sp, r0
+ sub r0, r0, #stack_size_irq
+
+ msr cpsr_c, #mode_supervisor|irq_disable|fiq_disable
+ mov sp, r0
+ sub r0, r0, #stack_size_supervisor
+
+ msr cpsr_c, #mode_system|irq_disable|fiq_disable
+ mov sp, r0
+ sub r0, r0, #stack_size_system
+
ldr r0, =stack_limit
mov sl, r0
+ # copy data section
+
+ ldr r1, =_etext
+ ldr r2, =_data
+ ldr r3, =_edata
+
+copy_data_loop:
+
+ cmp r2, r3
+ ldrlo r0, [r1], #4
+ strlo r0, [r2], #4
+ blo copy_data_loop
+
# jump to c code
adr lr, loop_forever