mzm/asm/intr_main.s

91 lines
2.2 KiB
ArmAsm
Raw Normal View History

.include "asm/constants.inc"
.include "asm/macros.inc"
2022-01-21 18:26:25 +00:00
2022-01-30 19:25:59 +00:00
.syntax unified
2023-07-11 14:27:10 +00:00
arm_func_start IntrMain
IntrMain: @ 0x08000104
2022-01-30 19:25:59 +00:00
mov r3, REG_BASE
add r3, r3, REG_IE_OFFSET
2022-01-21 18:26:25 +00:00
ldr r2, [r3]
2022-01-30 19:25:59 +00:00
ldrh r1, [r3, (REG_IME_OFFSET - REG_IE_OFFSET)] @ Interrupt Master Enable
2022-01-21 18:26:25 +00:00
mrs r0, spsr
2022-03-05 13:55:42 +00:00
push {r0-r3, lr}
2022-01-30 19:25:59 +00:00
mov r0, 1
strh r0, [r3, (REG_IME_OFFSET - REG_IE_OFFSET)] @ Interrupt Master Enable
and r1, r2, r2, lsr 16
mov ip, 0
ands r0, r1, INTR_FLAG_GAMEPAK
strbne r0, [r3, (REG_SOUNDCNT_X_OFFSET - REG_IE_OFFSET)]
2022-01-21 18:26:25 +00:00
lbl_08000134:
bne lbl_08000134
2022-01-30 19:25:59 +00:00
mov ip, 0
ands r0, r1, INTR_FLAG_DMA2
2022-01-21 18:26:25 +00:00
bne interrupt_found
2022-01-30 19:25:59 +00:00
add ip, ip, 4
ands r0, r1, INTR_FLAG_SERIAL
2022-01-21 18:26:25 +00:00
bne interrupt_found
2022-01-30 19:25:59 +00:00
add ip, ip, 4
ands r0, r1, INTR_FLAG_TIMER3
2022-01-21 18:26:25 +00:00
bne interrupt_found
2022-01-30 19:25:59 +00:00
add ip, ip, 4
ands r0, r1, INTR_FLAG_VBLANK
2022-01-21 18:26:25 +00:00
bne interrupt_found
2022-01-30 19:25:59 +00:00
add ip, ip, 4
ands r0, r1, INTR_FLAG_HBLANK
2022-01-21 18:26:25 +00:00
bne interrupt_found
2022-01-30 19:25:59 +00:00
add ip, ip, 4
ands r0, r1, INTR_FLAG_VCOUNT
2022-01-21 18:26:25 +00:00
bne interrupt_found
2022-01-30 19:25:59 +00:00
add ip, ip, 4
ands r0, r1, INTR_FLAG_TIMER0
2022-01-21 18:26:25 +00:00
bne interrupt_found
2022-01-30 19:25:59 +00:00
add ip, ip, 4
ands r0, r1, INTR_FLAG_TIMER1
2022-01-21 18:26:25 +00:00
bne interrupt_found
2022-01-30 19:25:59 +00:00
add ip, ip, 4
ands r0, r1, INTR_FLAG_TIMER2
2022-01-21 18:26:25 +00:00
bne interrupt_found
2022-01-30 19:25:59 +00:00
add ip, ip, 4
ands r0, r1, INTR_FLAG_DMA0
2022-01-21 18:26:25 +00:00
bne interrupt_found
2022-01-30 19:25:59 +00:00
add ip, ip, 4
ands r0, r1, INTR_FLAG_DMA1
2022-01-21 18:26:25 +00:00
bne interrupt_found
2022-01-30 19:25:59 +00:00
add ip, ip, 4
ands r0, r1, INTR_FLAG_DMA3
2022-01-21 18:26:25 +00:00
bne interrupt_found
2022-01-30 19:25:59 +00:00
add ip, ip, 4
ands r0, r1, INTR_FLAG_KEYPAD
2022-01-21 18:26:25 +00:00
interrupt_found:
2022-01-30 19:25:59 +00:00
strh r0, [r3, (REG_IF_OFFSET - REG_IE_OFFSET)]
2022-01-21 18:26:25 +00:00
ldr r1, lbl_08000234
bic r2, r2, r0
and r1, r1, r2
strh r1, [r3]
mrs r3, apsr
2022-01-30 19:25:59 +00:00
bic r3, r3, (PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK)
orr r3, r3, PSR_SYS_MODE
2022-01-21 18:26:25 +00:00
msr cpsr_fc, r3
ldr r1, lbl_08000238
add r1, r1, ip
ldr r0, [r1]
stmdb sp!, {lr}
2022-01-30 19:25:59 +00:00
add lr, pc, 0x0 @ lbl_0800020C
2022-01-21 18:26:25 +00:00
bx r0
lbl_0800020C:
2022-03-05 13:55:42 +00:00
ldmfd sp!, {lr}
mrs r3, cpsr_fc
bic r3, r3, (PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK)
orr r3, r3, (PSR_I_BIT | PSR_IRQ_MODE)
msr cpsr_fc, r3
pop {r0-r3, lr}
strh r2, [r3]
strh r1, [r3, (REG_IME_OFFSET - REG_IE_OFFSET)]
msr spsr_fc, r0
bx lr
2022-01-21 18:26:25 +00:00
2022-01-23 22:02:53 +00:00
@ pool
2022-01-21 18:26:25 +00:00
lbl_08000234: .4byte 0x000024C0
2022-09-08 20:35:29 +00:00
lbl_08000238: .4byte sIntrTable