agb/agb/interrupt_simple.s

37 lines
1 KiB
ArmAsm
Raw Normal View History

2021-03-07 04:58:59 +11:00
@ An interrupt handler that simply acknowledges all interrupts
.arm
.global InterruptHandlerSimple
.align
InterruptHandlerSimple:
2021-06-24 21:30:40 +10:00
ldr r2, =0x04000200 @ interrupt enable register location
2021-06-24 21:30:40 +10:00
ldrh r1, [r2] @ load 16 bit interrupt enable to r1
ldrh r3, [r2, #2] @ load 16 bit interrupt request to r3
2021-04-04 03:37:09 +10:00
and r0, r1, r3 @ interrupts both enabled and requested
2021-06-24 21:30:40 +10:00
strh r0, [r2, #2] @ store to interrupt request
2021-03-07 04:58:59 +11:00
2021-04-04 03:37:09 +10:00
ldr r2, =0x03007FF8 @ load bios interrupt request location
ldrh r1, [r2] @ load bios interrupt requests
orr r1, r1, r0 @ or with enabled and requested interrupts
strh r1, [r2] @ acknowlege bios requests
@ change to system mode
mrs r2, cpsr
orr r2, r2, #0xD
msr cpsr_c, r2
@ call the rust interrupt handler with r0 set to the triggered interrupts
ldr r1, =__RUST_INTERRUPT_HANDLER
2021-06-25 05:05:23 +10:00
push {lr, r4-r11}
2021-06-24 08:33:32 +10:00
mov lr, pc
bx r1
2021-06-25 05:05:23 +10:00
pop {lr, r4-r11}
@ change back to interrupt mode
mrs r2, cpsr
bic r2, r2, #0xD
msr cpsr_c, r2
2021-04-04 03:37:09 +10:00
bx lr @ return to bios
2021-04-13 10:33:05 +10:00
.pool