summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax <mparisi@stevens.edu>2020-10-27 16:13:32 -0400
committerMax <mparisi@stevens.edu>2020-10-27 16:13:32 -0400
commit126972af1a4ff9084cd48f9c57eb07f3951e5086 (patch)
tree55ac7ff81ee2656da6542fb2700452a15436a77b
parent69dd6927a2ec6791639065a70da615228ae362f6 (diff)
match up to func_801DC9CC
-rw-r--r--asm/code_801DBE90_asm.s140
-rw-r--r--asm/data_2.s4
-rw-r--r--include/SDK/DVD/dvd.h9
-rw-r--r--include/SDK/DVD/dvdfs.h4
-rw-r--r--include/SDK/OS/OSSemaphore.h21
-rw-r--r--include/SDK/os.h1
-rw-r--r--src/code_801DBE90.cpp83
7 files changed, 116 insertions, 146 deletions
diff --git a/asm/code_801DBE90_asm.s b/asm/code_801DBE90_asm.s
index dfc764f..09793a7 100644
--- a/asm/code_801DBE90_asm.s
+++ b/asm/code_801DBE90_asm.s
@@ -2,146 +2,6 @@
.section .text, "ax" # 0x80006980 - 0x803E1E60
-.global func_801DC7F8
-func_801DC7F8:
-/* 801DC7F8 001D8458 94 21 FF E0 */ stwu r1, -0x20(r1)
-/* 801DC7FC 001D845C 7C 08 02 A6 */ mflr r0
-/* 801DC800 001D8460 90 01 00 24 */ stw r0, 0x24(r1)
-/* 801DC804 001D8464 93 E1 00 1C */ stw r31, 0x1c(r1)
-/* 801DC808 001D8468 7C BF 2B 78 */ mr r31, r5
-/* 801DC80C 001D846C 93 C1 00 18 */ stw r30, 0x18(r1)
-/* 801DC810 001D8470 7C 9E 23 78 */ mr r30, r4
-/* 801DC814 001D8474 93 A1 00 14 */ stw r29, 0x14(r1)
-/* 801DC818 001D8478 7C 7D 1B 78 */ mr r29, r3
-/* 801DC81C 001D847C 88 0D A0 5E */ lbz r0, lbl_8063F31E-_SDA_BASE_(r13)
-/* 801DC820 001D8480 2C 00 00 00 */ cmpwi r0, 0
-/* 801DC824 001D8484 40 82 00 0C */ bne lbl_801DC830
-/* 801DC828 001D8488 38 60 00 00 */ li r3, 0
-/* 801DC82C 001D848C 48 00 00 40 */ b lbl_801DC86C
-lbl_801DC830:
-/* 801DC830 001D8490 4B FF FA 35 */ bl func_801DC264
-/* 801DC834 001D8494 2C 1D 00 00 */ cmpwi r29, 0
-/* 801DC838 001D8498 40 82 00 0C */ bne lbl_801DC844
-/* 801DC83C 001D849C 38 60 00 00 */ li r3, 0
-/* 801DC840 001D84A0 48 00 00 2C */ b lbl_801DC86C
-lbl_801DC844:
-/* 801DC844 001D84A4 3C A0 80 1E */ lis r5, lbl_801DC068@ha
-/* 801DC848 001D84A8 93 FD 00 44 */ stw r31, 0x44(r29)
-/* 801DC84C 001D84AC 7F C4 F3 78 */ mr r4, r30
-/* 801DC850 001D84B0 38 7D 00 04 */ addi r3, r29, 4
-/* 801DC854 001D84B4 38 A5 C0 68 */ addi r5, r5, lbl_801DC068@l
-/* 801DC858 001D84B8 38 C0 00 02 */ li r6, 2
-/* 801DC85C 001D84BC 48 0A B8 79 */ bl DVDSeekAsyncPrio
-/* 801DC860 001D84C0 7C 03 00 D0 */ neg r0, r3
-/* 801DC864 001D84C4 7C 00 1B 78 */ or r0, r0, r3
-/* 801DC868 001D84C8 54 03 0F FE */ srwi r3, r0, 0x1f
-lbl_801DC86C:
-/* 801DC86C 001D84CC 80 01 00 24 */ lwz r0, 0x24(r1)
-/* 801DC870 001D84D0 83 E1 00 1C */ lwz r31, 0x1c(r1)
-/* 801DC874 001D84D4 83 C1 00 18 */ lwz r30, 0x18(r1)
-/* 801DC878 001D84D8 83 A1 00 14 */ lwz r29, 0x14(r1)
-/* 801DC87C 001D84DC 7C 08 03 A6 */ mtlr r0
-/* 801DC880 001D84E0 38 21 00 20 */ addi r1, r1, 0x20
-/* 801DC884 001D84E4 4E 80 00 20 */ blr
-
-.global func_801DC888
-func_801DC888:
-/* 801DC888 001D84E8 38 03 00 01 */ addi r0, r3, 1
-/* 801DC88C 001D84EC 28 00 00 0C */ cmplwi r0, 0xc
-/* 801DC890 001D84F0 4D 81 00 20 */ bgtlr
-/* 801DC894 001D84F4 3C 60 80 42 */ lis r3, lbl_804232D8@ha
-/* 801DC898 001D84F8 54 00 10 3A */ slwi r0, r0, 2
-/* 801DC89C 001D84FC 38 63 32 D8 */ addi r3, r3, lbl_804232D8@l
-/* 801DC8A0 001D8500 7C 63 00 2E */ lwzx r3, r3, r0
-/* 801DC8A4 001D8504 7C 69 03 A6 */ mtctr r3
-/* 801DC8A8 001D8508 4E 80 04 20 */ bctr
-/* 801DC8AC 001D850C 38 00 00 09 */ li r0, 9
-/* 801DC8B0 001D8510 90 0D A0 68 */ stw r0, lbl_8063F328-_SDA_BASE_(r13)
-/* 801DC8B4 001D8514 4E 80 00 20 */ blr
-/* 801DC8B8 001D8518 38 00 00 01 */ li r0, 1
-/* 801DC8BC 001D851C 90 0D A0 68 */ stw r0, lbl_8063F328-_SDA_BASE_(r13)
-/* 801DC8C0 001D8520 4E 80 00 20 */ blr
-/* 801DC8C4 001D8524 38 00 00 03 */ li r0, 3
-/* 801DC8C8 001D8528 90 0D A0 68 */ stw r0, lbl_8063F328-_SDA_BASE_(r13)
-/* 801DC8CC 001D852C 4E 80 00 20 */ blr
-/* 801DC8D0 001D8530 38 00 00 05 */ li r0, 5
-/* 801DC8D4 001D8534 90 0D A0 68 */ stw r0, lbl_8063F328-_SDA_BASE_(r13)
-/* 801DC8D8 001D8538 4E 80 00 20 */ blr
-/* 801DC8DC 001D853C 38 00 00 07 */ li r0, 7
-/* 801DC8E0 001D8540 90 0D A0 68 */ stw r0, lbl_8063F328-_SDA_BASE_(r13)
-/* 801DC8E4 001D8544 4E 80 00 20 */ blr
-
-.global func_801DC8E8
-func_801DC8E8:
-/* 801DC8E8 001D8548 81 8D A0 70 */ lwz r12, lbl_8063F330-_SDA_BASE_(r13)
-/* 801DC8EC 001D854C 2C 0C 00 00 */ cmpwi r12, 0
-/* 801DC8F0 001D8550 4D 82 00 20 */ beqlr
-/* 801DC8F4 001D8554 7D 89 03 A6 */ mtctr r12
-/* 801DC8F8 001D8558 4E 80 04 20 */ bctr
-/* 801DC8FC 001D855C 4E 80 00 20 */ blr
-
-.global func_801DC900
-func_801DC900:
-/* 801DC900 001D8560 81 8D A0 74 */ lwz r12, lbl_8063F334-_SDA_BASE_(r13)
-/* 801DC904 001D8564 2C 0C 00 00 */ cmpwi r12, 0
-/* 801DC908 001D8568 4D 82 00 20 */ beqlr
-/* 801DC90C 001D856C 7D 89 03 A6 */ mtctr r12
-/* 801DC910 001D8570 4E 80 04 20 */ bctr
-/* 801DC914 001D8574 4E 80 00 20 */ blr
-lbl_801DC918:
-/* 801DC918 001D8578 90 6D 84 34 */ stw r3, lbl_8063D6F4-_SDA_BASE_(r13)
-/* 801DC91C 001D857C 3C 60 80 49 */ lis r3, lbl_80491830@ha
-/* 801DC920 001D8580 38 63 18 30 */ addi r3, r3, lbl_80491830@l
-/* 801DC924 001D8584 48 09 46 5C */ b OSSignalSemaphore
-
-.global func_801DC928
-func_801DC928:
-/* 801DC928 001D8588 94 21 FF F0 */ stwu r1, -0x10(r1)
-/* 801DC92C 001D858C 7C 08 02 A6 */ mflr r0
-/* 801DC930 001D8590 90 01 00 14 */ stw r0, 0x14(r1)
-/* 801DC934 001D8594 93 E1 00 0C */ stw r31, 0xc(r1)
-/* 801DC938 001D8598 48 09 1E 25 */ bl OSDisableInterrupts
-/* 801DC93C 001D859C 7C 7F 1B 78 */ mr r31, r3
-/* 801DC940 001D85A0 48 09 1E 45 */ bl OSRestoreInterrupts
-/* 801DC944 001D85A4 2C 1F 00 00 */ cmpwi r31, 0
-/* 801DC948 001D85A8 40 82 00 0C */ bne lbl_801DC954
-/* 801DC94C 001D85AC 38 60 00 01 */ li r3, 1
-/* 801DC950 001D85B0 48 00 00 68 */ b lbl_801DC9B8
-lbl_801DC954:
-/* 801DC954 001D85B4 3C 60 80 49 */ lis r3, lbl_80491830@ha
-/* 801DC958 001D85B8 38 80 00 00 */ li r4, 0
-/* 801DC95C 001D85BC 38 63 18 30 */ addi r3, r3, lbl_80491830@l
-/* 801DC960 001D85C0 48 09 45 09 */ bl OSInitSemaphore
-/* 801DC964 001D85C4 38 00 FF FF */ li r0, -1
-/* 801DC968 001D85C8 3C 60 80 49 */ lis r3, lbl_80491840@ha
-/* 801DC96C 001D85CC 3C 80 80 1E */ lis r4, lbl_801DC918@ha
-/* 801DC970 001D85D0 90 0D 84 34 */ stw r0, lbl_8063D6F4-_SDA_BASE_(r13)
-/* 801DC974 001D85D4 38 63 18 40 */ addi r3, r3, lbl_80491840@l
-/* 801DC978 001D85D8 38 84 C9 18 */ addi r4, r4, lbl_801DC918@l
-/* 801DC97C 001D85DC 48 0A FB 4D */ bl DVDCheckDiskAsync
-/* 801DC980 001D85E0 2C 03 00 00 */ cmpwi r3, 0
-/* 801DC984 001D85E4 40 82 00 0C */ bne lbl_801DC990
-/* 801DC988 001D85E8 38 00 00 00 */ li r0, 0
-/* 801DC98C 001D85EC 90 0D 84 34 */ stw r0, lbl_8063D6F4-_SDA_BASE_(r13)
-lbl_801DC990:
-/* 801DC990 001D85F0 80 0D 84 34 */ lwz r0, lbl_8063D6F4-_SDA_BASE_(r13)
-/* 801DC994 001D85F4 2C 00 00 00 */ cmpwi r0, 0
-/* 801DC998 001D85F8 40 80 00 10 */ bge lbl_801DC9A8
-/* 801DC99C 001D85FC 3C 60 80 49 */ lis r3, lbl_80491830@ha
-/* 801DC9A0 001D8600 38 63 18 30 */ addi r3, r3, lbl_80491830@l
-/* 801DC9A4 001D8604 48 09 45 1D */ bl OSWaitSemaphore
-lbl_801DC9A8:
-/* 801DC9A8 001D8608 80 6D 84 34 */ lwz r3, lbl_8063D6F4-_SDA_BASE_(r13)
-/* 801DC9AC 001D860C 7C 03 00 D0 */ neg r0, r3
-/* 801DC9B0 001D8610 7C 00 1B 78 */ or r0, r0, r3
-/* 801DC9B4 001D8614 54 03 0F FE */ srwi r3, r0, 0x1f
-lbl_801DC9B8:
-/* 801DC9B8 001D8618 80 01 00 14 */ lwz r0, 0x14(r1)
-/* 801DC9BC 001D861C 83 E1 00 0C */ lwz r31, 0xc(r1)
-/* 801DC9C0 001D8620 7C 08 03 A6 */ mtlr r0
-/* 801DC9C4 001D8624 38 21 00 10 */ addi r1, r1, 0x10
-/* 801DC9C8 001D8628 4E 80 00 20 */ blr
-
.global func_801DC9CC
func_801DC9CC:
/* 801DC9CC 001D862C 94 21 FF F0 */ stwu r1, -0x10(r1)
diff --git a/asm/data_2.s b/asm/data_2.s
index 4efec69..3939f73 100644
--- a/asm/data_2.s
+++ b/asm/data_2.s
@@ -2,10 +2,6 @@
.section .data, "wa" # 0x80405D60 - 0x80474F00
-.balign 4, 0
-.global lbl_804232D8
-lbl_804232D8:
- .incbin "baserom.dol", 0x41F3D8, 0x34
.global lbl_8042330C
lbl_8042330C:
.incbin "baserom.dol", 0x41F40C, 0x2C
diff --git a/include/SDK/DVD/dvd.h b/include/SDK/DVD/dvd.h
index f10826f..e9517dc 100644
--- a/include/SDK/DVD/dvd.h
+++ b/include/SDK/DVD/dvd.h
@@ -13,9 +13,18 @@ typedef struct DVDDiskID
u8 unk7;
} DVDDiskID;
+typedef struct DVDCommandBlock
+{
+ u8 unk0[0x30];
+} DVDCommandBlock;
+
+typedef void (*DVDCBCallback)(s32 result, DVDCommandBlock* block);
+
DVDDiskID* DVDGetCurrentDiskID(void);
void DVDInit(void);
s32 DVDGetDriveStatus(void);
+BOOL DVDCheckDiskAsync(DVDCommandBlock* block, DVDCBCallback callback);
+
#ifdef __cplusplus
}
diff --git a/include/SDK/DVD/dvdfs.h b/include/SDK/DVD/dvdfs.h
index 0597e82..0067c68 100644
--- a/include/SDK/DVD/dvdfs.h
+++ b/include/SDK/DVD/dvdfs.h
@@ -14,7 +14,7 @@ struct DVDFileInfo
u8 unk0[0x34];
u32 unk34;
u8 unk38[0x8];
- void (*unk40)(s32, void*); // TODO: not a DVDFileCallback bc an unkClass* is passed as 2nd param
+ void (*unk40)(s32, void*); // TODO: not a DVDFileCallback bc an unkClass* is passed as 2nd param?
void* unk44; //data cache start addr to invalidate
s32 unk48; // data cache region size
};
@@ -24,6 +24,8 @@ BOOL DVDClose(DVDFileInfo*);
s32 DVDConvertPathToEntrynum(const char* fileName);
s32 DVDReadPrio(DVDFileInfo* fileInfo, void* addr, s32 length, s32 offset, s32 prio);
s32 DVDReadAsyncPrio(DVDFileInfo* fileInfo, void* addr, s32 length, s32 offset, DVDCallback callback, s32 prio);
+s32 DVDSeekAsyncPrio(DVDFileInfo* fileInfo, s32 offset, DVDCallback callback, s32 prio);
+
#ifdef __cplusplus
diff --git a/include/SDK/OS/OSSemaphore.h b/include/SDK/OS/OSSemaphore.h
new file mode 100644
index 0000000..46e7e03
--- /dev/null
+++ b/include/SDK/OS/OSSemaphore.h
@@ -0,0 +1,21 @@
+#ifndef POKEREVO_OSSEMAPHORE_H
+#define POKEREVO_OSSEMAPHORE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct OSSemaphore
+{
+ u8 unk0[0x10];
+} OSSemaphore;
+
+s32 OSSignalSemaphore(OSSemaphore* sem);
+void OSInitSemaphore(OSSemaphore* sem, s32 count);
+s32 OSWaitSemaphore(OSSemaphore* sem);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //POKEREVO_OSSEMAPHORE_H
diff --git a/include/SDK/os.h b/include/SDK/os.h
index 0d31901..d2272f0 100644
--- a/include/SDK/os.h
+++ b/include/SDK/os.h
@@ -8,6 +8,7 @@ extern "C" {
#include "SDK/OS/OSAlloc.h"
#include "SDK/OS/OSCache.h"
#include "SDK/OS/OSInterrupt.h"
+#include "SDK/OS/OSSemaphore.h"
#ifdef __cplusplus
}
diff --git a/src/code_801DBE90.cpp b/src/code_801DBE90.cpp
index c8c2ad1..3826f7d 100644
--- a/src/code_801DBE90.cpp
+++ b/src/code_801DBE90.cpp
@@ -36,6 +36,8 @@ extern char* lbl_8063D6D8;
extern char* lbl_8063D6E0;
extern char lbl_8063D6E4[8];
extern char lbl_8063D6EC[8];
+extern s32 lbl_8063D6F4;
+
extern u8 lbl_8063F31E;
extern u8 lbl_8063F31F;
@@ -43,9 +45,15 @@ extern size_t lbl_8063F320;
extern unkClass* lbl_8063F324;
extern u32 lbl_8063F328;
extern u32 lbl_8063F32C;
+
+extern void (*lbl_8063F330)(void);
+extern void (*lbl_8063F334)(void);
+
extern gUnkClass4* lbl_8063F338;
extern u8 lbl_804917F0[0x40];
+extern OSSemaphore lbl_80491830;
+extern DVDCommandBlock lbl_80491840;
extern void* lbl_8063F600; // initialized in func_8022410C
@@ -231,7 +239,7 @@ void func_801DBFEC(s32 p1, DVDFileInfo* p2)
}
//static
-void lbl_801DC068(s32 p1, DVDFileInfo* p2)
+void func_801DC068(s32 p1, DVDFileInfo* p2)
{
if (lbl_8063F31F == 0) {
unkClass* r3 = func_801DBF98(p2);
@@ -436,11 +444,84 @@ s32 func_801DC7DC(void)
return (!lbl_8063F31E) ? -1 : DVDGetDriveStatus();
}
+BOOL func_801DC7F8(unkClass* p1, s32 offset, void (*p3)(s32, void*))
+{
+ if (!lbl_8063F31E)
+ return FALSE;
+ func_801DC264();
+ if (!p1)
+ return FALSE;
+ p1->unk4.unk40 = p3;
+ return DVDSeekAsyncPrio(&p1->unk4, offset, &func_801DC068, 2) != 0;
+}
+
+//static
+void func_801DC888(s32 p1)
+{
+ switch (p1)
+ {
+ case -1:
+ lbl_8063F328 = 9;
+ break;
+ case 5:
+ lbl_8063F328 = 1;
+ break;
+ case 4:
+ lbl_8063F328 = 3;
+ break;
+ case 6:
+ lbl_8063F328 = 5;
+ break;
+ case 11:
+ lbl_8063F328 = 7;
+ break;
+ default:
+ break;
+ }
+}
+//static
+void func_801DC8E8(void)
+{
+ if (lbl_8063F330)
+ lbl_8063F330();
+}
+//static
+void func_801DC900(void)
+{
+ if (lbl_8063F334)
+ lbl_8063F334();
+}
+//static
+void func_801DC918(s32 p1, DVDCommandBlock*)
+{
+ lbl_8063D6F4 = p1;
+ OSSignalSemaphore(&lbl_80491830);
+}
+//static
+BOOL func_801DC928(void)
+{
+ BOOL r31 = OSDisableInterrupts();
+ OSRestoreInterrupts();
+ if (!r31)
+ return TRUE;
+ OSInitSemaphore(&lbl_80491830, 0);
+ lbl_8063D6F4 = -1;
+ if (!DVDCheckDiskAsync(&lbl_80491840, &func_801DC918))
+ lbl_8063D6F4 = 0;
+ if (lbl_8063D6F4 < 0)
+ OSWaitSemaphore(&lbl_80491830);
+ return lbl_8063D6F4 != 0;
+}
+//static
+func_801DC9CC(u32 p1, u32 p2)
+{
+
+}