tinygo/targets/gameboy-advance.s
Ayke van Laethem 8687f3f8f4 targets/gba: implement interrupt handler
Thanks to Kyle Lemons for the inspiration and original design. The
implementation in this commit is very different however, building on top
of the software vectoring needed in RISC-V. The result is a flexible
interrupt handler that does not take up any RAM for configuration.
2020-01-27 21:56:17 +01:00

45 строки
1,6 КиБ
ArmAsm

.section .init
.global _start
.align
.arm
_start:
b start_vector
.fill 156,1,0 // Nintendo Logo Character Data (8000004h)
.fill 16,1,0 // Game Title
.byte 0x30,0x31 // Maker Code (80000B0h)
.byte 0x96 // Fixed Value (80000B2h)
.byte 0x00 // Main Unit Code (80000B3h)
.byte 0x00 // Device Type (80000B4h)
.fill 7,1,0 // unused
.byte 0x00 // Software Version No (80000BCh)
.byte 0xf0 // Complement Check (80000BDh)
.byte 0x00,0x00 // Checksum (80000BEh)
start_vector:
// Configure stacks
mov r0, #0x12 // Switch to IRQ Mode
msr cpsr, r0
ldr sp, =_stack_top_irq // Set IRQ stack
mov r0, #0x1f // Switch to System Mode
msr cpsr, r0
ldr sp, =_stack_top // Set user stack
// Configure interrupt handler
mov r0, #0x4000000 // REG_BASE
ldr r1, =handleInterruptARM
str r1, [r0, #-4] // actually storing to 0x03007FFC due to mirroring
// Enable interrupts
mov r1, #1
str r1, [r0, #0x208] // 0x04000208 Interrupt Master Enable
// Jump to user code (switching to Thumb mode)
ldr r3, =main
bx r3
// Small interrupt handler that immediately jumps to a function defined in the
// program (in Thumb) for further processing.
handleInterruptARM:
ldr r0, =handleInterrupt
bx r0