Merge branch 'master' into pikalax_work

This commit is contained in:
Cleverking2003
2020-06-03 16:07:39 +03:00
committed by GitHub
8 changed files with 410 additions and 416 deletions

View File

@@ -28,6 +28,7 @@ Autoload WRAM
Object OS_alloc.o
Object OS_timer.o
Object OS_tick.o
Object OS_alarm.o
Object dtcm.o
Object libsyscall.o
Object dtcm2.o

359
arm7/asm/OS_alarm.s Normal file
View File

@@ -0,0 +1,359 @@
.include "asm/macros.inc"
.include "global.inc"
.text
arm_func_start OSi_AlarmHandler
OSi_AlarmHandler: ; 0x037FA540
stmdb sp!, {r0, lr}
bl OSi_ArrangeTimer
ldmia sp!, {r0, lr}
bx lr
arm_func_start OSi_ArrangeTimer
OSi_ArrangeTimer: ; 0x037FA550
stmdb sp!, {r4, r5, lr}
sub sp, sp, #4
mov r1, #0
ldr r0, _037FA644 ; =0x04000106
strh r1, [r0]
mov r0, #16
bl OS_DisableIrqMask
ldr r1, _037FA648 ; =0x0380FFF8
ldr r0, [r1]
orr r0, r0, #16
str r0, [r1]
bl OS_GetTick
ldr r2, _037FA64C ; =_03807934
ldr r4, [r2]
cmp r4, #0
beq _037FA638
ldr ip, [r4, #12]
ldr r3, [r4, #16]
cmp r1, r3
cmpeq r0, ip
bcs _037FA5B0
mov r0, r4
bl OSi_SetTimer
b _037FA638
_037FA5B0:
ldr r1, [r4, #24]
str r1, [r2]
cmp r1, #0
moveq r0, #0
streq r0, [r2, #4]
movne r0, #0
strne r0, [r1, #20]
ldr r5, [r4]
ldr r2, [r4, #28]
ldr r1, [r4, #32]
mov r0, #0
cmp r1, r0
cmpeq r2, r0
streq r0, [r4]
cmp r5, #0
beq _037FA5FC
ldr r0, [r4, #4]
mov lr, pc
bx r5
_037FA5FC:
ldr r2, [r4, #28]
ldr r0, [r4, #32]
mov r1, #0
cmp r0, r1
cmpeq r2, r1
beq _037FA624
str r5, [r4]
mov r0, r4
mov r2, r1
bl OSi_InsertAlarm
_037FA624:
ldr r0, _037FA64C ; =_03807934
ldr r0, [r0]
cmp r0, #0
beq _037FA638
bl OSi_SetTimer
_037FA638:
add sp, sp, #4
ldmia sp!, {r4, r5, lr}
bx lr
_037FA644: .word 0x04000106
_037FA648: .word 0x0380FFF8
_037FA64C: .word _03807934
arm_func_start OS_CancelAlarm
OS_CancelAlarm: ; 0x037FA650
stmdb sp!, {r4, r5, lr}
sub sp, sp, #4
mov r5, r0
bl OS_DisableInterrupts
mov r4, r0
ldr r1, [r5]
cmp r1, #0
bne _037FA678
bl OS_RestoreInterrupts
b _037FA6D0
_037FA678:
ldr r0, [r5, #24]
cmp r0, #0
ldreq r2, [r5, #20]
ldreq r1, _037FA6DC ; =_03807934
streq r2, [r1, #4]
ldrne r1, [r5, #20]
strne r1, [r0, #20]
ldr r1, [r5, #20]
cmp r1, #0
strne r0, [r1, #24]
bne _037FA6B8
ldr r1, _037FA6DC ; =_03807934
str r0, [r1]
cmp r0, #0
beq _037FA6B8
bl OSi_SetTimer
_037FA6B8:
mov r0, #0
str r0, [r5]
str r0, [r5, #28]
str r0, [r5, #32]
mov r0, r4
bl OS_RestoreInterrupts
_037FA6D0:
add sp, sp, #4
ldmia sp!, {r4, r5, lr}
bx lr
_037FA6DC: .word _03807934
arm_func_start OS_SetPeriodicAlarm
OS_SetPeriodicAlarm: ; 0x037FA6E0
stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
sub sp, sp, #4
movs r4, r0
mov r9, r1
mov r8, r2
mov r7, r3
ldr r6, [sp, #32]
beq _037FA70C
ldr r0, [r4]
cmp r0, #0
beq _037FA710
_037FA70C:
bl FUN_037FB1F0
_037FA710:
bl OS_DisableInterrupts
mov r5, r0
str r7, [r4, #28]
str r6, [r4, #32]
str r9, [r4, #36] ; 0x24
str r8, [r4, #40] ; 0x28
ldr r0, [sp, #36] ; 0x24
str r0, [r4]
ldr r0, [sp, #40] ; 0x28
str r0, [r4, #4]
mov r0, r4
mov r1, #0
mov r2, r1
bl OSi_InsertAlarm
mov r0, r5
bl OS_RestoreInterrupts
add sp, sp, #4
ldmia sp!, {r4, r5, r6, r7, r8, r9, lr}
bx lr
arm_func_start OS_SetAlarm
OS_SetAlarm: ; 0x037FA75C
stmdb sp!, {r4, r5, r6, r7, r8, lr}
movs r7, r0
mov r6, r1
mov r5, r2
mov r8, r3
beq _037FA780
ldr r0, [r7]
cmp r0, #0
beq _037FA784
_037FA780:
bl FUN_037FB1F0
_037FA784:
bl OS_DisableInterrupts
mov r4, r0
mov r0, #0
str r0, [r7, #28]
str r0, [r7, #32]
str r8, [r7]
ldr r0, [sp, #24]
str r0, [r7, #4]
bl OS_GetTick
mov r2, r0
mov r0, r7
adds r3, r6, r2
adc r2, r5, r1
mov r1, r3
bl OSi_InsertAlarm
mov r0, r4
bl OS_RestoreInterrupts
ldmia sp!, {r4, r5, r6, r7, r8, lr}
bx lr
arm_func_start OSi_InsertAlarm
OSi_InsertAlarm: ; 0x037FA7D0
stmdb sp!, {r4, r5, r6, r7, r8, lr}
mov r8, r0
mov r7, r1
mov r6, r2
ldr r2, [r8, #28]
ldr r1, [r8, #32]
mov r0, #0
cmp r1, r0
cmpeq r2, r0
beq _037FA84C
bl OS_GetTick
ldr r7, [r8, #36] ; 0x24
ldr r6, [r8, #40] ; 0x28
cmp r6, r1
cmpeq r7, r0
bcs _037FA84C
ldr r5, [r8, #28]
ldr r4, [r8, #32]
subs r0, r0, r7
sbc r1, r1, r6
mov r2, r5
mov r3, r4
bl _ll_udiv
mov r2, #1
adds r2, r0, r2
adc r0, r1, #0
umull r3, r1, r5, r2
mla r1, r5, r0, r1
mla r1, r4, r2, r1
adds r7, r7, r3
adc r6, r6, r1
_037FA84C:
str r7, [r8, #12]
str r6, [r8, #16]
ldr r0, _037FA8FC ; =_03807934
ldr r4, [r0]
mov r1, #0
b _037FA8B8
_037FA864:
ldr r2, [r4, #12]
ldr r0, [r4, #16]
subs r3, r7, r2
sbc r2, r6, r0
subs r0, r3, r1
sbcs r0, r2, r1
bge _037FA8B4
ldr r0, [r4, #20]
str r0, [r8, #20]
str r8, [r4, #20]
str r4, [r8, #24]
ldr r0, [r8, #20]
cmp r0, #0
strne r8, [r0, #24]
bne _037FA8F4
ldr r0, _037FA8FC ; =_03807934
str r8, [r0]
mov r0, r8
bl OSi_SetTimer
b _037FA8F4
_037FA8B4:
ldr r4, [r4, #24]
_037FA8B8:
cmp r4, #0
bne _037FA864
mov r0, #0
str r0, [r8, #24]
ldr r0, _037FA8FC ; =_03807934
ldr r1, [r0, #4]
str r8, [r0, #4]
str r1, [r8, #20]
cmp r1, #0
strne r8, [r1, #24]
bne _037FA8F4
str r8, [r0, #4]
str r8, [r0]
mov r0, r8
bl OSi_SetTimer
_037FA8F4:
ldmia sp!, {r4, r5, r6, r7, r8, lr}
bx lr
_037FA8FC: .word _03807934
arm_func_start OS_CreateAlarm
OS_CreateAlarm: ; 0x037FA900
mov r1, #0
str r1, [r0]
str r1, [r0, #8]
bx lr
arm_func_start OS_IsAlarmAvailable
OS_IsAlarmAvailable: ; 0x037FA910
ldr r0, _037FA91C ; =_03807930
ldrh r0, [r0]
bx lr
_037FA91C: .word _03807930
arm_func_start OS_InitAlarm
OS_InitAlarm: ; 0x037FA920
stmfd sp!, {lr}
sub sp, sp, #4
ldr r1, _037FA968 ; =_03807930
ldrh r0, [r1]
cmp r0, #0
bne _037FA95C
mov r0, #1
strh r0, [r1]
bl OSi_SetTimerReserved
mov r1, #0
ldr r0, _037FA96C ; =_03807934
str r1, [r0]
str r1, [r0, #4]
mov r0, #16
bl OS_DisableIrqMask
_037FA95C:
add sp, sp, #4
ldmia sp!, {lr}
bx lr
_037FA968: .word _03807930
_037FA96C: .word _03807934
arm_func_start OSi_SetTimer
OSi_SetTimer: ; 0x037FA970
stmdb sp!, {r4, r5, lr}
sub sp, sp, #4
mov r4, r0
bl OS_GetTick
mov r2, #0
ldr r3, _037FA9FC ; =0x04000106
strh r2, [r3]
ldr ip, [r4, #12]
ldr r3, [r4, #16]
subs r5, ip, r0
sbc r4, r3, r1
mov r0, #1
ldr r1, _037FAA00 ; =OSi_AlarmHandler
bl OSi_EnterTimerCallback
mov r1, #0
subs r0, r5, r1
sbcs r0, r4, r1
ldrlt r1, _037FAA04 ; =0x0000FFFE
blt _037FA9D4
mov r0, #65536 ; 0x10000
subs r0, r5, r0
sbcs r0, r4, r1
mvnlt r0, r5
movlt r0, r0, lsl #16
movlt r1, r0, lsr #16
_037FA9D4:
ldr r0, _037FAA08 ; =0x04000104
strh r1, [r0]
mov r1, #193 ; 0xc1
ldr r0, _037FA9FC ; =0x04000106
strh r1, [r0]
mov r0, #16
bl OS_EnableIrqMask
add sp, sp, #4
ldmia sp!, {r4, r5, lr}
bx lr
_037FA9FC: .word 0x04000106
_037FAA00: .word OSi_AlarmHandler
_037FAA04: .word 0x0000FFFE
_037FAA08: .word 0x04000104

View File

@@ -2,361 +2,6 @@
.include "global.inc"
.section .text
arm_func_start FUN_037FA540
FUN_037FA540: ; 0x037FA540
stmdb sp!, {r0, lr}
bl FUN_037FA550
ldmia sp!, {r0, lr}
bx lr
arm_func_start FUN_037FA550
FUN_037FA550: ; 0x037FA550
stmdb sp!, {r4, r5, lr}
sub sp, sp, #4
mov r1, #0
ldr r0, _037FA644 ; =0x04000106
strh r1, [r0]
mov r0, #16
bl OS_DisableIrqMask
ldr r1, _037FA648 ; =0x0380FFF8
ldr r0, [r1]
orr r0, r0, #16
str r0, [r1]
bl OS_GetTick
ldr r2, _037FA64C ; =_03807934
ldr r4, [r2]
cmp r4, #0
beq _037FA638
ldr ip, [r4, #12]
ldr r3, [r4, #16]
cmp r1, r3
cmpeq r0, ip
bcs _037FA5B0
mov r0, r4
bl FUN_037FA970
b _037FA638
_037FA5B0:
ldr r1, [r4, #24]
str r1, [r2]
cmp r1, #0
moveq r0, #0
streq r0, [r2, #4]
movne r0, #0
strne r0, [r1, #20]
ldr r5, [r4]
ldr r2, [r4, #28]
ldr r1, [r4, #32]
mov r0, #0
cmp r1, r0
cmpeq r2, r0
streq r0, [r4]
cmp r5, #0
beq _037FA5FC
ldr r0, [r4, #4]
mov lr, pc
bx r5
_037FA5FC:
ldr r2, [r4, #28]
ldr r0, [r4, #32]
mov r1, #0
cmp r0, r1
cmpeq r2, r1
beq _037FA624
str r5, [r4]
mov r0, r4
mov r2, r1
bl FUN_037FA7D0
_037FA624:
ldr r0, _037FA64C ; =_03807934
ldr r0, [r0]
cmp r0, #0
beq _037FA638
bl FUN_037FA970
_037FA638:
add sp, sp, #4
ldmia sp!, {r4, r5, lr}
bx lr
_037FA644: .word 0x04000106
_037FA648: .word 0x0380FFF8
_037FA64C: .word _03807934
arm_func_start OS_CancelAlarm
OS_CancelAlarm: ; 0x037FA650
stmdb sp!, {r4, r5, lr}
sub sp, sp, #4
mov r5, r0
bl OS_DisableInterrupts
mov r4, r0
ldr r1, [r5]
cmp r1, #0
bne _037FA678
bl OS_RestoreInterrupts
b _037FA6D0
_037FA678:
ldr r0, [r5, #24]
cmp r0, #0
ldreq r2, [r5, #20]
ldreq r1, _037FA6DC ; =_03807934
streq r2, [r1, #4]
ldrne r1, [r5, #20]
strne r1, [r0, #20]
ldr r1, [r5, #20]
cmp r1, #0
strne r0, [r1, #24]
bne _037FA6B8
ldr r1, _037FA6DC ; =_03807934
str r0, [r1]
cmp r0, #0
beq _037FA6B8
bl FUN_037FA970
_037FA6B8:
mov r0, #0
str r0, [r5]
str r0, [r5, #28]
str r0, [r5, #32]
mov r0, r4
bl OS_RestoreInterrupts
_037FA6D0:
add sp, sp, #4
ldmia sp!, {r4, r5, lr}
bx lr
_037FA6DC: .word _03807934
arm_func_start OS_SetPeriodicAlarm
OS_SetPeriodicAlarm: ; 0x037FA6E0
stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
sub sp, sp, #4
movs r4, r0
mov r9, r1
mov r8, r2
mov r7, r3
ldr r6, [sp, #32]
beq _037FA70C
ldr r0, [r4]
cmp r0, #0
beq _037FA710
_037FA70C:
bl FUN_037FB1F0
_037FA710:
bl OS_DisableInterrupts
mov r5, r0
str r7, [r4, #28]
str r6, [r4, #32]
str r9, [r4, #36] ; 0x24
str r8, [r4, #40] ; 0x28
ldr r0, [sp, #36] ; 0x24
str r0, [r4]
ldr r0, [sp, #40] ; 0x28
str r0, [r4, #4]
mov r0, r4
mov r1, #0
mov r2, r1
bl FUN_037FA7D0
mov r0, r5
bl OS_RestoreInterrupts
add sp, sp, #4
ldmia sp!, {r4, r5, r6, r7, r8, r9, lr}
bx lr
arm_func_start OS_SetAlarm
OS_SetAlarm: ; 0x037FA75C
stmdb sp!, {r4, r5, r6, r7, r8, lr}
movs r7, r0
mov r6, r1
mov r5, r2
mov r8, r3
beq _037FA780
ldr r0, [r7]
cmp r0, #0
beq _037FA784
_037FA780:
bl FUN_037FB1F0
_037FA784:
bl OS_DisableInterrupts
mov r4, r0
mov r0, #0
str r0, [r7, #28]
str r0, [r7, #32]
str r8, [r7]
ldr r0, [sp, #24]
str r0, [r7, #4]
bl OS_GetTick
mov r2, r0
mov r0, r7
adds r3, r6, r2
adc r2, r5, r1
mov r1, r3
bl FUN_037FA7D0
mov r0, r4
bl OS_RestoreInterrupts
ldmia sp!, {r4, r5, r6, r7, r8, lr}
bx lr
arm_func_start FUN_037FA7D0
FUN_037FA7D0: ; 0x037FA7D0
stmdb sp!, {r4, r5, r6, r7, r8, lr}
mov r8, r0
mov r7, r1
mov r6, r2
ldr r2, [r8, #28]
ldr r1, [r8, #32]
mov r0, #0
cmp r1, r0
cmpeq r2, r0
beq _037FA84C
bl OS_GetTick
ldr r7, [r8, #36] ; 0x24
ldr r6, [r8, #40] ; 0x28
cmp r6, r1
cmpeq r7, r0
bcs _037FA84C
ldr r5, [r8, #28]
ldr r4, [r8, #32]
subs r0, r0, r7
sbc r1, r1, r6
mov r2, r5
mov r3, r4
bl _ll_udiv
mov r2, #1
adds r2, r0, r2
adc r0, r1, #0
umull r3, r1, r5, r2
mla r1, r5, r0, r1
mla r1, r4, r2, r1
adds r7, r7, r3
adc r6, r6, r1
_037FA84C:
str r7, [r8, #12]
str r6, [r8, #16]
ldr r0, _037FA8FC ; =_03807934
ldr r4, [r0]
mov r1, #0
b _037FA8B8
_037FA864:
ldr r2, [r4, #12]
ldr r0, [r4, #16]
subs r3, r7, r2
sbc r2, r6, r0
subs r0, r3, r1
sbcs r0, r2, r1
bge _037FA8B4
ldr r0, [r4, #20]
str r0, [r8, #20]
str r8, [r4, #20]
str r4, [r8, #24]
ldr r0, [r8, #20]
cmp r0, #0
strne r8, [r0, #24]
bne _037FA8F4
ldr r0, _037FA8FC ; =_03807934
str r8, [r0]
mov r0, r8
bl FUN_037FA970
b _037FA8F4
_037FA8B4:
ldr r4, [r4, #24]
_037FA8B8:
cmp r4, #0
bne _037FA864
mov r0, #0
str r0, [r8, #24]
ldr r0, _037FA8FC ; =_03807934
ldr r1, [r0, #4]
str r8, [r0, #4]
str r1, [r8, #20]
cmp r1, #0
strne r8, [r1, #24]
bne _037FA8F4
str r8, [r0, #4]
str r8, [r0]
mov r0, r8
bl FUN_037FA970
_037FA8F4:
ldmia sp!, {r4, r5, r6, r7, r8, lr}
bx lr
_037FA8FC: .word _03807934
arm_func_start OS_CreateAlarm
OS_CreateAlarm: ; 0x037FA900
mov r1, #0
str r1, [r0]
str r1, [r0, #8]
bx lr
arm_func_start OS_IsAlarmAvailable
OS_IsAlarmAvailable: ; 0x037FA910
ldr r0, _037FA91C ; =_03807930
ldrh r0, [r0]
bx lr
_037FA91C: .word _03807930
arm_func_start OS_InitAlarm
OS_InitAlarm: ; 0x037FA920
stmfd sp!, {lr}
sub sp, sp, #4
ldr r1, _037FA968 ; =_03807930
ldrh r0, [r1]
cmp r0, #0
bne _037FA95C
mov r0, #1
strh r0, [r1]
bl OSi_SetTimerReserved
mov r1, #0
ldr r0, _037FA96C ; =_03807934
str r1, [r0]
str r1, [r0, #4]
mov r0, #16
bl OS_DisableIrqMask
_037FA95C:
add sp, sp, #4
ldmia sp!, {lr}
bx lr
_037FA968: .word _03807930
_037FA96C: .word _03807934
arm_func_start FUN_037FA970
FUN_037FA970: ; 0x037FA970
stmdb sp!, {r4, r5, lr}
sub sp, sp, #4
mov r4, r0
bl OS_GetTick
mov r2, #0
ldr r3, _037FA9FC ; =0x04000106
strh r2, [r3]
ldr ip, [r4, #12]
ldr r3, [r4, #16]
subs r5, ip, r0
sbc r4, r3, r1
mov r0, #1
ldr r1, _037FAA00 ; =FUN_037FA540
bl OSi_EnterTimerCallback
mov r1, #0
subs r0, r5, r1
sbcs r0, r4, r1
ldrlt r1, _037FAA04 ; =0x0000FFFE
blt _037FA9D4
mov r0, #65536 ; 0x10000
subs r0, r5, r0
sbcs r0, r4, r1
mvnlt r0, r5
movlt r0, r0, lsl #16
movlt r1, r0, lsr #16
_037FA9D4:
ldr r0, _037FAA08 ; =0x04000104
strh r1, [r0]
mov r1, #193 ; 0xc1
ldr r0, _037FA9FC ; =0x04000106
strh r1, [r0]
mov r0, #16
bl OS_EnableIrqMask
add sp, sp, #4
ldmia sp!, {r4, r5, lr}
bx lr
_037FA9FC: .word 0x04000106
_037FAA00: .word FUN_037FA540
_037FAA04: .word 0x0000FFFE
_037FAA08: .word 0x04000104
arm_func_start FUN_037FAA0C
FUN_037FAA0C: ; 0x037FAA0C
stmdb sp!, {r4, lr}

View File

@@ -3,66 +3,6 @@
.section .text
; OS
arm_func_start OSi_ReloadRomData ;OS_reset.c
OSi_ReloadRomData: ; 0x01FF83C4
stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
sub sp, sp, #4
ldr r0, _01FF8484
ldr sl, [r0]
cmp sl, #32768 ; 0x8000
bcc _01FF83EC
ldr r1, _01FF8488
mov r0, sl
mov r2, #352 ; 0x160
bl OSi_ReadCardRom32
_01FF83EC:
ldr r5, _01FF848C
ldr r4, _01FF8490
ldr r3, _01FF8494
ldr r2, _01FF8498
ldr r1, _01FF849C
ldr r9, [r5]
ldr r0, _01FF84A0
ldr r8, [r4]
ldr r7, [r3]
ldr r6, [r2]
ldr r5, [r1]
ldr r4, [r0]
bl OS_DisableInterrupts ; 0x1e02b0
mov fp, r0
bl DC_StoreAll ; 0x1df064
bl DC_InvalidateAll ; 0x1df058
mov r0, fp
bl OS_RestoreInterrupts ; 0x1e02c4
bl IC_InvalidateAll ; 0x1df12c
bl DC_WaitWriteBufferEmpty ; 0x1df120
add r9, r9, sl
cmp r9, #32768 ; 0x8000
rsbcc r0, r9, #32768 ; 0x8000
addcc r8, r8, r0
subcc r7, r7, r0
movcc r9, #32768 ; 0x8000
add r6, r6, sl
mov r0, r9
mov r1, r8
mov r2, r7
bl OSi_ReadCardRom32 ; 0x10b234
mov r0, r6
mov r1, r5
mov r2, r4
bl OSi_ReadCardRom32
add sp, sp, #4
ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
bx lr
_01FF8484: .word 0x027FFC2C
_01FF8488: .word 0x027FFE00
_01FF848C: .word 0x027FFE20
_01FF8490: .word 0x027FFE28
_01FF8494: .word 0x027FFE2C
_01FF8498: .word 0x027FFE30
_01FF849C: .word 0x027FFE38
_01FF84A0: .word 0x027FFE3C
arm_func_start OSi_DoResetSystem ;OS_reset.c
OSi_DoResetSystem: ; 0x01FF84A4
stmfd sp!, {lr}

View File

@@ -7291,6 +7291,7 @@
.extern OSi_PreviousVCount
.extern OSi_ReadCardRom32
.extern OSi_ReferSymbol
.extern OSi_ReloadRomData
.extern OSi_RemoveMutexLinkFromQueue
.extern OSi_RescheduleCount
.extern OSi_SetTimerReserved

View File

@@ -18,6 +18,7 @@ static void OSi_SendToPxi(u16 data);
void OS_ResetSystem(u32 parameter);
void OSi_DoBoot(void);
static void OSi_CpuClear32(register u32 data, register void *destp, register u32 size);
void OSi_ReloadRomData(void);
void OSi_ReadCardRom32(u32 src, void *dst, s32 len);
static inline u32 OS_GetResetParameter(void)

View File

@@ -29,6 +29,7 @@ extern u32 SDK_AUTOLOAD_DTCM_START[];
#define HW_DOWNLOAD_PARAMETER_SIZE 0x00000020
#define HW_RESET_PARAMETER_BUF (HW_MAIN_MEM + 0x007ffc20)
#define HW_ROM_BASE_OFFSET_BUF (HW_MAIN_MEM + 0x007ffc2c)
#define HW_WM_BOOT_BUF (HW_MAIN_MEM + 0x007ffc40)
#define HW_ARENA_INFO_BUF (HW_MAIN_MEM + 0x007ffda0) // Arena data structure
#define HW_ROM_HEADER_BUF (HW_MAIN_MEM + 0x007ffe00) // ROM registration area data buffer

View File

@@ -7,6 +7,7 @@
#include "MB_mb.h"
#include "OS_terminate_proc.h"
#include "OS_interrupt.h"
#include "OS_system.h"
#include "sections.h"
static u16 OSi_IsInitReset = 0;
@@ -18,6 +19,10 @@ extern void PXI_SetFifoRecvCallback(u32 param1, void* callback);
extern u32 PXI_SendWordByFifo(u32 param1, u32 data, u32 param2);
extern void CARD_LockRom(u16 lockId);
extern void MI_StopDma(u32 dma);
extern void DC_StoreAll(void);
extern void DC_InvalidateAll(void);
extern void IC_InvalidateAll(void);
extern void DC_WaitWriteBufferEmpty(void);
extern void OSi_DoResetSystem(void); //in itcm, should technically be in this file
ARM_FUNC void OS_InitReset(void) {
@@ -136,7 +141,48 @@ enum
CARD_ENUM_END
};
void OSi_ReadCardRom32(u32 src, void *dst, s32 len) //should be static, can't mark as such
ARM_FUNC void OSi_ReloadRomData(void)
{
u32 header = (u32)HW_ROM_HEADER_BUF;
const u32 rom_base = *(u32 *)HW_ROM_BASE_OFFSET_BUF;
if (rom_base >= 0x8000)
{
OSi_ReadCardRom32(rom_base, (void *)header, 0x160);
}
u32 src_arm9 = *(u32 *)(header + 0x20);
u32 dst_arm9 = *(u32 *)(header + 0x28);
u32 len_arm9 = *(u32 *)(header + 0x2c);
u32 src_arm7 = *(u32 *)(header + 0x30);
u32 dst_arm7 = *(u32 *)(header + 0x38);
u32 len_arm7 = *(u32 *)(header + 0x3c);
OSIntrMode prevIntrMode = OS_DisableInterrupts();
DC_StoreAll();
DC_InvalidateAll();
(void)OS_RestoreInterrupts(prevIntrMode);
IC_InvalidateAll();
DC_WaitWriteBufferEmpty();
src_arm9 += rom_base;
src_arm7 += rom_base;
if (src_arm9 < 0x8000)
{
u32 diff = 0x8000 - src_arm9;
src_arm9 = 0x8000;
dst_arm9 += diff;
len_arm9 -= diff;
}
OSi_ReadCardRom32(src_arm9, (void *)dst_arm9, (s32)len_arm9);
OSi_ReadCardRom32(src_arm7, (void *)dst_arm7, (s32)len_arm7);
}
ARM_FUNC void OSi_ReadCardRom32(u32 src, void *dst, s32 len) //should be static, can't mark as such
{
vu32 *const hdr_GAME_BUF = (vu32 *)(HW_ROM_HEADER_BUF + 0x60);