Decompile FileInit + RNG, get a bunch of assembly-only functions out of the way

This commit is contained in:
chordtoll 2024-10-16 22:58:14 -07:00
parent 7f2a12c3e6
commit 2bc531caa3
No known key found for this signature in database
GPG Key ID: 6F33950B44755770
19 changed files with 5307 additions and 5208 deletions

View File

@ -1,22 +1,31 @@
#pragma once
.public ARM9_UNKNOWN_TABLE__NA_20AE924
.public ArrayCopy16
.public ArrayCopy32
.public ArrayFill32
.public AtomicExchange
.public ClearIrqFlag
.public DTCM_BSS
.public DseMem_Free
.public EnableIrqFiqFlags
.public EnableIrqFlag
.public FX_AtanIdxTable_
.public GXi_DmaId
.public GXi_VRamLockId
.public GetProcessorMode
.public OS_IRQTable
.public SDK_MAIN_ARENA_LO
.public SDK_SECTION_ARENA_DTCM_START
.public SDK_SECTION_ARENA_EX_START
.public SDK_SECTION_ARENA_ITCM_START
.public SVC_WaitByLoop
.public SetIrqFiqFlags
.public SetIrqFlag
.public WaitForInterrupt
.public WaitForever2
.public _0200002B
.public _0207AD0C
.public _020AEBF8
.public _020B2B9C
.public _020B2BAC
.public _020B2BB0
.public _022B9208
.public _022B958E
.public _022B9590
@ -51,27 +60,8 @@
.public _022B991C
.public _022B999C
.public _022B99A0
.public _022B99A8
.public _022B99B0
.public _022B99BC
.public _022B99D0
.public _022B99D4
.public _022B99D8
.public _022B99EC
.public _022B99F0
.public _022B9A20
.public _022B9A44
.public _022B9A80
.public _022B9D00
.public _022BAA20
.public _022BB4E8
.public _022BB500
.public _022BB560
.public _022BB564
.public _022BB568
.public _022BB5E8
.public _022BB5EC
.public _022BB5F8
.public _ll_sdiv
.public _ll_udiv
.public _s32_div_f
@ -83,20 +73,23 @@
.public sSubBGExtPltt
.public sTexPlttStartAddrTable
.public sTexStartAddrTable
.public sub_01FF97CC
.public sub_01FF9A68
.public sub_01FF9AA8
.public sub_01FF9B18
.public sub_01FF9B3C
.public sub_0206F808
.public sub_0206FD88
.public sub_0206FDE0
.public sub_0207F818
.public sub_0207F9DC
.public sub_0207B87C
.public sub_0207BA94
.public sub_0207BAC8
.public sub_0207BC4C
.public sub_0207BCCC
.public sub_0207BD3C
.public sub_0207BDA8
.public sub_0207BE6C
.public sub_0207C0FC
.public sub_0207C7C4
.public sub_0207D9A4
.public sub_02080EF0
.public sub_02080F30
.public sub_02081AC4
.public sub_02083434
.public sub_02084304
.public sub_02084A4C
.public sub_02085BD4

View File

@ -0,0 +1,23 @@
#pragma once
.public ArrayCopy16
.public EnableIrqFlag
.public GetTimer0Control
.public MemcpyFast
.public OS_GetLockID
.public SVC_WaitByLoop
.public SetIrqFlag
.public WaitForever2
.public _022B99A8
.public _022B99D0
.public _022B99D4
.public _022B99D8
.public sub_01FF97CC
.public sub_02078900
.public sub_02078C3C
.public sub_02078CC8
.public sub_0207C164
.public sub_0207D9A4
.public sub_0207DAB0
.public sub_0207DAFC
.public sub_0207DB20
.public sub_02083434

View File

@ -0,0 +1,44 @@
#pragma once
.public ARM9_UNKNOWN_TABLE__NA_20AE924
.public EnableIrqFlag
.public FileInit
.public SetIrqFlag
.public WaitForever2
.public _020AEBF8
.public _020B2BB0
.public _022B99EC
.public _022B99F0
.public _022B9A20
.public _022B9A44
.public _022B9A80
.public _022B9D00
.public _022BAA20
.public _022BB4E8
.public _022BB500
.public _022BB560
.public _022BB564
.public _022BB568
.public _022BB5E8
.public _022BB5F8
.public sub_01FF9A68
.public sub_01FF9AA8
.public sub_01FF9B18
.public sub_01FF9B3C
.public sub_02078A98
.public sub_02078BAC
.public sub_02078C68
.public sub_02078CC8
.public sub_02079888
.public sub_020798D8
.public sub_02079D98
.public sub_0207A030
.public sub_0207A048
.public sub_0207A0CC
.public sub_0207A2A4
.public sub_0207A2C0
.public sub_0207A2DC
.public sub_0207B854
.public sub_0207F60C
.public sub_0207F70C
.public sub_0207F818
.public sub_0207F9DC

View File

@ -0,0 +1,9 @@
#pragma once
.public EnableIrqFlag
.public FileInit
.public SetIrqFlag
.public _022BB5EC
.public sub_02079888
.public sub_0207EBA0
.public sub_0207EBE4
.public sub_0207EDB4

View File

@ -1,16 +1,14 @@
#pragma once
.public _020AFC4C
.public _s32_div_f
.public abs
.public CheckVariousStatuses2
.public DIRECTIONS_XY
.public DISPLACEMENTS_WITHIN_2_LARGEST_FIRST
.public DISPLACEMENTS_WITHIN_2_SMALLEST_FIRST
.public DISPLACEMENTS_WITHIN_3
.public DisplayUi
.public DUNGEON_PRNG_STATE
.public DUNGEON_PRNG_STATE_SECONDARY_VALUES
.public DUNGEON_PTR
.public DisplayUi
.public DungeonRandInt
.public EntityIsValid__022E95F4
.public GetLeader
.public GetTile
@ -19,6 +17,11 @@
.public InitWeirdMinimapMatrix
.public MemAlloc
.public MemFree
.public UpdateCamera
.public UpdateMinimap
.public _020AFC4C
.public _s32_div_f
.public abs
.public ov29_022DD8B4
.public ov29_022DDEF8
.public ov29_022DE11C
@ -52,5 +55,3 @@
.public sub_0204AEA0
.public sub_0204AEC0
.public sub_02051E20
.public UpdateCamera
.public UpdateMinimap

File diff suppressed because it is too large Load Diff

310
asm/main_0207B854.s Normal file
View File

@ -0,0 +1,310 @@
.include "asm/macros.inc"
.include "main_0207B854.inc"
.text
arm_func_start sub_0207B854
sub_0207B854: ; 0x0207B854
subs r0, r0, #4
bhs sub_0207B854
bx lr
arm_func_end sub_0207B854
arm_func_start sub_0207B860
sub_0207B860: ; 0x0207B860
stmdb sp!, {r3, lr}
mov r0, #1
blx SVC_WaitByLoop
mov r0, #1
mov r1, r0
bl sub_02078900
ldmia sp!, {r3, pc}
arm_func_end sub_0207B860
arm_func_start sub_0207B87C
sub_0207B87C: ; 0x0207B87C
stmdb sp!, {r3, r4, r5, lr}
ldr r0, _0207B8C8 ; =_022B99D0
ldrh r1, [r0, #2]
cmp r1, #0
ldmneia sp!, {r3, r4, r5, pc}
mov r1, #1
strh r1, [r0, #2]
bl sub_0207D9A4
mov r5, #0xc
mov r4, #1
_0207B8A4:
mov r0, r5
mov r1, r4
bl sub_0207DAFC
cmp r0, #0
beq _0207B8A4
ldr r1, _0207B8CC ; =sub_0207B8D0
mov r0, #0xc
bl sub_0207DAB0
ldmia sp!, {r3, r4, r5, pc}
.align 2, 0
_0207B8C8: .word _022B99D0
_0207B8CC: .word sub_0207B8D0
arm_func_end sub_0207B87C
arm_func_start sub_0207B8D0
sub_0207B8D0: ; 0x0207B8D0
stmdb sp!, {r3, lr}
and r0, r1, #0x7f00
mov r0, r0, lsl #8
mov r0, r0, lsr #0x10
cmp r0, #0x10
bne _0207B8F8
ldr r0, _0207B900 ; =_022B99D0
mov r1, #1
strh r1, [r0]
ldmia sp!, {r3, pc}
_0207B8F8:
bl WaitForever2
ldmia sp!, {r3, pc}
.align 2, 0
_0207B900: .word _022B99D0
arm_func_end sub_0207B8D0
arm_func_start sub_0207B904
sub_0207B904: ; 0x0207B904
stmdb sp!, {r4, r5, r6, lr}
mov r6, r0, lsl #8
mov r5, #0xc
mov r4, #0
_0207B914:
mov r0, r5
mov r1, r6
mov r2, r4
bl sub_0207DB20
cmp r0, #0
bne _0207B914
ldmia sp!, {r4, r5, r6, pc}
arm_func_end sub_0207B904
arm_func_start sub_0207B930
sub_0207B930: ; 0x0207B930
stmdb sp!, {r4, lr}
ldr r1, _0207B9C0 ; =0x027FFC40
mov r4, r0
ldrh r0, [r1]
cmp r0, #2
moveq r0, #1
movne r0, #0
cmp r0, #0
beq _0207B958
bl WaitForever2
_0207B958:
bl OS_GetLockID
mov r0, r0, lsl #0x10
mov r0, r0, lsr #0x10
bl sub_02083434
ldr r0, _0207B9C4 ; =0x00000000
bl sub_0207C164
ldr r0, _0207B9C8 ; =0x00000001
bl sub_0207C164
ldr r0, _0207B9CC ; =0x00000002
bl sub_0207C164
ldr r0, _0207B9D0 ; =0x00000003
bl sub_0207C164
ldr r0, _0207B9D4 ; =0x00040000
bl sub_02078C3C
ldr r0, _0207B9D8 ; =0xFFFBFFFF
bl sub_02078CC8
ldr r1, _0207B9DC ; =0x027FFC20
ldr r0, _0207B9E0 ; =0x00000010
str r4, [r1]
bl sub_0207B904
ldr r0, _0207B9E4 ; =0x027E3F80
ldr r1, _0207B9E8 ; =0x00000800
sub r0, r0, r1
mov sp, r0
bl sub_01FF97CC
ldmia sp!, {r4, pc}
.align 2, 0
_0207B9C0: .word 0x027FFC40
_0207B9C4: .word 0x00000000
_0207B9C8: .word 0x00000001
_0207B9CC: .word 0x00000002
_0207B9D0: .word 0x00000003
_0207B9D4: .word 0x00040000
_0207B9D8: .word 0xFFFBFFFF
_0207B9DC: .word 0x027FFC20
_0207B9E0: .word 0x00000010
_0207B9E4: .word 0x027E3F80
_0207B9E8: .word 0x00000800
arm_func_end sub_0207B930
arm_func_start sub_0207B9EC
sub_0207B9EC: ; 0x0207B9EC
ldr ip, _0207BA00 ; =MemcpyFast
mov r1, r0
ldr r0, _0207BA04 ; =0x027FFCF4
mov r2, #6
bx ip
.align 2, 0
_0207BA00: .word MemcpyFast
_0207BA04: .word 0x027FFCF4
arm_func_end sub_0207B9EC
arm_func_start sub_0207BA08
sub_0207BA08: ; 0x0207BA08
stmdb sp!, {r4, lr}
ldr ip, _0207BA88 ; =0x027FFC80
mov r4, r0
ldrh r2, [ip, #0x64]
add r0, ip, #6
add r1, r4, #4
mov r2, r2, lsl #0x1d
mov r2, r2, lsr #0x1d
strb r2, [r4]
ldrb r3, [ip, #2]
mov r2, #0x14
mov r3, r3, lsl #0x1c
mov r3, r3, lsr #0x1c
strb r3, [r4, #1]
ldrb r3, [ip, #3]
strb r3, [r4, #2]
ldrb r3, [ip, #4]
strb r3, [r4, #3]
ldrb r3, [ip, #0x1a]
strh r3, [r4, #0x1a]
ldrb r3, [ip, #0x50]
strh r3, [r4, #0x52]
bl ArrayCopy16
ldr r0, _0207BA88 ; =0x027FFC80
add r1, r4, #0x1c
add r0, r0, #0x1c
mov r2, #0x34
bl ArrayCopy16
mov r0, #0
strh r0, [r4, #0x18]
strh r0, [r4, #0x50]
ldmia sp!, {r4, pc}
.align 2, 0
_0207BA88: .word 0x027FFC80
arm_func_end sub_0207BA08
arm_func_start CountLeadingZeros
CountLeadingZeros: ; 0x0207BA8C
clz r0, r0
bx lr
arm_func_end CountLeadingZeros
arm_func_start sub_0207BA94
sub_0207BA94: ; 0x0207BA94
ldr r0, _0207BAC0 ; =_022B99D4
mov r3, #0
str r3, [r0]
ldr r0, _0207BAC4 ; =_022B99D8
mov r2, r3
_0207BAA8:
mov r1, r3, lsl #1
add r3, r3, #1
strh r2, [r0, r1]
cmp r3, #9
blt _0207BAA8
bx lr
.align 2, 0
_0207BAC0: .word _022B99D4
_0207BAC4: .word _022B99D8
arm_func_end sub_0207BA94
arm_func_start sub_0207BAC8
sub_0207BAC8: ; 0x0207BAC8
stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr}
mov r5, r0
mov sl, r1
bl EnableIrqFlag
ldr r4, _0207BB44 ; =_022B99D4
ldr r1, _0207BB48 ; =0x000001FF
ldr r2, [r4]
mov sb, r0
and r0, r5, r2
ldr r6, _0207BB4C ; =_022B99D8
and r8, r0, r1
mov r7, #1
mov r5, #0
_0207BAFC:
mov r0, r8
bl CountLeadingZeros
rsbs r2, r0, #0x1f
bmi _0207BB38
mov r1, r2, lsl #1
ldrh r0, [r6, r1]
mvn r2, r7, lsl r2
cmp sl, r0
and r8, r8, r2
bne _0207BAFC
ldr r0, [r4]
strh r5, [r6, r1]
and r0, r0, r2
str r0, [r4]
b _0207BAFC
_0207BB38:
mov r0, sb
bl SetIrqFlag
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc}
.align 2, 0
_0207BB44: .word _022B99D4
_0207BB48: .word 0x000001FF
_0207BB4C: .word _022B99D8
arm_func_end sub_0207BAC8
arm_func_start sub_0207BB50
sub_0207BB50: ; 0x0207BB50
stmdb sp!, {r4, r5, r6, lr}
ldr r1, _0207BC10 ; =0x04000006
mov r5, r0
ldrh r6, [r1]
ldr r4, _0207BC14 ; =0x027FFC00
bl GetTimer0Control
orr r0, r0, r6, lsl #16
str r0, [r5]
ldr r1, _0207BC18 ; =_022B99A8
ldrh ip, [r4, #0xf8]
ldr r3, [r1]
ldr r2, [r1, #4]
mov r0, r4
eor r2, r3, ip, lsl #16
str r2, [r5, #4]
ldr r2, [r1]
ldr r3, [r0, #0x3c]
ldr r2, [r1, #4]
ldr r1, [r4, #0xf4]
ldr ip, _0207BC1C ; =0x04000600
eor r1, r2, r1
eor r2, r3, r1
str r2, [r5, #8]
ldr r1, [ip]
eor r1, r2, r1
str r1, [r5, #8]
ldr r2, [r0, #0x1e8]
add r1, r0, #0x300
str r2, [r5, #0xc]
ldr r3, [r0, #0x1ec]
sub r2, ip, #0x4d0
str r3, [r5, #0x10]
ldr r3, [r0, #0x390]
ldrh r4, [r1, #0x94]
add r0, r0, #0x3a8
eor r3, r3, r4, lsl #16
str r3, [r5, #0x14]
ldrh r4, [r1, #0xaa]
ldrh r3, [r1, #0xac]
orr r3, r3, r4, lsl #16
str r3, [r5, #0x18]
ldrh r2, [r2]
ldrh r0, [r0]
ldrh r1, [r1, #0x98]
orr r0, r2, r0
orr r0, r0, r1, lsl #16
str r0, [r5, #0x1c]
ldmia sp!, {r4, r5, r6, pc}
.align 2, 0
_0207BC10: .word 0x04000006
_0207BC14: .word 0x027FFC00
_0207BC18: .word _022B99A8
_0207BC1C: .word 0x04000600
arm_func_end sub_0207BB50

4426
asm/main_0207BC3C.s Normal file

File diff suppressed because it is too large Load Diff

313
asm/main_0207F40C.s Normal file
View File

@ -0,0 +1,313 @@
.include "asm/macros.inc"
.include "main_0207F40C.inc"
.text
arm_func_start sub_0207F40C
sub_0207F40C: ; 0x0207F40C
stmdb sp!, {r3, r4, r5, r6, r7, r8, lr}
sub sp, sp, #0xc
mov r7, r1
ldrb r1, [r7]
mov r8, r0
mov r6, r2
cmp r1, #0x2f
mov r5, r3
cmpne r1, #0x5c
bne _0207F458
ldr r0, _0207F54C ; =_022BB5EC
mov r1, #0
ldr r0, [r0]
strh r1, [sp, #4]
str r0, [sp]
str r1, [sp, #8]
strh r1, [sp, #6]
add r7, r7, #1
b _0207F4FC
_0207F458:
ldr r0, _0207F54C ; =_022BB5EC
add r3, sp, #0
ldmia r0, {r0, r1, r2}
stmia r3, {r0, r1, r2}
mov r4, #0
_0207F46C:
ldrb r0, [r7, r4]
cmp r0, #0
cmpne r0, #0x2f
cmpne r0, #0x5c
beq _0207F4FC
cmp r0, #0x3a
bne _0207F4F0
mov r0, r7
mov r1, r4
bl sub_0207EDB4
cmp r0, #0
addeq sp, sp, #0xc
moveq r0, #0
ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc}
ldr r1, [r0, #0x1c]
tst r1, #2
movne r1, #1
moveq r1, #0
cmp r1, #0
addeq sp, sp, #0xc
moveq r0, #0
ldmeqia sp!, {r3, r4, r5, r6, r7, r8, pc}
mov r1, #0
str r0, [sp]
str r1, [sp, #8]
strh r1, [sp, #6]
strh r1, [sp, #4]
add r0, r4, #1
ldrb r0, [r7, r0]!
cmp r0, #0x2f
cmpne r0, #0x5c
addeq r7, r7, #1
b _0207F4FC
_0207F4F0:
add r4, r4, #1
cmp r4, #3
ble _0207F46C
_0207F4FC:
ldr r1, [sp]
add r0, sp, #0
str r1, [r8, #8]
str r7, [r8, #0x3c]
add r3, r8, #0x30
ldmia r0, {r0, r1, r2}
stmia r3, {r0, r1, r2}
cmp r5, #0
moveq r0, #0
streq r0, [r8, #0x40]
streq r6, [r8, #0x44]
beq _0207F538
mov r0, #1
str r0, [r8, #0x40]
str r5, [r8, #0x44]
_0207F538:
mov r0, r8
mov r1, #4
bl sub_0207EBE4
add sp, sp, #0xc
ldmia sp!, {r3, r4, r5, r6, r7, r8, pc}
.align 2, 0
_0207F54C: .word _022BB5EC
arm_func_end sub_0207F40C
arm_func_start sub_0207F550
sub_0207F550: ; 0x0207F550
stmdb sp!, {r3, r4, r5, r6, r7, lr}
mov r7, r0
ldr r4, [r7, #0x2c]
ldr r0, [r7, #0x28]
mov r6, r2
str r1, [r7, #0x30]
sub r0, r0, r4
cmp r6, r0
movgt r6, r0
cmp r6, #0
movlt r6, #0
str r2, [r7, #0x34]
mov r5, r3
str r6, [r7, #0x38]
cmp r5, #0
ldreq r0, [r7, #0xc]
mov r1, #0
orreq r0, r0, #4
streq r0, [r7, #0xc]
mov r0, r7
bl sub_0207EBE4
cmp r5, #0
bne _0207F5C4
mov r0, r7
bl sub_0207F748
cmp r0, #0
ldrne r0, [r7, #0x2c]
subne r6, r0, r4
mvneq r6, #0
_0207F5C4:
mov r0, r6
ldmia sp!, {r3, r4, r5, r6, r7, pc}
arm_func_end sub_0207F550
arm_func_start sub_0207F5CC
sub_0207F5CC: ; 0x0207F5CC
stmdb sp!, {r3, r4, r5, lr}
sub sp, sp, #0x48
mov r5, r0
add r0, sp, #0
mov r4, r1
bl FileInit
add r0, sp, #0
mov r1, r4
mov r2, r5
mov r3, #0
bl sub_0207F40C
cmp r0, #0
movne r0, #1
moveq r0, #0
add sp, sp, #0x48
ldmia sp!, {r3, r4, r5, pc}
arm_func_end sub_0207F5CC
arm_func_start sub_0207F60C
sub_0207F60C: ; 0x0207F60C
stmdb sp!, {r4, lr}
mov r4, r0
str r1, [r4, #8]
ldr ip, [sp, #8]
mov r1, #7
str ip, [r4, #0x38]
str r2, [r4, #0x30]
str r3, [r4, #0x34]
bl sub_0207EBE4
cmp r0, #0
moveq r0, #0
ldmeqia sp!, {r4, pc}
ldr r1, [r4, #0xc]
mov r0, #1
orr r1, r1, #0x10
bic r1, r1, #0x20
str r1, [r4, #0xc]
ldmia sp!, {r4, pc}
arm_func_end sub_0207F60C
arm_func_start sub_0207F654
sub_0207F654: ; 0x0207F654
stmdb sp!, {r0, r1, r2, r3}
stmdb sp!, {r4, lr}
ldr r1, [sp, #0xc]
mov r4, r0
cmp r1, #0
moveq r0, #0
ldmeqia sp!, {r4, lr}
addeq sp, sp, #0x10
bxeq lr
str r1, [r4, #8]
str r1, [r4, #0x30]
ldr r2, [sp, #0x10]
mov r1, #6
str r2, [r4, #0x34]
bl sub_0207EBE4
cmp r0, #0
moveq r0, #0
ldmeqia sp!, {r4, lr}
addeq sp, sp, #0x10
bxeq lr
ldr r1, [r4, #0xc]
mov r0, #1
orr r1, r1, #0x10
bic r1, r1, #0x20
str r1, [r4, #0xc]
ldmia sp!, {r4, lr}
add sp, sp, #0x10
bx lr
arm_func_end sub_0207F654
arm_func_start sub_0207F6C4
sub_0207F6C4: ; 0x0207F6C4
stmdb sp!, {r4, lr}
sub sp, sp, #8
mov r4, r0
add r0, sp, #0
bl sub_0207F5CC
cmp r0, #0
beq _0207F700
add r1, sp, #0
mov r0, r4
ldmia r1, {r1, r2}
bl sub_0207F654
cmp r0, #0
addne sp, sp, #8
movne r0, #1
ldmneia sp!, {r4, pc}
_0207F700:
mov r0, #0
add sp, sp, #8
ldmia sp!, {r4, pc}
arm_func_end sub_0207F6C4
arm_func_start sub_0207F70C
sub_0207F70C: ; 0x0207F70C
stmdb sp!, {r4, lr}
mov r1, #8
mov r4, r0
bl sub_0207EBE4
cmp r0, #0
mov r0, #0
ldmeqia sp!, {r4, pc}
str r0, [r4, #8]
mov r0, #0xe
str r0, [r4, #0x10]
ldr r1, [r4, #0xc]
mov r0, #1
bic r1, r1, #0x30
str r1, [r4, #0xc]
ldmia sp!, {r4, pc}
arm_func_end sub_0207F70C
arm_func_start sub_0207F748
sub_0207F748: ; 0x0207F748
stmdb sp!, {r4, r5, r6, r7, r8, lr}
mov r6, r0
mov r5, #0
bl EnableIrqFlag
ldr r1, [r6, #0xc]
mov r4, r0
tst r1, #1
movne r0, #1
moveq r0, r5
cmp r0, #0
beq _0207F7D8
ldr r0, [r6, #0xc]
tst r0, #0x44
moveq r5, #1
movne r5, #0
cmp r5, #0
beq _0207F7B0
ldr r0, [r6, #0xc]
orr r0, r0, #4
str r0, [r6, #0xc]
_0207F798:
add r0, r6, #0x18
bl sub_02079888
ldr r0, [r6, #0xc]
tst r0, #0x40
beq _0207F798
b _0207F7D8
_0207F7B0:
mov r7, #0
mov r8, #1
_0207F7B8:
add r0, r6, #0x18
bl sub_02079888
ldr r0, [r6, #0xc]
tst r0, #1
movne r0, r8
moveq r0, r7
cmp r0, #0
bne _0207F7B8
_0207F7D8:
mov r0, r4
bl SetIrqFlag
cmp r5, #0
beq _0207F7F4
mov r0, r6
bl sub_0207EBA0
ldmia sp!, {r4, r5, r6, r7, r8, pc}
_0207F7F4:
ldr r0, [r6, #0x14]
cmp r0, #0
moveq r0, #1
movne r0, #0
ldmia sp!, {r4, r5, r6, r7, r8, pc}
arm_func_end sub_0207F748
arm_func_start sub_0207F808
sub_0207F808: ; 0x0207F808
ldr ip, _0207F814 ; =sub_0207F550
mov r3, #1
bx ip
.align 2, 0
_0207F814: .word sub_0207F550
arm_func_end sub_0207F808

View File

@ -1618,46 +1618,3 @@ _022EAA8C: .word 0x5D588B65
_022EAA90: .word DUNGEON_PRNG_STATE_SECONDARY_VALUES
_022EAA94: .word 0x00269EC3
arm_func_end DungeonRand16Bit
arm_func_start DungeonRandInt
DungeonRandInt: ; 0x022EAA98
stmdb sp!, {r4, lr}
mov r4, r0
bl DungeonRand16Bit
mov r0, r0, lsl #0x10
mov r1, r0, lsr #0x10
mul r0, r1, r4
mov r0, r0, asr #0x10
mov r0, r0, lsl #0x10
mov r0, r0, lsr #0x10
ldmia sp!, {r4, pc}
arm_func_end DungeonRandInt
arm_func_start DungeonRandRange
DungeonRandRange: ; 0x022EAAC0
stmdb sp!, {r3, r4, r5, lr}
mov r5, r0
mov r4, r1
cmp r5, r4
ldmeqia sp!, {r3, r4, r5, pc}
bge _022EAAFC
bl DungeonRand16Bit
mov r0, r0, lsl #0x10
mov r1, r0, lsr #0x10
sub r0, r4, r5
mul r0, r1, r0
mov r0, r0, asr #0x10
mov r0, r0, lsl #0x10
add r0, r5, r0, lsr #16
ldmia sp!, {r3, r4, r5, pc}
_022EAAFC:
bl DungeonRand16Bit
mov r0, r0, lsl #0x10
mov r1, r0, lsr #0x10
sub r0, r5, r4
mul r0, r1, r0
mov r0, r0, asr #0x10
mov r0, r0, lsl #0x10
add r0, r4, r0, lsr #16
ldmia sp!, {r3, r4, r5, pc}
arm_func_end DungeonRandRange

View File

@ -1,6 +1,8 @@
#ifndef PMDSKY_DG_RANDOM_H
#define PMDSKY_DG_RANDOM_H
s32 DungeonRandInt(s32 end);
s32 DungeonRandRange(s32 from, s32 to);
// Returns the result of a possibly biased coin flip (a Bernoulli random variable) with some success probability p, using the dungeon PRNG.
// percentChance: success percentage (100*p)
// return: true with probability p, false with probability (1-p)

12
include/main_0207B848.h Normal file
View File

@ -0,0 +1,12 @@
#ifndef PMDSKY_MAIN_0207B848_H
#define PMDSKY_MAIN_0207B848_H
u8 ClearIrqFlag();
u8 EnableIrqFlag();
u8 SetIrqFlag(u8 flag);
u8 EnableIrqFiqFlags(void);
u8 SetIrqFiqFlags(u8 flags);
u8 GetIrqFlag();
u8 GetProcessorMode();
#endif //PMDSKY_MAIN_0207B848_H

7
include/main_0207BC20.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef PMDSKY_MAIN_0207BC20_H
#define PMDSKY_MAIN_0207BC20_H
void WaitForever2(void);
void WaitForInterrupt(void);
#endif //PMDSKY_MAIN_0207BC20_H

8
include/main_0207F3E4.h Normal file
View File

@ -0,0 +1,8 @@
#ifndef PMDSKY_MAIN_0207F3E4_H
#define PMDSKY_MAIN_0207F3E4_H
#include <file.h>
void FileInit(struct file_stream* file);
#endif //PMDSKY_MAIN_0207F3E4_H

View File

@ -27,6 +27,12 @@ Static main
Object lib/DSE/asm/dc_lfo_1.o
Object lib/DSE/src/dc_lfo_2.o
Object asm/main_02075600.o
Object src/main_0207B848.o
Object asm/main_0207B854.o
Object src/main_0207BC20.o
Object asm/main_0207BC3C.o
Object src/main_0207F3E4.o
Object asm/main_0207F40C.o
Object src/main_0207F818.o
Object asm/main_0207F894.o
}

View File

@ -2,7 +2,29 @@
// file starts at 0x022ea968
extern s32 DungeonRand16Bit(void);
extern s16 DungeonRand16Bit(void);
s32 DungeonRandInt(s32 end)
{
s32 entropy = DungeonRand16Bit();
entropy &= 0xffff;
entropy *= end;
return (((s32) entropy) >> 0x10) & 0xffff;
}
s32 DungeonRandRange(s32 from, s32 to)
{
s32 entropy;
if (from == to) {
return from;
} else if (from<to) {
entropy = DungeonRand16Bit();
return from + ((s32)((entropy & 0xffff) * (to - from)) >> 0x10 & 0xffffU);
} else {
entropy = DungeonRand16Bit();
return to + ((s32)((entropy & 0xffff) * (from - to)) >> 0x10 & 0xffffU);
}
}
u8 DungeonRandOutcome__022EAB20(s32 percentChance)
{

62
src/main_0207B848.c Normal file
View File

@ -0,0 +1,62 @@
#include "main_0207B848.h"
asm u8 ClearIrqFlag()
{
mrs r0, cpsr
bic r1, r0, #0x80
msr cpsr_c, r1
and r0, r0, #0x80
bx lr
}
asm u8 EnableIrqFlag()
{
mrs r0, cpsr
orr r1, r0, #0x80
msr cpsr_c, r1
and r0, r0, #0x80
bx lr
}
asm u8 SetIrqFlag(u8 flag)
{
mrs r1, cpsr
bic r2, r1, #0x80
orr r2, r2, r0
msr cpsr_c, r2
and r0, r1, #0x80
bx lr
}
asm u8 EnableIrqFiqFlags(void)
{
mrs r0, cpsr
orr r1, r0, #0xc0
msr cpsr_c, r1
and r0, r0, #0xc0
bx lr
}
asm u8 SetIrqFiqFlags(u8 flags)
{
mrs r1, cpsr
bic r2, r1, #0xc0
orr r2, r2, r0
msr cpsr_c, r2
and r0, r1, #0xc0
bx lr
}
asm u8 GetIrqFlag()
{
mrs r0, cpsr
and r0, r0, #0x80
bx lr
}
asm u8 GetProcessorMode()
{
mrs r0, cpsr
and r0, r0, #0x1f
bx lr
}

20
src/main_0207BC20.c Normal file
View File

@ -0,0 +1,20 @@
#include "main_0207BC20.h"
#include "main_0207B848.h"
void WaitForever2(void)
{
while (TRUE) {
EnableIrqFlag();
WaitForInterrupt();
}
}
asm void WaitForInterrupt(void)
{
mov r0, #0
// System Control Coprocessor command: Wait For Interrupt
// https://problemkaputt.de/gbatek.htm#armcp15cachecontrol
mcr p15, 0, r0, c7, c0, 4
bx lr
}

12
src/main_0207F3E4.c Normal file
View File

@ -0,0 +1,12 @@
#include "main_0207F3E4.h"
void FileInit(struct file_stream* file)
{
file->field_0x0 = 0;
file->field_0x4 = 0;
file->field_0x1c = 0;
file->field_0x18 = 0;
file->field_0x8 = 0;
file->field_0x10 = 0xe;
file->field_0xc = 0;
}