Disassemble intr_main

This commit is contained in:
buffet 2022-01-21 18:26:25 +00:00
parent bb004a8600
commit 7be6309cde
7 changed files with 115 additions and 6 deletions

View File

@ -33,7 +33,8 @@ ASFLAGS = -mcpu=arm7tdmi
ASM = \
asm/romheader.s \
asm/crt0.s \
asm/blob_0x00000104-0x00800000.s
asm/intr_main.s \
asm/blob_0x0000023c-0x00800000.s
OBJ = $(ASM:.s=.o) $(BLOBS)

View File

@ -1,2 +0,0 @@
.include "asm/macros.s"
baserom_blob 0x00000104, 0x00800000

View File

@ -0,0 +1,2 @@
.include "asm/macros.s"
baserom_blob 0x0000023c, 0x00800000

View File

@ -6,3 +6,27 @@
.set PSR_UND_MODE, 0x0000001b
.set PSR_SYS_MODE, 0x0000001f
.set PSR_MODE_MASK, 0x0000001f
.set PSR_T_BIT, 0x00000020
.set PSR_F_BIT, 0x00000040
.set PSR_I_BIT, 0x00000080
.set REG_BASE, 0x04000000
.set REG_SOUNDCNT_X_OFFSET, 0x00000084
.set REG_IE_OFFSET, 0x00000200
.set REG_IF_OFFSET, 0x00000202
.set REG_IME_OFFSET, 0x00000208
.set INTR_FLAG_VBLANK, 1 << 0
.set INTR_FLAG_HBLANK, 1 << 1
.set INTR_FLAG_VCOUNT, 1 << 2
.set INTR_FLAG_TIMER0, 1 << 3
.set INTR_FLAG_TIMER1, 1 << 4
.set INTR_FLAG_TIMER2, 1 << 5
.set INTR_FLAG_TIMER3, 1 << 6
.set INTR_FLAG_SERIAL, 1 << 7
.set INTR_FLAG_DMA0, 1 << 8
.set INTR_FLAG_DMA1, 1 << 9
.set INTR_FLAG_DMA2, 1 << 10
.set INTR_FLAG_DMA3, 1 << 11
.set INTR_FLAG_KEYPAD, 1 << 12
.set INTR_FLAG_GAMEPAK, 1 << 13

View File

@ -12,7 +12,7 @@ _start:
ldr r1, intr_vector_ptr
add r0, pc, #0x20 @ intr_main
str r0, [r1]
ldr r1, main_loop_ptr
ldr r1, main_ptr
mov lr, pc
bx r1
b _start
@ -21,4 +21,4 @@ _start:
sp_sys_ptr: .4byte sp_sys
sp_irq_ptr: .4byte sp_irq
intr_vector_ptr: .4byte intr_vector
main_loop_ptr: .4byte 0x0800023d
main_ptr: .4byte 0x0800023d @ TODO: main

83
asm/intr_main.s Normal file
View File

@ -0,0 +1,83 @@
.include "asm/constants.s"
.include "asm/macros.s"
arm_func_start intr_main
intr_main:
mov r3, #REG_BASE
add r3, r3, #REG_IE_OFFSET
ldr r2, [r3]
ldrh r1, [r3, #(REG_IME_OFFSET - REG_IE_OFFSET)] @ Interrupt Master Enable
mrs r0, spsr
stmfd sp!, {r0-r3, lr}
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
strneb r0, [r3, #(REG_SOUNDCNT_X_OFFSET - REG_IE_OFFSET)]
lbl_08000134:
bne lbl_08000134
mov ip, #0
ands r0, r1, #INTR_FLAG_DMA2
bne interrupt_found
add ip, ip, #4
ands r0, r1, #INTR_FLAG_SERIAL
bne interrupt_found
add ip, ip, #4
ands r0, r1, #INTR_FLAG_TIMER3
bne interrupt_found
add ip, ip, #4
ands r0, r1, #INTR_FLAG_VBLANK
bne interrupt_found
add ip, ip, #4
ands r0, r1, #INTR_FLAG_HBLANK
bne interrupt_found
add ip, ip, #4
ands r0, r1, #INTR_FLAG_VCOUNT
bne interrupt_found
add ip, ip, #4
ands r0, r1, #INTR_FLAG_TIMER0
bne interrupt_found
add ip, ip, #4
ands r0, r1, #INTR_FLAG_TIMER1
bne interrupt_found
add ip, ip, #4
ands r0, r1, #INTR_FLAG_TIMER2
bne interrupt_found
add ip, ip, #4
ands r0, r1, #INTR_FLAG_DMA0
bne interrupt_found
add ip, ip, #4
ands r0, r1, #INTR_FLAG_DMA1
bne interrupt_found
add ip, ip, #4
ands r0, r1, #INTR_FLAG_DMA3
bne interrupt_found
add ip, ip, #4
ands r0, r1, #INTR_FLAG_KEYPAD
interrupt_found:
strh r0, [r3, #(REG_IF_OFFSET - REG_IE_OFFSET)]
ldr r1, lbl_08000234
bic r2, r2, r0
and r1, r1, r2
strh r1, [r3]
mrs r3, apsr
bic r3, r3, #(PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK)
orr r3, r3, #PSR_SYS_MODE
msr cpsr_fc, r3
ldr r1, lbl_08000238
add r1, r1, ip
ldr r0, [r1]
stmdb sp!, {lr}
add lr, pc, #0x0 @ lbl_0800020C
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
@pool
lbl_08000234: .4byte 0x000024C0
lbl_08000238: .4byte 0x0808CA9C

View File

@ -16,7 +16,8 @@ SECTIONS {
rom : ALIGN(2) {
asm/romheader.o(.text);
asm/crt0.o(.text);
asm/blob_0x00000104-0x00800000.o(.text);
asm/intr_main.o(.text);
asm/blob_0x0000023c-0x00800000.o(.text);
} >rom
/DISCARD/ : {