mzm/asm/intr_main.s

86 lines
2.3 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
2022-01-21 18:26:25 +00:00
arm_func_start intr_main
2022-01-23 16:48:38 +00:00
intr_main: @ 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
stmfd sp!, {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:
.byte 0x00, 0x40, 0xBD, 0xE8
.byte 0x00, 0x30, 0x0F, 0xE1, 0xDF, 0x30, 0xC3, 0xE3, 0x92, 0x30, 0x83, 0xE3, 0x03, 0xF0, 0x29, 0xE1
.byte 0x0F, 0x40, 0xBD, 0xE8, 0xB0, 0x20, 0xC3, 0xE1, 0xB8, 0x10, 0xC3, 0xE1, 0x00, 0xF0, 0x69, 0xE1
.byte 0x1E, 0xFF, 0x2F, 0xE1
2022-01-23 22:02:53 +00:00
@ pool
2022-01-21 18:26:25 +00:00
lbl_08000234: .4byte 0x000024C0
lbl_08000238: .4byte 0x0808CA9C