Files
dspico-wrfuxxed/source/start.s
2025-11-25 19:47:25 +01:00

100 lines
1.7 KiB
ArmAsm

.section ".uart", "ax"
.arm
.global _uart_header
.type _uart_header, %function
_uart_header:
// header area of payload
// command
.word 0
.word 0
// length of command payload in ASCII (9e)
.word 0x6539
// dataBuf, just fill with zeros
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
// r3 = UART_Read ptr
.word 0x0200DA4C
// r4 = payload length (UART_Read r1)
// provided in linkerscript
.word __data_size
// r5-r7
.word 0
.word 0
.word 0
// r8 - destination address (UART_Read r0)
.word _start
// r9
.word 0
// pc -> gadget
.word 0x0201DE98
// stack for "pop {r4-r8,pc}" at 0x0201DEB4
.word 0
.word 0
.word 0
.word 0
.word 0
// stack pc -> entrypoint, usually equal to dest addr (at 0x84)
.word _start
.section ".crt0", "ax"
.arm
.global _start
.type _start, %function
_start:
// disable irqs
mov r0, #0x04000000
str r0, [r0, #0x208]
// configure cp15
// disable itcm, dtcm, caches and mpu
ldr r0,= 0x00002078
mcr p15, 0, r0, c1, c0
mov r0, #0
// invalidate entire icache
mcr p15, 0, r0, c7, c5, 0
// invalidate entire dcache
mcr p15, 0, r0, c7, c6, 0
// drain write buffer
mcr p15, 0, r0, c7, c10, 4
// clear bss
ldr r0,= __bss_start
ldr r1,= __bss_end
cmp r0, r1
beq bss_done
mov r2, #0
1:
str r2, [r0], #4
cmp r0, r1
bne 1b
bss_done:
b main
.pool
.end