diff --git a/asm/DynamicLink.s b/asm/DynamicLink.s index 3df3524f97..4630ec8e2d 100644 --- a/asm/DynamicLink.s +++ b/asm/DynamicLink.s @@ -571,7 +571,7 @@ lbl_80262948: /* 80262988 0025F8C8 39 00 00 01 */ li r8, 1 /* 8026298C 0025F8CC 39 20 00 00 */ li r9, 0 /* 80262990 0025F8D0 39 40 00 00 */ li r10, 0 -/* 80262994 0025F8D4 48 07 72 05 */ bl loadToMainRAM__12JKRDvdRipperFPCcPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 80262994 0025F8D4 48 07 72 05 */ bl loadToMainRAM__12JKRDvdRipperFPCcPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 80262998 0025F8D8 90 7C 00 10 */ stw r3, 0x10(r28) /* 8026299C 0025F8DC 80 1C 00 10 */ lwz r0, 0x10(r28) /* 802629A0 0025F8E0 28 00 00 00 */ cmplwi r0, 0 diff --git a/asm/m/Do/dvd/m_Do_dvd_thread.s b/asm/m/Do/dvd/m_Do_dvd_thread.s index b0052bc40e..372a39a7a1 100644 --- a/asm/m/Do/dvd/m_Do_dvd_thread.s +++ b/asm/m/Do/dvd/m_Do_dvd_thread.s @@ -963,7 +963,7 @@ lbl_800164EC: lbl_8001651C: /* 8001651C 0001345C 39 20 00 00 */ li r9, 0 /* 80016520 00013460 39 40 00 00 */ li r10, 0 -/* 80016524 00013464 48 2C 37 31 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 80016524 00013464 48 2C 37 31 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 80016528 00013468 90 7E 00 1C */ stw r3, 0x1c(r30) /* 8001652C 0001346C 80 9E 00 1C */ lwz r4, 0x1c(r30) /* 80016530 00013470 28 04 00 00 */ cmplwi r4, 0 diff --git a/include/JSystem/JKernel/JKRAramArchive/JKRAramArchive.h b/include/JSystem/JKernel/JKRAramArchive/JKRAramArchive.h index 80c103da97..117dcc87c7 100644 --- a/include/JSystem/JKernel/JKRAramArchive/JKRAramArchive.h +++ b/include/JSystem/JKernel/JKRAramArchive/JKRAramArchive.h @@ -13,7 +13,7 @@ public: void getAramAddress_Entry(SDIFileEntry*); void getAramAddress(char const*); - /* vt[15] */ void getExpandedResSize(void const*) const; /* override */ + /* vt[15] */ u32 getExpandedResSize(const void*) const; /* override */ /* vt[16] */ void* fetchResource(SDIFileEntry*, u32*); /* override */ /* vt[17] */ void* fetchResource(void*, u32, SDIFileEntry*, u32*); /* override */ diff --git a/include/JSystem/JKernel/JKRAramArchive/asm/func_802D72A8.s b/include/JSystem/JKernel/JKRAramArchive/asm/func_802D72A8.s index 5bc1bd10ac..2994dc7c07 100644 --- a/include/JSystem/JKernel/JKRAramArchive/asm/func_802D72A8.s +++ b/include/JSystem/JKernel/JKRAramArchive/asm/func_802D72A8.s @@ -57,7 +57,7 @@ lbl_802D7354: /* 802D7370 002D42B0 39 00 00 01 */ li r8, 1 /* 802D7374 002D42B4 39 20 00 00 */ li r9, 0 /* 802D7378 002D42B8 39 5F 00 5C */ addi r10, r31, 0x5c -/* 802D737C 002D42BC 48 00 28 D9 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D737C 002D42BC 48 00 28 D9 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D7380 002D42C0 7F A3 EB 78 */ mr r3, r29 /* 802D7384 002D42C4 38 80 00 20 */ li r4, 0x20 /* 802D7388 002D42C8 48 06 41 F9 */ bl DCInvalidateRange @@ -91,7 +91,7 @@ lbl_802D73D8: /* 802D73F0 002D4330 39 00 00 01 */ li r8, 1 /* 802D73F4 002D4334 39 20 00 20 */ li r9, 0x20 /* 802D73F8 002D4338 39 40 00 00 */ li r10, 0 -/* 802D73FC 002D433C 48 00 28 59 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D73FC 002D433C 48 00 28 59 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D7400 002D4340 80 7F 00 44 */ lwz r3, 0x44(r31) /* 802D7404 002D4344 7F 64 DB 78 */ mr r4, r27 /* 802D7408 002D4348 48 06 41 79 */ bl DCInvalidateRange diff --git a/include/JSystem/JKernel/JKRArchive/JKRArchive.h b/include/JSystem/JKernel/JKRArchive/JKRArchive.h index ee2883cd2b..bc8c61ab0f 100644 --- a/include/JSystem/JKernel/JKRArchive/JKRArchive.h +++ b/include/JSystem/JKernel/JKRArchive/JKRArchive.h @@ -1,16 +1,28 @@ #ifndef __JKRARCHIVEPUB_H__ #define __JKRARCHIVEPUB_H__ +#include "JSystem/JKernel/JKRDecomp/JKRDecomp.h" #include "JSystem/JKernel/JKRFileLoader/JKRFileLoader.h" #include "dolphin/types.h" +struct SArcHeader { + u32 signature; + u32 file_length; + u32 header_length; + u32 file_data_offset; + u32 file_data_length; + u32 field_0x14; + u32 field_0x18; + u32 field_0x1c; +}; + struct SArcDataInfo { u32 num_nodes; u32 node_offset; u32 num_file_entries; u32 file_entry_offset; u32 string_table_length; - u32 string_trable_offset; + u32 string_table_offset; u16 next_free_file_id; bool sync_file_ids_and_indices; u8 field_1b[5]; @@ -44,8 +56,10 @@ struct SDIFileEntry { u16 getNameHash() const { return name_hash; } u32 getFlags() const { return type_flags_and_name_offset >> 24; } u16 getFileID() const { return file_id; } - bool isDirectory() const { return (getFlags() & 2) != 0; } - bool isUnknownFlag1() const { return (getFlags() & 1) != 0; } + bool isDirectory() const { return (getFlags() & 0x02) != 0; } + bool isUnknownFlag1() const { return (getFlags() & 0x01) != 0; } + bool isCompressed() const { return (getFlags() & 0x04) != 0; } + bool isYAZ0Compressed() const { return (getFlags() & 0x80) != 0; } }; extern u32 lbl_80451420; // JKRArchive::sCurrentDirID @@ -131,13 +145,13 @@ public: /* vt[12] */ virtual u32 getResSize(const void*) const; /* override */ /* vt[13] */ virtual u32 countFile(const char*) const; /* override */ /* vt[14] */ virtual JKRArcFinder* getFirstFile(const char*) const; /* override */ - /* vt[15] */ virtual void getExpandedResSize(const void*) const; + /* vt[15] */ virtual u32 getExpandedResSize(const void*) const; /* vt[16] */ virtual void* fetchResource(SDIFileEntry*, u32*) = 0; /* vt[17] */ virtual void* fetchResource(void*, u32, SDIFileEntry*, u32*) = 0; /* vt[18] */ virtual void setExpandSize(SDIFileEntry*, u32); - /* vt[19] */ virtual void getExpandSize(SDIFileEntry*) const; + /* vt[19] */ virtual u32 getExpandSize(SDIFileEntry*) const; -private: +protected: /* 0x00 */ // vtable /* 0x04 */ // JKRFileLoader /* 0x38 */ JKRHeap* mHeap; diff --git a/include/JSystem/JKernel/JKRCompArchive/JKRCompArchive.h b/include/JSystem/JKernel/JKRCompArchive/JKRCompArchive.h index e2fbba61d5..fd6c33a067 100644 --- a/include/JSystem/JKernel/JKRCompArchive/JKRCompArchive.h +++ b/include/JSystem/JKernel/JKRCompArchive/JKRCompArchive.h @@ -14,7 +14,7 @@ public: /* vt[09] */ void removeResourceAll(void); /* override */ /* vt[10] */ bool removeResource(void*); /* override */ - /* vt[15] */ void getExpandedResSize(void const*) const; /* override */ + /* vt[15] */ u32 getExpandedResSize(const void*) const; /* override */ /* vt[16] */ void* fetchResource(SDIFileEntry*, u32*); /* override */ /* vt[17] */ void* fetchResource(void*, u32, SDIFileEntry*, u32*); /* override */ diff --git a/include/JSystem/JKernel/JKRCompArchive/asm/func_802D89BC.s b/include/JSystem/JKernel/JKRCompArchive/asm/func_802D89BC.s index 5b664dd9da..59da4fc871 100644 --- a/include/JSystem/JKernel/JKRCompArchive/asm/func_802D89BC.s +++ b/include/JSystem/JKernel/JKRCompArchive/asm/func_802D89BC.s @@ -57,7 +57,7 @@ lbl_802D8A6C: /* 802D8A88 002D59C8 39 00 00 01 */ li r8, 1 /* 802D8A8C 002D59CC 39 20 00 00 */ li r9, 0 /* 802D8A90 002D59D0 39 5F 00 5C */ addi r10, r31, 0x5c -/* 802D8A94 002D59D4 48 00 11 C1 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D8A94 002D59D4 48 00 11 C1 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D8A98 002D59D8 7F C3 F3 78 */ mr r3, r30 /* 802D8A9C 002D59DC 38 80 00 20 */ li r4, 0x20 /* 802D8AA0 002D59E0 48 06 2A E1 */ bl DCInvalidateRange @@ -107,7 +107,7 @@ lbl_802D8B20: /* 802D8B40 002D5A80 39 00 00 01 */ li r8, 1 /* 802D8B44 002D5A84 39 20 00 20 */ li r9, 0x20 /* 802D8B48 002D5A88 39 40 00 00 */ li r10, 0 -/* 802D8B4C 002D5A8C 48 00 11 09 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D8B4C 002D5A8C 48 00 11 09 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D8B50 002D5A90 80 7F 00 44 */ lwz r3, 0x44(r31) /* 802D8B54 002D5A94 80 9E 00 0C */ lwz r4, 0xc(r30) /* 802D8B58 002D5A98 80 1F 00 74 */ lwz r0, 0x74(r31) @@ -196,7 +196,7 @@ lbl_802D8C74: /* 802D8C90 002D5BD0 39 00 00 01 */ li r8, 1 /* 802D8C94 002D5BD4 39 20 00 00 */ li r9, 0 /* 802D8C98 002D5BD8 39 40 00 00 */ li r10, 0 -/* 802D8C9C 002D5BDC 48 00 0F B9 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D8C9C 002D5BDC 48 00 0F B9 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D8CA0 002D5BE0 7F 63 DB 78 */ mr r3, r27 /* 802D8CA4 002D5BE4 7F 24 CB 78 */ mr r4, r25 /* 802D8CA8 002D5BE8 48 06 28 D9 */ bl DCInvalidateRange diff --git a/include/JSystem/JKernel/JKRCompArchive/asm/func_802D90C0.s b/include/JSystem/JKernel/JKRCompArchive/asm/func_802D90C0.s index 0574a10ed0..cbca7e28c8 100644 --- a/include/JSystem/JKernel/JKRCompArchive/asm/func_802D90C0.s +++ b/include/JSystem/JKernel/JKRCompArchive/asm/func_802D90C0.s @@ -63,7 +63,7 @@ lbl_802D9180: /* 802D9198 002D60D8 7F 85 E3 78 */ mr r5, r28 /* 802D919C 002D60DC 57 A6 00 34 */ rlwinm r6, r29, 0, 0, 0x1a /* 802D91A0 002D60E0 7D 07 43 78 */ mr r7, r8 -/* 802D91A4 002D60E4 4B FF DD B9 */ bl fetchResource_subroutine__13JKRMemArchiveFPUcUlPUcUli +/* 802D91A4 002D60E4 4B FF DD B9 */ bl fetchResource_subroutine__13JKRMemArchiveFPUcUlPUcUl14JKRCompression /* 802D91A8 002D60E8 7C 7B 1B 78 */ mr r27, r3 /* 802D91AC 002D60EC 48 00 00 8C */ b lbl_802D9238 lbl_802D91B0: diff --git a/include/JSystem/JKernel/JKRCompArchive/asm/func_802D9360.s b/include/JSystem/JKernel/JKRCompArchive/asm/func_802D9360.s index 2ec587696c..182cc3dca3 100644 --- a/include/JSystem/JKernel/JKRCompArchive/asm/func_802D9360.s +++ b/include/JSystem/JKernel/JKRCompArchive/asm/func_802D9360.s @@ -81,7 +81,7 @@ lbl_802D9458: /* 802D9484 002D63C4 80 1F 00 08 */ lwz r0, 8(r31) /* 802D9488 002D63C8 7D 29 02 14 */ add r9, r9, r0 /* 802D948C 002D63CC 39 40 00 00 */ li r10, 0 -/* 802D9490 002D63D0 48 00 07 C5 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D9490 002D63D0 48 00 07 C5 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D9494 002D63D4 7F A3 EB 78 */ mr r3, r29 /* 802D9498 002D63D8 38 80 00 20 */ li r4, 0x20 /* 802D949C 002D63DC 48 06 20 E5 */ bl DCInvalidateRange diff --git a/include/JSystem/JKernel/JKRDecomp/JKRDecomp.h b/include/JSystem/JKernel/JKRDecomp/JKRDecomp.h index 5baf3800d2..f8f24c2e11 100644 --- a/include/JSystem/JKernel/JKRDecomp/JKRDecomp.h +++ b/include/JSystem/JKernel/JKRDecomp/JKRDecomp.h @@ -30,6 +30,22 @@ public: #define JKRDECOMP_SYNC_BLOCKING 0 #define JKRDECOMP_SYNC_NON_BLOCKING 1 +#define READ_BIG_ENDIAN_U32(P) \ + (((u32)(((u8*)(P))[0]) << 0x18) | ((u32)(((u8*)(P))[1]) << 0x10) | \ + ((u32)(((u8*)(P))[2]) << 8) | ((u32)(((u8*)(P))[3]))) + +#define READ_BIG_ENDIAN_U16(P) (((u32)(((u8*)(P))[0]) << 8) | ((u32)(((u8*)(P))[1]))) + +enum JKRCompression { + COMPRESSION_NONE = 0, + COMPRESSION_YAY0 = 1, + COMPRESSION_YAZ0 = 2, + COMPRESSION_ASR = 3, + + __COMPRESSION_ENUM_FORCE_S32 = INT32_MAX, + __COMPRESSION_ENUM_FORCE_SIGNED = -1, +}; + class JKRDecomp : public JKRThread { private: JKRDecomp(long); @@ -38,16 +54,6 @@ private: /* vt[03] */ virtual void* run(); /* override */ public: - enum Compression { - NONE = 0, - YAY0 = 1, - YAZ0 = 2, - ASR = 3, - - __COMPRESSION_ENUM_FORCE_S32 = INT32_MAX, - __COMPRESSION_ENUM_FORCE_SIGNED = -1, - }; - static JKRDecomp* create(long); static JKRDecompCommand* prepareCommand(u8*, u8*, u32, u32, JKRDecompCommand::AsyncCallback); static void sendCommand(JKRDecompCommand*); @@ -57,7 +63,15 @@ public: static void decode(u8*, u8*, u32, u32); static void decodeSZP(u8*, u8*, u32, u32); static void decodeSZS(u8*, u8*, u32, u32); - static Compression checkCompressed(u8*); + static JKRCompression checkCompressed(u8*); }; +inline u32 JKRDecompExpandSize(const void* resource) { + return READ_BIG_ENDIAN_U32((u8*)resource + 4); +} + +inline void JKRDecompress(u8* srcBuffer, u8* dstBuffer, u32 srcLength, u32 dstLength) { + JKRDecomp::orderSync(srcBuffer, dstBuffer, srcLength, dstLength); +} + #endif diff --git a/include/JSystem/JKernel/JKRDvdArchive/JKRDvdArchive.h b/include/JSystem/JKernel/JKRDvdArchive/JKRDvdArchive.h index cf812512bb..5eb9a3c407 100644 --- a/include/JSystem/JKernel/JKRDvdArchive/JKRDvdArchive.h +++ b/include/JSystem/JKernel/JKRDvdArchive/JKRDvdArchive.h @@ -11,7 +11,7 @@ public: void open(long); - /* vt[15] */ virtual void getExpandedResSize(void const*) const; /* override */ + /* vt[15] */ virtual u32 getExpandedResSize(const void*) const; /* override */ /* vt[16] */ virtual void* fetchResource(SDIFileEntry*, u32*); /* override */ /* vt[17] */ virtual void* fetchResource(void*, u32, SDIFileEntry*, u32*); /* override */ diff --git a/include/JSystem/JKernel/JKRDvdArchive/asm/func_802D7DB4.s b/include/JSystem/JKernel/JKRDvdArchive/asm/func_802D7DB4.s index d14b367ea8..d70f7720df 100644 --- a/include/JSystem/JKernel/JKRDvdArchive/asm/func_802D7DB4.s +++ b/include/JSystem/JKernel/JKRDvdArchive/asm/func_802D7DB4.s @@ -52,7 +52,7 @@ lbl_802D7E50: /* 802D7E6C 002D4DAC 39 00 00 01 */ li r8, 1 /* 802D7E70 002D4DB0 39 20 00 00 */ li r9, 0 /* 802D7E74 002D4DB4 39 5D 00 5C */ addi r10, r29, 0x5c -/* 802D7E78 002D4DB8 48 00 1D DD */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D7E78 002D4DB8 48 00 1D DD */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D7E7C 002D4DBC 7F C3 F3 78 */ mr r3, r30 /* 802D7E80 002D4DC0 38 80 00 20 */ li r4, 0x20 /* 802D7E84 002D4DC4 48 06 36 FD */ bl DCInvalidateRange @@ -83,7 +83,7 @@ lbl_802D7EC8: /* 802D7EE0 002D4E20 39 00 00 01 */ li r8, 1 /* 802D7EE4 002D4E24 39 20 00 20 */ li r9, 0x20 /* 802D7EE8 002D4E28 39 40 00 00 */ li r10, 0 -/* 802D7EEC 002D4E2C 48 00 1D 69 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D7EEC 002D4E2C 48 00 1D 69 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D7EF0 002D4E30 80 7D 00 44 */ lwz r3, 0x44(r29) /* 802D7EF4 002D4E34 80 9E 00 0C */ lwz r4, 0xc(r30) /* 802D7EF8 002D4E38 48 06 36 89 */ bl DCInvalidateRange diff --git a/include/JSystem/JKernel/JKRDvdArchive/asm/func_802D826C.s b/include/JSystem/JKernel/JKRDvdArchive/asm/func_802D826C.s index 6c66977cbb..9d55a1f75a 100644 --- a/include/JSystem/JKernel/JKRDvdArchive/asm/func_802D826C.s +++ b/include/JSystem/JKernel/JKRDvdArchive/asm/func_802D826C.s @@ -44,7 +44,7 @@ lbl_802D82E4: /* 802D8300 002D5240 39 00 00 01 */ li r8, 1 /* 802D8304 002D5244 7F C9 F3 78 */ mr r9, r30 /* 802D8308 002D5248 39 40 00 00 */ li r10, 0 -/* 802D830C 002D524C 48 00 19 49 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D830C 002D524C 48 00 19 49 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D8310 002D5250 7F E3 FB 78 */ mr r3, r31 /* 802D8314 002D5254 7F 84 E3 78 */ mr r4, r28 /* 802D8318 002D5258 48 06 32 69 */ bl DCInvalidateRange @@ -62,7 +62,7 @@ lbl_802D8324: /* 802D8344 002D5284 39 00 00 01 */ li r8, 1 /* 802D8348 002D5288 7F C9 F3 78 */ mr r9, r30 /* 802D834C 002D528C 39 40 00 00 */ li r10, 0 -/* 802D8350 002D5290 48 00 19 05 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D8350 002D5290 48 00 19 05 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D8354 002D5294 7F 83 E3 78 */ mr r3, r28 /* 802D8358 002D5298 38 80 00 20 */ li r4, 0x20 /* 802D835C 002D529C 48 06 32 25 */ bl DCInvalidateRange @@ -90,7 +90,7 @@ lbl_802D8394: /* 802D83B0 002D52F0 39 00 00 01 */ li r8, 1 /* 802D83B4 002D52F4 7F C9 F3 78 */ mr r9, r30 /* 802D83B8 002D52F8 39 40 00 00 */ li r10, 0 -/* 802D83BC 002D52FC 48 00 18 99 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D83BC 002D52FC 48 00 18 99 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D83C0 002D5300 7F E3 FB 78 */ mr r3, r31 /* 802D83C4 002D5304 7F 44 D3 78 */ mr r4, r26 /* 802D83C8 002D5308 48 06 31 B9 */ bl DCInvalidateRange @@ -111,7 +111,7 @@ lbl_802D83E0: /* 802D83FC 002D533C 39 00 00 01 */ li r8, 1 /* 802D8400 002D5340 7F C9 F3 78 */ mr r9, r30 /* 802D8404 002D5344 39 40 00 00 */ li r10, 0 -/* 802D8408 002D5348 48 00 18 4D */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D8408 002D5348 48 00 18 4D */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D840C 002D534C 7F E3 FB 78 */ mr r3, r31 /* 802D8410 002D5350 7F 44 D3 78 */ mr r4, r26 /* 802D8414 002D5354 48 06 31 6D */ bl DCInvalidateRange diff --git a/include/JSystem/JKernel/JKRDvdArchive/asm/func_802D8474.s b/include/JSystem/JKernel/JKRDvdArchive/asm/func_802D8474.s index 1f7728e518..84ad42e21b 100644 --- a/include/JSystem/JKernel/JKRDvdArchive/asm/func_802D8474.s +++ b/include/JSystem/JKernel/JKRDvdArchive/asm/func_802D8474.s @@ -45,7 +45,7 @@ lbl_802D84E0: /* 802D8510 002D5450 39 00 00 01 */ li r8, 1 /* 802D8514 002D5454 7F C9 F3 78 */ mr r9, r30 /* 802D8518 002D5458 39 40 00 00 */ li r10, 0 -/* 802D851C 002D545C 48 00 17 39 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D851C 002D545C 48 00 17 39 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D8520 002D5460 7F 83 E3 78 */ mr r3, r28 /* 802D8524 002D5464 7F 64 DB 78 */ mr r4, r27 /* 802D8528 002D5468 48 06 30 59 */ bl DCInvalidateRange @@ -64,7 +64,7 @@ lbl_802D8538: /* 802D8558 002D5498 39 00 00 01 */ li r8, 1 /* 802D855C 002D549C 7F C9 F3 78 */ mr r9, r30 /* 802D8560 002D54A0 39 40 00 00 */ li r10, 0 -/* 802D8564 002D54A4 48 00 16 F1 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D8564 002D54A4 48 00 16 F1 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D8568 002D54A8 7F 63 DB 78 */ mr r3, r27 /* 802D856C 002D54AC 38 80 00 20 */ li r4, 0x20 /* 802D8570 002D54B0 48 06 30 11 */ bl DCInvalidateRange @@ -91,7 +91,7 @@ lbl_802D8538: /* 802D85C4 002D5504 39 00 00 01 */ li r8, 1 /* 802D85C8 002D5508 7F C9 F3 78 */ mr r9, r30 /* 802D85CC 002D550C 39 40 00 00 */ li r10, 0 -/* 802D85D0 002D5510 48 00 16 85 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D85D0 002D5510 48 00 16 85 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D85D4 002D5514 7F 63 DB 78 */ mr r3, r27 /* 802D85D8 002D5518 7F 84 E3 78 */ mr r4, r28 /* 802D85DC 002D551C 48 06 2F A5 */ bl DCInvalidateRange @@ -114,7 +114,7 @@ lbl_802D85EC: /* 802D861C 002D555C 39 00 00 01 */ li r8, 1 /* 802D8620 002D5560 7F C9 F3 78 */ mr r9, r30 /* 802D8624 002D5564 39 40 00 00 */ li r10, 0 -/* 802D8628 002D5568 48 00 16 2D */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D8628 002D5568 48 00 16 2D */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D862C 002D556C 7F 83 E3 78 */ mr r3, r28 /* 802D8630 002D5570 7F 24 CB 78 */ mr r4, r25 /* 802D8634 002D5574 48 06 2F 4D */ bl DCInvalidateRange diff --git a/include/JSystem/JKernel/JKRDvdArchive/asm/func_802D8698.s b/include/JSystem/JKernel/JKRDvdArchive/asm/func_802D8698.s index 4fe8320948..5bf7d8bd87 100644 --- a/include/JSystem/JKernel/JKRDvdArchive/asm/func_802D8698.s +++ b/include/JSystem/JKernel/JKRDvdArchive/asm/func_802D8698.s @@ -57,7 +57,7 @@ lbl_802D8734: /* 802D8760 002D56A0 80 1D 00 08 */ lwz r0, 8(r29) /* 802D8764 002D56A4 7D 29 02 14 */ add r9, r9, r0 /* 802D8768 002D56A8 39 40 00 00 */ li r10, 0 -/* 802D876C 002D56AC 48 00 14 E9 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D876C 002D56AC 48 00 14 E9 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D8770 002D56B0 7F C3 F3 78 */ mr r3, r30 /* 802D8774 002D56B4 38 80 00 20 */ li r4, 0x20 /* 802D8778 002D56B8 48 06 2E 09 */ bl DCInvalidateRange diff --git a/include/JSystem/JKernel/JKRDvdRipper/JKRDvdRipper.h b/include/JSystem/JKernel/JKRDvdRipper/JKRDvdRipper.h index faf3408c78..ab6fce7d24 100644 --- a/include/JSystem/JKernel/JKRDvdRipper/JKRDvdRipper.h +++ b/include/JSystem/JKernel/JKRDvdRipper/JKRDvdRipper.h @@ -1,10 +1,14 @@ #ifndef __JKRDVDRIPPER_H__ #define __JKRDVDRIPPER_H__ +#include "JSystem/JKernel/JKRDecomp/JKRDecomp.h" #include "dolphin/types.h" enum JKRExpandSwitch { - + EXPAND_SWITCH_UNKNOWN0 = 0, + EXPAND_SWITCH_UNKNOWN1 = 1, + EXPAND_SWITCH_UNKNOWN2 = 2, + __FORCE_EXPAND_SWITCH_32BIT = UINT32_MAX, }; class JKRHeap; @@ -12,14 +16,19 @@ class JKRDvdFile; class JKRDvdRipper { public: enum EAllocDirection { + UNKNOWN_EALLOC_DIRECTION = 0, + FORWARD = 1, + BACKWARD = 2, + __FORCE_EALLOC_DIRECTION_32BIT = UINT32_MAX, }; - void loadToMainRAM(char const*, u8*, JKRExpandSwitch, u32, JKRHeap*, EAllocDirection, u32, int*, - u32*); - void loadToMainRAM(long, u8*, JKRExpandSwitch, u32, JKRHeap*, EAllocDirection, u32, int*, u32*); - void loadToMainRAM(JKRDvdFile*, u8*, JKRExpandSwitch, u32, JKRHeap*, EAllocDirection, u32, int*, - u32*); + static void* loadToMainRAM(char const*, u8*, JKRExpandSwitch, u32, JKRHeap*, EAllocDirection, + u32, JKRCompression*, u32*); + static void* loadToMainRAM(long, u8*, JKRExpandSwitch, u32, JKRHeap*, EAllocDirection, u32, + JKRCompression*, u32*); + static void* loadToMainRAM(JKRDvdFile*, u8*, JKRExpandSwitch, u32, JKRHeap*, EAllocDirection, + u32, JKRCompression*, u32*); void isErrorRetry(void); }; diff --git a/include/JSystem/JKernel/JKRDvdRipper/asm/func_802D9B98.s b/include/JSystem/JKernel/JKRDvdRipper/asm/func_802D9B98.s index 804b88def1..66f96e93e3 100644 --- a/include/JSystem/JKernel/JKRDvdRipper/asm/func_802D9B98.s +++ b/include/JSystem/JKernel/JKRDvdRipper/asm/func_802D9B98.s @@ -1,4 +1,4 @@ -/* loadToMainRAM__12JKRDvdRipperFPCcPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl JKRDvdRipper::loadToMainRAM(char const *, unsigned char *, JKRExpandSwitch, unsigned long, JKRHeap *, JKRDvdRipper::EAllocDirection, unsigned long, int *, unsigned long *) */ +/* loadToMainRAM__12JKRDvdRipperFPCcPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl JKRDvdRipper::loadToMainRAM(char const *, unsigned char *, JKRExpandSwitch, unsigned long, JKRHeap *, JKRDvdRipper::EAllocDirection, unsigned long, int *, unsigned long *) */ /* JKRDvdRipper_NS_loadToMainRAM */ /* 802D9B98 002D6AD8 94 21 FE D0 */ stwu r1, -0x130(r1) /* 802D9B9C 002D6ADC 7C 08 02 A6 */ mflr r0 @@ -36,7 +36,7 @@ lbl_802D9C00: /* 802D9C18 002D6B58 7F 88 E3 78 */ mr r8, r28 /* 802D9C1C 002D6B5C 7F A9 EB 78 */ mr r9, r29 /* 802D9C20 002D6B60 7F CA F3 78 */ mr r10, r30 -/* 802D9C24 002D6B64 48 00 00 ED */ bl loadToMainRAM__12JKRDvdRipperFP10JKRDvdFilePUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D9C24 002D6B64 48 00 00 ED */ bl loadToMainRAM__12JKRDvdRipperFP10JKRDvdFilePUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D9C28 002D6B68 7C 7F 1B 78 */ mr r31, r3 /* 802D9C2C 002D6B6C 38 61 00 10 */ addi r3, r1, 0x10 /* 802D9C30 002D6B70 38 80 FF FF */ li r4, -1 diff --git a/include/JSystem/JKernel/JKRDvdRipper/asm/func_802D9C54.s b/include/JSystem/JKernel/JKRDvdRipper/asm/func_802D9C54.s index b61001b794..5b7dcb6e71 100644 --- a/include/JSystem/JKernel/JKRDvdRipper/asm/func_802D9C54.s +++ b/include/JSystem/JKernel/JKRDvdRipper/asm/func_802D9C54.s @@ -1,4 +1,4 @@ -/* loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl JKRDvdRipper::loadToMainRAM(long, unsigned char *, JKRExpandSwitch, unsigned long, JKRHeap *, JKRDvdRipper::EAllocDirection, unsigned long, int *, unsigned long *) */ +/* loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl JKRDvdRipper::loadToMainRAM(long, unsigned char *, JKRExpandSwitch, unsigned long, JKRHeap *, JKRDvdRipper::EAllocDirection, unsigned long, int *, unsigned long *) */ /* JKRDvdRipper_NS_loadToMainRAM_X1_ */ /* 802D9C54 002D6B94 94 21 FE D0 */ stwu r1, -0x130(r1) /* 802D9C58 002D6B98 7C 08 02 A6 */ mflr r0 @@ -36,7 +36,7 @@ lbl_802D9CBC: /* 802D9CD4 002D6C14 7F 88 E3 78 */ mr r8, r28 /* 802D9CD8 002D6C18 7F A9 EB 78 */ mr r9, r29 /* 802D9CDC 002D6C1C 7F CA F3 78 */ mr r10, r30 -/* 802D9CE0 002D6C20 48 00 00 31 */ bl loadToMainRAM__12JKRDvdRipperFP10JKRDvdFilePUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D9CE0 002D6C20 48 00 00 31 */ bl loadToMainRAM__12JKRDvdRipperFP10JKRDvdFilePUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D9CE4 002D6C24 7C 7F 1B 78 */ mr r31, r3 /* 802D9CE8 002D6C28 38 61 00 10 */ addi r3, r1, 0x10 /* 802D9CEC 002D6C2C 38 80 FF FF */ li r4, -1 diff --git a/include/JSystem/JKernel/JKRDvdRipper/asm/func_802D9D10.s b/include/JSystem/JKernel/JKRDvdRipper/asm/func_802D9D10.s index 903a0154d5..d0ef664f66 100644 --- a/include/JSystem/JKernel/JKRDvdRipper/asm/func_802D9D10.s +++ b/include/JSystem/JKernel/JKRDvdRipper/asm/func_802D9D10.s @@ -1,4 +1,4 @@ -/* loadToMainRAM__12JKRDvdRipperFP10JKRDvdFilePUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl JKRDvdRipper::loadToMainRAM(JKRDvdFile *, unsigned char *, JKRExpandSwitch, unsigned long, JKRHeap *, JKRDvdRipper::EAllocDirection, unsigned long, int *, unsigned long *) */ +/* loadToMainRAM__12JKRDvdRipperFP10JKRDvdFilePUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl JKRDvdRipper::loadToMainRAM(JKRDvdFile *, unsigned char *, JKRExpandSwitch, unsigned long, JKRHeap *, JKRDvdRipper::EAllocDirection, unsigned long, int *, unsigned long *) */ /* JKRDvdRipper_NS_loadToMainRAM_X2_ */ /* 802D9D10 002D6C50 94 21 FF 40 */ stwu r1, -0xc0(r1) /* 802D9D14 002D6C54 7C 08 02 A6 */ mflr r0 diff --git a/include/JSystem/JKernel/JKRFileLoader/JKRFileLoader.h b/include/JSystem/JKernel/JKRFileLoader/JKRFileLoader.h index bc0ce82cd8..e5d2b8e6b5 100644 --- a/include/JSystem/JKernel/JKRFileLoader/JKRFileLoader.h +++ b/include/JSystem/JKernel/JKRFileLoader/JKRFileLoader.h @@ -36,7 +36,7 @@ protected: /* 0x00 */ // vtable /* 0x04 */ // JKRDisposer /* 0x18 */ JSULink mFileLoaderLink; - /* 0x28 */ char* mVolumeName; + /* 0x28 */ const char* mVolumeName; /* 0x2C */ u32 mVolumeType; /* 0x30 */ bool mIsMounted; /* 0x31 */ u8 field_0x31[3]; diff --git a/include/JSystem/JKernel/JKRMemArchive/JKRMemArchive.h b/include/JSystem/JKernel/JKRMemArchive/JKRMemArchive.h index e3b698b0a9..dd20af882d 100644 --- a/include/JSystem/JKernel/JKRMemArchive/JKRMemArchive.h +++ b/include/JSystem/JKernel/JKRMemArchive/JKRMemArchive.h @@ -6,6 +6,7 @@ enum JKRMemBreakFlag { JKRMEMBREAK_FLAG_UNKNOWN0 = 0, + JKRMEMBREAK_FLAG_UNKNOWN1 = 1, _JKRMemBreakFlag_PADDING_32BIT = 0xFFFFFFFF, }; @@ -15,23 +16,28 @@ public: JKRMemArchive(void*, u32, JKRMemBreakFlag); virtual ~JKRMemArchive(); - void open(long, JKRArchive::EMountDirection); - void open(void*, u32, JKRMemBreakFlag); + bool open(long, JKRArchive::EMountDirection); + bool open(void*, u32, JKRMemBreakFlag); /* vt[09] */ void removeResourceAll(void); /* override */ /* vt[10] */ bool removeResource(void*); /* override */ - /* vt[15] */ void getExpandedResSize(void const*) const; /* override */ + /* vt[15] */ u32 getExpandedResSize(const void*) const; /* override */ /* vt[16] */ void* fetchResource(SDIFileEntry*, u32*); /* override */ /* vt[17] */ void* fetchResource(void*, u32, SDIFileEntry*, u32*); /* override */ public: - static void fetchResource_subroutine(u8*, u32, u8*, u32, int); + static u32 fetchResource_subroutine(u8*, u32, u8*, u32, JKRCompression); private: /* 0x00 */ // vtable /* 0x04 */ // JKRArchive - u8 unk[20]; + /* 0x5C */ JKRCompression mCompression; + /* 0x60 */ EMountDirection mMountDirection; + /* 0x64 */ SArcHeader* mArcHeader; + /* 0x68 */ u8* mArchiveData; + /* 0x6C */ bool mIsOpen; + /* 0x6D */ u8 field_0x6d[3]; }; #endif diff --git a/include/JSystem/JKernel/JKRMemArchive/asm/func_802D6BCC.s b/include/JSystem/JKernel/JKRMemArchive/asm/func_802D6BCC.s index 3b028d5bd8..afcf389570 100644 --- a/include/JSystem/JKernel/JKRMemArchive/asm/func_802D6BCC.s +++ b/include/JSystem/JKernel/JKRMemArchive/asm/func_802D6BCC.s @@ -27,7 +27,7 @@ /* 802D6C2C 002D3B6C 39 00 00 01 */ li r8, 1 /* 802D6C30 002D3B70 39 20 00 00 */ li r9, 0 /* 802D6C34 002D3B74 39 5F 00 5C */ addi r10, r31, 0x5c -/* 802D6C38 002D3B78 48 00 30 1D */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D6C38 002D3B78 48 00 30 1D */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D6C3C 002D3B7C 90 7F 00 64 */ stw r3, 0x64(r31) /* 802D6C40 002D3B80 80 7F 00 64 */ lwz r3, 0x64(r31) /* 802D6C44 002D3B84 28 03 00 00 */ cmplwi r3, 0 @@ -46,7 +46,7 @@ lbl_802D6C58: /* 802D6C74 002D3BB4 39 00 00 02 */ li r8, 2 /* 802D6C78 002D3BB8 39 20 00 00 */ li r9, 0 /* 802D6C7C 002D3BBC 39 5F 00 5C */ addi r10, r31, 0x5c -/* 802D6C80 002D3BC0 48 00 2F D5 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl +/* 802D6C80 002D3BC0 48 00 2F D5 */ bl loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl /* 802D6C84 002D3BC4 90 7F 00 64 */ stw r3, 0x64(r31) /* 802D6C88 002D3BC8 80 7F 00 64 */ lwz r3, 0x64(r31) /* 802D6C8C 002D3BCC 28 03 00 00 */ cmplwi r3, 0 diff --git a/include/JSystem/JKernel/JKRMemArchive/asm/func_802D6E10.s b/include/JSystem/JKernel/JKRMemArchive/asm/func_802D6E10.s index 129a0744e3..a6bf0c8288 100644 --- a/include/JSystem/JKernel/JKRMemArchive/asm/func_802D6E10.s +++ b/include/JSystem/JKernel/JKRMemArchive/asm/func_802D6E10.s @@ -41,7 +41,7 @@ lbl_802D6E88: /* 802D6E94 002D3DD4 7F E4 FB 78 */ mr r4, r31 /* 802D6E98 002D3DD8 7F A5 EB 78 */ mr r5, r29 /* 802D6E9C 002D3DDC 7D 06 43 78 */ mr r6, r8 -/* 802D6EA0 002D3DE0 48 00 00 BD */ bl fetchResource_subroutine__13JKRMemArchiveFPUcUlPUcUli +/* 802D6EA0 002D3DE0 48 00 00 BD */ bl fetchResource_subroutine__13JKRMemArchiveFPUcUlPUcUl14JKRCompression /* 802D6EA4 002D3DE4 7C 7F 1B 78 */ mr r31, r3 lbl_802D6EA8: /* 802D6EA8 002D3DE8 28 1E 00 00 */ cmplwi r30, 0 diff --git a/include/JSystem/JKernel/JKRMemArchive/asm/func_802D6F5C.s b/include/JSystem/JKernel/JKRMemArchive/asm/func_802D6F5C.s index 7f6f9b4032..5dbcb76001 100644 --- a/include/JSystem/JKernel/JKRMemArchive/asm/func_802D6F5C.s +++ b/include/JSystem/JKernel/JKRMemArchive/asm/func_802D6F5C.s @@ -1,4 +1,4 @@ -/* fetchResource_subroutine__13JKRMemArchiveFPUcUlPUcUli __ct__13JKRMemArchiveFlQ210JKRArchive15EMountDirection::fetchResource_subroutine(unsigned char *, unsigned long, unsigned char *, unsigned long, int) */ +/* fetchResource_subroutine__13JKRMemArchiveFPUcUlPUcUl14JKRCompression __ct__13JKRMemArchiveFlQ210JKRArchive15EMountDirection::fetchResource_subroutine(unsigned char *, unsigned long, unsigned char *, unsigned long, int) */ /* JKRMemArchive_NS_fetchResource_subroutine */ /* 802D6F5C 002D3E9C 94 21 FF F0 */ stwu r1, -0x10(r1) /* 802D6F60 002D3EA0 7C 08 02 A6 */ mflr r0 diff --git a/include/functions.h b/include/functions.h index d6a5f56f2e..c5466bdb50 100644 --- a/include/functions.h +++ b/include/functions.h @@ -923,7 +923,7 @@ void __ct__13JKRMemArchiveFlQ210JKRArchive15EMountDirection(void); void __dt__13JKRMemArchiveFv(void); void fetchResource__13JKRMemArchiveFP12SDIFileEntryPUl(void); void fetchResource__13JKRMemArchiveFPvUlP12SDIFileEntryPUl(void); -void fetchResource_subroutine__13JKRMemArchiveFPUcUlPUcUli(void); +void fetchResource_subroutine__13JKRMemArchiveFPUcUlPUcUl14JKRCompression(void); void getExpandedResSize__13JKRMemArchiveCFPCv(void); void open__13JKRMemArchiveFPvUl15JKRMemBreakFlag(void); void open__13JKRMemArchiveFlQ210JKRArchive15EMountDirection(void); @@ -985,11 +985,11 @@ void __sinit_JKRDvdRipper_cpp(void); void decompSZS_subroutine__FPUcPUc(void); void firstSrcData__Fv(void); void isErrorRetry__12JKRDvdRipperFv(void); -void loadToMainRAM__12JKRDvdRipperFP10JKRDvdFilePUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl( +void loadToMainRAM__12JKRDvdRipperFP10JKRDvdFilePUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl( void); -void loadToMainRAM__12JKRDvdRipperFPCcPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl( +void loadToMainRAM__12JKRDvdRipperFP10JKRDvdFilePUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl( void); -void loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl( +void loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlP14JKRCompressionPUl( void); void nextSrcData__FPUc(void); }; diff --git a/include/global.h b/include/global.h index 7a76277774..0b80728dcf 100644 --- a/include/global.h +++ b/include/global.h @@ -13,6 +13,7 @@ struct Vec { }; #define JUT_ASSERT(...) +#define ASSERT(...) #include "dolphin/types.h" diff --git a/include/variables.h b/include/variables.h index f21c50a74d..a54119c8ad 100644 --- a/include/variables.h +++ b/include/variables.h @@ -263,8 +263,8 @@ extern JSUList lbl_8043428C; // JSUList JKRThread::sThrea extern u8 lbl_803CC398; // JKRDvdArchive::__vt extern u8 lbl_8039D1B0; // "JKRDvdArchive.cpp" -extern u8 lbl_803CC2D8; // JKRMemArchive::__vt -extern u8 lbl_8039D160; // "JKRMemArchive.cpp" +extern u8 lbl_803CC2D8; // JKRMemArchive::__vt +extern const char lbl_8039D160[16]; // "JKRMemArchive.cpp" extern u8 lbl_803CC348; // JKRAramArchive::__vt extern u8 lbl_8039D188; // "JKRAramArchive.cpp" diff --git a/libs/JSystem/JKernel/JKRAramArchive.cpp b/libs/JSystem/JKernel/JKRAramArchive.cpp index 2e44548ba5..c9699b2c4d 100644 --- a/libs/JSystem/JKernel/JKRAramArchive.cpp +++ b/libs/JSystem/JKernel/JKRAramArchive.cpp @@ -48,7 +48,7 @@ asm void JKRAramArchive::fetchResource_subroutine(u32, u32, JKRHeap*, int, u8**) #include "JSystem/JKernel/JKRAramArchive/asm/func_802D7914.s" } -asm void JKRAramArchive::getExpandedResSize(void const*) const { +asm u32 JKRAramArchive::getExpandedResSize(void const*) const { nofralloc #include "JSystem/JKernel/JKRAramArchive/asm/func_802D7A64.s" } diff --git a/libs/JSystem/JKernel/JKRCompArchive.cpp b/libs/JSystem/JKernel/JKRCompArchive.cpp index f480576c16..69a0c02ed6 100644 --- a/libs/JSystem/JKernel/JKRCompArchive.cpp +++ b/libs/JSystem/JKernel/JKRCompArchive.cpp @@ -36,7 +36,7 @@ asm bool JKRCompArchive::removeResource(void*) { #include "JSystem/JKernel/JKRCompArchive/asm/func_802D92F4.s" } -asm void JKRCompArchive::getExpandedResSize(void const*) const { +asm u32 JKRCompArchive::getExpandedResSize(void const*) const { nofralloc #include "JSystem/JKernel/JKRCompArchive/asm/func_802D9360.s" } diff --git a/libs/JSystem/JKernel/JKRDecomp.cpp b/libs/JSystem/JKernel/JKRDecomp.cpp index 59b39d7237..671017ef5b 100644 --- a/libs/JSystem/JKernel/JKRDecomp.cpp +++ b/libs/JSystem/JKernel/JKRDecomp.cpp @@ -92,20 +92,14 @@ bool JKRDecomp::orderSync(u8* srcBuffer, u8* dstBuffer, u32 srcLength, u32 dstLe } void JKRDecomp::decode(u8* srcBuffer, u8* dstBuffer, u32 srcLength, u32 dstLength) { - Compression compression = checkCompressed(srcBuffer); - if (compression == JKRDecomp::YAY0) { + JKRCompression compression = checkCompressed(srcBuffer); + if (compression == COMPRESSION_YAY0) { decodeSZP(srcBuffer, dstBuffer, srcLength, dstLength); - } else if (compression == JKRDecomp::YAZ0) { + } else if (compression == COMPRESSION_YAZ0) { decodeSZS(srcBuffer, dstBuffer, srcLength, dstLength); } } -#define READ_BIG_ENDIAN_U32(P) \ - (((u32)(((u8*)(P))[0]) << 0x18) | ((u32)(((u8*)(P))[1]) << 0x10) | \ - ((u32)(((u8*)(P))[2]) << 8) | ((u32)(((u8*)(P))[3]))) - -#define READ_BIG_ENDIAN_U16(P) (((u32)(((u8*)(P))[0]) << 8) | ((u32)(((u8*)(P))[1]))) - // All instructions match. Wrong registers are used. #ifdef NONMATCHING void JKRDecomp::decodeSZP(u8* src, u8* dst, u32 srcLength, u32 dstLength) { @@ -199,19 +193,19 @@ asm void JKRDecomp::decodeSZS(u8*, u8*, u32, u32){nofralloc #include "JSystem/JKernel/JKRDecomp/asm/func_802DBC14.s" } -JKRDecomp::Compression JKRDecomp::checkCompressed(u8* src) { +JKRCompression JKRDecomp::checkCompressed(u8* src) { if ((src[0] == 'Y') && (src[1] == 'a') && (src[3] == '0')) { if (src[2] == 'y') { - return JKRDecomp::YAY0; + return COMPRESSION_YAY0; } if (src[2] == 'z') { - return JKRDecomp::YAZ0; + return COMPRESSION_YAZ0; } } if ((src[0] == 'A') && (src[1] == 'S') && (src[2] == 'R')) { - return JKRDecomp::ASR; + return COMPRESSION_ASR; } - return JKRDecomp::NONE; + return COMPRESSION_NONE; } JKRDecompCommand::JKRDecompCommand() { diff --git a/libs/JSystem/JKernel/JKRDvdArchive.cpp b/libs/JSystem/JKernel/JKRDvdArchive.cpp index 07579d6e48..c60c137771 100644 --- a/libs/JSystem/JKernel/JKRDvdArchive.cpp +++ b/libs/JSystem/JKernel/JKRDvdArchive.cpp @@ -36,7 +36,7 @@ asm void JKRDvdArchive::fetchResource_subroutine(long, u32, u32, JKRHeap*, int, #include "JSystem/JKernel/JKRDvdArchive/asm/func_802D8474.s" } -asm void JKRDvdArchive::getExpandedResSize(void const*) const { +asm u32 JKRDvdArchive::getExpandedResSize(void const*) const { nofralloc #include "JSystem/JKernel/JKRDvdArchive/asm/func_802D8698.s" } diff --git a/libs/JSystem/JKernel/JKRDvdRipper.cpp b/libs/JSystem/JKernel/JKRDvdRipper.cpp index 855d5ee568..b47bc700be 100644 --- a/libs/JSystem/JKernel/JKRDvdRipper.cpp +++ b/libs/JSystem/JKernel/JKRDvdRipper.cpp @@ -2,20 +2,20 @@ #include "dvd/dvd.h" #include "global.h" -asm void JKRDvdRipper::loadToMainRAM(char const*, u8*, JKRExpandSwitch, u32, JKRHeap*, - JKRDvdRipper::EAllocDirection, u32, int*, u32*) { +asm void* JKRDvdRipper::loadToMainRAM(const char*, u8*, JKRExpandSwitch, u32, JKRHeap*, + JKRDvdRipper::EAllocDirection, u32, JKRCompression*, u32*) { nofralloc #include "JSystem/JKernel/JKRDvdRipper/asm/func_802D9B98.s" } -asm void JKRDvdRipper::loadToMainRAM(long, u8*, JKRExpandSwitch, u32, JKRHeap*, - JKRDvdRipper::EAllocDirection, u32, int*, u32*) { +asm void* JKRDvdRipper::loadToMainRAM(long, u8*, JKRExpandSwitch, u32, JKRHeap*, + JKRDvdRipper::EAllocDirection, u32, JKRCompression*, u32*) { nofralloc #include "JSystem/JKernel/JKRDvdRipper/asm/func_802D9C54.s" } -asm void JKRDvdRipper::loadToMainRAM(JKRDvdFile*, u8*, JKRExpandSwitch, u32, JKRHeap*, - JKRDvdRipper::EAllocDirection, u32, int*, u32*) { +asm void* JKRDvdRipper::loadToMainRAM(JKRDvdFile*, u8*, JKRExpandSwitch, u32, JKRHeap*, + JKRDvdRipper::EAllocDirection, u32, JKRCompression*, u32*) { nofralloc #include "JSystem/JKernel/JKRDvdRipper/asm/func_802D9D10.s" } diff --git a/libs/JSystem/JKernel/JKRMemArchive.cpp b/libs/JSystem/JKernel/JKRMemArchive.cpp index f795f42aea..4911dde5c4 100644 --- a/libs/JSystem/JKernel/JKRMemArchive.cpp +++ b/libs/JSystem/JKernel/JKRMemArchive.cpp @@ -1,57 +1,242 @@ #include "JSystem/JKernel/JKRMemArchive/JKRMemArchive.h" +#include "JSystem/JKernel/JKRDvdRipper/JKRDvdRipper.h" #include "global.h" -asm JKRMemArchive::JKRMemArchive(long, JKRArchive::EMountDirection) { - nofralloc -#include "JSystem/JKernel/JKRMemArchive/asm/func_802D69B8.s" +JKRMemArchive::JKRMemArchive(long entryNum, JKRArchive::EMountDirection mountDirection) + : JKRArchive(entryNum, MOUNT_MEM) { + mIsMounted = false; + mMountDirection = mountDirection; + if (!open(entryNum, mMountDirection)) { + return; + } + + mVolumeType = 'RARC'; + mVolumeName = mStringTable + (u32)mNodes->name; + + getVolumeList().prepend(&mFileLoaderLink); + mIsMounted = true; } -asm JKRMemArchive::JKRMemArchive(void*, u32, JKRMemBreakFlag) { - nofralloc -#include "JSystem/JKernel/JKRMemArchive/asm/func_802D6A6C.s" +JKRMemArchive::JKRMemArchive(void* buffer, u32 bufferSize, JKRMemBreakFlag param_3) + : JKRArchive((s32)buffer, MOUNT_MEM) { + mIsMounted = false; + if (!open(buffer, bufferSize, param_3)) { + return; + } + + mVolumeType = 'RARC'; + mVolumeName = mStringTable + (u32)mNodes->name; + + getVolumeList().prepend(&mFileLoaderLink); + mIsMounted = true; } -asm JKRMemArchive::~JKRMemArchive() { - nofralloc -#include "JSystem/JKernel/JKRMemArchive/asm/func_802D6B24.s" +JKRMemArchive::~JKRMemArchive() { + if (mIsMounted == true) { + if (mIsOpen) { + if (mArcHeader) + JKRFreeToHeap(mHeap, mArcHeader); + } + + getVolumeList().remove(&mFileLoaderLink); + mIsMounted = false; + } } -asm void JKRMemArchive::open(long, JKRArchive::EMountDirection) { +// full match, except: +// mArchiveData = (u8*)(mArcHeader->file_data_offset + mArcHeader->header_length + (u32)mArcHeader); +// where the addition is swapped. +#ifdef NONMATCHING +bool JKRMemArchive::open(long entryNum, JKRArchive::EMountDirection mountDirection) { + mArcHeader = NULL; + mArcInfoBlock = NULL; + mArchiveData = NULL; + mNodes = NULL; + mFiles = NULL; + mStringTable = NULL; + mIsOpen = false; + mMountDirection = mountDirection; + + if (mMountDirection == JKRArchive::HEAD) { + u32 loadedSize; + mArcHeader = (SArcHeader*)JKRDvdRipper::loadToMainRAM( + entryNum, NULL, EXPAND_SWITCH_UNKNOWN1, 0, mHeap, JKRDvdRipper::FORWARD, 0, + &mCompression, &loadedSize); + if (mArcHeader) { + DCInvalidateRange(mArcHeader, loadedSize); + } + } else { + u32 loadedSize; + mArcHeader = (SArcHeader*)JKRDvdRipper::loadToMainRAM( + entryNum, NULL, EXPAND_SWITCH_UNKNOWN1, 0, mHeap, JKRDvdRipper::BACKWARD, 0, + &mCompression, &loadedSize); + if (mArcHeader) { + DCInvalidateRange(mArcHeader, loadedSize); + } + } + + if (!mArcHeader) { + mMountMode = UNKNOWN_MOUNT_MODE; + } else { + ASSERT(mArcHeader->signature == 'RARC'); + mArcInfoBlock = (SArcDataInfo*)((u8*)mArcHeader + mArcHeader->header_length); + mNodes = (SDirEntry*)((u8*)&mArcInfoBlock->num_nodes + mArcInfoBlock->node_offset); + mFiles = (SDIFileEntry*)((u8*)&mArcInfoBlock->num_nodes + mArcInfoBlock->file_entry_offset); + mStringTable = (char*)((u8*)&mArcInfoBlock->num_nodes + mArcInfoBlock->string_table_offset); + + mArchiveData = + (u8*)(mArcHeader->file_data_offset + mArcHeader->header_length + (u32)mArcHeader); + mIsOpen = true; + } + + return mMountMode != UNKNOWN_MOUNT_MODE; +} +#else +asm bool JKRMemArchive::open(long entryNum, JKRArchive::EMountDirection mountDirection) { nofralloc #include "JSystem/JKernel/JKRMemArchive/asm/func_802D6BCC.s" } +#endif -asm void JKRMemArchive::open(void*, u32, JKRMemBreakFlag) { +// full match, except: +// mArchiveData = (u8*)(mArcHeader->file_data_offset + mArcHeader->header_length + (u32)mArcHeader); +// where the addition is swapped. +#ifdef NONMATCHING +bool JKRMemArchive::open(void* buffer, u32 bufferSize, JKRMemBreakFlag flag) { + mArcHeader = (SArcHeader*)buffer; + + ASSERT(mArcHeader->signature == 'RARC'); + mArcInfoBlock = (SArcDataInfo*)((u8*)mArcHeader + mArcHeader->header_length); + mNodes = (SDirEntry*)((u8*)&mArcInfoBlock->num_nodes + mArcInfoBlock->node_offset); + mFiles = (SDIFileEntry*)((u8*)&mArcInfoBlock->num_nodes + mArcInfoBlock->file_entry_offset); + mStringTable = (char*)((u8*)&mArcInfoBlock->num_nodes + mArcInfoBlock->string_table_offset); + mArchiveData = + (u8*)(mArcHeader->file_data_offset + mArcHeader->header_length + (u32)mArcHeader); + mIsOpen = (flag == JKRMEMBREAK_FLAG_UNKNOWN1); + mHeap = JKRHeap::findFromRoot(buffer); + mCompression = JKRDecomp::NONE; + return true; +} +#else +asm bool JKRMemArchive::open(void* buffer, u32 bufferSize, JKRMemBreakFlag flag) { nofralloc #include "JSystem/JKernel/JKRMemArchive/asm/func_802D6D30.s" } +#endif -asm void* JKRMemArchive::fetchResource(SDIFileEntry*, u32*) { - nofralloc -#include "JSystem/JKernel/JKRMemArchive/asm/func_802D6DDC.s" +void* JKRMemArchive::fetchResource(SDIFileEntry* fileEntry, u32* resourceSize) { + if (!fileEntry->data) { + fileEntry->data = mArchiveData + fileEntry->data_offset; + } + + if (resourceSize) { + *resourceSize = fileEntry->data_size; + } + + return fileEntry->data; } -asm void* JKRMemArchive::fetchResource(void*, u32, SDIFileEntry*, u32*) { - nofralloc -#include "JSystem/JKernel/JKRMemArchive/asm/func_802D6E10.s" +void* JKRMemArchive::fetchResource(void* buffer, u32 bufferSize, SDIFileEntry* fileEntry, + u32* resourceSize) { + u32 srcLength = fileEntry->data_size; + if (srcLength > bufferSize) { + srcLength = bufferSize; + } + + if (fileEntry->data != NULL) { + memcpy(buffer, fileEntry->data, srcLength); + } else { + JKRCompression compression; + if (!fileEntry->isCompressed()) { + compression = COMPRESSION_NONE; + } else if (fileEntry->isYAZ0Compressed()) { + compression = COMPRESSION_YAZ0; + } else { + compression = COMPRESSION_YAY0; + } + + void* data = mArchiveData + fileEntry->data_offset; + srcLength = + fetchResource_subroutine((u8*)data, srcLength, (u8*)buffer, bufferSize, compression); + } + + if (resourceSize) { + *resourceSize = srcLength; + } + + return buffer; } -asm void JKRMemArchive::removeResourceAll(void) { - nofralloc -#include "JSystem/JKernel/JKRMemArchive/asm/func_802D6ED0.s" +void JKRMemArchive::removeResourceAll(void) { + ASSERT(isMounted()); + + if (mArcInfoBlock == NULL) + return; + if (mMountMode == MOUNT_MEM) + return; + + // !@bug: looping over file entries without incrementing the fileEntry pointer. Thus, only the + // first fileEntry will clear/remove the resource data. + SDIFileEntry* fileEntry = mFiles; + for (int i = 0; i < mArcInfoBlock->num_file_entries; i++) { + if (fileEntry->data) { + fileEntry->data = NULL; + } + } } -asm bool JKRMemArchive::removeResource(void*) { - nofralloc -#include "JSystem/JKernel/JKRMemArchive/asm/func_802D6F20.s" +bool JKRMemArchive::removeResource(void* resource) { + ASSERT(isMounted()); + + SDIFileEntry* fileEntry = findPtrResource(resource); + if (!fileEntry) + return false; + + fileEntry->data = NULL; + return true; } -asm void JKRMemArchive::fetchResource_subroutine(u8*, u32, u8*, u32, int) { - nofralloc -#include "JSystem/JKernel/JKRMemArchive/asm/func_802D6F5C.s" +u32 JKRMemArchive::fetchResource_subroutine(u8* src, u32 srcLength, u8* dst, u32 dstLength, + JKRCompression compression) { + switch (compression) { + case COMPRESSION_NONE: + if (srcLength > dstLength) { + srcLength = dstLength; + } + + memcpy(dst, src, srcLength); + return srcLength; + + case COMPRESSION_YAY0: + case COMPRESSION_YAZ0: + u32 expendedSize = JKRDecompExpandSize(src); + srcLength = expendedSize; + if (expendedSize > dstLength) { + srcLength = dstLength; + } + + JKRDecompress(src, dst, srcLength, 0); + return srcLength; + + default: { + const char* file = lbl_8039D160; // "JKRMemArchive.cpp" + const char* format = lbl_8039D160 + 0x12; // "%s" + const char* arg1 = lbl_8039D160 + 0x12 + 0x3; // "??? bad sequence\n" + JUTException_NS_panic_f(file, 0x2d3, format, arg1); + } break; + } + + return 0; } -asm void JKRMemArchive::getExpandedResSize(const void*) const { - nofralloc -#include "JSystem/JKernel/JKRMemArchive/asm/func_802D7030.s" +u32 JKRMemArchive::getExpandedResSize(const void* resource) const { + SDIFileEntry* fileEntry = findPtrResource(resource); + if (fileEntry == NULL) + return 0xFFFFFFFF; + + if (fileEntry->isCompressed() == false) { + return getResSize(resource); + } else { + return JKRDecompExpandSize(resource); + } }