diff options
-rw-r--r-- | asm/code_801DBE90_asm.s | 32 | ||||
-rw-r--r-- | include/SDK/OS/OSInterrupt.h | 2 | ||||
-rw-r--r-- | src/code_801DBE90.cpp | 33 |
3 files changed, 29 insertions, 38 deletions
diff --git a/asm/code_801DBE90_asm.s b/asm/code_801DBE90_asm.s index 6163c0e..b18d5b0 100644 --- a/asm/code_801DBE90_asm.s +++ b/asm/code_801DBE90_asm.s @@ -2,38 +2,6 @@ .section .text, "ax" # 0x80006980 - 0x803E1E60
-.global func_801DC264
-func_801DC264:
-/* 801DC264 001D7EC4 94 21 FF F0 */ stwu r1, -0x10(r1)
-/* 801DC268 001D7EC8 7C 08 02 A6 */ mflr r0
-/* 801DC26C 001D7ECC 90 01 00 14 */ stw r0, 0x14(r1)
-/* 801DC270 001D7ED0 93 E1 00 0C */ stw r31, 0xc(r1)
-/* 801DC274 001D7ED4 48 09 24 E9 */ bl OSDisableInterrupts
-/* 801DC278 001D7ED8 7C 7F 1B 78 */ mr r31, r3
-/* 801DC27C 001D7EDC 48 09 25 09 */ bl OSRestoreInterrupts
-/* 801DC280 001D7EE0 2C 1F 00 00 */ cmpwi r31, 0
-/* 801DC284 001D7EE4 41 82 00 38 */ beq lbl_801DC2BC
-lbl_801DC288:
-/* 801DC288 001D7EE8 80 6D A0 6C */ lwz r3, lbl_8063F32C-_SDA_BASE_(r13)
-/* 801DC28C 001D7EEC 38 80 00 00 */ li r4, 0
-/* 801DC290 001D7EF0 48 00 07 3D */ bl func_801DC9CC
-/* 801DC294 001D7EF4 80 0D A0 68 */ lwz r0, lbl_8063F328-_SDA_BASE_(r13)
-/* 801DC298 001D7EF8 2C 00 00 00 */ cmpwi r0, 0
-/* 801DC29C 001D7EFC 41 82 00 20 */ beq lbl_801DC2BC
-/* 801DC2A0 001D7F00 80 6D A3 40 */ lwz r3, lbl_8063F600-_SDA_BASE_(r13)
-/* 801DC2A4 001D7F04 48 04 83 21 */ bl func_802245C4
-/* 801DC2A8 001D7F08 2C 03 00 00 */ cmpwi r3, 0
-/* 801DC2AC 001D7F0C 41 82 00 10 */ beq lbl_801DC2BC
-/* 801DC2B0 001D7F10 80 6D A3 40 */ lwz r3, lbl_8063F600-_SDA_BASE_(r13)
-/* 801DC2B4 001D7F14 48 04 82 D5 */ bl func_80224588
-/* 801DC2B8 001D7F18 4B FF FF D0 */ b lbl_801DC288
-lbl_801DC2BC:
-/* 801DC2BC 001D7F1C 80 01 00 14 */ lwz r0, 0x14(r1)
-/* 801DC2C0 001D7F20 83 E1 00 0C */ lwz r31, 0xc(r1)
-/* 801DC2C4 001D7F24 7C 08 03 A6 */ mtlr r0
-/* 801DC2C8 001D7F28 38 21 00 10 */ addi r1, r1, 0x10
-/* 801DC2CC 001D7F2C 4E 80 00 20 */ blr
-
.global func_801DC2D0
func_801DC2D0:
/* 801DC2D0 001D7F30 94 21 FF F0 */ stwu r1, -0x10(r1)
diff --git a/include/SDK/OS/OSInterrupt.h b/include/SDK/OS/OSInterrupt.h index 9bb3bda..b4508f6 100644 --- a/include/SDK/OS/OSInterrupt.h +++ b/include/SDK/OS/OSInterrupt.h @@ -5,7 +5,7 @@ extern "C" {
#endif
-void OSDisableInterrupts(void);
+BOOL OSDisableInterrupts(void);
void OSRestoreInterrupts(void);
#ifdef __cplusplus
diff --git a/src/code_801DBE90.cpp b/src/code_801DBE90.cpp index 8519f21..319f894 100644 --- a/src/code_801DBE90.cpp +++ b/src/code_801DBE90.cpp @@ -47,17 +47,20 @@ extern char* lbl_8063D6E0; extern char lbl_8063D6E4[8];
extern char lbl_8063D6EC[8];
-
extern u8 lbl_8063F31E;
extern u8 lbl_8063F31F;
extern size_t lbl_8063F320;
extern unkClass* lbl_8063F324;
+extern u32 lbl_8063F328;
extern u32 lbl_8063F32C;
extern gUnkClass4* lbl_8063F338;
extern u8 lbl_804917F0[0x40];
+extern void* lbl_8063F600; // initialized in func_8022410C
+
+
extern "C"
{
@@ -65,10 +68,12 @@ extern "C" extern MEMHeapHandle lbl_8063E8EC;
s32 func_80249BC8(void);
// code_80223C54
-u32 func_80223FD0(u32, u32, u32, void (*)(void));
+u32 func_80223FD0(u32, u32, u32, void (*)(u32, u32));
-void func_801DC9CC(void);
+void func_801DC9CC(u32, u32);
void func_8022408C(u32, const char*);
+u32 func_802245C4(void*);
+void func_80224588(void*);
@@ -237,7 +242,6 @@ void lbl_801DC068(u32 p1, unkClass2* p2) }
}
-#if 1
BOOL func_801DC0C8(size_t p1, u32 p2)
{
if (lbl_8063F31E == 1)
@@ -265,6 +269,8 @@ BOOL func_801DC0C8(size_t p1, u32 p2) case 2:
lbl_8063D6D8 = lbl_8063D6EC;
break;
+ default:
+ break;
}
DVDDiskID* diskID = DVDGetCurrentDiskID();
diskID->gameCode[0] = lbl_8063D6D8[0];
@@ -284,7 +290,24 @@ BOOL func_801DC0C8(size_t p1, u32 p2) lbl_8063F31E = 1;
return TRUE;
}
-#endif
+
+//static
+void func_801DC264(void)
+{
+ BOOL r31 = OSDisableInterrupts();
+ OSRestoreInterrupts();
+ if (r31) {
+ while (TRUE) {
+ func_801DC9CC(lbl_8063F32C, 0);
+ if (lbl_8063F328 == 0)
+ break;
+ if (!func_802245C4(lbl_8063F600))
+ break;
+ func_80224588(lbl_8063F600);
+ }
+ }
+}
+
|