fernly/start.S
Sean Cross 1c3ef737bf fernly: Fix printf("%d") > 99999
This adds lots of divison code, which fixes, among other things,
calling printf() with %d greater than 99999.
2014-09-11 13:15:37 +08:00

106 lines
1.8 KiB
ArmAsm

.section vectors
.global reset
reset:
ldr r0, =0x7000cffc // stack_start
mov sp, r0
mov r2, #0xffffffff
ldr r1, =0x7000c000 // stack_end
clear_stack:
cmp r1, r0
str r2, [r0]
sub r0, r0, #4
bcc clear_stack
## Copy 0x10000 bytes from =spi_offset to psram at 0x3460
#copy_code_to_ram:
# ldr r0, =0x00003460 // Target offset
# ldr r1, =0x10003460 // Source offset
# mov r2, #0x10000
# bl asm_memcpy
#
## Copy reset vector table to address 0
#copy_reset_vectors:
# mov r0, #0
# ldr r1, =0x3500
# mov r2, #0x100
# bl asm_memcpy
# Begin executing out of psram
# Jump to main, which ought to be in psram now
jump_to_main:
ldr r0, =reset_handler
mov pc, r0
asm_memcpy:
mov r3, r1
add r3, r3, r2
asm_memcpy_loop:
cmp r1, r3
ldrcc r2, [r1], #4
strcc r2, [r0], #4
bcc asm_memcpy_loop
bx lr
uart_putc:
ldr r2, =0xa0080014 // uart offset
uart_putc_ready_wait:
ldr r1, [r2]
tst r1, #0x20
beq uart_putc_ready_wait
sub r2, r2, #0x14
str r0, [r2]
bx lr
.global rv_start
rv_start:
ldr pc, .Lreset_handler
ldr pc, .Lundef_handler
ldr pc, .Lswi_handler
ldr pc, .Lprefetch_abort_handler
ldr pc, .Ldata_abort_handler
ldr pc, .Lreserved_handler
ldr pc, .Lirq_handler
ldr pc, .Lfiq_handler
.Lreset_handler:
.long reset_handler
.Lundef_handler:
.long undef_handler
.Lswi_handler:
.long swi_handler
.Lprefetch_abort_handler:
.long prefetch_abort_handler
.Ldata_abort_handler:
.long data_abort_handler
.Lreserved_handler:
.long reserved_handler
.Lirq_handler:
.long irq_handler
.Lfiq_handler:
.long fiq_handler
.global rv_end
rv_end:
.text
.global ram_memcpy
ram_memcpy:
ldr r0, =ram_memcpy_addr
ldr r0, [r0]
mov pc, r0
ram_memcpy_addr:
.long 0x70007388
.global ram_bzero
ram_bzero:
ldr r0, =ram_bzero_addr
ldr r0, [r0]
mov pc, r0
ram_bzero_addr:
.long 0x700073bc