mirror of
https://github.com/pret/pokeplatinum.git
synced 2026-04-26 08:41:27 -05:00
365 lines
7.0 KiB
ArmAsm
365 lines
7.0 KiB
ArmAsm
.include "macros/function.inc"
|
|
.include "include/itcm.inc"
|
|
|
|
.extern OSi_ThreadInfo
|
|
.extern Unk_021CCFE4
|
|
.extern OS_IRQTable
|
|
.extern OSi_IrqThreadQueue
|
|
|
|
.section .itcm,4,1,4
|
|
|
|
arm_func_start OS_IrqHandler
|
|
OS_IrqHandler: ; 0x01FF8000
|
|
stmdb sp!, {lr}
|
|
mov ip, #0x4000000
|
|
add ip, ip, #0x210
|
|
ldr r1, [ip, #-8]
|
|
cmp r1, #0
|
|
beq _01FF801C
|
|
b _01FF8020
|
|
_01FF801C:
|
|
ldmia sp!, {pc}
|
|
_01FF8020:
|
|
ldmia ip, {r1, r2}
|
|
ands r1, r1, r2
|
|
beq _01FF8030
|
|
b _01FF8034
|
|
_01FF8030:
|
|
ldmia sp!, {pc}
|
|
_01FF8034:
|
|
mov r3, #-0x80000000
|
|
_01FF8038:
|
|
clz r0, r1
|
|
bics r1, r1, r3, lsr r0
|
|
bne _01FF8038
|
|
mov r1, r3, lsr r0
|
|
str r1, [ip, #4]
|
|
rsbs r0, r0, #0x1f
|
|
ldr r1, _01FF8060 ; =0x027E0000
|
|
ldr r0, [r1, r0, lsl #2]
|
|
ldr lr, _01FF8064 ; =OS_IrqHandler_ThreadSwitch
|
|
bx r0
|
|
; .align 2, 0
|
|
_01FF8060: .word OS_IRQTable
|
|
_01FF8064: .word OS_IrqHandler_ThreadSwitch
|
|
arm_func_end OS_IrqHandler
|
|
|
|
arm_func_start OS_IrqHandler_ThreadSwitch
|
|
OS_IrqHandler_ThreadSwitch: ; 0x01FF8068
|
|
ldr ip, _01FF81D4 ; =0x027E0060
|
|
mov r3, #0
|
|
ldr ip, [ip]
|
|
mov r2, #1
|
|
cmp ip, #0
|
|
beq _01FF80B8
|
|
_01FF8080:
|
|
str r2, [ip, #0x64]
|
|
str r3, [ip, #0x78]
|
|
str r3, [ip, #0x7c]
|
|
ldr r0, [ip, #0x80]
|
|
str r3, [ip, #0x80]
|
|
mov ip, r0
|
|
cmp ip, #0
|
|
bne _01FF8080
|
|
ldr ip, _01FF81D4 ; =0x027E0060
|
|
str r3, [ip]
|
|
str r3, [ip, #4]
|
|
ldr ip, _01FF81D8 ; =0x021CCC80
|
|
mov r1, #1
|
|
strh r1, [ip]
|
|
_01FF80B8:
|
|
ldr ip, _01FF81D8 ; =0x021CCC80
|
|
ldrh r1, [ip]
|
|
cmp r1, #0
|
|
beq _01FF80CC
|
|
b _01FF80D0
|
|
_01FF80CC:
|
|
ldr pc, [sp], #4
|
|
_01FF80D0:
|
|
mov r1, #0
|
|
strh r1, [ip]
|
|
mov r3, #0xd2
|
|
msr cpsr_c, r3
|
|
add r2, ip, #8
|
|
ldr r1, [r2, #0]
|
|
_01FF80E8:
|
|
cmp r1, #0
|
|
bne _01FF80F4
|
|
b _01FF80F8
|
|
_01FF80F4:
|
|
ldrh r0, [r1, #0x64]
|
|
_01FF80F8:
|
|
bne _01FF8100
|
|
b _01FF8104
|
|
_01FF8100:
|
|
cmp r0, #1
|
|
_01FF8104:
|
|
bne _01FF810C
|
|
b _01FF8110
|
|
_01FF810C:
|
|
ldr r1, [r1, #0x68]
|
|
_01FF8110:
|
|
bne _01FF80E8
|
|
cmp r1, #0
|
|
bne _01FF8128
|
|
_01FF811C:
|
|
mov r3, #0x92
|
|
msr cpsr_c, r3
|
|
ldr pc, [sp], #4
|
|
_01FF8128:
|
|
ldr r0, [ip, #4]
|
|
cmp r1, r0
|
|
beq _01FF811C
|
|
ldr r3, [ip, #0xc]
|
|
cmp r3, #0
|
|
beq _01FF8150
|
|
stmfd sp!, {r0, r1, ip}
|
|
mov lr, pc
|
|
bx r3
|
|
_01FF814C:
|
|
.byte 0x03, 0x10, 0xBD, 0xE8
|
|
_01FF8150:
|
|
str r1, [ip, #4]
|
|
mrs r2, spsr
|
|
str r2, [r0, #0]!
|
|
stmfd sp!, {r0, r1}
|
|
add r0, r0, #0
|
|
add r0, r0, #0x48
|
|
ldr r1, _01FF81DC ; =0x020C99FC
|
|
blx r1
|
|
ldmia sp!, {r0, r1}
|
|
ldmib sp!, {r2, r3}
|
|
stmib r0!, {r2, r3}
|
|
ldmib sp!, {r2, r3, ip, lr}
|
|
stmib r0!, {r2, r3, r4, r5, r6, r7, r8, sb, sl, fp, ip, sp, lr} ^
|
|
stmib r0!, {lr}
|
|
mov r3, #0xd3
|
|
msr cpsr_c, r3
|
|
stmib r0!, {sp}
|
|
stmdb sp!, {r1}
|
|
add r0, r1, #0
|
|
add r0, r0, #0x48
|
|
ldr r1, _01FF81E0 ; =0x020C9A3C
|
|
blx r1
|
|
ldmia sp!, {r1}
|
|
ldr sp, [r1, #0x44]
|
|
mov r3, #0xd2
|
|
msr cpsr_c, r3
|
|
ldr r2, [r1, #0]!
|
|
msr spsr_fc, r2
|
|
ldr lr, [r1, #0x40]
|
|
ldmib r1, {r0, r1, r2, r3, r4, r5, r6, r7, r8, sb, sl, fp, ip, sp, lr} ^
|
|
mov r0, r0
|
|
stmda sp!, {r0, r1, r2, r3, ip, lr}
|
|
ldmia sp!, {pc}
|
|
; .align 2, 0
|
|
_01FF81D4: .word OSi_IrqThreadQueue
|
|
_01FF81D8: .word OSi_ThreadInfo
|
|
_01FF81DC: .word 0x020C99FC
|
|
_01FF81E0: .word 0x020C9A3C
|
|
arm_func_end OS_IrqHandler_ThreadSwitch
|
|
|
|
arm_func_start OSi_DoResetSystem
|
|
OSi_DoResetSystem: ; 0x01FF81E4
|
|
stmfd sp!, {r3, lr}
|
|
ldr r0, _01FF8210 ; =0x021CCFE4
|
|
_01FF81EC:
|
|
ldrh r1, [r0]
|
|
cmp r1, #0
|
|
beq _01FF81EC
|
|
ldr r0, _01FF8214 ; =0x04000208
|
|
mov r1, #0
|
|
strh r1, [r0]
|
|
bl OSi_ReloadRomData
|
|
bl OSi_DoBoot
|
|
ldmia sp!, {r3, pc}
|
|
; .align 2, 0
|
|
_01FF8210: .word Unk_021CCFE4
|
|
_01FF8214: .word 0x04000208
|
|
arm_func_end OSi_DoResetSystem
|
|
|
|
arm_func_start OSi_DoBoot
|
|
OSi_DoBoot: ; 0x01FF8218
|
|
mov ip, #0x4000000
|
|
str ip, [ip, #0x208]
|
|
ldr r1, _01FF82C4 ; =0x027E0000
|
|
add r1, r1, #0x3fc0
|
|
add r1, r1, #0x3c
|
|
mov r0, #0
|
|
str r0, [r1, #0]
|
|
ldr r1, _01FF82C8 ; =0x04000180
|
|
_01FF8238:
|
|
ldrh r0, [r1]
|
|
and r0, r0, #0xf
|
|
cmp r0, #1
|
|
bne _01FF8238
|
|
mov r0, #0x100
|
|
strh r0, [r1]
|
|
mov r0, #0
|
|
ldr r3, _01FF82CC ; =0x027FFD9C
|
|
ldr r4, [r3, #0]
|
|
ldr r1, _01FF82D0 ; =0x027FFD80
|
|
mov r2, #0x80
|
|
bl OSi_CpuClear32
|
|
str r4, [r3, #0]
|
|
ldr r1, _01FF82D4 ; =0x027FFF80
|
|
mov r2, #0x18
|
|
bl OSi_CpuClear32
|
|
ldr r1, _01FF82D8 ; =0x027FFF98
|
|
strh r0, [r1]
|
|
ldr r1, _01FF82DC ; =0x027FFF9C
|
|
mov r2, #0x64
|
|
bl OSi_CpuClear32
|
|
ldr r1, _01FF82C8 ; =0x04000180
|
|
_01FF8290:
|
|
ldrh r0, [r1]
|
|
and r0, r0, #0xf
|
|
cmp r0, #1
|
|
beq _01FF8290
|
|
mov r0, #0
|
|
strh r0, [r1]
|
|
ldr r3, _01FF82E0 ; =0x027FFE00
|
|
ldr ip, [r3, #0x24]
|
|
mov lr, ip
|
|
ldr fp, _01FF82D4 ; =0x027FFF80
|
|
ldmia fp, {r0, r1, r2, r3, r4, r5, r6, r7, r8, sb, sl}
|
|
mov fp, #0
|
|
bx ip
|
|
; .align 2, 0
|
|
_01FF82C4: .word OS_IRQTable
|
|
_01FF82C8: .word 0x04000180
|
|
_01FF82CC: .word 0x027FFD9C
|
|
_01FF82D0: .word 0x027FFD80
|
|
_01FF82D4: .word 0x027FFF80
|
|
_01FF82D8: .word 0x027FFF98
|
|
_01FF82DC: .word 0x027FFF9C
|
|
_01FF82E0: .word 0x027FFE00
|
|
arm_func_end OSi_DoBoot
|
|
|
|
arm_func_start OSi_CpuClear32
|
|
OSi_CpuClear32: ; 0x01FF82E4
|
|
add ip, r1, r2
|
|
_01FF82E8:
|
|
cmp r1, ip
|
|
blt _01FF82F4
|
|
b _01FF82F8
|
|
_01FF82F4:
|
|
stmia r1!, {r0}
|
|
_01FF82F8:
|
|
blt _01FF82E8
|
|
bx lr
|
|
arm_func_end OSi_CpuClear32
|
|
|
|
arm_func_start OSi_ReloadRomData
|
|
OSi_ReloadRomData: ; 0x01FF8300
|
|
stmfd sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr}
|
|
ldr r1, _01FF83A0 ; =0x027FFC2C
|
|
ldr r4, [r1, #0]
|
|
cmp r4, #0x8000
|
|
blo _01FF8324
|
|
mov r0, r4
|
|
add r1, r1, #0x1d4
|
|
mov r2, #0x160
|
|
bl OSi_ReadCardRom32
|
|
_01FF8324:
|
|
ldr r0, _01FF83A4 ; =0x027FFE20
|
|
ldr r5, [r0, #0]
|
|
ldr r6, [r0, #8]
|
|
ldr r7, [r0, #0xc]
|
|
ldr r8, [r0, #0x10]
|
|
ldr sb, [r0, #0x18]
|
|
ldr sl, [r0, #0x1c]
|
|
bl OS_DisableInterrupts
|
|
mov fp, r0
|
|
bl DC_StoreAll
|
|
bl DC_InvalidateAll
|
|
mov r0, fp
|
|
bl OS_RestoreInterrupts
|
|
bl IC_InvalidateAll
|
|
bl DC_WaitWriteBufferEmpty
|
|
add r5, r5, r4
|
|
cmp r5, #0x8000
|
|
bhs _01FF837C
|
|
rsb r0, r5, #0x8000
|
|
add r6, r6, r0
|
|
sub r7, r7, r0
|
|
mov r5, #0x8000
|
|
_01FF837C:
|
|
mov r0, r5
|
|
mov r1, r6
|
|
mov r2, r7
|
|
bl OSi_ReadCardRom32
|
|
mov r1, sb
|
|
mov r2, sl
|
|
add r0, r8, r4
|
|
bl OSi_ReadCardRom32
|
|
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
|
|
; .align 2, 0
|
|
_01FF83A0: .word 0x027FFC2C
|
|
_01FF83A4: .word 0x027FFE20
|
|
arm_func_end OSi_ReloadRomData
|
|
|
|
arm_func_start OSi_ReadCardRom32
|
|
OSi_ReadCardRom32: ; 0x01FF83A8
|
|
stmfd sp!, {r3, r4, r5, r6, r7, r8, sb, lr}
|
|
ldr r4, _01FF846C ; =0x027FFE60
|
|
ldr r3, _01FF8470 ; =0x000001FF
|
|
ldr r5, [r4, #0]
|
|
and r4, r0, r3
|
|
bic r3, r5, #0x7000000
|
|
ldr r5, _01FF8474 ; =0x040001A4
|
|
orr r3, r3, #0xa1000000
|
|
rsb ip, r4, #0
|
|
_01FF83CC:
|
|
ldr r4, [r5, #0]
|
|
tst r4, #-0x80000000
|
|
bne _01FF83CC
|
|
ldr r7, _01FF8478 ; =0x040001A1
|
|
mov r4, #0x80
|
|
strb r4, [r7]
|
|
cmp ip, r2
|
|
add r0, r0, ip
|
|
ldmgeia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
|
|
ldr r4, _01FF847C ; =0x04100010
|
|
mov sb, r0, lsr #8
|
|
mov r6, #0xb7
|
|
mov r5, #0
|
|
_01FF8400:
|
|
strb r6, [r7, #7]
|
|
mov lr, r0, lsr #0x18
|
|
strb lr, [r7, #8]
|
|
mov lr, r0, lsr #0x10
|
|
strb lr, [r7, #9]
|
|
strb sb, [r7, #0xa]
|
|
strb r0, [r7, #0xb]
|
|
strb r5, [r7, #0xc]
|
|
strb r5, [r7, #0xd]
|
|
strb r5, [r7, #0xe]
|
|
str r3, [r7, #3]
|
|
_01FF842C:
|
|
ldr r8, [r7, #3]
|
|
tst r8, #0x800000
|
|
beq _01FF8450
|
|
cmp ip, #0
|
|
ldr lr, [r4]
|
|
blt _01FF844C
|
|
cmp ip, r2
|
|
strlt lr, [r1, ip]
|
|
_01FF844C:
|
|
add ip, ip, #4
|
|
_01FF8450:
|
|
tst r8, #-0x80000000
|
|
bne _01FF842C
|
|
cmp ip, r2
|
|
add sb, sb, #2
|
|
add r0, r0, #0x200
|
|
blt _01FF8400
|
|
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
|
|
; .align 2, 0
|
|
_01FF846C: .word 0x027FFE60
|
|
_01FF8470: .word 0x000001FF
|
|
_01FF8474: .word 0x040001A4
|
|
_01FF8478: .word 0x040001A1
|
|
_01FF847C: .word 0x04100010
|
|
arm_func_end OSi_ReadCardRom32
|