diff --git a/asm/JSystem/JKernel/JKRAram/JKRDecompressFromAramToMainRam__FUlPvUlUlUlPUl.s b/asm/JSystem/JKernel/JKRAram/JKRDecompressFromAramToMainRam__FUlPvUlUlUlPUl.s deleted file mode 100644 index 41e2e4af27..0000000000 --- a/asm/JSystem/JKernel/JKRAram/JKRDecompressFromAramToMainRam__FUlPvUlUlUlPUl.s +++ /dev/null @@ -1,100 +0,0 @@ -lbl_802D2830: -/* 802D2830 94 21 FF D0 */ stwu r1, -0x30(r1) -/* 802D2834 7C 08 02 A6 */ mflr r0 -/* 802D2838 90 01 00 34 */ stw r0, 0x34(r1) -/* 802D283C 39 61 00 30 */ addi r11, r1, 0x30 -/* 802D2840 48 08 F9 8D */ bl _savegpr_25 -/* 802D2844 7C 7A 1B 78 */ mr r26, r3 -/* 802D2848 7C 9B 23 78 */ mr r27, r4 -/* 802D284C 7C BC 2B 78 */ mr r28, r5 -/* 802D2850 7C DD 33 78 */ mr r29, r6 -/* 802D2854 7C FE 3B 78 */ mr r30, r7 -/* 802D2858 7D 1F 43 78 */ mr r31, r8 -/* 802D285C 48 06 AE 99 */ bl OSDisableInterrupts -/* 802D2860 7C 79 1B 78 */ mr r25, r3 -/* 802D2864 88 0D 8E 7C */ lbz r0, data_804513FC(r13) -/* 802D2868 28 00 00 00 */ cmplwi r0, 0 -/* 802D286C 40 82 00 18 */ bne lbl_802D2884 -/* 802D2870 3C 60 80 43 */ lis r3, decompMutex@ha /* 0x804342E8@ha */ -/* 802D2874 38 63 42 E8 */ addi r3, r3, decompMutex@l /* 0x804342E8@l */ -/* 802D2878 48 06 C7 91 */ bl OSInitMutex -/* 802D287C 38 00 00 01 */ li r0, 1 -/* 802D2880 98 0D 8E 7C */ stb r0, data_804513FC(r13) -lbl_802D2884: -/* 802D2884 7F 23 CB 78 */ mr r3, r25 -/* 802D2888 48 06 AE 95 */ bl OSRestoreInterrupts -/* 802D288C 3C 60 80 43 */ lis r3, decompMutex@ha /* 0x804342E8@ha */ -/* 802D2890 38 63 42 E8 */ addi r3, r3, decompMutex@l /* 0x804342E8@l */ -/* 802D2894 48 06 C7 AD */ bl OSLockMutex -/* 802D2898 83 2D 83 38 */ lwz r25, sSZSBufferSize__7JKRAram(r13) -/* 802D289C 80 6D 8D F0 */ lwz r3, sSystemHeap__7JKRHeap(r13) -/* 802D28A0 7F 24 CB 78 */ mr r4, r25 -/* 802D28A4 38 A0 00 20 */ li r5, 0x20 -/* 802D28A8 4B FF BC 2D */ bl alloc__7JKRHeapFUli -/* 802D28AC 90 6D 8E 4C */ stw r3, szpBuf(r13) -/* 802D28B0 7C 03 CA 14 */ add r0, r3, r25 -/* 802D28B4 90 0D 8E 50 */ stw r0, szpEnd(r13) -/* 802D28B8 28 1E 00 00 */ cmplwi r30, 0 -/* 802D28BC 41 82 00 28 */ beq lbl_802D28E4 -/* 802D28C0 80 6D 8D F0 */ lwz r3, sSystemHeap__7JKRHeap(r13) -/* 802D28C4 38 80 11 20 */ li r4, 0x1120 -/* 802D28C8 38 A0 00 00 */ li r5, 0 -/* 802D28CC 4B FF BC 09 */ bl alloc__7JKRHeapFUli -/* 802D28D0 90 6D 8E 54 */ stw r3, refBuf(r13) -/* 802D28D4 38 03 11 20 */ addi r0, r3, 0x1120 -/* 802D28D8 90 0D 8E 58 */ stw r0, refEnd(r13) -/* 802D28DC 90 6D 8E 5C */ stw r3, refCurrent(r13) -/* 802D28E0 48 00 00 0C */ b lbl_802D28EC -lbl_802D28E4: -/* 802D28E4 38 00 00 00 */ li r0, 0 -/* 802D28E8 90 0D 8E 54 */ stw r0, refBuf(r13) -lbl_802D28EC: -/* 802D28EC 93 4D 8E 6C */ stw r26, srcAddress(r13) -/* 802D28F0 38 00 00 00 */ li r0, 0 -/* 802D28F4 90 0D 8E 60 */ stw r0, srcOffset(r13) -/* 802D28F8 28 1C 00 00 */ cmplwi r28, 0 -/* 802D28FC 38 00 FF FF */ li r0, -1 -/* 802D2900 41 82 00 08 */ beq lbl_802D2908 -/* 802D2904 7F 80 E3 78 */ mr r0, r28 -lbl_802D2908: -/* 802D2908 90 0D 8E 64 */ stw r0, transLeft(r13) -/* 802D290C 93 CD 8E 70 */ stw r30, fileOffset(r13) -/* 802D2910 38 00 00 00 */ li r0, 0 -/* 802D2914 90 0D 8E 74 */ stw r0, readCount(r13) -/* 802D2918 93 AD 8E 78 */ stw r29, maxDest(r13) -/* 802D291C 28 1F 00 00 */ cmplwi r31, 0 -/* 802D2920 41 82 00 0C */ beq lbl_802D292C -/* 802D2924 7F E3 FB 78 */ mr r3, r31 -/* 802D2928 48 00 00 08 */ b lbl_802D2930 -lbl_802D292C: -/* 802D292C 38 6D 8E 84 */ la r3, tsArea(r13) /* 80451404-_SDA_BASE_ */ -lbl_802D2930: -/* 802D2930 90 6D 8E 80 */ stw r3, tsPtr(r13) -/* 802D2934 38 00 00 00 */ li r0, 0 -/* 802D2938 90 03 00 00 */ stw r0, 0(r3) -/* 802D293C 48 00 03 05 */ bl firstSrcData__Fv -/* 802D2940 7F 64 DB 78 */ mr r4, r27 -/* 802D2944 48 00 00 5D */ bl decompSZS_subroutine__FPUcPUc -/* 802D2948 80 6D 8E 4C */ lwz r3, szpBuf(r13) -/* 802D294C 38 80 00 00 */ li r4, 0 -/* 802D2950 4B FF BB B1 */ bl free__7JKRHeapFPvP7JKRHeap -/* 802D2954 80 6D 8E 54 */ lwz r3, refBuf(r13) -/* 802D2958 28 03 00 00 */ cmplwi r3, 0 -/* 802D295C 41 82 00 0C */ beq lbl_802D2968 -/* 802D2960 38 80 00 00 */ li r4, 0 -/* 802D2964 4B FF BB 9D */ bl free__7JKRHeapFPvP7JKRHeap -lbl_802D2968: -/* 802D2968 7F 63 DB 78 */ mr r3, r27 -/* 802D296C 80 8D 8E 80 */ lwz r4, tsPtr(r13) -/* 802D2970 80 84 00 00 */ lwz r4, 0(r4) -/* 802D2974 48 06 8C C5 */ bl DCStoreRangeNoSync -/* 802D2978 3C 60 80 43 */ lis r3, decompMutex@ha /* 0x804342E8@ha */ -/* 802D297C 38 63 42 E8 */ addi r3, r3, decompMutex@l /* 0x804342E8@l */ -/* 802D2980 48 06 C7 9D */ bl OSUnlockMutex -/* 802D2984 38 60 00 00 */ li r3, 0 -/* 802D2988 39 61 00 30 */ addi r11, r1, 0x30 -/* 802D298C 48 08 F8 8D */ bl _restgpr_25 -/* 802D2990 80 01 00 34 */ lwz r0, 0x34(r1) -/* 802D2994 7C 08 03 A6 */ mtlr r0 -/* 802D2998 38 21 00 30 */ addi r1, r1, 0x30 -/* 802D299C 4E 80 00 20 */ blr diff --git a/defs/module0.py b/defs/module0.py index 9a278484a3..086ad03b20 100644 --- a/defs/module0.py +++ b/defs/module0.py @@ -22652,7 +22652,7 @@ SYMBOLS = [ {'addr':0x804513F0,'size':4,'pad':0,'label':"fileOffset",'name':"fileOffset",'lib':16,'tu':436,'section':7,'class_template':None,'static':True,'is_reachable':True,'r':[2,0,0],'sh':[0,0,0],'type':"ArbitraryData"}, {'addr':0x804513F4,'size':4,'pad':0,'label':"readCount",'name':"readCount",'lib':16,'tu':436,'section':7,'class_template':None,'static':True,'is_reachable':True,'r':[2,0,0],'sh':[0,0,0],'type':"ArbitraryData"}, {'addr':0x804513F8,'size':4,'pad':0,'label':"maxDest",'name':"maxDest",'lib':16,'tu':436,'section':7,'class_template':None,'static':True,'is_reachable':True,'r':[2,0,0],'sh':[0,0,0],'type':"ArbitraryData"}, - {'addr':0x804513FC,'size':4,'pad':0,'label':"data_804513FC",'name':None,'lib':16,'tu':436,'section':7,'class_template':None,'static':True,'is_reachable':True,'r':[1,0,0],'sh':[0,0,0],'type':"ArbitraryData"}, + {'addr':0x804513FC,'size':4,'pad':0,'label':"s_is_decompress_mutex_initialized",'name':None,'lib':16,'tu':436,'section':7,'class_template':None,'static':True,'is_reachable':True,'r':[1,0,0],'sh':[0,0,0],'type':"ArbitraryData"}, {'addr':0x80451400,'size':4,'pad':0,'label':"tsPtr",'name':"tsPtr",'lib':16,'tu':436,'section':7,'class_template':None,'static':True,'is_reachable':True,'r':[2,0,0],'sh':[0,0,0],'type':"ArbitraryData"}, {'addr':0x80451404,'size':4,'pad':0,'label':"tsArea",'name':"tsArea",'lib':16,'tu':436,'section':7,'class_template':None,'static':True,'is_reachable':True,'r':[1,0,0],'sh':[0,0,0],'type':"ArbitraryData"}, {'addr':0x80451408,'size':4,'pad':0,'label':"sAramStreamObject__13JKRAramStream",'name':"sAramStreamObject__13JKRAramStream",'lib':16,'tu':440,'section':7,'class_template':False,'static':True,'is_reachable':True,'r':[1,0,0],'sh':[0,0,0],'type':"ArbitraryData"}, @@ -49144,7 +49144,7 @@ SYMBOL_NAMES = { "fileOffset":21869, "readCount":21870, "maxDest":21871, - "data_804513FC":21872, + "s_is_decompress_mutex_initialized":21872, "tsPtr":21873, "tsArea":21874, "sAramStreamObject__13JKRAramStream":21875, diff --git a/include/JSystem/JKernel/JKRAram.h b/include/JSystem/JKernel/JKRAram.h index 5fd1b7820e..6ec1a901be 100644 --- a/include/JSystem/JKernel/JKRAram.h +++ b/include/JSystem/JKernel/JKRAram.h @@ -21,7 +21,6 @@ public: u32 getAudioMemSize() const { return mAudioMemorySize; } u32 getGraphMemory() const { return mGraphMemoryPtr; } u32 getGraphMemSize() const { return mGraphMemorySize; } - //private: /* 0x00 */ // vtable /* 0x04 */ // JKRThread @@ -38,8 +37,8 @@ public: static JKRAram* create(u32, u32, long, long, long); static void checkOkAddress(u8*, u32, JKRAramBlock*, u32); static void changeGroupIdIfNeed(u8*, int); - static void mainRamToAram(u8*, u32, u32, JKRExpandSwitch, u32, JKRHeap*, int, u32*); - static void aramToMainRam(u32, u8*, u32, JKRExpandSwitch, u32, JKRHeap*, int, u32*); + static JKRAramBlock* mainRamToAram(u8*, u32, u32, JKRExpandSwitch, u32, JKRHeap*, int, u32*); + static u8* aramToMainRam(u32, u8*, u32, JKRExpandSwitch, u32, JKRHeap*, int, u32*); static void dump(void); static JKRAram* getManager() { return sAramObject; } @@ -73,11 +72,19 @@ inline void* JKRAllocFromAram(u32 size, JKRAramHeap::EAllocMode allocMode) { return JKRAram::getAramHeap()->alloc(size, allocMode); } +inline void JKRFreeToAram(JKRAramBlock* block) { + JKRAram::getAramHeap()->free(block); +} + inline void JKRAramToMainRam(u32 p1, u8* p2, u32 p3, JKRExpandSwitch p4, u32 p5, JKRHeap* p6, int p7, u32* p8) { JKRAram::aramToMainRam(p1, p2, p3, p4, p5, p6, p7, p8); } +inline JKRAramBlock *JKRMainRamToAram(u8 *buf, u32 bufSize, u32 alignedSize, JKRExpandSwitch expandSwitch, u32 fileSize, JKRHeap *heap, int id, u32 *pSize) { + return JKRAram::mainRamToAram(buf, bufSize, alignedSize, expandSwitch, fileSize, heap, id, pSize); +} + // void JKRDecompressFromAramToMainRam(u32, void*, u32, u32, u32, u32*); #endif /* JKRARAM_H */ diff --git a/include/JSystem/JKernel/JKRAramHeap.h b/include/JSystem/JKernel/JKRAramHeap.h index 48293cba8d..23a80a78c2 100644 --- a/include/JSystem/JKernel/JKRAramHeap.h +++ b/include/JSystem/JKernel/JKRAramHeap.h @@ -27,6 +27,9 @@ public: u32 getTotalFreeSize(void); // u32 getUsedSize(void); void dump(void); + void free(JKRAramBlock *block) { + delete block; + } u8 getCurrentGroupID() const { return mGroupId; } diff --git a/include/JSystem/JKernel/JKRCompArchive.h b/include/JSystem/JKernel/JKRCompArchive.h index 74490ddfef..d4c17d44b2 100644 --- a/include/JSystem/JKernel/JKRCompArchive.h +++ b/include/JSystem/JKernel/JKRCompArchive.h @@ -25,12 +25,12 @@ public: private: /* 0x00 */ // vtable /* 0x04 */ // JKRArchive - /* 0x5C */ int field_0x5c; + /* 0x5C */ int mCompression; /* 0x60 */ EMountDirection mMountDirection; /* 0x64 */ int field_0x64; - /* 0x68 */ JKRAramBlock* field_0x68; + /* 0x68 */ JKRAramBlock* mAramPart; /* 0x6C */ int field_0x6c; - /* 0x70 */ JKRDvdFile* field_0x70; + /* 0x70 */ JKRDvdFile* mDvdFile; /* 0x74 */ u32 mSizeOfMemPart; /* 0x78 */ u32 mSizeOfAramPart; /* 0x7C */ int field_0x7c; diff --git a/include/JSystem/JKernel/JKRExpHeap.h b/include/JSystem/JKernel/JKRExpHeap.h index faccd6431c..c8bbca2fb3 100644 --- a/include/JSystem/JKernel/JKRExpHeap.h +++ b/include/JSystem/JKernel/JKRExpHeap.h @@ -85,7 +85,7 @@ public: /* vt[18] */ virtual s32 do_getTotalFreeSize(); /* override */ /* vt[19] */ virtual s32 do_changeGroupID(u8 newGroupID); /* override */ /* vt[20] */ virtual u8 do_getCurrentGroupId(); /* override */ - /* vt[21] */ virtual void state_register(JKRHeap::TState* p, u32 id) const; /* override */ + /* vt[21] */ virtual u32 state_register(JKRHeap::TState* p, u32 id) const; /* override */ /* vt[22] */ virtual bool state_compare(JKRHeap::TState const& r1, JKRHeap::TState const& r2) const; /* override */ diff --git a/include/JSystem/JKernel/JKRHeap.h b/include/JSystem/JKernel/JKRHeap.h index c12504d42f..20d72621a6 100644 --- a/include/JSystem/JKernel/JKRHeap.h +++ b/include/JSystem/JKernel/JKRHeap.h @@ -77,7 +77,7 @@ public: /* vt[18] */ virtual s32 do_getTotalFreeSize() = 0; /* vt[19] */ virtual s32 do_changeGroupID(u8 newGroupID); /* vt[20] */ virtual u8 do_getCurrentGroupId(); - /* vt[21] */ virtual void state_register(JKRHeap::TState* p, u32 id) const; + /* vt[21] */ virtual u32 state_register(JKRHeap::TState* p, u32 id) const; /* vt[22] */ virtual bool state_compare(JKRHeap::TState const& r1, JKRHeap::TState const& r2) const; /* vt[23] */ virtual void state_dump(JKRHeap::TState const& p) const; diff --git a/include/JSystem/JKernel/JKRSolidHeap.h b/include/JSystem/JKernel/JKRSolidHeap.h index f3058bb029..89a326945a 100644 --- a/include/JSystem/JKernel/JKRSolidHeap.h +++ b/include/JSystem/JKernel/JKRSolidHeap.h @@ -40,7 +40,7 @@ public: /* vt[17] */ virtual void* do_getMaxFreeBlock(void); /* override */ /* vt[18] */ virtual s32 do_getTotalFreeSize(void); /* override */ - /* vt[21] */ virtual void state_register(JKRHeap::TState*, u32) const; /* override */ + /* vt[21] */ virtual u32 state_register(JKRHeap::TState*, u32) const; /* override */ /* vt[22] */ virtual bool state_compare(JKRHeap::TState const&, JKRHeap::TState const&) const; /* override */ diff --git a/include/JSystem/JParticle/JPAKeyBlock.h b/include/JSystem/JParticle/JPAKeyBlock.h index 701b252ea0..2f29e74acf 100644 --- a/include/JSystem/JParticle/JPAKeyBlock.h +++ b/include/JSystem/JParticle/JPAKeyBlock.h @@ -3,4 +3,13 @@ #include "dolphin/types.h" +struct JPAKeyBlock { + /* 8027D730 */ JPAKeyBlock(u8 const*); + /* 8027D740 */ void calc(f32); + + const u8* mDataStart; + const f32* field_0x4; +}; + + #endif /* JPAKEYBLOCK_H */ diff --git a/include/JSystem/JParticle/JPAMath.h b/include/JSystem/JParticle/JPAMath.h index abad96a07d..7bb10f6101 100644 --- a/include/JSystem/JParticle/JPAMath.h +++ b/include/JSystem/JParticle/JPAMath.h @@ -7,5 +7,6 @@ void JPAGetXYZRotateMtx(s16 x, s16 y, s16 z, Mtx dst); void JPASetRMtxTVecfromMtx(f32 const (*param_0)[4], f32 (*param_1)[4], JGeometry::TVec3* param_2); +void JPACalcKeyAnmValue(f32 param_0, u16 param_1, f32 const* param_2); #endif /* JPAMATH_H */ diff --git a/include/JSystem/JStudio/JStudio/fvb-data-parse.h b/include/JSystem/JStudio/JStudio/fvb-data-parse.h index 93e6ba3b11..16b3627827 100644 --- a/include/JSystem/JStudio/JStudio/fvb-data-parse.h +++ b/include/JSystem/JStudio/JStudio/fvb-data-parse.h @@ -39,6 +39,7 @@ public: /* 0x04 */ u32 u32Size; /* 0x08 */ u32 u32Type; /* 0x0C */ const void* pContent; + /* 0x10 */ const void* next; }; TParse_TParagraph(const void* content) : TParseData_aligned<4>(content) {} diff --git a/include/JSystem/JStudio/JStudio/stb-data-parse.h b/include/JSystem/JStudio/JStudio/stb-data-parse.h index b21486fcfb..3c99071395 100644 --- a/include/JSystem/JStudio/JStudio/stb-data-parse.h +++ b/include/JSystem/JStudio/JStudio/stb-data-parse.h @@ -65,10 +65,10 @@ public: struct TParse_TParagraph_data : public TParseData_aligned<4> { struct TData { - /* 0x00 */ u8 _0; - /* 0x04 */ u32 _4; + /* 0x00 */ u8 status; + /* 0x04 */ u32 dataSize; /* 0x08 */ u32 _8; - /* 0x0C */ const void* _c; + /* 0x0C */ const void* fileCount; /* 0x10 */ const void* _10; }; diff --git a/include/JSystem/JUtility/JUTConsole.h b/include/JSystem/JUtility/JUTConsole.h index 1fe9467b99..3fa010ded3 100644 --- a/include/JSystem/JUtility/JUTConsole.h +++ b/include/JSystem/JUtility/JUTConsole.h @@ -148,6 +148,7 @@ extern "C" JUTConsole* JUTGetWarningConsole(); extern "C" void JUTReportConsole_f_va(const char*, va_list); extern "C" void JUTReportConsole_f(const char*, ...); extern "C" void JUTWarningConsole(const char* message); +extern "C" void JUTWarningConsole_f(const char* message, ...); extern "C" void JUTReportConsole(const char* message); #endif /* JUTCONSOLE_H */ diff --git a/include/JSystem/JUtility/JUTGraphFifo.h b/include/JSystem/JUtility/JUTGraphFifo.h index 8dae2c7b90..e7c925663a 100644 --- a/include/JSystem/JUtility/JUTGraphFifo.h +++ b/include/JSystem/JUtility/JUTGraphFifo.h @@ -32,4 +32,6 @@ private: /* 0x10 */ u8 field_0x10[0xC]; }; +inline void JUTCreateFifo(u32 bufSize) { new JUTGraphFifo(bufSize); } + #endif /* JUTGRAPHFIFO_H */ diff --git a/libs/JSystem/JFramework/JFWDisplay.cpp b/libs/JSystem/JFramework/JFWDisplay.cpp index 1a08f01667..62bcf33dc4 100644 --- a/libs/JSystem/JFramework/JFWDisplay.cpp +++ b/libs/JSystem/JFramework/JFWDisplay.cpp @@ -19,96 +19,10 @@ // Forward References: // -extern "C" void ctor_subroutine__10JFWDisplayFb(); -extern "C" void __ct__10JFWDisplayFP7JKRHeapQ26JUTXfb10EXfbNumberb(); -extern "C" void __dt__10JFWDisplayFv(); -extern "C" void createManager__10JFWDisplayFPC16_GXRenderModeObjP7JKRHeapQ26JUTXfb10EXfbNumberb(); -extern "C" static void callDirectDraw__Fv(); -extern "C" void prepareCopyDisp__10JFWDisplayFv(); -extern "C" void drawendXfb_single__10JFWDisplayFv(); -extern "C" void exchangeXfb_double__10JFWDisplayFv(); -extern "C" void exchangeXfb_triple__10JFWDisplayFv(); -extern "C" void copyXfb_triple__10JFWDisplayFv(); -extern "C" void preGX__10JFWDisplayFv(); -extern "C" void endGX__10JFWDisplayFv(); -extern "C" void beginRender__10JFWDisplayFv(); -extern "C" void endRender__10JFWDisplayFv(); -extern "C" void endFrame__10JFWDisplayFv(); -extern "C" void waitBlanking__10JFWDisplayFi(); -extern "C" static void waitForTick__FUlUs(); -extern "C" static void JFWThreadAlarmHandler__FP7OSAlarmP9OSContext(); -extern "C" void threadSleep__10JFWDisplayFx(); -extern "C" void clearEfb_init__10JFWDisplayFv(); -extern "C" void clearEfb__10JFWDisplayFv(); -extern "C" void clearEfb__10JFWDisplayF8_GXColor(); -extern "C" void clearEfb__10JFWDisplayFiiii8_GXColor(); -extern "C" void calcCombinationRatio__10JFWDisplayFv(); -extern "C" static void JFWDrawDoneAlarm__Fv(); -extern "C" static void JFWGXAbortAlarmHandler__FP7OSAlarmP9OSContext(); -extern "C" static void diagnoseGpHang__Fv(); -extern "C" void __sinit_JFWDisplay_cpp(); -extern "C" void func_80273724(void* _this); -extern "C" extern char const* const JFWDisplay__stringBase0; -extern "C" u8 sList__8JFWAlarm[12]; -extern "C" u8 sManager__10JFWDisplay[4]; - // // External References: // -extern "C" void* __nw__FUl(); -extern "C" void __dl__FPv(); -extern "C" void __ct__10JSUPtrLinkFPv(); -extern "C" void __dt__10JSUPtrLinkFv(); -extern "C" void __ct__10JSUPtrListFb(); -extern "C" void __dt__10JSUPtrListFv(); -extern "C" void append__10JSUPtrListFP10JSUPtrLink(); -extern "C" void remove__10JSUPtrListFP10JSUPtrLink(); -extern "C" void flush__10JUTDbPrintFv(); -extern "C" void changeFrameBuffer__14JUTDirectPrintFPvUsUs(); -extern "C" void flushMessage__12JUTAssertionFv(); -extern "C" void flushMessage_dbPrint__12JUTAssertionFv(); -extern "C" void drawDoneStart__8JUTVideoFv(); -extern "C" void dummyNoDrawWait__8JUTVideoFv(); -extern "C" void setRenderMode__8JUTVideoFPC16_GXRenderModeObj(); -extern "C" void waitRetraceIfNeed__8JUTVideoFv(); -extern "C" void createManager__6JUTXfbFP7JKRHeapQ26JUTXfb10EXfbNumber(); -extern "C" void destroyManager__6JUTXfbFv(); -extern "C" void control__8JUTFaderFv(); -extern "C" void create__10JUTProcBarFv(); -extern "C" void destroy__10JUTProcBarFv(); -extern "C" void clear__10JUTProcBarFv(); -extern "C" void draw__10JUTProcBarFv(); -extern "C" void draw__17JUTConsoleManagerCFv(); -extern "C" void __ct__13J2DOrthoGraphFffffff(); -extern "C" void setPort__13J2DOrthoGraphFv(); -extern "C" void VIFlush(); -extern "C" void GXClearVtxDesc(); -extern "C" void GXInvalidateVtxCache(); -extern "C" void GXAbortFrame(); -extern "C" void GXSetDrawDone(); -extern "C" void GXDrawDone(); -extern "C" void GXPixModeSync(); -extern "C" void GXInvalidateTexAll(); -extern "C" void __register_global_object(); -extern "C" void _savegpr_24(); -extern "C" void _savegpr_28(); -extern "C" void _savegpr_29(); -extern "C" void _restgpr_24(); -extern "C" void _restgpr_28(); -extern "C" void _restgpr_29(); -extern "C" void __cvt_dbl_usll(); -extern "C" extern void* __vt__14J2DGrafContext[10]; -extern "C" extern void* __vt__13J2DOrthoGraph[10]; -extern "C" u8 sDebugPrint__10JUTDbPrint[4 + 4 /* padding */]; -extern "C" u8 sDirectPrint__14JUTDirectPrint[4 + 4 /* padding */]; -extern "C" u8 sManager__8JUTVideo[4]; -extern "C" u8 sVideoLastTick__8JUTVideo[4]; -extern "C" u8 sVideoInterval__8JUTVideo[4]; -extern "C" u8 sManager__6JUTXfb[4 + 4 /* padding */]; -extern "C" u8 sManager__10JUTProcBar[4]; -extern "C" u8 sManager__17JUTConsoleManager[4]; - // // Declarations: // @@ -141,14 +55,14 @@ void JFWDisplay::ctor_subroutine(bool enableAlpha) { /* ############################################################################################## */ /* 803C4020-803C4060 021140 0030+10 1/1 0/0 0/0 .data e_mtx */ -SECTION_DATA static Mtx e_mtx ALIGN_DECL(32) = { +static Mtx e_mtx ALIGN_DECL(32) = { {1.0f, 0.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 1.0f, 0.0f}, }; /* 803C4060-803C40A0 021180 0040+00 1/1 0/0 0/0 .data clear_z_TX */ -SECTION_DATA static u8 clear_z_TX[64] ALIGN_DECL(32) = { +static u8 clear_z_TX[64] ALIGN_DECL(32) = { 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, @@ -483,7 +397,6 @@ void JFWDisplay::waitBlanking(int param_0) { } } -#ifdef NONMATCHING /* ############################################################################################## */ /* 804511D0-804511D4 0006D0 0004+00 1/1 0/0 0/0 .sbss nextTick$2642 */ static OSTime nextTick ALIGN_DECL(8); @@ -498,64 +411,28 @@ static u32 nextCount; static s8 data_804511E0; /* 80272CB0-80272DD0 26D5F0 0120+00 2/2 0/0 0/0 .text waitForTick__FUlUs */ -static void waitForTick(u32 param_0, u16 param_1) { - if (param_0 != 0) { - if (!data_804511D8) { - nextTick = OSGetTime(); - data_804511D8 = true; +static void waitForTick(u32 p1, u16 p2) { + if (p1 != 0) { + static s64 nextTick = OSGetTime(); + s64 time = OSGetTime(); + while (time < nextTick) { + JFWDisplay::getManager()->threadSleep((nextTick - time)); + time = OSGetTime(); } - - while (OSGetTime() < nextTick) { - JFWDisplay::getManager()->threadSleep(nextTick - param_0); - } - nextTick += param_0; - } else { - if (!data_804511E0) { - nextCount = VIGetRetraceCount(); - data_804511E0 = true; - } - - int uvar4 = 1; - if (param_1 != 0) { - uvar4 = param_1; - } - + nextTick = time + p1; + } + else { + static u32 nextCount = VIGetRetraceCount(); + u32 uVar1 = (p2 == 0) ? 1 : p2; OSMessage msg; do { - if (!OSReceiveMessage(JUTVideo::getManager()->getMessageQueue(), &msg, - OS_MESSAGE_BLOCK)) { - msg = NULL; + if (!OSReceiveMessage(JUTVideo::getManager()->getMessageQueue(), &msg, OS_MESSAGE_BLOCK)) { + msg = 0; } - } while ((int)msg - nextCount > 0); - nextCount = (int)msg + uvar4; + } while (((int)msg - (int)nextCount) < 0); + nextCount = (int)msg + uVar1; } } -#else -/* ############################################################################################## */ -/* 804511D0-804511D4 0006D0 0004+00 1/1 0/0 0/0 .sbss nextTick$2642 */ -static u8 nextTick[4] ALIGN_DECL(8); - -/* 804511D4-804511D8 0006D4 0004+00 1/1 0/0 0/0 .sbss None */ -static u8 data_804511D4[4]; - -/* 804511D8-804511DC 0006D8 0004+00 1/1 0/0 0/0 .sbss None */ -static s8 data_804511D8; - -/* 804511DC-804511E0 0006DC 0004+00 1/1 0/0 0/0 .sbss nextCount$2650 */ -static u32 nextCount; - -/* 804511E0-804511E8 0006E0 0008+00 1/1 0/0 0/0 .sbss None */ -static s8 data_804511E0; - -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void waitForTick(u32 param_0, u16 param_1) { - nofralloc -#include "asm/JSystem/JFramework/JFWDisplay/waitForTick__FUlUs.s" -} -#pragma pop -#endif /* 80430FE4-80430FF0 05DD04 000C+00 4/4 0/0 0/0 .bss sList__8JFWAlarm */ JSUList JFWAlarm::sList(false); diff --git a/libs/JSystem/JKernel/JKRAram.cpp b/libs/JSystem/JKernel/JKRAram.cpp index 46682e9626..57d9658f00 100644 --- a/libs/JSystem/JKernel/JKRAram.cpp +++ b/libs/JSystem/JKernel/JKRAram.cpp @@ -10,6 +10,7 @@ #include "JSystem/JKernel/JKRAramStream.h" #include "JSystem/JKernel/JKRDecomp.h" #include "JSystem/JKernel/JKRExpHeap.h" +#include "JSystem/JKernel/JKRArchive.h" #include "JSystem/JUtility/JUTException.h" #include "MSL_C/string.h" #include "dol2asm.h" @@ -22,67 +23,16 @@ // Forward References: // -extern "C" void create__7JKRAramFUlUllll(); -extern "C" void __ct__7JKRAramFUlUll(); -extern "C" void __dt__7JKRAramFv(); -extern "C" void run__7JKRAramFv(); -extern "C" void checkOkAddress__7JKRAramFPUcUlP12JKRAramBlockUl(); -extern "C" void changeGroupIdIfNeed__7JKRAramFPUci(); -extern "C" void mainRamToAram__7JKRAramFPUcUlUl15JKRExpandSwitchUlP7JKRHeapiPUl(); -extern "C" void aramToMainRam__7JKRAramFUlPUcUl15JKRExpandSwitchUlP7JKRHeapiPUl(); -extern "C" static void JKRDecompressFromAramToMainRam__FUlPvUlUlUlPUl(); -extern "C" static void decompSZS_subroutine__FPUcPUc(); -static int decompSZS_subroutine(u8* param_0, u8* param_1); -extern "C" static void firstSrcData__Fv(); -static u8* firstSrcData(void); -extern "C" static void nextSrcData__FPUc(); -extern "C" void __sinit_JKRAram_cpp(); -extern "C" void func_802D2DF0(void* _this); -extern "C" extern char const* const JKRAram__stringBase0; -extern "C" u8 sMessageBuffer__7JKRAram[16]; -extern "C" u8 sMessageQueue__7JKRAram[32]; -extern "C" u8 sAramCommandList__7JKRAram[12]; -extern "C" u32 sSZSBufferSize__7JKRAram[1 + 1 /* padding */]; -extern "C" u8 sAramObject__7JKRAram[4]; +static u8* firstSrcData(); +static u8* nextSrcData(u8* param_0); +static int JKRDecompressFromAramToMainRam(u32 src, void* dst, u32 srcLength, u32 dstLength, u32 offset, + u32* resourceSize); +int decompSZS_subroutine(u8 *src, u8 *dest); // // External References: // -extern "C" void alloc__7JKRHeapFUliP7JKRHeap(); -extern "C" void alloc__7JKRHeapFUli(); -extern "C" void free__7JKRHeapFPvP7JKRHeap(); -extern "C" void* __nw__FUlP7JKRHeapi(); -extern "C" void __dl__FPv(); -extern "C" void __ct__9JKRThreadFUlii(); -extern "C" void __dt__9JKRThreadFv(); -extern "C" void __ct__11JKRAramHeapFUlUl(); -extern "C" void alloc__11JKRAramHeapFUlQ211JKRAramHeap10EAllocMode(); -extern "C" void orderSync__12JKRAramPieceFiUlUlUlP12JKRAramBlock(); -extern "C" void startDMA__12JKRAramPieceFP12JKRAMCommand(); -extern "C" void create__13JKRAramStreamFl(); -extern "C" void create__9JKRDecompFl(); -extern "C" void orderSync__9JKRDecompFPUcPUcUlUl(); -extern "C" void checkCompressed__9JKRDecompFPUc(); -extern "C" void __dt__10JSUPtrListFv(); -extern "C" void initiate__10JSUPtrListFv(); -extern "C" void panic_f__12JUTExceptionFPCciPCce(); -extern "C" void ARQInit(); -extern "C" void __register_global_object(); -extern "C" void _savegpr_22(); -extern "C" void _savegpr_23(); -extern "C" void _savegpr_25(); -extern "C" void _savegpr_27(); -extern "C" void _savegpr_28(); -extern "C" void _savegpr_29(); -extern "C" void _restgpr_22(); -extern "C" void _restgpr_23(); -extern "C" void _restgpr_25(); -extern "C" void _restgpr_27(); -extern "C" void _restgpr_28(); -extern "C" void _restgpr_29(); -extern "C" u8 sSystemHeap__7JKRHeap[4]; -extern "C" u8 sCurrentHeap__7JKRHeap[4]; // // Declarations: @@ -198,27 +148,151 @@ void JKRAram::changeGroupIdIfNeed(u8* data, int groupId) { /* 802D233C-802D25B4 2CCC7C 0278+00 0/0 3/3 0/0 .text * mainRamToAram__7JKRAramFPUcUlUl15JKRExpandSwitchUlP7JKRHeapiPUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JKRAram::mainRamToAram(u8* param_0, u32 param_1, u32 param_2, JKRExpandSwitch param_3, - u32 param_4, JKRHeap* param_5, int param_6, u32* param_7) { - nofralloc -#include "asm/JSystem/JKernel/JKRAram/mainRamToAram__7JKRAramFPUcUlUl15JKRExpandSwitchUlP7JKRHeapiPUl.s" +JKRAramBlock *JKRAram::mainRamToAram(u8 *buf, u32 bufSize, u32 alignedSize, JKRExpandSwitch expandSwitch, u32 fileSize, JKRHeap *heap, int id, u32 *pSize) { + JKRAramBlock *block = NULL; + checkOkAddress(buf, bufSize, NULL, 0); + if (expandSwitch == EXPAND_SWITCH_UNKNOWN1) { + expandSwitch = (JKRCheckCompressed_noASR(buf) == COMPRESSION_NONE) ? EXPAND_SWITCH_UNKNOWN0 : EXPAND_SWITCH_UNKNOWN1; + } + if (expandSwitch == EXPAND_SWITCH_UNKNOWN1) { + u32 expandSize = JKRDecompExpandSize(buf); + if (fileSize == 0 || fileSize > expandSize) { + fileSize = ALIGN_NEXT(expandSize, 32); + } + if (bufSize == 0) { + JKRAramBlock* allocatedBlock = (JKRAramBlock*)JKRAllocFromAram(fileSize, JKRAramHeap::HEAD); + block = (JKRAramBlock*)allocatedBlock; + if (allocatedBlock == NULL) + return NULL; + + allocatedBlock->newGroupID(decideAramGroupId(id)); + bufSize = allocatedBlock->getAddress(); + } + if (alignedSize == 0 || alignedSize > expandSize) + alignedSize = ALIGN_NEXT(expandSize, 32); + + if (alignedSize > fileSize) + alignedSize = fileSize; + + void *allocatedMem = JKRAllocFromHeap(heap, fileSize, -32); + if (allocatedMem == NULL) { + if (block != NULL) { + JKRFreeToAram(block); + } + block = NULL; + } + else { + JKRDecompress(buf, (u8 *)allocatedMem, fileSize, 0); + JKRAramPcs(0, (u32)allocatedMem, bufSize, alignedSize, block); + JKRFreeToHeap(heap, allocatedMem); + block = block == NULL ? (JKRAramBlock *)-1 : block; + if (pSize != NULL) { + *pSize = alignedSize; + } + } + } + else { + if (fileSize != 0 && alignedSize > fileSize) + alignedSize = fileSize; + if (bufSize == 0) { + + JKRAramBlock* allocatedBlock = (JKRAramBlock*)JKRAllocFromAram(alignedSize, JKRAramHeap::HEAD); + block = allocatedBlock; + block->newGroupID(decideAramGroupId(id)); + if (block == NULL) + return NULL; + + bufSize = allocatedBlock->getAddress(); + } + + JKRAramPcs(0, (u32)buf, bufSize, alignedSize, block); + block = block == NULL ? (JKRAramBlock *)-1 : block; + if (pSize != NULL) + *pSize = alignedSize; + } + return block; } -#pragma pop /* 802D25B4-802D2830 2CCEF4 027C+00 0/0 6/6 0/0 .text * aramToMainRam__7JKRAramFUlPUcUl15JKRExpandSwitchUlP7JKRHeapiPUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JKRAram::aramToMainRam(u32 param_0, u8* param_1, u32 param_2, JKRExpandSwitch param_3, - u32 param_4, JKRHeap* param_5, int param_6, u32* param_7) { - nofralloc -#include "asm/JSystem/JKernel/JKRAram/aramToMainRam__7JKRAramFUlPUcUl15JKRExpandSwitchUlP7JKRHeapiPUl.s" +u8 *JKRAram::aramToMainRam(u32 address, u8 *buf, u32 p3, JKRExpandSwitch expandSwitch, u32 p5, JKRHeap *heap, int id, u32 *pSize) { + JKRCompression compression = COMPRESSION_NONE; + if (pSize != NULL) + *pSize = 0; + + checkOkAddress(buf, address, NULL, 0); + + u32 expandSize; + if (expandSwitch == EXPAND_SWITCH_UNKNOWN1) { + u8 buffer[64]; + u8 *bufPtr = (u8 *)ALIGN_NEXT((u32)buffer, 32); + JKRAramPcs(1, address, (u32)bufPtr, sizeof(buffer) / 2, NULL); // probably change sizeof(buffer) / 2 to 32 + compression = JKRCheckCompressed_noASR(bufPtr); + expandSize = JKRDecompExpandSize(bufPtr); + } + + if (compression == COMPRESSION_YAZ0) { // SZS + if (p5 != 0 && p5 < expandSize) + expandSize = p5; + + if (buf == NULL) + buf = (u8 *)JKRAllocFromHeap(heap, expandSize, 32); + if (buf == NULL) + return NULL; + else { + changeGroupIdIfNeed(buf, id); + JKRDecompressFromAramToMainRam(address, buf, p3, expandSize, 0, pSize); + return buf; + } + } + else if (compression == COMPRESSION_YAY0) { // SZP + u8 *szpSpace = (u8 *)JKRAllocFromHeap(heap, p3, -32); + if (szpSpace == NULL) { + return NULL; + } + else { + JKRAramPcs(1, address, (u32)szpSpace, p3, NULL); + if (p5 != 0 && p5 < expandSize) + expandSize = p5; + + u8* rv; + if (buf == NULL) { + rv = (u8 *)JKRAllocFromHeap(heap, expandSize, 32); + } else { + rv = buf; + } + + if (rv == NULL) { + i_JKRFree(szpSpace); + return NULL; + } + else { + changeGroupIdIfNeed(rv, id); + JKRDecompress(szpSpace, rv, expandSize, 0); + JKRFreeToHeap(heap, szpSpace); + if (pSize != NULL) { + *pSize = expandSize; + } + return rv; + } + } + } + else { // Not compressed or ASR + if (buf == NULL) + buf = (u8 *)JKRAllocFromHeap(heap, p3, 32); + if (buf == NULL) { + return NULL; + } + else { + changeGroupIdIfNeed(buf, id); + JKRAramPcs(1, address, (u32)buf, p3, NULL); + if (pSize != NULL) { + *pSize = p3; + } + return buf; + } + } } -#pragma pop /* 804342DC-804342E8 060FFC 000C+00 1/1 0/0 0/0 .bss sAramCommandList__7JKRAram */ JSUList JKRAram::sAramCommandList; @@ -266,7 +340,7 @@ static u32 readCount; static u32 maxDest; /* 804513FC-80451400 0008FC 0004+00 1/1 0/0 0/0 .sbss None */ -static bool data_804513FC; +static bool s_is_decompress_mutex_initialized; /* 80451400-80451404 000900 0004+00 2/2 0/0 0/0 .sbss tsPtr */ static u32* tsPtr; @@ -276,92 +350,170 @@ static u32 tsArea; /* 802D2830-802D29A0 2CD170 0170+00 1/1 0/0 0/0 .text * JKRDecompressFromAramToMainRam__FUlPvUlUlUlPUl */ -#ifdef NONMATCHING -// full match, except: -// tsPtr = &tsArea; -// doesn't use r13 -void JKRDecompressFromAramToMainRam(u32 src, void* dst, u32 srcLength, u32 dstLength, u32 offset, +static int JKRDecompressFromAramToMainRam(u32 src, void* dst, u32 srcLength, u32 dstLength, u32 offset, u32* resourceSize) { -#define s_is_decompress_mutex_initialized data_804513FC - - // STATIC BEGIN - // This code is probably generated by the compiler for a static variable - BOOL enable = OSDisableInterrupts(); + BOOL interrupts = OSDisableInterrupts(); if (s_is_decompress_mutex_initialized == false) { OSInitMutex(&decompMutex); s_is_decompress_mutex_initialized = true; } - OSRestoreInterrupts(enable); - // STATIC END - + OSRestoreInterrupts(interrupts); OSLockMutex(&decompMutex); - u32 szpSize = JKRAram::getSZSBufferSize(); - szpBuf = (u8*)JKRAllocFromSysHeap(szpSize, 0x20); - ASSERT(szpBuf != 0); - szpEnd = szpBuf + szpSize; + u32 szsBufferSize = JKRAram::getSZSBufferSize(); + szpBuf = (u8 *)JKRAllocFromSysHeap(szsBufferSize, 32); + + szpEnd = szpBuf + szsBufferSize; if (offset != 0) { - refBuf = (u8*)JKRAllocFromSysHeap(0x1120, 0); - ASSERT(refBuf != 0); + refBuf = (u8 *)JKRAllocFromSysHeap(0x1120, 0); refEnd = refBuf + 0x1120; refCurrent = refBuf; - } else { + } + else { refBuf = NULL; } - srcAddress = src; srcOffset = 0; - if (srcLength == 0) { - transLeft = -1; - } else { - transLeft = srcLength; - } - + transLeft = (srcLength != 0) ? srcLength : -1; fileOffset = offset; readCount = 0; maxDest = dstLength; - if (!resourceSize) { - tsPtr = &tsArea; - } else { - tsPtr = resourceSize; - } - + tsPtr = (resourceSize != 0) ? resourceSize : &tsArea; *tsPtr = 0; - decompSZS_subroutine(firstSrcData(), (u8*)dst); - JKRFreeToSysHeap(szpBuf); + decompSZS_subroutine(firstSrcData(), (u8 *)dst); + i_JKRFree(szpBuf); if (refBuf) { - JKRFreeToSysHeap(refBuf); + i_JKRFree(refBuf); } + DCStoreRangeNoSync(dst, *tsPtr); OSUnlockMutex(&decompMutex); -#undef s_is_decompress_mutex_initialized -#undef decompMutex + + return 0; } -#else -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void JKRDecompressFromAramToMainRam(u32 param_0, void* param_1, u32 param_2, u32 param_3, - u32 param_4, u32* param_5) { - nofralloc -#include "asm/JSystem/JKernel/JKRAram/JKRDecompressFromAramToMainRam__FUlPvUlUlUlPUl.s" -} -#pragma pop -#endif /* 802D29A0-802D2C40 2CD2E0 02A0+00 1/1 0/0 0/0 .text decompSZS_subroutine__FPUcPUc */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm int decompSZS_subroutine(u8* param_0, u8* param_1) { - nofralloc -#include "asm/JSystem/JKernel/JKRAram/decompSZS_subroutine__FPUcPUc.s" +int decompSZS_subroutine(u8 *src, u8 *dest) { + u8 *endPtr; + s32 validBitCount = 0; + s32 currCodeByte = 0; + u32 ts = 0; + + if (src[0] != 'Y' || src[1] != 'a' || src[2] != 'z' || src[3] != '0') { + return -1; + } + + SYaz0Header *header = (SYaz0Header *)src; + endPtr = dest + (header->length - fileOffset); + if (endPtr > dest + maxDest) { + endPtr = dest + maxDest; + } + + src += 0x10; + do { + if (validBitCount == 0) { + if ((src > srcLimit) && transLeft) { + src = nextSrcData(src); + } + currCodeByte = *src; + validBitCount = 8; + src++; + } + if (currCodeByte & 0x80) { + if (fileOffset != 0) { + if (readCount >= fileOffset) { + *dest = *src; + dest++; + ts++; + if (dest == endPtr) + { + break; + } + } + *(refCurrent++) = *src; + if (refCurrent == refEnd) { + refCurrent = refBuf; + } + src++; + } + else { + *dest = *src; + dest++; + src++; + ts++; + if (dest == endPtr) { + break; + } + } + readCount++; + } + else { + u32 dist = ((src[0] & 0x0f) << 8) | src[1]; + s32 numBytes = src[0] >> 4; + src += 2; + u8 *copySource; + if (fileOffset != 0) { + copySource = refCurrent - dist - 1; + if (copySource < refBuf) { + copySource += refEnd - refBuf; + } + } + else { + copySource = dest - dist - 1; + } + if (numBytes == 0) { + numBytes = *src + 0x12; + src += 1; + } + else { + numBytes += 2; + } + if (fileOffset != 0) { + do { + if (readCount >= fileOffset) { + *dest = *copySource; + dest++; + ts++; + if (dest == endPtr) { + break; + } + } + *(refCurrent++) = *copySource; + if (refCurrent == refEnd) { + refCurrent = refBuf; + } + copySource++; + if (copySource == refEnd) { + copySource = refBuf; + } + readCount++; + numBytes--; + } while (numBytes != 0); + } + else { + do { + *dest = *copySource; + dest++; + ts++; + if (dest == endPtr) { + break; + } + readCount++; + numBytes--; + copySource++; + } while (numBytes != 0); + } + } + currCodeByte <<= 1; + validBitCount--; + } while (dest < endPtr); + *tsPtr = ts; + return 0; } -#pragma pop /* 802D2C40-802D2CE4 2CD580 00A4+00 1/1 0/0 0/0 .text firstSrcData__Fv */ -static u8* firstSrcData(void) { +static u8* firstSrcData() { srcLimit = szpEnd - 0x19; u8* buffer = szpBuf; @@ -388,54 +540,32 @@ static u8* firstSrcData(void) { } /* 802D2CE4-802D2DAC 2CD624 00C8+00 1/1 0/0 0/0 .text nextSrcData__FPUc */ -// missing one add instruction -#ifdef NONMATCHING -inline u32 nextSrcData_MIN(u32 A, u32 B) { - if (A > B) - return B; - return A; -} - -static u8* nextSrcData(u8* current) { - u8* dest; +static u8 *nextSrcData(u8 *current) { + u8 *dest; u32 left = (u32)(szpEnd - current); - if (!IS_NOT_ALIGNED(left, 0x20)) { + if (IS_NOT_ALIGNED(left, 0x20)) + dest = szpBuf + 0x20 - (left & (0x20 - 1)); + else dest = szpBuf; - } else { - dest = szpBuf + 0x20 - (left & 0x1f); - } memcpy(dest, current, left); - u32 transSize = nextSrcData_MIN(transLeft, szpEnd - (dest + left)); - ASSERT(transSize > 0); + u32 transSize = (u32)(szpEnd - (dest + left)); + if (transSize > transLeft) + transSize = transLeft; - JKRAramPcs(1, (u32)(srcAddress + srcOffset), (u32)(dest + left), ALIGN_NEXT(transSize, 0x20), + JKRAramPcs(1, (u32)(srcAddress + srcOffset), ((u32)dest + left), ALIGN_NEXT(transSize, 0x20), NULL); srcOffset += transSize; transLeft -= transSize; - if (transLeft == 0) { + if (transLeft == 0) srcLimit = (dest + left) + transSize; - } return dest; } -#else -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm u8* nextSrcData(u8* param_0) { - nofralloc -#include "asm/JSystem/JKernel/JKRAram/nextSrcData__FPUc.s" -} -#pragma pop -#endif /* ############################################################################################## */ /* 8039D0A6-8039D0B8 029706 000E+04 0/0 0/0 0/0 .rodata None */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_8039D0A6 = "bad aramSync\n"; +static const char* stringBase_8039D0A6 = "bad aramSync\n"; /* @stringBase0 padding */ -SECTION_DEAD static char const* const pad_8039D0B4 = "\0\0\0"; -#pragma pop +static const char* pad_8039D0B4 = "\0\0\0"; diff --git a/libs/JSystem/JKernel/JKRCompArchive.cpp b/libs/JSystem/JKernel/JKRCompArchive.cpp index bb6cca7d1e..82eec667b5 100644 --- a/libs/JSystem/JKernel/JKRCompArchive.cpp +++ b/libs/JSystem/JKernel/JKRCompArchive.cpp @@ -9,80 +9,21 @@ #include "JSystem/JKernel/JKRDvdArchive.h" #include "JSystem/JKernel/JKRDvdFile.h" #include "JSystem/JKernel/JKRMemArchive.h" +#include "JSystem/JKernel/JKRDecomp.h" +#include "JSystem/JKernel/JKRAramArchive.h" #include "JSystem/JUtility/JUTException.h" #include "MSL_C/math.h" #include "MSL_C/string.h" -#include "dol2asm.h" #include "dolphin/os/OSCache.h" // // Forward References: // -extern "C" void __ct__14JKRCompArchiveFlQ210JKRArchive15EMountDirection(); -extern "C" void __dt__14JKRCompArchiveFv(); -extern "C" void open__14JKRCompArchiveFl(); -extern "C" void fetchResource__14JKRCompArchiveFPQ210JKRArchive12SDIFileEntryPUl(); -extern "C" void fetchResource__14JKRCompArchiveFPvUlPQ210JKRArchive12SDIFileEntryPUl(); -extern "C" void removeResourceAll__14JKRCompArchiveFv(); -extern "C" void removeResource__14JKRCompArchiveFPv(); -extern "C" void getExpandedResSize__14JKRCompArchiveCFPCv(); -extern "C" extern char const* const JKRCompArchive__stringBase0; - // // External References: // -extern "C" void alloc__7JKRHeapFUliP7JKRHeap(); -extern "C" void alloc__7JKRHeapFUli(); -extern "C" void free__7JKRHeapFPvP7JKRHeap(); -extern "C" void free__7JKRHeapFPv(); -extern "C" void copyMemory__7JKRHeapFPvPvUl(); -extern "C" void* __nw__FUlP7JKRHeapi(); -extern "C" void __dl__FPv(); -extern "C" void mainRamToAram__7JKRAramFPUcUlUl15JKRExpandSwitchUlP7JKRHeapiPUl(); -extern "C" void aramToMainRam__7JKRAramFUlPUcUl15JKRExpandSwitchUlP7JKRHeapiPUl(); -extern "C" void alloc__11JKRAramHeapFUlQ211JKRAramHeap10EAllocMode(); -extern "C" void unmount__13JKRFileLoaderFv(); -extern "C" void becomeCurrent__10JKRArchiveFPCc(); -extern "C" void getResource__10JKRArchiveFPCc(); -extern "C" void getResource__10JKRArchiveFUlPCc(); -extern "C" void readResource__10JKRArchiveFPvUlUlPCc(); -extern "C" void readResource__10JKRArchiveFPvUlPCc(); -extern "C" void detachResource__10JKRArchiveFPv(); -extern "C" void getResSize__10JKRArchiveCFPCv(); -extern "C" void countFile__10JKRArchiveCFPCc(); -extern "C" void getFirstFile__10JKRArchiveCFPCc(); -extern "C" void __ct__10JKRArchiveFlQ210JKRArchive10EMountMode(); -extern "C" void __dt__10JKRArchiveFv(); -extern "C" void findPtrResource__10JKRArchiveCFPCv(); -extern "C" void setExpandSize__10JKRArchiveFPQ210JKRArchive12SDIFileEntryUl(); -extern "C" void getExpandSize__10JKRArchiveCFPQ210JKRArchive12SDIFileEntry(); -extern "C" void fetchResource_subroutine__13JKRMemArchiveFPUcUlPUcUli(); -extern "C" void fetchResource_subroutine__14JKRAramArchiveFUlUlPUcUli(); -extern "C" void fetchResource_subroutine__14JKRAramArchiveFUlUlP7JKRHeapiPPUc(); -extern "C" void fetchResource_subroutine__13JKRDvdArchiveFlUlUlPUcUlii(); -extern "C" void fetchResource_subroutine__13JKRDvdArchiveFlUlUlP7JKRHeapiiPPUc(); -extern "C" void __ct__10JKRDvdFileFl(); -extern "C" void -loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl(); -extern "C" void loadToAram__16JKRDvdAramRipperFlUl15JKRExpandSwitchUlUlPUl(); -extern "C" void orderSync__9JKRDecompFPUcPUcUlUl(); -extern "C" void prepend__10JSUPtrListFP10JSUPtrLink(); -extern "C" void remove__10JSUPtrListFP10JSUPtrLink(); -extern "C" void panic_f__12JUTExceptionFPCciPCce(); -extern "C" void _savegpr_25(); -extern "C" void _savegpr_26(); -extern "C" void _savegpr_28(); -extern "C" void _savegpr_29(); -extern "C" void _restgpr_25(); -extern "C" void _restgpr_26(); -extern "C" void _restgpr_28(); -extern "C" void _restgpr_29(); -extern "C" u8 sVolumeList__13JKRFileLoader[12]; -extern "C" u8 sSystemHeap__7JKRHeap[4]; -extern "C" u8 sAramObject__7JKRAram[4]; - // // Declarations: // @@ -119,8 +60,8 @@ JKRCompArchive::~JKRCompArchive() { mArcInfoBlock = NULL; } - if (field_0x68 != NULL) { - delete field_0x68; + if (mAramPart != NULL) { + delete mAramPart; } if (mExpandedSize != NULL) { @@ -128,8 +69,8 @@ JKRCompArchive::~JKRCompArchive() { mExpandedSize = NULL; } - if (field_0x70 != NULL) { - delete field_0x70; + if (mDvdFile != NULL) { + delete mDvdFile; } sVolumeList.remove(&mFileLoaderLink); @@ -137,46 +78,254 @@ JKRCompArchive::~JKRCompArchive() { } /* 802D89BC-802D8F40 2D32FC 0584+00 1/1 0/0 0/0 .text open__14JKRCompArchiveFl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm bool JKRCompArchive::open(s32 param_0) { - nofralloc -#include "asm/JSystem/JKernel/JKRCompArchive/open__14JKRCompArchiveFl.s" +bool JKRCompArchive::open(long entryNum) { + mArcInfoBlock = NULL; + field_0x64 = 0; + mAramPart = NULL; + field_0x6c = 0; + mSizeOfMemPart = 0; + mSizeOfAramPart = 0; + field_0x7c = 0; + mNodes = NULL; + mFiles = NULL; + mStringTable = NULL; + + mDvdFile = new (JKRGetSystemHeap(), 0) JKRDvdFile(entryNum); + if(mDvdFile == NULL) { + mMountMode = 0; + return 0; + } + SArcHeader *arcHeader = (SArcHeader *)JKRAllocFromSysHeap(sizeof(SArcHeader), -32); // NOTE: unconfirmed if this struct is used + if(arcHeader == NULL) { + mMountMode = 0; + } + else { + int alignment; + + JKRDvdToMainRam(entryNum, (u8 *)arcHeader, EXPAND_SWITCH_UNKNOWN1, 32, NULL, JKRDvdRipper::ALLOC_DIRECTION_FORWARD, 0, &mCompression, NULL); + DCInvalidateRange(arcHeader, 32); + + mSizeOfMemPart = arcHeader->field_0x14; + mSizeOfAramPart = arcHeader->field_0x18; + + switch (mCompression) + { + case COMPRESSION_NONE: + case COMPRESSION_YAZ0: + alignment = mMountDirection == 1 ? 32 : -32; + mArcInfoBlock = (SArcDataInfo *)JKRAllocFromHeap(mHeap, arcHeader->file_data_offset + mSizeOfMemPart, alignment); + if (mArcInfoBlock == NULL) { + mMountMode = 0; + } + else + { + JKRDvdToMainRam(entryNum, (u8 *)mArcInfoBlock, EXPAND_SWITCH_UNKNOWN1, (u32)arcHeader->file_data_offset + mSizeOfMemPart, + NULL, JKRDvdRipper::ALLOC_DIRECTION_FORWARD, 0x20, NULL, NULL); + DCInvalidateRange(mArcInfoBlock, (u32)arcHeader->file_data_offset + mSizeOfMemPart); + field_0x64 = (u32)mArcInfoBlock + arcHeader->file_data_offset; + + if (mSizeOfAramPart != 0) { + mAramPart = (JKRAramBlock*)JKRAllocFromAram(mSizeOfAramPart, JKRAramHeap::HEAD); + if(mAramPart == NULL) { + mMountMode = 0; + break; + } + + JKRDvdToAram(entryNum, mAramPart->getAddress(), EXPAND_SWITCH_UNKNOWN1, arcHeader->header_length + arcHeader->file_data_offset + mSizeOfMemPart, 0, NULL); + } + + mNodes = (SDIDirEntry*)((u32)mArcInfoBlock + mArcInfoBlock->node_offset); + mFiles = (SDIFileEntry *)((u32)mArcInfoBlock + mArcInfoBlock->file_entry_offset); + mStringTable = (char*)((u32)mArcInfoBlock + mArcInfoBlock->string_table_offset); + field_0x6c = arcHeader->header_length + arcHeader->file_data_offset; + } + break; + + case COMPRESSION_YAY0: + u32 alignedSize = ALIGN_NEXT(mDvdFile->getFileSize(), 32); + alignment = ((mMountDirection == 1) ? 32 : -32); + u8 *buf = (u8 *)JKRAllocFromSysHeap(alignedSize, -alignment); + + if(buf == NULL) { + mMountMode = 0; + } + else { + JKRDvdToMainRam(entryNum, buf, EXPAND_SWITCH_UNKNOWN2, alignedSize, NULL, JKRDvdRipper::ALLOC_DIRECTION_FORWARD, 0, NULL, NULL); + DCInvalidateRange(buf, alignedSize); + u32 expandSize = ALIGN_NEXT(JKRDecompExpandSize(buf), 32); + u8 *mem = (u8 *)JKRAllocFromHeap(mHeap, expandSize, -alignment); + + if(mem == NULL) { + mMountMode = 0; + } + else { + arcHeader = (SArcHeader *)mem; + JKRDecompress((u8 *)buf, (u8 *)mem, expandSize, 0); + JKRFreeToSysHeap(buf); + + mArcInfoBlock = (SArcDataInfo *)JKRAllocFromHeap(mHeap, arcHeader->file_data_offset + mSizeOfMemPart, alignment); + if(mArcInfoBlock == NULL) { + mMountMode = 0; + } + else { + // arcHeader + 1 should lead to 0x20, which is the data after the header + JKRHeap::copyMemory((u8 *)mArcInfoBlock, arcHeader + 1, (arcHeader->file_data_offset + mSizeOfMemPart)); + field_0x64 = (u32)mArcInfoBlock + arcHeader->file_data_offset; + if (mSizeOfAramPart != 0) { + mAramPart = (JKRAramBlock*)JKRAllocFromAram(mSizeOfAramPart, JKRAramHeap::HEAD); + if(mAramPart == NULL) { + mMountMode = 0; + } + else { + JKRMainRamToAram((u8 *)mem + arcHeader->header_length + arcHeader->file_data_offset + mSizeOfMemPart, + mAramPart->getAddress(), mSizeOfAramPart, EXPAND_SWITCH_UNKNOWN0, 0, NULL, -1, NULL); + } + } + } + } + } + mNodes = (SDIDirEntry *)((u32)mArcInfoBlock + mArcInfoBlock->node_offset); + mFiles = (SDIFileEntry *)((u32)mArcInfoBlock + mArcInfoBlock->file_entry_offset); + mStringTable = (char *)((u32)mArcInfoBlock + mArcInfoBlock->string_table_offset); + field_0x6c = arcHeader->header_length + arcHeader->file_data_offset; + break; + } + mExpandedSize = NULL; + u8 compressedFiles = 0; + SDIFileEntry *fileEntry = mFiles; + for (int i = 0; i < mArcInfoBlock->num_file_entries; i++) + { + u8 flag = fileEntry->type_flags_and_name_offset >> 0x18; + if (((flag & 0x1) != 0) && (((flag)&0x10) == 0)) + { + compressedFiles = compressedFiles | (flag & 4); + } + fileEntry++; + } + + if (compressedFiles != 0) + { + mExpandedSize = (s32 *)JKRAllocFromHeap(mHeap, mArcInfoBlock->num_file_entries * 4, abs(alignment)); + if (mExpandedSize == NULL) + { + JKRFreeToSysHeap(mArcInfoBlock); + mMountMode = 0; + } + else + { + memset(mExpandedSize, 0, mArcInfoBlock->num_file_entries * 4); + } + } + } + + if (arcHeader != NULL) + { + JKRFreeToSysHeap(arcHeader); + } + if(mMountMode == 0) { + if(mDvdFile != NULL) { + delete mDvdFile; + } + return false; + } + return true; } -#pragma pop + /* 802D8F40-802D90C0 2D3880 0180+00 1/0 0/0 0/0 .text * fetchResource__14JKRCompArchiveFPQ210JKRArchive12SDIFileEntryPUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void* JKRCompArchive::fetchResource(JKRArchive::SDIFileEntry* param_0, u32* param_1) { - nofralloc -#include "asm/JSystem/JKernel/JKRCompArchive/fetchResource__14JKRCompArchiveFPQ210JKRArchive12SDIFileEntryPUl.s" +void* JKRCompArchive::fetchResource(SDIFileEntry *fileEntry, u32 *pSize) { + u32 ptrSize; + u32 size = fileEntry->data_size; + int compression = JKRConvertAttrToCompressionType(fileEntry->type_flags_and_name_offset >> 0x18); + + if(pSize == NULL) { + pSize = &ptrSize; // this makes barely any sense but ok + } + + if (fileEntry->data == NULL) { + u32 flag = fileEntry->type_flags_and_name_offset >> 0x18; + if(flag & 0x10) { + fileEntry->data = (void *)(field_0x64 + fileEntry->data_offset); + *pSize = size; + } + else if (flag & 0x20) { + u8 *data; + *pSize = JKRAramArchive::fetchResource_subroutine(fileEntry->data_offset + mAramPart->getAddress() - mSizeOfMemPart, size, mHeap, compression, &data); + fileEntry->data = data; + if(compression == COMPRESSION_YAZ0) { + setExpandSize(fileEntry, *pSize); + } + } + else if (flag & 0x40) { + u8 *data; + u32 resSize = JKRDvdArchive::fetchResource_subroutine(mEntryNum, field_0x6c + fileEntry->data_offset, fileEntry->data_size, mHeap, compression, mCompression, &data); + if (pSize != NULL) { + *pSize = resSize; + } + fileEntry->data = data; + if (compression == COMPRESSION_YAZ0) { + setExpandSize(fileEntry, *pSize); + } + } + } + else { + if (pSize != NULL) { + *pSize = fileEntry->data_size; + } + } + return fileEntry->data; } -#pragma pop /* ############################################################################################## */ -/* 8039D220-8039D220 029880 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_8039D220 = "JKRCompArchive.cpp"; -SECTION_DEAD static char const* const stringBase_8039D233 = "%s"; -SECTION_DEAD static char const* const stringBase_8039D236 = "illegal archive."; -#pragma pop /* 802D90C0-802D9260 2D3A00 01A0+00 1/0 0/0 0/0 .text * fetchResource__14JKRCompArchiveFPvUlPQ210JKRArchive12SDIFileEntryPUl */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void* JKRCompArchive::fetchResource(void* param_0, u32 param_1, - JKRArchive::SDIFileEntry* param_2, u32* param_3) { - nofralloc -#include "asm/JSystem/JKernel/JKRCompArchive/fetchResource__14JKRCompArchiveFPvUlPQ210JKRArchive12SDIFileEntryPUl.s" +void *JKRCompArchive::fetchResource(void *data, u32 compressedSize, SDIFileEntry *fileEntry, u32 *pSize) +{ + u32 size = 0; + u32 fileSize = fileEntry->data_size; + u32 alignedSize = ALIGN_NEXT(fileSize, 32); + u32 fileFlag = fileEntry->type_flags_and_name_offset >> 0x18; + int compression = JKRConvertAttrToCompressionType(fileFlag); + + if(fileEntry->data != NULL) { + if (compression == COMPRESSION_YAZ0) { + u32 expandSize = getExpandSize(fileEntry); + if (expandSize != 0) { + fileSize = expandSize; + } + } + + if (fileSize > compressedSize) { + fileSize = compressedSize; + } + + JKRHeap::copyMemory(data, fileEntry->data, fileSize); + size = fileSize; + } + else { + if (fileFlag & 0x10) { + size = JKRMemArchive::fetchResource_subroutine((u8 *)(field_0x64 + fileEntry->data_offset), alignedSize, (u8 *)data, + compressedSize & ~31, compression); + } + else if (fileFlag & 0x20) { + size = JKRAramArchive::fetchResource_subroutine(fileEntry->data_offset + mAramPart->getAddress() - mSizeOfMemPart, + alignedSize, (u8 *)data, compressedSize & ~31, compression); + } + else if (fileFlag & 0x40){ + size = JKRDvdArchive::fetchResource_subroutine(mEntryNum, field_0x6c + fileEntry->data_offset, alignedSize, (u8 *)data, + compressedSize & ~31, compression, mCompression); + } else { + JUTException::panic_f(__FILE__, 0x308, "%s", "illegal archive."); + } + } + + if(pSize != NULL) { + *pSize = size; + } + return data; } -#pragma pop /* 802D9260-802D92F4 2D3BA0 0094+00 1/0 0/0 0/0 .text removeResourceAll__14JKRCompArchiveFv */ void JKRCompArchive::removeResourceAll() { @@ -212,22 +361,46 @@ bool JKRCompArchive::removeResource(void* resource) { } /* ############################################################################################## */ -/* 8039D220-8039D220 029880 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_8039D247 = "illegal resource."; -/* @stringBase0 padding */ -SECTION_DEAD static char const* const pad_8039D259 = "\0\0\0\0\0\0"; -#pragma pop /* 802D9360-802D9518 2D3CA0 01B8+00 1/0 0/0 0/0 .text getExpandedResSize__14JKRCompArchiveCFPCv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm u32 JKRCompArchive::getExpandedResSize(void const* param_0) const { - nofralloc -#include "asm/JSystem/JKernel/JKRCompArchive/getExpandedResSize__14JKRCompArchiveCFPCv.s" +u32 JKRCompArchive::getExpandedResSize(const void *resource) const +{ + if (mExpandedSize == NULL) { + return getResSize(resource); + } + + SDIFileEntry *fileEntry = findPtrResource(resource); + if(!fileEntry) { + return 0xffffffff; + } + + u8 flags = (fileEntry->type_flags_and_name_offset >> 0x18); + if((flags & 4) == 0) { // not compressed + return getResSize(resource); + } + + if ((flags & 0x10) != 0) { + return JKRDecompExpandSize((u8 *)resource); + } + + u8 buf[64]; + u8 *bufPtr = (u8 *)ALIGN_NEXT((u32)buf, 32); + if ((flags & 0x20) != 0) { + u32 addr = mAramPart->mAddress; + addr = fileEntry->data_offset + addr; + JKRAramToMainRam(addr, bufPtr, sizeof(buf) / 2, EXPAND_SWITCH_UNKNOWN0, 0, NULL, -1, NULL); + DCInvalidateRange(bufPtr, sizeof(buf) / 2); + } + else if ((flags & 0x40) != 0) { + JKRDvdToMainRam(mEntryNum, bufPtr, EXPAND_SWITCH_UNKNOWN2, sizeof(buf) / 2, NULL, JKRDvdRipper::ALLOC_DIRECTION_FORWARD, field_0x6c + fileEntry->data_offset, NULL, NULL); + DCInvalidateRange(bufPtr, sizeof(buf) / 2); + } + else { + JUTException::panic_f(__FILE__, 0x3af, "%s", "illegal resource."); + } + u32 expandSize = JKRDecompExpandSize(bufPtr); + const_cast(this)->setExpandSize(fileEntry, expandSize); + return expandSize; } -#pragma pop /* 8039D220-8039D220 029880 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ diff --git a/libs/JSystem/JKernel/JKRExpHeap.cpp b/libs/JSystem/JKernel/JKRExpHeap.cpp index 62177a250c..610308db4e 100644 --- a/libs/JSystem/JKernel/JKRExpHeap.cpp +++ b/libs/JSystem/JKernel/JKRExpHeap.cpp @@ -1078,7 +1078,7 @@ JKRExpHeap::CMemBlock* JKRExpHeap::CMemBlock::getHeapBlock(void* ptr) { /* 802D0938-802D09E0 2CB278 00A8+00 1/0 0/0 0/0 .text * state_register__10JKRExpHeapCFPQ27JKRHeap6TStateUl */ -void JKRExpHeap::state_register(JKRHeap::TState* p, u32 param_1) const { +u32 JKRExpHeap::state_register(JKRHeap::TState* p, u32 param_1) const { p->mId = param_1; if (param_1 <= 0xff) { p->mUsedSize = getUsedSize(param_1); @@ -1099,6 +1099,7 @@ void JKRExpHeap::state_register(JKRHeap::TState* p, u32 param_1) const { } } p->mCheckCode = checkCode; + return checkCode; } /* 802D09E0-802D0A10 2CB320 0030+00 1/0 0/0 0/0 .text diff --git a/libs/JSystem/JKernel/JKRHeap.cpp b/libs/JSystem/JKernel/JKRHeap.cpp index 2f438e5414..7001124419 100644 --- a/libs/JSystem/JKernel/JKRHeap.cpp +++ b/libs/JSystem/JKernel/JKRHeap.cpp @@ -516,7 +516,7 @@ void operator delete[](void* ptr) { /* 802CED84-802CED88 2C96C4 0004+00 1/0 1/0 0/0 .text * state_register__7JKRHeapCFPQ27JKRHeap6TStateUl */ -void JKRHeap::state_register(JKRHeap::TState* p, u32 id) const { +u32 JKRHeap::state_register(JKRHeap::TState* p, u32 id) const { JUT_ASSERT(__FILE__, 1213, p != 0); JUT_ASSERT(__FILE__, 1214, p->getHeap() == this); } diff --git a/libs/JSystem/JKernel/JKRMemArchive.cpp b/libs/JSystem/JKernel/JKRMemArchive.cpp index e6c1ba6a18..578f930205 100644 --- a/libs/JSystem/JKernel/JKRMemArchive.cpp +++ b/libs/JSystem/JKernel/JKRMemArchive.cpp @@ -9,7 +9,6 @@ #include "JSystem/JKernel/JKRHeap.h" #include "JSystem/JUtility/JUTException.h" #include "MSL_C/string.h" -#include "dol2asm.h" #include "dolphin/os/OSCache.h" #include "global.h" @@ -17,53 +16,10 @@ // Forward References: // -extern "C" void __ct__13JKRMemArchiveFlQ210JKRArchive15EMountDirection(); -extern "C" void __ct__13JKRMemArchiveFPvUl15JKRMemBreakFlag(); -extern "C" void __dt__13JKRMemArchiveFv(); -extern "C" void open__13JKRMemArchiveFlQ210JKRArchive15EMountDirection(); -extern "C" void open__13JKRMemArchiveFPvUl15JKRMemBreakFlag(); -extern "C" void fetchResource__13JKRMemArchiveFPQ210JKRArchive12SDIFileEntryPUl(); -extern "C" void fetchResource__13JKRMemArchiveFPvUlPQ210JKRArchive12SDIFileEntryPUl(); -extern "C" void removeResourceAll__13JKRMemArchiveFv(); -extern "C" void removeResource__13JKRMemArchiveFPv(); -extern "C" void fetchResource_subroutine__13JKRMemArchiveFPUcUlPUcUli(); -extern "C" void getExpandedResSize__13JKRMemArchiveCFPCv(); -extern "C" extern char const* const JKRMemArchive__stringBase0; - // // External References: // -extern "C" void free__7JKRHeapFPvP7JKRHeap(); -extern "C" void findFromRoot__7JKRHeapFPv(); -extern "C" void __dl__FPv(); -extern "C" void unmount__13JKRFileLoaderFv(); -extern "C" void becomeCurrent__10JKRArchiveFPCc(); -extern "C" void getResource__10JKRArchiveFPCc(); -extern "C" void getResource__10JKRArchiveFUlPCc(); -extern "C" void readResource__10JKRArchiveFPvUlUlPCc(); -extern "C" void readResource__10JKRArchiveFPvUlPCc(); -extern "C" void detachResource__10JKRArchiveFPv(); -extern "C" void getResSize__10JKRArchiveCFPCv(); -extern "C" void countFile__10JKRArchiveCFPCc(); -extern "C" void getFirstFile__10JKRArchiveCFPCc(); -extern "C" void __ct__10JKRArchiveFlQ210JKRArchive10EMountMode(); -extern "C" void __dt__10JKRArchiveFv(); -extern "C" void findPtrResource__10JKRArchiveCFPCv(); -extern "C" void setExpandSize__10JKRArchiveFPQ210JKRArchive12SDIFileEntryUl(); -extern "C" void getExpandSize__10JKRArchiveCFPQ210JKRArchive12SDIFileEntry(); -extern "C" void -loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15EAllocDirectionUlPiPUl(); -extern "C" void orderSync__9JKRDecompFPUcPUcUlUl(); -extern "C" void prepend__10JSUPtrListFP10JSUPtrLink(); -extern "C" void remove__10JSUPtrListFP10JSUPtrLink(); -extern "C" void panic_f__12JUTExceptionFPCciPCce(); -extern "C" void _savegpr_28(); -extern "C" void _savegpr_29(); -extern "C" void _restgpr_28(); -extern "C" void _restgpr_29(); -extern "C" u8 sVolumeList__13JKRFileLoader[12]; - // // Declarations: // @@ -116,10 +72,6 @@ JKRMemArchive::~JKRMemArchive() { /* 802D6BCC-802D6D30 2D150C 0164+00 1/1 0/0 0/0 .text * open__13JKRMemArchiveFlQ210JKRArchive15EMountDirection */ -// 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; @@ -132,17 +84,18 @@ bool JKRMemArchive::open(long entryNum, JKRArchive::EMountDirection mountDirecti if (mMountDirection == JKRArchive::MOUNT_DIRECTION_HEAD) { u32 loadedSize; - mArcHeader = (SArcHeader*)JKRDvdRipper::loadToMainRAM( + mArcHeader = (SArcHeader *)JKRDvdRipper::loadToMainRAM( entryNum, NULL, EXPAND_SWITCH_UNKNOWN1, 0, mHeap, JKRDvdRipper::ALLOC_DIRECTION_FORWARD, - 0, &mCompression, &loadedSize); + 0, (int *)&mCompression, &loadedSize); if (mArcHeader) { DCInvalidateRange(mArcHeader, loadedSize); } - } else { + } + else { u32 loadedSize; - mArcHeader = (SArcHeader*)JKRDvdRipper::loadToMainRAM( + mArcHeader = (SArcHeader *)JKRDvdRipper::loadToMainRAM( entryNum, NULL, EXPAND_SWITCH_UNKNOWN1, 0, mHeap, - JKRDvdRipper::ALLOC_DIRECTION_BACKWARD, 0, &mCompression, &loadedSize); + JKRDvdRipper::ALLOC_DIRECTION_BACKWARD, 0, (int *)&mCompression, &loadedSize); if (mArcHeader) { DCInvalidateRange(mArcHeader, loadedSize); } @@ -150,62 +103,35 @@ bool JKRMemArchive::open(long entryNum, JKRArchive::EMountDirection mountDirecti if (!mArcHeader) { mMountMode = UNKNOWN_MOUNT_MODE; - } else { - ASSERT(mArcHeader->signature == 'RARC'); - mArcInfoBlock = (SArcDataInfo*)((u8*)mArcHeader + mArcHeader->header_length); - mNodes = (SDIDirEntry*)((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); + } + else { + mArcInfoBlock = (SArcDataInfo *)((u8 *)mArcHeader + mArcHeader->header_length); + mNodes = (SDIDirEntry *)((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); + (u8 *)((u32)mArcHeader + mArcHeader->header_length + mArcHeader->file_data_offset); mIsOpen = true; } - return mMountMode != UNKNOWN_MOUNT_MODE; + return (mMountMode == UNKNOWN_MOUNT_MODE) ? false : true; } -#else -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm bool JKRMemArchive::open(s32 param_0, JKRArchive::EMountDirection param_1) { - nofralloc -#include "asm/JSystem/JKernel/JKRMemArchive/open__13JKRMemArchiveFlQ210JKRArchive15EMountDirection.s" -} -#pragma pop -#endif /* 802D6D30-802D6DDC 2D1670 00AC+00 1/1 0/0 0/0 .text open__13JKRMemArchiveFPvUl15JKRMemBreakFlag */ -// 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 = (SDIDirEntry*)((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); + mArcHeader = (SArcHeader *)buffer; + mArcInfoBlock = (SArcDataInfo *)((u8 *)mArcHeader + mArcHeader->header_length); + mNodes = (SDIDirEntry *)((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 *)(((u32)mArcHeader + mArcHeader->header_length) + mArcHeader->file_data_offset); + mIsOpen = (flag == JKRMEMBREAK_FLAG_UNKNOWN1) ? true : false; // mIsOpen might be u8 mHeap = JKRHeap::findFromRoot(buffer); mCompression = COMPRESSION_NONE; return true; } -#else -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm bool JKRMemArchive::open(void* param_0, u32 param_1, JKRMemBreakFlag param_2) { - nofralloc -#include "asm/JSystem/JKernel/JKRMemArchive/open__13JKRMemArchiveFPvUl15JKRMemBreakFlag.s" -} -#pragma pop -#endif /* 802D6DDC-802D6E10 2D171C 0034+00 1/0 0/0 0/0 .text * fetchResource__13JKRMemArchiveFPQ210JKRArchive12SDIFileEntryPUl */ diff --git a/libs/JSystem/JKernel/JKRSolidHeap.cpp b/libs/JSystem/JKernel/JKRSolidHeap.cpp index dc64429e7b..b9b0f264e1 100644 --- a/libs/JSystem/JKernel/JKRSolidHeap.cpp +++ b/libs/JSystem/JKernel/JKRSolidHeap.cpp @@ -5,67 +5,18 @@ #include "JSystem/JKernel/JKRSolidHeap.h" #include "JSystem/JUtility/JUTAssert.h" +#include "JSystem/JUtility/JUTConsole.h" #include "MSL_C/math.h" -#include "dol2asm.h" #include "global.h" // // Forward References: // -extern "C" void create__12JKRSolidHeapFUlP7JKRHeapb(); -extern "C" void do_destroy__12JKRSolidHeapFv(); -extern "C" void __ct__12JKRSolidHeapFPvUlP7JKRHeapb(); -extern "C" void __dt__12JKRSolidHeapFv(); -extern "C" void adjustSize__12JKRSolidHeapFv(); -extern "C" void do_alloc__12JKRSolidHeapFUli(); -extern "C" void allocFromHead__12JKRSolidHeapFUli(); -extern "C" void allocFromTail__12JKRSolidHeapFUli(); -extern "C" void do_free__12JKRSolidHeapFPv(); -extern "C" void do_freeAll__12JKRSolidHeapFv(); -extern "C" void do_freeTail__12JKRSolidHeapFv(); -extern "C" void do_fillFreeArea__12JKRSolidHeapFv(); -extern "C" void do_resize__12JKRSolidHeapFPvUl(); -extern "C" void do_getSize__12JKRSolidHeapFPv(); -extern "C" void check__12JKRSolidHeapFv(); -extern "C" void dump__12JKRSolidHeapFv(); -extern "C" void state_register__12JKRSolidHeapCFPQ27JKRHeap6TStateUl(); -extern "C" void state_compare__12JKRSolidHeapCFRCQ27JKRHeap6TStateRCQ27JKRHeap6TState(); -extern "C" void getHeapType__12JKRSolidHeapFv(); -extern "C" void do_getFreeSize__12JKRSolidHeapFv(); -extern "C" void do_getMaxFreeBlock__12JKRSolidHeapFv(); -extern "C" void do_getTotalFreeSize__12JKRSolidHeapFv(); -extern "C" extern char const* const JKRSolidHeap__stringBase0; - // // External References: // -extern "C" bool dump_sort__7JKRHeapFv(); -extern "C" void __ct__7JKRHeapFPvUlP7JKRHeapb(); -extern "C" void __dt__7JKRHeapFv(); -extern "C" void alloc__7JKRHeapFUliP7JKRHeap(); -extern "C" void free__7JKRHeapFPvP7JKRHeap(); -extern "C" void callAllDisposer__7JKRHeapFv(); -extern "C" void resize__7JKRHeapFPvUl(); -extern "C" void getFreeSize__7JKRHeapFv(); -extern "C" void getTotalFreeSize__7JKRHeapFv(); -extern "C" void getMaxAllocatableSize__7JKRHeapFi(); -extern "C" void dispose__7JKRHeapFPvPv(); -extern "C" void dispose__7JKRHeapFv(); -extern "C" void __dl__FPv(); -extern "C" void state_dump__7JKRHeapCFRCQ27JKRHeap6TState(); -extern "C" bool do_changeGroupID__7JKRHeapFUc(); -extern "C" bool do_getCurrentGroupId__7JKRHeapFv(); -extern "C" void JUTReportConsole_f(const char*, ...); -extern "C" void JUTWarningConsole_f(const char*, ...); -extern "C" void _savegpr_28(); -extern "C" void _savegpr_29(); -extern "C" void _restgpr_28(); -extern "C" void _restgpr_29(); -extern "C" u8 sRootHeap__7JKRHeap[4]; -extern "C" u8 mErrorHandler__7JKRHeap[4]; - // // Declarations: // @@ -315,9 +266,7 @@ bool JKRSolidHeap::dump(void) { } /* 802D11FC-802D1258 2CBB3C 005C+00 1/0 0/0 0/0 .text * state_register__12JKRSolidHeapCFPQ27JKRHeap6TStateUl */ -// full match expect using the wrong register -#ifdef NONMATCHING -void JKRSolidHeap::state_register(JKRHeap::TState* p, u32 id) const { +u32 JKRSolidHeap::state_register(JKRHeap::TState* p, u32 id) const { JUT_ASSERT(__FILE__, 0x25c, p != 0); JUT_ASSERT(__FILE__, 0x25d, p->getHeap() == this); @@ -325,17 +274,8 @@ void JKRSolidHeap::state_register(JKRHeap::TState* p, u32 id) const { setState_u32ID_(p, id); setState_uUsedSize_(p, getUsedSize((JKRSolidHeap*)this)); setState_u32CheckCode_(p, (u32)mSolidHead + (u32)mSolidTail * 3); + return (u32)mSolidHead + (u32)mSolidTail * 3; } -#else -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JKRSolidHeap::state_register(JKRHeap::TState* param_0, u32 param_1) const { - nofralloc -#include "asm/JSystem/JKernel/JKRSolidHeap/state_register__12JKRSolidHeapCFPQ27JKRHeap6TStateUl.s" -} -#pragma pop -#endif /* 802D1258-802D1288 2CBB98 0030+00 1/0 0/0 0/0 .text * state_compare__12JKRSolidHeapCFRCQ27JKRHeap6TStateRCQ27JKRHeap6TState */ diff --git a/libs/JSystem/JParticle/JPAKeyBlock.cpp b/libs/JSystem/JParticle/JPAKeyBlock.cpp index 2b1898d391..43ca47c061 100644 --- a/libs/JSystem/JParticle/JPAKeyBlock.cpp +++ b/libs/JSystem/JParticle/JPAKeyBlock.cpp @@ -4,55 +4,41 @@ // #include "JSystem/JParticle/JPAKeyBlock.h" -#include "dol2asm.h" #include "dolphin/types.h" +#include "JSystem/JParticle/JPAMath.h" // // Types: // -struct JPAKeyBlock { - /* 8027D730 */ JPAKeyBlock(u8 const*); - /* 8027D740 */ void calc(f32); -}; - // // Forward References: // -extern "C" void __ct__11JPAKeyBlockFPCUc(); -extern "C" void calc__11JPAKeyBlockFf(); - // // External References: // -extern "C" void JPACalcKeyAnmValue__FfUsPCf(); - // // Declarations: // /* 8027D730-8027D740 278070 0010+00 0/0 1/1 0/0 .text __ct__11JPAKeyBlockFPCUc */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm JPAKeyBlock::JPAKeyBlock(u8 const* param_0) { - nofralloc -#include "asm/JSystem/JParticle/JPAKeyBlock/__ct__11JPAKeyBlockFPCUc.s" +JPAKeyBlock::JPAKeyBlock(const u8* data) + : mDataStart(data) + , field_0x4(reinterpret_cast(&data[0xC])) +{ } -#pragma pop /* ############################################################################################## */ -/* 80455350-80455358 003950 0008+00 1/1 0/0 0/0 .sdata2 @2215 */ -SECTION_SDATA2 static f64 lit_2215 = 4503601774854144.0 /* cast s32 to float */; /* 8027D740-8027D7D4 278080 0094+00 0/0 1/1 0/0 .text calc__11JPAKeyBlockFf */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JPAKeyBlock::calc(f32 param_0) { - nofralloc -#include "asm/JSystem/JParticle/JPAKeyBlock/calc__11JPAKeyBlockFf.s" +void JPAKeyBlock::calc(float p1) { + if (mDataStart[0xB] != '\0') { + int v1 = (int)field_0x4[(mDataStart[9] - 1) * 4] + 1; + // p1 -= (v1 * ((int)p1 / v1)); + int v2 = ((int)p1 / v1); + p1 = p1 - (v2 * v1); + } + JPACalcKeyAnmValue(p1, mDataStart[9], field_0x4); } -#pragma pop diff --git a/libs/JSystem/JStudio/JStudio/fvb-data-parse.cpp b/libs/JSystem/JStudio/JStudio/fvb-data-parse.cpp index f3183ac949..ec4bda3baa 100644 --- a/libs/JSystem/JStudio/JStudio/fvb-data-parse.cpp +++ b/libs/JSystem/JStudio/JStudio/fvb-data-parse.cpp @@ -4,7 +4,6 @@ // #include "JSystem/JStudio/JStudio/fvb-data-parse.h" -#include "dol2asm.h" #include "dolphin/types.h" // @@ -15,28 +14,25 @@ // Forward References: // -extern "C" void -getData__Q47JStudio3fvb4data17TParse_TParagraphCFPQ57JStudio3fvb4data17TParse_TParagraph5TData(); - // // External References: // -extern "C" void -parseVariableUInt_16_32_following__Q27JGadget6binaryFPCvPUlPUlPQ37JGadget6binary5TEBit(); - // // Declarations: // /* 802850AC-80285114 27F9EC 0068+00 0/0 1/1 0/0 .text * getData__Q47JStudio3fvb4data17TParse_TParagraphCFPQ57JStudio3fvb4data17TParse_TParagraph5TData */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void JStudio::fvb::data::TParse_TParagraph::getData( - JStudio::fvb::data::TParse_TParagraph::TData* param_0) const { - nofralloc -#include "asm/JSystem/JStudio/JStudio/fvb-data-parse/func_802850AC.s" +void JStudio::fvb::data::TParse_TParagraph::getData(TParse_TParagraph::TData* data) const +{ + u16* parse = (u16*)JGadget::binary::parseVariableUInt_16_32_following(getRaw(), (u32*)data, (u32*)&data->u32Type, NULL); + u32 t = (u32)data->u32Size; + if (!t) { + data->pContent = NULL; + data->next = parse; + } else { + data->pContent = parse; + data->next = parse + ((t + 3) >> 1 & ~1); + } } -#pragma pop diff --git a/libs/JSystem/JStudio/JStudio/stb-data-parse.cpp b/libs/JSystem/JStudio/JStudio/stb-data-parse.cpp index eb5d1c4542..d2f7d3a6de 100644 --- a/libs/JSystem/JStudio/JStudio/stb-data-parse.cpp +++ b/libs/JSystem/JStudio/JStudio/stb-data-parse.cpp @@ -4,15 +4,12 @@ // #include "JSystem/JStudio/JStudio/stb-data-parse.h" -#include "dol2asm.h" #include "global.h" namespace JStudio { namespace stb { namespace data { -extern "C" u32 gauDataSize_TEParagraph_data__Q37JStudio3stb4data[]; - void TParse_TSequence::getData(TData* pData) const { ASSERT(pData != 0); @@ -50,48 +47,36 @@ void TParse_TParagraph::getData(TData* pData) const { } } -#ifdef NONMATCHING void TParse_TParagraph_data::getData(data::TParse_TParagraph_data::TData* pData) const { - ASSERT(pData != 0); + u8* set2; - pData->_4 = 0; - pData->_8 = 0; - pData->_c = NULL; - pData->_10 = 0; - u8* p = (u8*)getRaw(); - if (p != NULL) { - u8 val = *p; - pData->_0 = val & ~8; - if (val != 0) { - u32 count = 1; - p++; - if (val & 8) { - count = *(p++); - } - pData->_8 = count; - pData->_c = p; - u8 idx = val & 7; - if (idx) { - u32 size = gauDataSize_TEParagraph_data[idx]; - pData->_4 = size; - pData->_10 = p + size * count; - } - } - } + int dSize = pData->dataSize = 0; + pData->_8 = 0; + pData->fileCount = NULL; + pData->_10 = NULL; + u8* filedata = (u8*)getRaw(); + if (filedata == NULL) + return; + u8 set = *filedata; + pData->status = set & ~0x8; + if (!set) + return; + int is8; + int set3 = 1; + is8 = set & 8; + // Probably fake match + if (set2 = (filedata + 1), is8) { + set3 = *set2++; + } + pData->_8 = set3; + pData->fileCount = set2; + + if (!(set & 7)) + return; + dSize = (gauDataSize_TEParagraph_data)[set &= 7]; + pData->dataSize = dSize; + pData->_10 = (u8*)set2 + (dSize * set3); } -#else -/* 80289A80-80289B00 2843C0 0080+00 0/0 3/3 1/1 .text - * getData__Q47JStudio3stb4data22TParse_TParagraph_dataCFPQ57JStudio3stb4data22TParse_TParagraph_data5TData - */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void TParse_TParagraph_data::getData(TParse_TParagraph_data::TData* param_0) const { - nofralloc -#include "asm/JSystem/JStudio/JStudio/stb-data-parse/func_80289A80.s" -} -#pragma pop -#endif } // namespace data } // namespace stb