Copy JKernel (#126)

* start JSystem

* JKRAram and JUTGamePad

* started heap and thread

* more JKernel

* mostly finished JKernel

* delete unused asm

* JKRFileFinder

* delete unused asm and match findNextFile

* format

* fix mtx_vec
This commit is contained in:
lepelog
2021-05-03 02:03:24 +02:00
committed by GitHub
parent 913bb08f51
commit 0b8db42226
360 changed files with 6646 additions and 12699 deletions
+1 -1
View File
@@ -5,8 +5,8 @@
#include "JSystem/JFramework/JFWDisplay.h"
#include "dol2asm.h"
#include "dolphin/mtx/mtx44.h"
#include "dolphin/types.h"
#include "mtx_vec.h"
//
// Types:
+229 -198
View File
@@ -4,87 +4,15 @@
//
#include "JSystem/JKernel/JKRAram.h"
#include "JSystem/JKernel/JKRAramBlock.h"
#include "JSystem/JKernel/JKRAramHeap.h"
#include "JSystem/JKernel/JKRAramPiece.h"
#include "JSystem/JKernel/JKRAramStream.h"
#include "JSystem/JKernel/JKRExpHeap.h"
#include "JSystem/JUtility/JUTException.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JUTException {
/* 802E21FC */ void panic_f(char const*, int, char const*, ...);
};
struct JSUPtrList {
/* 802DBEAC */ ~JSUPtrList();
/* 802DBF14 */ void initiate();
};
template <typename A0>
struct JSUList {};
/* JSUList<JKRAMCommand> */
struct JSUList__template5 {
/* 802D2DF0 */ void func_802D2DF0(void* _this);
};
struct JKRThread {
/* 802D1568 */ JKRThread(u32, int, int);
/* 802D1758 */ ~JKRThread();
};
struct JKRHeap {
/* 802CE4D4 */ void alloc(u32, int);
/* 802CE474 */ void alloc(u32, int, JKRHeap*);
/* 802CE500 */ void free(void*, JKRHeap*);
static u8 sSystemHeap[4];
static u8 sCurrentHeap[4];
};
struct JKRExpandSwitch {};
struct JKRDecomp {
/* 802DB680 */ void create(s32);
/* 802DB988 */ void orderSync(u8*, u8*, u32, u32);
/* 802DBCF8 */ void checkCompressed(u8*);
};
struct JKRAramStream {
/* 802D3B48 */ void create(s32);
};
struct JKRAMCommand {};
struct JKRAramBlock {};
struct JKRAramPiece {
/* 802D3838 */ void orderSync(int, u32, u32, u32, JKRAramBlock*);
/* 802D38CC */ void startDMA(JKRAMCommand*);
};
struct JKRAramHeap {
struct EAllocMode {};
/* 802D2E44 */ JKRAramHeap(u32, u32);
/* 802D2FBC */ void alloc(u32, JKRAramHeap::EAllocMode);
};
struct JKRAram {
/* 802D1FA4 */ void create(u32, u32, s32, s32, s32);
/* 802D2040 */ JKRAram(u32, u32, s32);
/* 802D214C */ ~JKRAram();
/* 802D21DC */ void run();
/* 802D2248 */ void checkOkAddress(u8*, u32, JKRAramBlock*, u32);
/* 802D22DC */ void changeGroupIdIfNeed(u8*, int);
/* 802D233C */ void mainRamToAram(u8*, u32, u32, JKRExpandSwitch, u32, JKRHeap*, int, u32*);
/* 802D25B4 */ void aramToMainRam(u32, u8*, u32, JKRExpandSwitch, u32, JKRHeap*, int, u32*);
static u8 sMessageBuffer[16];
static u8 sMessageQueue[32];
static u8 sAramCommandList[12];
static u32 sSZSBufferSize[1 + 1 /* padding */];
static u8 sAramObject[4];
};
#include "dolphin/ar/ar.h"
#include "global.h"
//
// Forward References:
@@ -135,17 +63,6 @@ extern "C" void __dt__10JSUPtrListFv();
extern "C" void initiate__10JSUPtrListFv();
extern "C" void panic_f__12JUTExceptionFPCciPCce();
extern "C" void DCStoreRangeNoSync();
extern "C" void OSDisableInterrupts();
extern "C" void OSRestoreInterrupts();
extern "C" void OSInitMessageQueue();
extern "C" void OSReceiveMessage();
extern "C" void OSInitMutex();
extern "C" void OSLockMutex();
extern "C" void OSUnlockMutex();
extern "C" void OSResumeThread();
extern "C" void ARAlloc();
extern "C" void ARInit();
extern "C" void ARGetSize();
extern "C" void ARQInit();
extern "C" void __register_global_object();
extern "C" void _savegpr_22();
@@ -169,98 +86,130 @@ extern "C" u8 sCurrentHeap__7JKRHeap[4];
/* ############################################################################################## */
/* 804513C8-804513CC 0008C8 0004+00 3/3 9/9 0/0 .sbss sAramObject__7JKRAram */
u8 JKRAram::sAramObject[4];
JKRAram* JKRAram::sAramObject;
/* 802D1FA4-802D2040 2CC8E4 009C+00 0/0 1/1 0/0 .text create__7JKRAramFUlUllll */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAram::create(u32 param_0, u32 param_1, s32 param_2, s32 param_3, s32 param_4) {
nofralloc
#include "asm/JSystem/JKernel/JKRAram/create__7JKRAramFUlUllll.s"
JKRAram* JKRAram::create(u32 aram_audio_buffer_size, u32 aram_audio_graph_size,
long stream_priority, long decomp_priority, long piece_priority) {
if (!sAramObject) {
sAramObject = new (JKRHeap::getSystemHeap(), 0)
JKRAram(aram_audio_buffer_size, aram_audio_graph_size, piece_priority);
}
JKRCreateAramStreamManager(stream_priority);
JKRCreateDecompManager(decomp_priority);
sAramObject->resume();
return sAramObject;
}
#pragma pop
/* ############################################################################################## */
/* 803CC128-803CC138 029248 0010+00 1/1 0/0 0/0 .data sMessageBuffer__7JKRAram */
SECTION_DATA u8 JKRAram::sMessageBuffer[16] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
OSMessage JKRAram::sMessageBuffer[4] = {
NULL,
NULL,
NULL,
NULL,
};
/* 803CC138-803CC158 029258 0020+00 1/1 1/1 0/0 .data sMessageQueue__7JKRAram */
SECTION_DATA u8 JKRAram::sMessageQueue[32] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/* 803CC158-803CC168 029278 0010+00 2/2 0/0 0/0 .data __vt__7JKRAram */
SECTION_DATA extern void* __vt__7JKRAram[4] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__7JKRAramFv,
(void*)run__7JKRAramFv,
};
OSMessageQueue JKRAram::sMessageQueue = {0};
/* 802D2040-802D214C 2CC980 010C+00 1/1 0/0 0/0 .text __ct__7JKRAramFUlUll */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRAram::JKRAram(u32 param_0, u32 param_1, s32 param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRAram/__ct__7JKRAramFUlUll.s"
JKRAram::JKRAram(u32 audio_buffer_size, u32 audio_graph_size, long priority)
: JKRThread(0xC00, 0x10, priority) {
u32 aramBase = ARInit(mStackArray, ARRAY_SIZE(mStackArray));
ARQInit();
u32 aramSize = ARGetSize();
mAudioMemorySize = audio_buffer_size;
if (audio_graph_size == 0xffffffff) {
mGraphMemorySize = (aramSize - audio_buffer_size) - aramBase;
mAramMemorySize = 0;
} else {
mGraphMemorySize = audio_graph_size;
mAramMemorySize = (aramSize - (audio_buffer_size + audio_graph_size)) - aramBase;
}
mAudioMemoryPtr = ARAlloc(mAudioMemorySize);
mGraphMemoryPtr = ARAlloc(mGraphMemorySize);
if (mAramMemorySize) {
mAramMemoryPtr = ARAlloc(mAramMemorySize);
} else {
mAramMemoryPtr = NULL;
}
mAramHeap = new (JKRHeap::getSystemHeap(), 0) JKRAramHeap(mGraphMemoryPtr, mGraphMemorySize);
}
#pragma pop
/* 802D214C-802D21DC 2CCA8C 0090+00 1/0 0/0 0/0 .text __dt__7JKRAramFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRAram::~JKRAram() {
nofralloc
#include "asm/JSystem/JKernel/JKRAram/__dt__7JKRAramFv.s"
JKRAram::~JKRAram() {
sAramObject = NULL;
if (mAramHeap)
delete mAramHeap;
}
#pragma pop
/* 802D21DC-802D2248 2CCB1C 006C+00 1/0 0/0 0/0 .text run__7JKRAramFv */
// almost full match
#ifdef NONMATCHING
void* JKRAram::run(void) {
int result;
JKRAMCommand* command;
JKRAMCommand::Message* message;
OSInitMessageQueue(&sMessageQueue, sMessageBuffer, 4);
do {
OSReceiveMessage(&sMessageQueue, &message, OS_MESSAGE_BLOCKING);
result = message->field_0x0;
command = message->command;
delete message;
if (result == 1) {
JKRAramPiece::startDMA(command);
}
} while (true);
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAram::run() {
asm void* JKRAram::run() {
nofralloc
#include "asm/JSystem/JKernel/JKRAram/run__7JKRAramFv.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 8039D078-8039D078 0296D8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039D078 = "JKRAram.cpp";
SECTION_DEAD static char const* const stringBase_8039D084 = "%s";
SECTION_DEAD static char const* const stringBase_8039D087 = ":::address not 32Byte aligned.";
#pragma pop
// #pragma push
// #pragma force_active on
// SECTION_DEAD static char const* const stringBase_8039D078 = "JKRAram.cpp";
// SECTION_DEAD static char const* const stringBase_8039D084 = "%s";
// SECTION_DEAD static char const* const stringBase_8039D087 = ":::address not 32Byte aligned.";
// #pragma pop
/* 802D2248-802D22DC 2CCB88 0094+00 2/2 0/0 0/0 .text
* checkOkAddress__7JKRAramFPUcUlP12JKRAramBlockUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAram::checkOkAddress(u8* param_0, u32 param_1, JKRAramBlock* param_2, u32 param_3) {
nofralloc
#include "asm/JSystem/JKernel/JKRAram/checkOkAddress__7JKRAramFPUcUlP12JKRAramBlockUl.s"
void JKRAram::checkOkAddress(u8* addr, u32 size, JKRAramBlock* block, u32 param_4) {
if (!IS_ALIGNED((u32)addr, 0x20) && !IS_ALIGNED(size, 0x20)) {
JUTException::panic_f("JKRAram.cpp", 0xdb, "%s", ":::address not 32Byte aligned.");
}
if (block && !IS_ALIGNED((u32)block->getAddress() + param_4, 0x20)) {
JUTException::panic_f("JKRAram.cpp", 0xe3, "%s", ":::address not 32Byte aligned.");
}
}
#pragma pop
/* 802D22DC-802D233C 2CCC1C 0060+00 1/1 0/0 0/0 .text changeGroupIdIfNeed__7JKRAramFPUci
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAram::changeGroupIdIfNeed(u8* param_0, int param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRAram/changeGroupIdIfNeed__7JKRAramFPUci.s"
void JKRAram::changeGroupIdIfNeed(u8* data, int groupId) {
JKRHeap* currentHeap = JKRHeap::getCurrentHeap();
if (currentHeap->getHeapType() == 'EXPH' && groupId >= 0) {
JKRExpHeap::CMemBlock* block = JKRExpHeap::CMemBlock::getBlock(data);
block->newGroupId(groupId);
}
}
#pragma pop
/* 802D233C-802D25B4 2CCC7C 0278+00 0/0 3/3 0/0 .text
* mainRamToAram__7JKRAramFPUcUlUl15JKRExpandSwitchUlP7JKRHeapiPUl */
@@ -286,28 +235,20 @@ asm void JKRAram::aramToMainRam(u32 param_0, u8* param_1, u32 param_2, JKRExpand
}
#pragma pop
/* ############################################################################################## */
/* 804342D0-804342DC 060FF0 000C+00 1/1 0/0 0/0 .bss @492 */
static u8 lit_492[12];
/* 804342DC-804342E8 060FFC 000C+00 1/1 0/0 0/0 .bss sAramCommandList__7JKRAram */
u8 JKRAram::sAramCommandList[12];
JSUList<JKRAMCommand> JKRAram::sAramCommandList;
/* 804342E8-80434300 061008 0018+00 1/1 0/0 0/0 .bss decompMutex */
static u8 decompMutex[24];
static OSMutex decompMutex;
/* 804508B8-804508C0 000338 0004+04 1/1 1/1 0/0 .sdata sSZSBufferSize__7JKRAram */
SECTION_SDATA u32 JKRAram::sSZSBufferSize[1 + 1 /* padding */] = {
0x00000400,
/* padding */
0x00000000,
};
u32 JKRAram::sSZSBufferSize = 0x00000400;
/* 804513CC-804513D0 0008CC 0004+00 3/3 0/0 0/0 .sbss szpBuf */
static u8 szpBuf[4];
static u8* szpBuf;
/* 804513D0-804513D4 0008D0 0004+00 3/3 0/0 0/0 .sbss szpEnd */
static u8 szpEnd[4];
static u8* szpEnd;
/* 804513D4-804513D8 0008D4 0004+00 2/2 0/0 0/0 .sbss refBuf */
static u8 refBuf[4];
@@ -319,16 +260,16 @@ static u8 refEnd[4];
static u8 refCurrent[4];
/* 804513E0-804513E4 0008E0 0004+00 3/3 0/0 0/0 .sbss srcOffset */
static u8 srcOffset[4];
static u32 srcOffset;
/* 804513E4-804513E8 0008E4 0004+00 4/4 0/0 0/0 .sbss transLeft */
static u8 transLeft[4];
static u32 transLeft;
/* 804513E8-804513EC 0008E8 0004+00 3/3 0/0 0/0 .sbss srcLimit */
static u8 srcLimit[4];
static u32 srcLimit;
/* 804513EC-804513F0 0008EC 0004+00 3/3 0/0 0/0 .sbss srcAddress */
static u8 srcAddress[4];
static u32 srcAddress;
/* 804513F0-804513F4 0008F0 0004+00 2/2 0/0 0/0 .sbss fileOffset */
static u8 fileOffset[4];
@@ -350,6 +291,70 @@ static u8 tsArea[4];
/* 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,
u32* resourceSize) {
#define s_is_decompress_mutex_initialized lbl_804513FC
#define decompMutex lbl_804343C0
// STATIC BEGIN
// This code is probably generated by the compiler for a static variable
BOOL enable = OSDisableInterrupts();
if (s_is_decompress_mutex_initialized == false) {
OSInitMutex(&decompMutex);
s_is_decompress_mutex_initialized = true;
}
OSRestoreInterrupts(enable);
// STATIC END
OSLockMutex(&decompMutex);
u32 szpSize = getSZSBufferSize();
szpBuf = (u8*)JKRAllocFromSysHeap(szpSize, 0x20);
ASSERT(szpBuf != 0);
szpEnd = szpBuf + szpSize;
if (offset != 0) {
refBuf = (u8*)JKRAllocFromSysHeap(0x1120, 0);
ASSERT(refBuf != 0);
refEnd = refBuf + 0x1120;
refCurrent = refBuf;
} else {
refBuf = NULL;
}
srcAddress = src;
srcOffset = 0;
if (srcLength == 0) {
transLeft = -1;
} else {
transLeft = srcLength;
}
fileOffset = offset;
readCount = 0;
maxDest = dstLength;
if (!resourceSize) {
tsPtr = &tsArea;
} else {
tsPtr = resourceSize;
}
*tsPtr = 0;
decompSZS_subroutine(firstSrcData(), (u8*)dst);
JKRFreeToSysHeap(szpBuf);
if (refBuf) {
JKRFreeToSysHeap(refBuf);
}
DCStoreRangeNoSync(dst, *tsPtr);
OSUnlockMutex(&decompMutex);
#undef s_is_decompress_mutex_initialized
#undef decompMutex
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -359,6 +364,7 @@ static asm void JKRDecompressFromAramToMainRam(u32 param_0, void* param_1, u32 p
#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
@@ -371,16 +377,66 @@ static asm void decompSZS_subroutine(u8* param_0, u8* param_1) {
#pragma pop
/* 802D2C40-802D2CE4 2CD580 00A4+00 1/1 0/0 0/0 .text firstSrcData__Fv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
static asm void firstSrcData() {
nofralloc
#include "asm/JSystem/JKernel/JKRAram/firstSrcData__Fv.s"
static u8* firstSrcData(void) {
srcLimit = (u32)(szpEnd - 0x19);
u8* buffer = szpBuf;
u32 length;
u32 size = szpEnd - szpBuf;
if (transLeft < size) {
length = transLeft;
} else {
length = size;
}
u32 src = (u32)(srcAddress + srcOffset);
u32 dst = (u32)buffer;
u32 alignedLength = ALIGN_NEXT(length, 0x20);
JKRAramPcs(1, src, dst, alignedLength, NULL);
srcOffset += length;
transLeft -= length;
if (!transLeft) {
srcLimit = (u32)(buffer + length);
}
return buffer;
}
#pragma pop
/* 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;
u32 left = (u32)(szpEnd - current);
if (!IS_NOT_ALIGNED(left, 0x20)) {
dest = szpBuf;
} else {
dest = szpBuf + 0x20 - (left & 0x1f);
}
memcpy(dest, current, left);
u32 transSize = nextSrcData_MIN(transLeft, szpEnd - (dest + left));
ASSERT(transSize > 0);
JKRAramPcs(1, (u32)(srcAddress + srcOffset), (u32)(dest + left), ALIGN_NEXT(transSize, 0x20),
NULL);
srcOffset += transSize;
transLeft -= transSize;
if (transLeft == 0) {
srcLimit = (u32)(dest + left) + transSize;
}
return dest;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -389,32 +445,7 @@ static asm void nextSrcData(u8* param_0) {
#include "asm/JSystem/JKernel/JKRAram/nextSrcData__FPUc.s"
}
#pragma pop
/* 802D2DAC-802D2DF0 2CD6EC 0044+00 0/0 1/0 0/0 .text __sinit_JKRAram_cpp */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void __sinit_JKRAram_cpp() {
nofralloc
#include "asm/JSystem/JKernel/JKRAram/__sinit_JKRAram_cpp.s"
}
#pragma pop
#pragma push
#pragma force_active on
REGISTER_CTORS(0x802D2DAC, __sinit_JKRAram_cpp);
#pragma pop
/* 802D2DF0-802D2E44 2CD730 0054+00 1/1 1/1 0/0 .text __dt__23JSUList<12JKRAMCommand>Fv
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
extern "C" asm void func_802D2DF0(void* _this) {
nofralloc
#include "asm/JSystem/JKernel/JKRAram/func_802D2DF0.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 8039D0A6-8039D0B8 029706 000E+04 0/0 0/0 0/0 .rodata None */
+1 -1
View File
@@ -3,7 +3,7 @@
// Translation Unit: JKRAramArchive
//
#include "JSystem/JKernel/JKRAramArchive.h"
// #include "JSystem/JKernel/JKRAramArchive.h"
#include "dol2asm.h"
#include "dolphin/types.h"
+50 -87
View File
@@ -4,110 +4,73 @@
//
#include "JSystem/JKernel/JKRAramBlock.h"
#include "JSystem/JKernel/JKRAramHeap.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JSUPtrLink {
/* 802DBDFC */ JSUPtrLink(void*);
/* 802DBE14 */ ~JSUPtrLink();
};
struct JSUPtrList {
/* 802DC094 */ void insert(JSUPtrLink*, JSUPtrLink*);
/* 802DC15C */ void remove(JSUPtrLink*);
};
struct JKRHeap {};
struct JKRAramHeap {};
struct JKRAramBlock {
/* 802D3304 */ JKRAramBlock(u32, u32, u32, u8, bool);
/* 802D3378 */ ~JKRAramBlock();
/* 802D3434 */ void allocHead(u32, u8, JKRAramHeap*);
/* 802D34D0 */ void allocTail(u32, u8, JKRAramHeap*);
};
//
// Forward References:
//
extern "C" void __ct__12JKRAramBlockFUlUlUlUcb();
extern "C" void __dt__12JKRAramBlockFv();
extern "C" void allocHead__12JKRAramBlockFUlUcP11JKRAramHeap();
extern "C" void allocTail__12JKRAramBlockFUlUcP11JKRAramHeap();
//
// External References:
//
extern "C" void* __nw__FUlP7JKRHeapi();
extern "C" void __dl__FPv();
extern "C" void __ct__10JSUPtrLinkFPv();
extern "C" void __dt__10JSUPtrLinkFv();
extern "C" void insert__10JSUPtrListFP10JSUPtrLinkP10JSUPtrLink();
extern "C" void remove__10JSUPtrListFP10JSUPtrLink();
extern "C" void _savegpr_26();
extern "C" void _savegpr_27();
extern "C" void _restgpr_26();
extern "C" void _restgpr_27();
//
// Declarations:
//
/* ############################################################################################## */
/* 803CC178-803CC188 029298 000C+04 2/2 0/0 0/0 .data __vt__12JKRAramBlock */
SECTION_DATA extern void* __vt__12JKRAramBlock[3 + 1 /* padding */] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__12JKRAramBlockFv,
/* padding */
NULL,
};
/* 802D3304-802D3378 2CDC44 0074+00 2/2 1/1 0/0 .text __ct__12JKRAramBlockFUlUlUlUcb */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRAramBlock::JKRAramBlock(u32 param_0, u32 param_1, u32 param_2, u8 param_3, bool param_4) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramBlock/__ct__12JKRAramBlockFUlUlUlUcb.s"
JKRAramBlock::JKRAramBlock(u32 address, u32 size, u32 freeSize, u8 groupId, bool isTempMemory)
: mBlockLink(this) {
mAddress = address;
mSize = size;
mFreeSize = freeSize;
mGroupId = groupId;
mIsTempMemory = isTempMemory;
}
#pragma pop
/* 802D3378-802D3434 2CDCB8 00BC+00 1/0 0/0 0/0 .text __dt__12JKRAramBlockFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRAramBlock::~JKRAramBlock() {
nofralloc
#include "asm/JSystem/JKernel/JKRAramBlock/__dt__12JKRAramBlockFv.s"
JKRAramBlock::~JKRAramBlock() {
JSUList<JKRAramBlock>* list = mBlockLink.getSupervisor();
JSULink<JKRAramBlock>* prev = mBlockLink.getPrev();
if (prev) {
JKRAramBlock* block = prev->getObject();
block->mFreeSize = mSize + mFreeSize + block->mFreeSize;
list->remove(&mBlockLink);
} else {
mFreeSize = mFreeSize + mSize;
mSize = 0;
}
}
#pragma pop
/* 802D3434-802D34D0 2CDD74 009C+00 0/0 1/1 0/0 .text allocHead__12JKRAramBlockFUlUcP11JKRAramHeap
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramBlock::allocHead(u32 param_0, u8 param_1, JKRAramHeap* param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramBlock/allocHead__12JKRAramBlockFUlUcP11JKRAramHeap.s"
JKRAramBlock* JKRAramBlock::allocHead(u32 size, u8 groupId, JKRAramHeap* aramHeap) {
u32 address = mAddress;
u32 usedSize = mSize;
u32 nextAddress = address + usedSize;
u32 freeSize = mFreeSize;
u32 nextFreeSize = freeSize - size;
JKRAramBlock* block = new (aramHeap->getMgrHeap(), 0)
JKRAramBlock(nextAddress, size, nextFreeSize, groupId, false);
mFreeSize = 0;
JSULink<JKRAramBlock>* next = mBlockLink.getNext();
JSUList<JKRAramBlock>* list = mBlockLink.getSupervisor();
list->insert(next, &block->mBlockLink);
return block;
}
#pragma pop
/* 802D34D0-802D3574 2CDE10 00A4+00 0/0 1/1 0/0 .text allocTail__12JKRAramBlockFUlUcP11JKRAramHeap
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramBlock::allocTail(u32 param_0, u8 param_1, JKRAramHeap* param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramBlock/allocTail__12JKRAramBlockFUlUcP11JKRAramHeap.s"
JKRAramBlock* JKRAramBlock::allocTail(u32 size, u8 groupId, JKRAramHeap* aramHeap) {
u32 freeSize = mFreeSize;
u32 address = mAddress;
u32 usedSize = mSize;
u32 endAddress = address + usedSize + freeSize;
u32 tailAddress = endAddress - size;
JKRAramBlock* block =
new (aramHeap->getMgrHeap(), 0) JKRAramBlock(tailAddress, size, 0, groupId, true);
mFreeSize -= size;
JSULink<JKRAramBlock>* next = mBlockLink.getNext();
JSUList<JKRAramBlock>* list = mBlockLink.getSupervisor();
list->insert(next, &block->mBlockLink);
return block;
}
#pragma pop
+128 -137
View File
@@ -4,57 +4,9 @@
//
#include "JSystem/JKernel/JKRAramHeap.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JSUPtrLink {};
struct JSUPtrList {
/* 802DBEAC */ ~JSUPtrList();
/* 802DBF14 */ void initiate();
/* 802DBF4C */ void append(JSUPtrLink*);
};
template <typename A0>
struct JSUList {};
/* JSUList<JKRAramBlock> */
struct JSUList__template6 {
/* 802D32B0 */ void func_802D32B0(void* _this);
};
struct JKRHeap {
/* 802CE83C */ void findFromRoot(void*);
};
struct JKRDisposer {
/* 802D147C */ JKRDisposer();
/* 802D14E4 */ ~JKRDisposer();
};
struct JKRAramHeap {
struct EAllocMode {};
/* 802D2E44 */ JKRAramHeap(u32, u32);
/* 802D2F14 */ ~JKRAramHeap();
/* 802D2FBC */ void alloc(u32, JKRAramHeap::EAllocMode);
/* 802D3034 */ void allocFromHead(u32);
/* 802D30BC */ void allocFromTail(u32);
/* 802D3134 */ void getFreeSize();
/* 802D31AC */ void getTotalFreeSize();
/* 802D3218 */ void dump();
static u8 sAramList[12];
};
struct JKRAramBlock {
/* 802D3304 */ JKRAramBlock(u32, u32, u32, u8, bool);
/* 802D3434 */ void allocHead(u32, u8, JKRAramHeap*);
/* 802D34D0 */ void allocTail(u32, u8, JKRAramHeap*);
};
#include "global.h"
//
// Forward References:
@@ -72,10 +24,17 @@ extern "C" void __sinit_JKRAramHeap_cpp();
extern "C" void func_802D32B0(void* _this);
extern "C" u8 sAramList__11JKRAramHeap[12];
extern "C" void* __vt__11JKRAramHeap;
//
// External References:
//
// TODO: move to JKRHeap
void* operator new(u32 size);
void* operator new(u32 size, int alignment);
void* operator new(u32 size, JKRHeap* heap, int alignment);
extern "C" void findFromRoot__7JKRHeapFPv();
extern "C" void* __nw__FUlP7JKRHeapi();
extern "C" void __dl__FPv();
@@ -87,9 +46,6 @@ extern "C" void allocTail__12JKRAramBlockFUlUcP11JKRAramHeap();
extern "C" void __dt__10JSUPtrListFv();
extern "C" void initiate__10JSUPtrListFv();
extern "C" void append__10JSUPtrListFP10JSUPtrLink();
extern "C" void OSInitMutex();
extern "C" void OSLockMutex();
extern "C" void OSUnlockMutex();
extern "C" void __register_global_object();
extern "C" void _savegpr_29();
extern "C" void _restgpr_29();
@@ -98,33 +54,40 @@ extern "C" void _restgpr_29();
// Declarations:
//
/* ############################################################################################## */
/* 803CC168-803CC178 029288 000C+04 2/2 0/0 0/0 .data __vt__11JKRAramHeap */
SECTION_DATA extern void* __vt__11JKRAramHeap[3 + 1 /* padding */] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__11JKRAramHeapFv,
/* padding */
NULL,
};
/* 80434300-8043430C 061020 000C+00 1/1 0/0 0/0 .bss @297 */
static u8 lit_297[12];
/* 8043430C-80434318 06102C 000C+00 8/8 0/0 0/0 .bss sAramList__11JKRAramHeap */
u8 JKRAramHeap::sAramList[12];
JSUList<JKRAramBlock> JKRAramHeap::sAramList;
/* 802D2E44-802D2F14 2CD784 00D0+00 0/0 1/1 0/0 .text __ct__11JKRAramHeapFUlUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRAramHeap::JKRAramHeap(u32 param_0, u32 param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/__ct__11JKRAramHeapFUlUl.s"
JKRAramHeap::JKRAramHeap(u32 startAddress, u32 size) {
OSInitMutex(&mMutex);
mHeap = JKRHeap::findFromRoot(this);
mSize = ALIGN_PREV(size, 0x20);
mHeadAddress = ALIGN_NEXT(startAddress, 0x20);
mTailAddress = mHeadAddress + mSize;
mGroupId = -1;
JKRAramBlock* block = new (mHeap, 0) JKRAramBlock(mHeadAddress, 0, mSize, -1, false);
sAramList.append(&block->mBlockLink);
}
#pragma pop
/* 802D2F14-802D2FBC 2CD854 00A8+00 1/0 0/0 0/0 .text __dt__11JKRAramHeapFv */
// close match, regalloc problem in the beginning of the while loop
#ifdef NONMATCHING
JKRAramHeap::~JKRAramHeap() {
JSUList<JKRAramBlock>* list = &lbl_8043430C;
JSUListIterator<JKRAramBlock> iterator = list;
while (iterator != list->getEnd()) {
JSUListIterator<JKRAramBlock> prev = iterator;
JKRAramBlock* block = prev.getObject();
delete block;
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -133,91 +96,119 @@ asm JKRAramHeap::~JKRAramHeap() {
#include "asm/JSystem/JKernel/JKRAramHeap/__dt__11JKRAramHeapFv.s"
}
#pragma pop
#endif
/* 802D2FBC-802D3034 2CD8FC 0078+00 0/0 5/5 0/0 .text
* alloc__11JKRAramHeapFUlQ211JKRAramHeap10EAllocMode */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramHeap::alloc(u32 param_0, JKRAramHeap::EAllocMode param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/alloc__11JKRAramHeapFUlQ211JKRAramHeap10EAllocMode.s"
JKRAramBlock* JKRAramHeap::alloc(u32 size, JKRAramHeap::EAllocMode allocationMode) {
lock();
JKRAramBlock* block;
if (allocationMode == JKRAramHeap::HEAD) {
block = allocFromHead(size);
} else {
block = allocFromTail(size);
}
unlock();
return block;
}
#pragma pop
/* 802D3034-802D30BC 2CD974 0088+00 1/1 0/0 0/0 .text allocFromHead__11JKRAramHeapFUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramHeap::allocFromHead(u32 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/allocFromHead__11JKRAramHeapFUl.s"
JKRAramBlock* JKRAramHeap::allocFromHead(u32 size) {
u32 alignedSize = ALIGN_NEXT(size, 0x20);
u32 bestFreeSize = UINT32_MAX;
JKRAramBlock* bestBlock = NULL;
JSUList<JKRAramBlock>* list = &sAramList;
for (JSUListIterator<JKRAramBlock> iterator = list; iterator != list->getEnd(); ++iterator) {
JKRAramBlock* block = iterator.getObject();
if (block->mFreeSize < alignedSize)
continue;
if (bestFreeSize <= block->mFreeSize)
continue;
bestFreeSize = block->mFreeSize;
bestBlock = block;
if (block->mFreeSize == alignedSize) {
break;
}
}
if (bestBlock) {
return bestBlock->allocHead(alignedSize, mGroupId, this);
}
return NULL;
}
#pragma pop
/* 802D30BC-802D3134 2CD9FC 0078+00 1/1 0/0 0/0 .text allocFromTail__11JKRAramHeapFUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramHeap::allocFromTail(u32 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/allocFromTail__11JKRAramHeapFUl.s"
JKRAramBlock* JKRAramHeap::allocFromTail(u32 size) {
u32 alignedSize = ALIGN_NEXT(size, 0x20);
JKRAramBlock* tailBlock = NULL;
JSUList<JKRAramBlock>* list = &sAramList;
JSUListIterator<JKRAramBlock> iterator = list->getLast();
for (; iterator != list->getEnd(); --iterator) {
JKRAramBlock* block = iterator.getObject();
if (block->mFreeSize >= alignedSize) {
tailBlock = block;
break;
}
}
if (tailBlock) {
return tailBlock->allocTail(alignedSize, mGroupId, this);
}
return NULL;
}
#pragma pop
/* 802D3134-802D31AC 2CDA74 0078+00 0/0 1/1 0/0 .text getFreeSize__11JKRAramHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramHeap::getFreeSize() {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/getFreeSize__11JKRAramHeapFv.s"
u32 JKRAramHeap::getFreeSize(void) {
u32 maxFreeSize = 0;
lock();
JSUList<JKRAramBlock>* list = &sAramList;
JSUListIterator<JKRAramBlock> iterator = list;
for (; iterator != list->getEnd(); ++iterator) {
if (iterator->mFreeSize > maxFreeSize) {
maxFreeSize = iterator->mFreeSize;
}
}
unlock();
return maxFreeSize;
}
#pragma pop
/* 802D31AC-802D3218 2CDAEC 006C+00 0/0 2/2 0/0 .text getTotalFreeSize__11JKRAramHeapFv
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramHeap::getTotalFreeSize() {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/getTotalFreeSize__11JKRAramHeapFv.s"
u32 JKRAramHeap::getTotalFreeSize(void) {
u32 totalFreeSize = 0;
lock();
JSUList<JKRAramBlock>* list = &sAramList;
JSUListIterator<JKRAramBlock> iterator = list;
for (; iterator != list->getEnd(); ++iterator) {
totalFreeSize += iterator->mFreeSize;
}
unlock();
return totalFreeSize;
}
#pragma pop
/* 802D3218-802D326C 2CDB58 0054+00 0/0 2/2 0/0 .text dump__11JKRAramHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramHeap::dump() {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/dump__11JKRAramHeapFv.s"
}
#pragma pop
void JKRAramHeap::dump(void) {
lock();
/* 802D326C-802D32B0 2CDBAC 0044+00 0/0 1/0 0/0 .text __sinit_JKRAramHeap_cpp */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void __sinit_JKRAramHeap_cpp() {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/__sinit_JKRAramHeap_cpp.s"
}
#pragma pop
JSUList<JKRAramBlock>* list = &sAramList;
JSUListIterator<JKRAramBlock> iterator = list;
for (; iterator != list->getEnd(); ++iterator) {
// The debug version calls OSReport
}
#pragma push
#pragma force_active on
REGISTER_CTORS(0x802D326C, __sinit_JKRAramHeap_cpp);
#pragma pop
/* 802D32B0-802D3304 2CDBF0 0054+00 1/1 0/0 0/0 .text __dt__23JSUList<12JKRAramBlock>Fv
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
extern "C" asm void func_802D32B0(void* _this) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/func_802D32B0.s"
unlock();
}
#pragma pop
+121 -212
View File
@@ -4,259 +4,168 @@
//
#include "JSystem/JKernel/JKRAramPiece.h"
#include "JSystem/JKernel/JKRAram.h"
#include "JSystem/JKernel/JKRDecomp.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/JUtility/JUTException.h"
#include "dol2asm.h"
#include "dolphin/os/OSCache.h"
#include "dolphin/types.h"
//
// Types:
//
struct JUTException {
/* 802E21FC */ void panic_f(char const*, int, char const*, ...);
};
struct JSUPtrLink {
/* 802DBDFC */ JSUPtrLink(void*);
/* 802DBE14 */ ~JSUPtrLink();
};
struct JSUPtrList {
/* 802DBF14 */ void initiate();
/* 802DBF4C */ void append(JSUPtrLink*);
/* 802DC15C */ void remove(JSUPtrLink*);
};
template <typename A0>
struct JSUList {};
/* JSUList<JKRAMCommand> */
struct JSUList__template5 {
/* 802D2DF0 */ void func_802D2DF0(void* _this);
};
struct JKRHeap {
/* 802CE500 */ void free(void*, JKRHeap*);
static u8 sSystemHeap[4];
};
struct JKRDecompCommand {};
struct JKRDecomp {
/* 802DB8D0 */ void sendCommand(JKRDecompCommand*);
};
struct JKRAMCommand {
/* 802D39EC */ JKRAMCommand();
/* 802D3A5C */ ~JKRAMCommand();
};
struct JKRAramBlock {};
struct JKRAramPiece {
/* 802D3574 */ void prepareCommand(int, u32, u32, u32, JKRAramBlock*, void (*)(u32));
/* 802D35F4 */ void sendCommand(JKRAMCommand*);
/* 802D3614 */ void orderAsync(int, u32, u32, u32, JKRAramBlock*, void (*)(u32));
/* 802D3770 */ void sync(JKRAMCommand*, int);
/* 802D3838 */ void orderSync(int, u32, u32, u32, JKRAramBlock*);
/* 802D38CC */ void startDMA(JKRAMCommand*);
/* 802D3944 */ void doneDMA(u32);
static u8 sAramPieceCommandList[12];
static u8 mMutex[24];
};
struct JKRAram {
static u8 sMessageQueue[32];
};
//
// Forward References:
//
extern "C" void prepareCommand__12JKRAramPieceFiUlUlUlP12JKRAramBlockPFUl_v();
extern "C" void sendCommand__12JKRAramPieceFP12JKRAMCommand();
extern "C" void orderAsync__12JKRAramPieceFiUlUlUlP12JKRAramBlockPFUl_v();
extern "C" void sync__12JKRAramPieceFP12JKRAMCommandi();
extern "C" void orderSync__12JKRAramPieceFiUlUlUlP12JKRAramBlock();
extern "C" void startDMA__12JKRAramPieceFP12JKRAMCommand();
extern "C" void doneDMA__12JKRAramPieceFUl();
extern "C" void __ct__12JKRAMCommandFv();
extern "C" void __dt__12JKRAMCommandFv();
extern "C" void __sinit_JKRAramPiece_cpp();
extern "C" extern char const* const JKRAramPiece__stringBase0;
extern "C" u8 sAramPieceCommandList__12JKRAramPiece[12];
extern "C" u8 mMutex__12JKRAramPiece[24];
//
// External References:
//
extern "C" void OSReport();
extern "C" void free__7JKRHeapFPvP7JKRHeap();
extern "C" void* __nw__FUlP7JKRHeapi();
extern "C" void __dl__FPv();
extern "C" void func_802D2DF0(void* _this);
extern "C" void sendCommand__9JKRDecompFP16JKRDecompCommand();
extern "C" void __ct__10JSUPtrLinkFPv();
extern "C" void __dt__10JSUPtrLinkFv();
extern "C" void initiate__10JSUPtrListFv();
extern "C" void append__10JSUPtrListFP10JSUPtrLink();
extern "C" void remove__10JSUPtrListFP10JSUPtrLink();
extern "C" void panic_f__12JUTExceptionFPCciPCce();
extern "C" void DCInvalidateRange();
extern "C" void DCStoreRange();
extern "C" void OSInitMessageQueue();
extern "C" void OSSendMessage();
extern "C" void OSReceiveMessage();
extern "C" void OSLockMutex();
extern "C" void OSUnlockMutex();
extern "C" void ARQPostRequest();
extern "C" void __register_global_object();
extern "C" void _savegpr_25();
extern "C" void _savegpr_26();
extern "C" void _savegpr_27();
extern "C" void _restgpr_25();
extern "C" void _restgpr_26();
extern "C" void _restgpr_27();
extern "C" u8 sMessageQueue__7JKRAram[32];
extern "C" u8 sSystemHeap__7JKRHeap[4];
//
// Declarations:
//
/* 802D3574-802D35F4 2CDEB4 0080+00 1/1 0/0 0/0 .text
* prepareCommand__12JKRAramPieceFiUlUlUlP12JKRAramBlockPFUl_v */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramPiece::prepareCommand(int param_0, u32 param_1, u32 param_2, u32 param_3,
JKRAramBlock* param_4, void (*param_5)(u32)) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramPiece/prepareCommand__12JKRAramPieceFiUlUlUlP12JKRAramBlockPFUl_v.s"
JKRAMCommand* JKRAramPiece::prepareCommand(int direction, u32 src, u32 dst, u32 length,
JKRAramBlock* block,
JKRAMCommand::AsyncCallback callback) {
JKRAMCommand* command = new (JKRHeap::getSystemHeap(), -4) JKRAMCommand();
command->mTransferDirection = direction;
command->mSrc = src;
command->mDst = dst;
command->mAramBlock = block;
command->mDataLength = length;
command->mCallback = callback;
return command;
}
#pragma pop
/* 802D35F4-802D3614 2CDF34 0020+00 0/0 1/1 0/0 .text sendCommand__12JKRAramPieceFP12JKRAMCommand
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramPiece::sendCommand(JKRAMCommand* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramPiece/sendCommand__12JKRAramPieceFP12JKRAMCommand.s"
void JKRAramPiece::sendCommand(JKRAMCommand* command) {
startDMA(command);
}
#pragma pop
/* ############################################################################################## */
/* 8039D0B8-8039D0B8 029718 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039D0B8 = "direction = %x\n";
SECTION_DEAD static char const* const stringBase_8039D0C8 = "source = %x\n";
SECTION_DEAD static char const* const stringBase_8039D0D5 = "destination = %x\n";
SECTION_DEAD static char const* const stringBase_8039D0E7 = "length = %x\n";
SECTION_DEAD static char const* const stringBase_8039D0F4 = "JKRAramPiece.cpp";
SECTION_DEAD static char const* const stringBase_8039D105 = "%s";
SECTION_DEAD static char const* const stringBase_8039D108 = "illegal address. abort.";
#pragma pop
/* 80434318-80434324 061038 000C+00 1/1 0/0 0/0 .bss @492 */
static u8 lit_492[12];
/* 80434324-80434330 061044 000C+00 3/3 0/0 0/0 .bss sAramPieceCommandList__12JKRAramPiece */
u8 JKRAramPiece::sAramPieceCommandList[12];
// JSUList<JKRAMCommand> JKRAramPiece::sAramPieceCommandList;
JSUList<JKRAMCommand> JKRAramPiece::sAramPieceCommandList;
/* 80434330-80434348 061050 0018+00 3/3 0/0 0/0 .bss mMutex__12JKRAramPiece */
u8 JKRAramPiece::mMutex[24];
OSMutex JKRAramPiece::mMutex;
/* 802D3614-802D3770 2CDF54 015C+00 1/1 0/0 0/0 .text
* orderAsync__12JKRAramPieceFiUlUlUlP12JKRAramBlockPFUl_v */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramPiece::orderAsync(int param_0, u32 param_1, u32 param_2, u32 param_3,
JKRAramBlock* param_4, void (*param_5)(u32)) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramPiece/orderAsync__12JKRAramPieceFiUlUlUlP12JKRAramBlockPFUl_v.s"
JKRAMCommand* JKRAramPiece::orderAsync(int direction, u32 source, u32 destination, u32 length,
JKRAramBlock* block, JKRAMCommand::AsyncCallback callback) {
lock();
if (((source & 0x1f) != 0) || ((destination & 0x1f) != 0)) {
OSReport("direction = %x\n", direction);
OSReport("source = %x\n", source);
OSReport("destination = %x\n", destination);
OSReport("length = %x\n", length);
JUTException::panic_f("JKRAramPiece.cpp", 0x6c, "%s", "illegal address. abort.");
}
Message* message = new (JKRHeap::getSystemHeap(), -4) Message();
JKRAMCommand* command =
JKRAramPiece::prepareCommand(direction, source, destination, length, block, callback);
message->field_0x00 = 1;
message->command = command;
OSSendMessage(&JKRAram::sMessageQueue, message, OS_MESSAGE_BLOCKING);
if (command->mCallback != NULL) {
sAramPieceCommandList.append(&command->mPieceLink);
}
unlock();
return command;
}
#pragma pop
/* 802D3770-802D3838 2CE0B0 00C8+00 1/1 0/0 0/0 .text sync__12JKRAramPieceFP12JKRAMCommandi */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramPiece::sync(JKRAMCommand* param_0, int param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramPiece/sync__12JKRAramPieceFP12JKRAMCommandi.s"
BOOL JKRAramPiece::sync(JKRAMCommand* command, int is_non_blocking) {
OSMessage message;
lock();
if (is_non_blocking == 0) {
OSReceiveMessage(&command->mMessageQueue, &message, OS_MESSAGE_BLOCKING);
sAramPieceCommandList.remove(&command->mPieceLink);
unlock();
return TRUE;
}
BOOL result = OSReceiveMessage(&command->mMessageQueue, &message, OS_MESSAGE_NON_BLOCKING);
if (!result) {
unlock();
return FALSE;
}
sAramPieceCommandList.remove(&command->mPieceLink);
unlock();
return TRUE;
}
#pragma pop
/* 802D3838-802D38CC 2CE178 0094+00 0/0 6/6 0/0 .text
* orderSync__12JKRAramPieceFiUlUlUlP12JKRAramBlock */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramPiece::orderSync(int param_0, u32 param_1, u32 param_2, u32 param_3,
JKRAramBlock* param_4) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramPiece/orderSync__12JKRAramPieceFiUlUlUlP12JKRAramBlock.s"
BOOL JKRAramPiece::orderSync(int direction, u32 source, u32 destination, u32 length,
JKRAramBlock* block) {
lock();
JKRAMCommand* command =
JKRAramPiece::orderAsync(direction, source, destination, length, block, NULL);
BOOL result = JKRAramPiece::sync(command, 0);
delete command;
unlock();
return result;
}
#pragma pop
/* 802D38CC-802D3944 2CE20C 0078+00 1/1 1/1 0/0 .text startDMA__12JKRAramPieceFP12JKRAMCommand */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramPiece::startDMA(JKRAMCommand* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramPiece/startDMA__12JKRAramPieceFP12JKRAMCommand.s"
void JKRAramPiece::startDMA(JKRAMCommand* command) {
if (command->mTransferDirection == 1) {
DCInvalidateRange((void*)command->mDst, command->mDataLength);
} else {
DCStoreRange((void*)command->mSrc, command->mDataLength);
}
ARQPostRequest(&command->mRequest, 0, command->mTransferDirection, 0, command->mSrc,
command->mDst, command->mDataLength, JKRAramPiece::doneDMA);
}
#pragma pop
/* 802D3944-802D39EC 2CE284 00A8+00 1/1 0/0 0/0 .text doneDMA__12JKRAramPieceFUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramPiece::doneDMA(u32 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramPiece/doneDMA__12JKRAramPieceFUl.s"
void JKRAramPiece::doneDMA(u32 requestAddress) {
JKRAMCommand* command = (JKRAMCommand*)requestAddress;
if (command->mTransferDirection == 1) {
DCInvalidateRange((void*)command->mDst, command->mDataLength);
}
if (command->field_0x60 != 0) {
if (command->field_0x60 == 2) {
JKRDecomp::sendCommand(command->mDecompCommand);
}
return;
}
if (command->mCallback) {
(*command->mCallback)(requestAddress);
} else if (command->field_0x5C) {
OSSendMessage(command->field_0x5C, command, OS_MESSAGE_NON_BLOCKING);
} else {
OSSendMessage(&command->mMessageQueue, command, OS_MESSAGE_NON_BLOCKING);
}
}
#pragma pop
/* 802D39EC-802D3A5C 2CE32C 0070+00 1/1 0/0 0/0 .text __ct__12JKRAMCommandFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRAMCommand::JKRAMCommand() {
nofralloc
#include "asm/JSystem/JKernel/JKRAramPiece/__ct__12JKRAMCommandFv.s"
JKRAMCommand::JKRAMCommand() : mPieceLink(this), field_0x30(this) {
OSInitMessageQueue(&mMessageQueue, &mMessage, 1);
mCallback = NULL;
field_0x5C = NULL;
field_0x60 = 0;
field_0x8C = NULL;
field_0x90 = NULL;
field_0x94 = NULL;
}
#pragma pop
/* 802D3A5C-802D3B04 2CE39C 00A8+00 1/1 0/0 0/0 .text __dt__12JKRAMCommandFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRAMCommand::~JKRAMCommand() {
nofralloc
#include "asm/JSystem/JKernel/JKRAramPiece/__dt__12JKRAMCommandFv.s"
}
#pragma pop
JKRAMCommand::~JKRAMCommand() {
if (field_0x8C)
delete field_0x8C;
if (field_0x90)
delete field_0x90;
/* 802D3B04-802D3B48 2CE444 0044+00 0/0 1/0 0/0 .text __sinit_JKRAramPiece_cpp */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void __sinit_JKRAramPiece_cpp() {
nofralloc
#include "asm/JSystem/JKernel/JKRAramPiece/__sinit_JKRAramPiece_cpp.s"
if (field_0x94)
JKRHeap::free(field_0x94, NULL);
}
#pragma pop
#pragma push
#pragma force_active on
REGISTER_CTORS(0x802D3B04, __sinit_JKRAramPiece_cpp);
#pragma pop
/* 8039D0B8-8039D0B8 029718 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
+196 -155
View File
@@ -4,72 +4,10 @@
//
#include "JSystem/JKernel/JKRAramStream.h"
#include "JSystem/JKernel/JKRAramPiece.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JUTException {
/* 802E21FC */ void panic_f(char const*, int, char const*, ...);
};
struct JSUStreamSeekFrom {};
struct JSURandomInputStream {
/* 802D4094 */ void getAvailable() const;
/* 802DC4DC */ void seek(s32, JSUStreamSeekFrom);
};
struct JSUInputStream {
/* 802DC298 */ void read(void*, s32);
};
struct JSUFileInputStream {};
struct JKRThread {
/* 802D1568 */ JKRThread(u32, int, int);
/* 802D1758 */ ~JKRThread();
};
struct JKRHeap {
/* 802CE4D4 */ void alloc(u32, int);
/* 802CE474 */ void alloc(u32, int, JKRHeap*);
/* 802CE500 */ void free(void*, JKRHeap*);
static u8 sSystemHeap[4];
static u8 sCurrentHeap[4];
};
struct JKRAramStreamCommand {
/* 802D4088 */ JKRAramStreamCommand();
};
struct JKRAramStream {
/* 802D3B48 */ void create(s32);
/* 802D3BB8 */ JKRAramStream(s32);
/* 802D3C08 */ ~JKRAramStream();
/* 802D3C68 */ void run();
/* 802D3CD8 */ bool readFromAram();
/* 802D3CE0 */ void writeToAram(JKRAramStreamCommand*);
/* 802D3ED0 */ void write_StreamToAram_Async(JSUFileInputStream*, u32, u32, u32, u32*);
/* 802D3FA0 */ void sync(JKRAramStreamCommand*, int);
/* 802D4034 */ void setTransBuffer(u8*, u32, JKRHeap*);
static u8 sMessageBuffer[16];
static u8 sMessageQueue[32];
static u8 sAramStreamObject[4];
static u8 transBuffer[4];
static u8 transSize[4];
static u8 transHeap[4];
};
struct JKRAramBlock {};
struct JKRAramPiece {
/* 802D3838 */ void orderSync(int, u32, u32, u32, JKRAramBlock*);
};
#include "global.h"
//
// Forward References:
@@ -109,10 +47,6 @@ extern "C" void orderSync__12JKRAramPieceFiUlUlUlP12JKRAramBlock();
extern "C" void read__14JSUInputStreamFPvl();
extern "C" void seek__20JSURandomInputStreamFl17JSUStreamSeekFrom();
extern "C" void panic_f__12JUTExceptionFPCciPCce();
extern "C" void OSInitMessageQueue();
extern "C" void OSSendMessage();
extern "C" void OSReceiveMessage();
extern "C" void OSResumeThread();
extern "C" void _savegpr_24();
extern "C" void _savegpr_26();
extern "C" void _restgpr_24();
@@ -127,75 +61,153 @@ extern "C" u8 sCurrentHeap__7JKRHeap[4];
/* ############################################################################################## */
/* 80451408-8045140C 000908 0004+00 1/1 0/0 0/0 .sbss sAramStreamObject__13JKRAramStream
*/
u8 JKRAramStream::sAramStreamObject[4];
JKRAramStream* JKRAramStream::sAramStreamObject;
/* 802D3B48-802D3BB8 2CE488 0070+00 0/0 1/1 0/0 .text create__13JKRAramStreamFl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramStream::create(s32 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramStream/create__13JKRAramStreamFl.s"
JKRAramStream* JKRAramStream::create(long priority) {
if (!sAramStreamObject) {
sAramStreamObject = new (JKRGetSystemHeap(), 0) JKRAramStream(priority);
setTransBuffer(NULL, 0, NULL);
}
return sAramStreamObject;
}
#pragma pop
/* ############################################################################################## */
/* 803CC188-803CC198 0292A8 0010+00 1/1 0/0 0/0 .data sMessageBuffer__13JKRAramStream */
SECTION_DATA u8 JKRAramStream::sMessageBuffer[16] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
void* JKRAramStream::sMessageBuffer[4] = {
NULL,
NULL,
NULL,
NULL,
};
/* 803CC198-803CC1B8 0292B8 0020+00 2/2 0/0 0/0 .data sMessageQueue__13JKRAramStream */
SECTION_DATA u8 JKRAramStream::sMessageQueue[32] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/* 803CC1B8-803CC1C8 0292D8 0010+00 2/2 0/0 0/0 .data __vt__13JKRAramStream */
SECTION_DATA extern void* __vt__13JKRAramStream[4] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__13JKRAramStreamFv,
(void*)run__13JKRAramStreamFv,
};
OSMessageQueue JKRAramStream::sMessageQueue = {0};
/* 802D3BB8-802D3C08 2CE4F8 0050+00 1/1 0/0 0/0 .text __ct__13JKRAramStreamFl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRAramStream::JKRAramStream(s32 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramStream/__ct__13JKRAramStreamFl.s"
JKRAramStream::JKRAramStream(long priority) : JKRThread(0xc00, 0x10, priority) {
resume();
}
#pragma pop
/* 802D3C08-802D3C68 2CE548 0060+00 1/0 0/0 0/0 .text __dt__13JKRAramStreamFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRAramStream::~JKRAramStream() {
nofralloc
#include "asm/JSystem/JKernel/JKRAramStream/__dt__13JKRAramStreamFv.s"
}
#pragma pop
JKRAramStream::~JKRAramStream() {}
/* 802D3C68-802D3CD8 2CE5A8 0070+00 1/0 0/0 0/0 .text run__13JKRAramStreamFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramStream::run() {
nofralloc
#include "asm/JSystem/JKernel/JKRAramStream/run__13JKRAramStreamFv.s"
void* JKRAramStream::run(void) {
OSInitMessageQueue(&sMessageQueue, sMessageBuffer, ARRAY_SIZE(sMessageBuffer));
for (;;) {
OSMessage message;
OSReceiveMessage(&sMessageQueue, &message, OS_MESSAGE_BLOCKING);
JKRAramStreamCommand* command = (JKRAramStreamCommand*)message;
switch (command->mType) {
case JKRAramStreamCommand::READ:
readFromAram();
break;
case JKRAramStreamCommand::WRITE:
writeToAram(command);
break;
}
}
}
#pragma pop
/* 802D3CD8-802D3CE0 2CE618 0008+00 1/1 0/0 0/0 .text readFromAram__13JKRAramStreamFv */
bool JKRAramStream::readFromAram() {
return true;
s32 JKRAramStream::readFromAram(void) {
return 1;
}
/* ############################################################################################## */
/* 8039D120-8039D120 029780 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
// regalloc problems
#ifdef NONMATCHING
s32 JKRAramStream::writeToAram(JKRAramStreamCommand* command) {
u32 size;
u32 dstSize = command->mDstLength;
u32 offset = command->mOffset;
u32 writtenLength = 0;
u32 destination = command->mDst;
u8* buffer = command->mTransferBuffer;
u32 bufferSize = command->mTransferBufferSize;
JKRHeap* heap = command->mHeap;
if (buffer) {
if (bufferSize) {
size = bufferSize;
} else {
size = 0x8000;
}
command->mTransferBufferSize = size;
command->mAllocatedTransferBuffer = false;
} else {
if (bufferSize) {
size = bufferSize;
} else {
size = 0x8000;
}
if (heap) {
buffer = (u8*)JKRAllocFromHeap(heap, size, -0x20);
command->mTransferBuffer = buffer;
} else {
buffer = (u8*)JKRAllocFromSysHeap(size, -0x20);
command->mTransferBuffer = buffer;
}
command->mTransferBufferSize = size;
command->mAllocatedTransferBuffer = true;
}
if (!buffer) {
if (!heap) {
JKRGetCurrentHeap()->dump();
} else {
heap->dump();
}
panic_f__12JUTExceptionFPCciPCce("JKRAramStream.cpp", 0xac, "%s",
":::Cannot alloc memory\n");
}
if (buffer) {
seek__20JSURandomInputStreamFl17JSUStreamSeekFrom((JSURandomInputStream*)command->mStream,
offset, 0);
while (dstSize != 0) {
u32 length;
if (dstSize > size) {
length = size;
} else {
length = dstSize;
}
s32 readLength =
read__14JSUInputStreamFPvl((JSUInputStream*)command->mStream, buffer, length);
if (readLength == 0) {
writtenLength = 0;
break;
}
JKRAramPcs(0, (u32)buffer, destination, length, NULL);
dstSize -= length;
writtenLength += writtenLength;
destination += length;
if (command->mReturnSize) {
*command->mReturnSize += length;
}
}
if (command->mAllocatedTransferBuffer) {
JKRFree(buffer);
command->mAllocatedTransferBuffer = false;
}
}
OSSendMessage(&command->mMessageQueue, (OSMessage)writtenLength, OS_MESSAGE_NON_BLOCKING);
return writtenLength;
}
#else
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039D120 = "JKRAramStream.cpp";
@@ -210,74 +222,103 @@ SECTION_DEAD static char const* const pad_8039D14D = "\0\0";
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramStream::writeToAram(JKRAramStreamCommand* param_0) {
asm s32 JKRAramStream::writeToAram(JKRAramStreamCommand* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramStream/writeToAram__13JKRAramStreamFP20JKRAramStreamCommand.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 8045140C-80451410 00090C 0004+00 2/2 0/0 0/0 .sbss transBuffer__13JKRAramStream */
u8 JKRAramStream::transBuffer[4];
u8* JKRAramStream::transBuffer;
/* 80451410-80451414 000910 0004+00 2/2 0/0 0/0 .sbss transSize__13JKRAramStream */
u8 JKRAramStream::transSize[4];
u32 JKRAramStream::transSize;
/* 80451414-80451418 000914 0004+00 2/2 0/0 0/0 .sbss transHeap__13JKRAramStream */
u8 JKRAramStream::transHeap[4];
JKRHeap* JKRAramStream::transHeap;
/* 802D3ED0-802D3FA0 2CE810 00D0+00 0/0 1/1 0/0 .text
* write_StreamToAram_Async__13JKRAramStreamFP18JSUFileInputStreamUlUlUlPUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramStream::write_StreamToAram_Async(JSUFileInputStream* param_0, u32 param_1,
u32 param_2, u32 param_3, u32* param_4) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramStream/write_StreamToAram_Async__13JKRAramStreamFP18JSUFileInputStreamUlUlUlPUl.s"
JKRAramStreamCommand* JKRAramStream::write_StreamToAram_Async(JSUFileInputStream* stream, u32 addr,
u32 size, u32 offset,
u32* returnSize) {
JKRAramStreamCommand* command = new (JKRGetSystemHeap(), -4) JKRAramStreamCommand();
command->mType = JKRAramStreamCommand::WRITE;
command->mAddress = addr;
command->mSize = size;
command->mStream = stream;
command->field_0x2c = 0;
command->mOffset = offset;
command->mTransferBuffer = transBuffer;
command->mHeap = transHeap;
command->mTransferBufferSize = transSize;
command->mReturnSize = returnSize;
if (returnSize) {
*returnSize = 0;
}
OSInitMessageQueue(&command->mMessageQueue, &command->mMessage, 1);
OSSendMessage(&sMessageQueue, command, OS_MESSAGE_BLOCKING);
return command;
}
#pragma pop
/* 802D3FA0-802D4034 2CE8E0 0094+00 0/0 1/1 0/0 .text
* sync__13JKRAramStreamFP20JKRAramStreamCommandi */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramStream::sync(JKRAramStreamCommand* param_0, int param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramStream/sync__13JKRAramStreamFP20JKRAramStreamCommandi.s"
JKRAramStreamCommand* JKRAramStream::sync(JKRAramStreamCommand* command, BOOL isNonBlocking) {
OSMessage message;
if (isNonBlocking == 0) {
OSReceiveMessage(&command->mMessageQueue, &message, OS_MESSAGE_BLOCKING);
if (message == NULL) {
command = NULL;
return command;
} else {
return command;
}
} else {
BOOL receiveResult =
OSReceiveMessage(&command->mMessageQueue, &message, OS_MESSAGE_NON_BLOCKING);
if (receiveResult == FALSE) {
command = NULL;
return command;
} else if (message == NULL) {
command = NULL;
return command;
} else {
return command;
}
}
}
#pragma pop
/* 802D4034-802D4088 2CE974 0054+00 1/1 1/1 0/0 .text
* setTransBuffer__13JKRAramStreamFPUcUlP7JKRHeap */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAramStream::setTransBuffer(u8* param_0, u32 param_1, JKRHeap* param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramStream/setTransBuffer__13JKRAramStreamFPUcUlP7JKRHeap.s"
void JKRAramStream::setTransBuffer(u8* buffer, u32 bufferSize, JKRHeap* heap) {
transBuffer = NULL;
transSize = 0x8000;
transHeap = NULL;
if (buffer) {
transBuffer = (u8*)ALIGN_NEXT((u32)buffer, 0x20);
}
if (bufferSize) {
transSize = ALIGN_PREV(bufferSize, 0x20);
}
if (heap && !buffer) {
transHeap = heap;
}
}
#pragma pop
/* 802D4088-802D4094 2CE9C8 000C+00 1/1 0/0 0/0 .text __ct__20JKRAramStreamCommandFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRAramStreamCommand::JKRAramStreamCommand() {
nofralloc
#include "asm/JSystem/JKernel/JKRAramStream/__ct__20JKRAramStreamCommandFv.s"
JKRAramStreamCommand::JKRAramStreamCommand() {
mAllocatedTransferBuffer = false;
}
#pragma pop
/* 802D4094-802D40F0 2CE9D4 005C+00 0/0 3/0 0/0 .text getAvailable__20JSURandomInputStreamCFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSURandomInputStream::getAvailable() const {
nofralloc
#include "asm/JSystem/JKernel/JKRAramStream/getAvailable__20JSURandomInputStreamCFv.s"
s32 JSURandomInputStream::getAvailable() const {
return getLength() - getPosition();
}
#pragma pop
/* 8039D120-8039D120 029780 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
+184 -193
View File
@@ -3,94 +3,11 @@
// Translation Unit: JKRArchivePri
//
#include "JSystem/JKernel/JKRArchivePri.h"
#include "JSystem/JKernel/JKRArchive.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JKRHeap {
/* 802CE83C */ void findFromRoot(void*);
static u8 sCurrentHeap[4];
};
struct JKRFileLoader {
/* 802D40F0 */ JKRFileLoader();
/* 802D4148 */ ~JKRFileLoader();
static u8 sCurrentVolume[4 + 4 /* padding */];
};
struct JKRArchive {
struct EMountMode {};
struct CArcName {
/* 802D6884 */ void store(char const*, char);
/* 802D67F4 */ void store(char const*);
};
struct SDIFileEntry {};
/* 802D6294 */ JKRArchive(s32, JKRArchive::EMountMode);
/* 802D6334 */ ~JKRArchive();
/* 802D6394 */ void isSameName(JKRArchive::CArcName&, u32, u16) const;
/* 802D63E0 */ void findResType(u32) const;
/* 802D641C */ void findDirectory(char const*, u32) const;
/* 802D64F4 */ void findTypeResource(u32, char const*) const;
/* 802D65A4 */ void findFsResource(char const*, u32) const;
/* 802D6684 */ void findIdxResource(u32) const;
/* 802D66AC */ void findNameResource(char const*) const;
/* 802D6734 */ void findPtrResource(void const*) const;
/* 802D6770 */ void findIdResource(u16) const;
/* 802D693C */ void setExpandSize(JKRArchive::SDIFileEntry*, u32);
/* 802D6978 */ void getExpandSize(JKRArchive::SDIFileEntry*) const;
static u8 sCurrentDirID[4 + 4 /* padding */];
};
//
// Forward References:
//
extern "C" void __ct__10JKRArchiveFlQ210JKRArchive10EMountMode();
extern "C" void __dt__10JKRArchiveFv();
extern "C" void isSameName__10JKRArchiveCFRQ210JKRArchive8CArcNameUlUs();
extern "C" void findResType__10JKRArchiveCFUl();
extern "C" void findDirectory__10JKRArchiveCFPCcUl();
extern "C" void findTypeResource__10JKRArchiveCFUlPCc();
extern "C" void findFsResource__10JKRArchiveCFPCcUl();
extern "C" void findIdxResource__10JKRArchiveCFUl();
extern "C" void findNameResource__10JKRArchiveCFPCc();
extern "C" void findPtrResource__10JKRArchiveCFPCv();
extern "C" void findIdResource__10JKRArchiveCFUs();
extern "C" void store__Q210JKRArchive8CArcNameFPCc();
extern "C" void store__Q210JKRArchive8CArcNameFPCcc();
extern "C" void setExpandSize__10JKRArchiveFPQ210JKRArchive12SDIFileEntryUl();
extern "C" void getExpandSize__10JKRArchiveCFPQ210JKRArchive12SDIFileEntry();
extern "C" u8 sCurrentDirID__10JKRArchive[4 + 4 /* padding */];
//
// External References:
//
extern "C" void findFromRoot__7JKRHeapFPv();
extern "C" void __dl__FPv();
extern "C" void __ct__13JKRFileLoaderFv();
extern "C" void __dt__13JKRFileLoaderFv();
extern "C" void _savegpr_27();
extern "C" void _savegpr_28();
extern "C" void _savegpr_29();
extern "C" void _restgpr_27();
extern "C" void _restgpr_28();
extern "C" void _restgpr_29();
extern "C" void tolower();
extern "C" void strcmp();
extern "C" extern void* __vt__10JKRArchive[20];
extern "C" u8 sCurrentHeap__7JKRHeap[4];
extern "C" u8 sCurrentVolume__13JKRFileLoader[4 + 4 /* padding */];
#include "msl_c/string.h"
//
// Declarations:
@@ -98,165 +15,239 @@ extern "C" u8 sCurrentVolume__13JKRFileLoader[4 + 4 /* padding */];
/* ############################################################################################## */
/* 80451420-80451428 000920 0004+04 1/1 5/5 0/0 .sbss sCurrentDirID__10JKRArchive */
u8 JKRArchive::sCurrentDirID[4 + 4 /* padding */];
u32 JKRArchive::sCurrentDirID;
/* 802D6294-802D6334 2D0BD4 00A0+00 0/0 5/5 0/0 .text
* __ct__10JKRArchiveFlQ210JKRArchive10EMountMode */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRArchive::JKRArchive(s32 param_0, JKRArchive::EMountMode param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePri/__ct__10JKRArchiveFlQ210JKRArchive10EMountMode.s"
JKRArchive::JKRArchive(long entryNumber, JKRArchive::EMountMode mountMode) {
mIsMounted = false;
mMountMode = mountMode;
mMountCount = 1;
field_0x58 = 1;
mHeap = JKRHeap::findFromRoot(this);
if (mHeap == NULL) {
mHeap = JKRHeap::getCurrentHeap();
}
mEntryNum = entryNumber;
if (getCurrentVolume() == NULL) {
setCurrentVolume(this);
setCurrentDirID(0);
}
}
#pragma pop
/* 802D6334-802D6394 2D0C74 0060+00 0/0 5/4 0/0 .text __dt__10JKRArchiveFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRArchive::~JKRArchive() {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePri/__dt__10JKRArchiveFv.s"
}
#pragma pop
JKRArchive::~JKRArchive() {}
/* 802D6394-802D63E0 2D0CD4 004C+00 4/4 0/0 0/0 .text
* isSameName__10JKRArchiveCFRQ210JKRArchive8CArcNameUlUs */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::isSameName(JKRArchive::CArcName& param_0, u32 param_1, u16 param_2) const {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePri/isSameName__10JKRArchiveCFRQ210JKRArchive8CArcNameUlUs.s"
bool JKRArchive::isSameName(JKRArchive::CArcName& name, u32 nameOffset, u16 nameHash) const {
u16 hash = name.getHash();
if (hash != nameHash)
return false;
return strcmp(mStringTable + nameOffset, name.getString()) == 0;
}
#pragma pop
/* 802D63E0-802D641C 2D0D20 003C+00 1/1 0/0 0/0 .text findResType__10JKRArchiveCFUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::findResType(u32 param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePri/findResType__10JKRArchiveCFUl.s"
JKRArchive::SDirEntry* JKRArchive::findResType(u32 type) const {
SDirEntry* node = mNodes;
u32 count = 0;
while (count < mArcInfoBlock->num_nodes) {
if (node->type == type) {
return node;
}
node++;
count++;
}
return NULL;
}
#pragma pop
/* 802D641C-802D64F4 2D0D5C 00D8+00 0/0 3/3 0/0 .text findDirectory__10JKRArchiveCFPCcUl
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::findDirectory(char const* param_0, u32 param_1) const {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePri/findDirectory__10JKRArchiveCFPCcUl.s"
JKRArchive::SDirEntry* JKRArchive::findDirectory(const char* name, u32 directoryId) const {
if (name == NULL) {
return mNodes + directoryId;
}
CArcName arcName(&name, '/');
SDirEntry* dirEntry = mNodes + directoryId;
SDIFileEntry* fileEntry = mFiles + dirEntry->first_file_index;
for (int i = 0; i < dirEntry->num_entries; fileEntry++, i++) {
// regalloc doesn't like fileEntry->getNameHash()
if (isSameName(arcName, fileEntry->getNameOffset(), fileEntry->name_hash)) {
if (fileEntry->isDirectory()) {
return findDirectory(name, fileEntry->data_offset);
}
break;
}
}
return NULL;
}
#pragma pop
/* 802D64F4-802D65A4 2D0E34 00B0+00 0/0 2/2 0/0 .text findTypeResource__10JKRArchiveCFUlPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::findTypeResource(u32 param_0, char const* param_1) const {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePri/findTypeResource__10JKRArchiveCFUlPCc.s"
JKRArchive::SDIFileEntry* JKRArchive::findTypeResource(u32 type, const char* name) const {
if (type) {
CArcName arcName(name);
SDirEntry* dirEntry = findResType(type);
if (dirEntry) {
SDIFileEntry* fileEntry = mFiles + dirEntry->first_file_index;
for (int i = 0; i < dirEntry->num_entries; fileEntry++, i++) {
if (isSameName(arcName, fileEntry->getNameOffset(), fileEntry->getNameHash())) {
return fileEntry;
}
}
}
}
return NULL;
}
#pragma pop
/* 802D65A4-802D6684 2D0EE4 00E0+00 0/0 4/4 0/0 .text findFsResource__10JKRArchiveCFPCcUl
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::findFsResource(char const* param_0, u32 param_1) const {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePri/findFsResource__10JKRArchiveCFPCcUl.s"
JKRArchive::SDIFileEntry* JKRArchive::findFsResource(const char* name, u32 directoryId) const {
if (name) {
CArcName arcName(&name, '/');
SDirEntry* dirEntry = mNodes + directoryId;
SDIFileEntry* fileEntry = mFiles + dirEntry->first_file_index;
for (int i = 0; i < dirEntry->num_entries; fileEntry++, i++) {
// regalloc doesn't like fileEntry->getNameHash()
if (isSameName(arcName, fileEntry->getNameOffset(), fileEntry->name_hash)) {
if (fileEntry->isDirectory()) {
return findFsResource(name, fileEntry->data_offset);
}
if (name == NULL) {
return fileEntry;
}
return NULL;
}
}
}
return NULL;
}
#pragma pop
/* 802D6684-802D66AC 2D0FC4 0028+00 0/0 7/7 0/0 .text findIdxResource__10JKRArchiveCFUl
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::findIdxResource(u32 param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePri/findIdxResource__10JKRArchiveCFUl.s"
JKRArchive::SDIFileEntry* JKRArchive::findIdxResource(u32 fileIndex) const {
if (fileIndex < mArcInfoBlock->num_file_entries) {
return mFiles + fileIndex;
}
return NULL;
}
#pragma pop
/* 802D66AC-802D6734 2D0FEC 0088+00 0/0 4/4 0/0 .text findNameResource__10JKRArchiveCFPCc
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::findNameResource(char const* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePri/findNameResource__10JKRArchiveCFPCc.s"
JKRArchive::SDIFileEntry* JKRArchive::findNameResource(const char* name) const {
SDIFileEntry* fileEntry = mFiles;
CArcName arcName(name);
for (int i = 0; i < mArcInfoBlock->num_file_entries; fileEntry++, i++) {
if (isSameName(arcName, fileEntry->getNameOffset(), fileEntry->getNameHash())) {
return fileEntry;
}
}
return NULL;
}
#pragma pop
/* 802D6734-802D6770 2D1074 003C+00 0/0 9/9 0/0 .text findPtrResource__10JKRArchiveCFPCv
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::findPtrResource(void const* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePri/findPtrResource__10JKRArchiveCFPCv.s"
JKRArchive::SDIFileEntry* JKRArchive::findPtrResource(const void* resource) const {
SDIFileEntry* fileEntry = mFiles;
for (int i = 0; i < mArcInfoBlock->num_file_entries; fileEntry++, i++) {
if (fileEntry->data == resource) {
return fileEntry;
}
}
return NULL;
}
#pragma pop
/* 802D6770-802D67F4 2D10B0 0084+00 0/0 4/4 0/0 .text findIdResource__10JKRArchiveCFUs */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::findIdResource(u16 param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePri/findIdResource__10JKRArchiveCFUs.s"
JKRArchive::SDIFileEntry* JKRArchive::findIdResource(u16 id) const {
if (id != 0xFFFF) {
if (id < mArcInfoBlock->num_file_entries) {
SDIFileEntry* fileEntry = mFiles + id;
if (fileEntry->file_id == id && fileEntry->isUnknownFlag1()) {
return fileEntry;
}
}
SDIFileEntry* fileEntry = mFiles;
for (int i = 0; i < mArcInfoBlock->num_file_entries; fileEntry++, i++) {
if (fileEntry->file_id == id && fileEntry->isUnknownFlag1()) {
return fileEntry;
}
}
}
return NULL;
}
#pragma pop
/* 802D67F4-802D6884 2D1134 0090+00 2/2 0/0 0/0 .text store__Q210JKRArchive8CArcNameFPCc
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::CArcName::store(char const* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePri/store__Q210JKRArchive8CArcNameFPCc.s"
void JKRArchive::CArcName::store(const char* name) {
mHash = 0;
s32 length = 0;
while (*name) {
s32 ch = tolower(*name);
mHash = ch + mHash * 3;
if (length < (s32)ARRAY_SIZE(mData)) {
mData[length++] = ch;
}
name++;
}
mLength = (u16)length;
mData[length] = 0;
}
#pragma pop
/* 802D6884-802D693C 2D11C4 00B8+00 2/2 0/0 0/0 .text store__Q210JKRArchive8CArcNameFPCcc
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::CArcName::store(char const* param_0, char param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePri/store__Q210JKRArchive8CArcNameFPCcc.s"
const char* JKRArchive::CArcName::store(const char* name, char endChar) {
mHash = 0;
s32 length = 0;
while (*name && *name != endChar) {
s32 lch = tolower((int)*name);
mHash = lch + mHash * 3;
if (length < (s32)ARRAY_SIZE(mData)) {
mData[length++] = lch;
}
name++;
}
mLength = (u16)length;
mData[length] = 0;
if (*name == 0)
return NULL;
return name + 1;
}
#pragma pop
/* 802D693C-802D6978 2D127C 003C+00 0/0 5/0 0/0 .text
* setExpandSize__10JKRArchiveFPQ210JKRArchive12SDIFileEntryUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::setExpandSize(JKRArchive::SDIFileEntry* param_0, u32 param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePri/setExpandSize__10JKRArchiveFPQ210JKRArchive12SDIFileEntryUl.s"
void JKRArchive::setExpandSize(SDIFileEntry* fileEntry, u32 expandSize) {
int index = fileEntry - mFiles;
if (!mExpandedSize || index >= mArcInfoBlock->num_file_entries)
return;
mExpandedSize[index] = expandSize;
}
#pragma pop
/* 802D6978-802D69B8 2D12B8 0040+00 0/0 5/0 0/0 .text
* getExpandSize__10JKRArchiveCFPQ210JKRArchive12SDIFileEntry */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::getExpandSize(JKRArchive::SDIFileEntry* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePri/getExpandSize__10JKRArchiveCFPQ210JKRArchive12SDIFileEntry.s"
u32 JKRArchive::getExpandSize(SDIFileEntry* fileEntry) const {
int index = fileEntry - mFiles;
if (!mExpandedSize || index >= mArcInfoBlock->num_file_entries)
return 0;
return mExpandedSize[index];
}
#pragma pop
+300 -346
View File
@@ -3,434 +3,388 @@
// Translation Unit: JKRArchivePub
//
#include "JSystem/JKernel/JKRArchivePub.h"
#include "JSystem/JKernel/JKRAramArchive.h"
#include "JSystem/JKernel/JKRAramPiece.h"
#include "JSystem/JKernel/JKRArchive.h"
#include "JSystem/JKernel/JKRCompArchive.h"
#include "JSystem/JKernel/JKRDvdArchive.h"
#include "JSystem/JKernel/JKRFileFinder.h"
#include "JSystem/JKernel/JKRFileLoader.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/JKernel/JKRMemArchive.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JKRMemBreakFlag {};
struct JKRHeap {
/* 802CE500 */ void free(void*, JKRHeap*);
static u8 sSystemHeap[4];
static u8 sCurrentHeap[4];
};
struct JKRArchive {
struct EMountMode {};
struct EMountDirection {};
struct SDirEntry {};
struct SDIFileEntry {};
/* 801CC284 */ void getExpandedResSize(void const*) const;
/* 802D5778 */ void check_mount_already(s32, JKRHeap*);
/* 802D5840 */ void mount(void*, JKRHeap*, JKRArchive::EMountDirection);
/* 802D58C8 */ void mount(s32, JKRArchive::EMountMode, JKRHeap*, JKRArchive::EMountDirection);
/* 802D57E4 */ void mount(char const*, JKRArchive::EMountMode, JKRHeap*,
JKRArchive::EMountDirection);
/* 802D5A38 */ void becomeCurrent(char const*);
/* 802D5AC0 */ void getDirEntry(JKRArchive::SDirEntry*, u32) const;
/* 802D5B38 */ void getGlbResource(u32, char const*, JKRArchive*);
/* 802D5D38 */ void getResource(u16);
/* 802D5C64 */ void getResource(u32, char const*);
/* 802D5BE8 */ void getResource(char const*);
/* 802D5CE4 */ void getIdxResource(u32);
/* 802D5D8C */ void readResource(void*, u32, u32, char const*);
/* 802D5E30 */ void readResource(void*, u32, char const*);
/* 802D5F40 */ void readResource(void*, u32, u16);
/* 802D5ECC */ void readIdxResource(void*, u32, u32);
/* 802D5FB4 */ void removeResourceAll();
/* 802D603C */ void removeResource(void*);
/* 802D609C */ void detachResource(void*);
/* 802D60D8 */ void getResSize(void const*) const;
/* 802D610C */ void countResource() const;
/* 802D6150 */ void countFile(char const*) const;
/* 802D61B0 */ void getFirstFile(char const*) const;
/* 802D625C */ void getFileAttribute(u32) const;
/* 802D6334 */ ~JKRArchive();
/* 802D641C */ void findDirectory(char const*, u32) const;
/* 802D64F4 */ void findTypeResource(u32, char const*) const;
/* 802D65A4 */ void findFsResource(char const*, u32) const;
/* 802D6684 */ void findIdxResource(u32) const;
/* 802D66AC */ void findNameResource(char const*) const;
/* 802D6734 */ void findPtrResource(void const*) const;
/* 802D6770 */ void findIdResource(u16) const;
/* 802D693C */ void setExpandSize(JKRArchive::SDIFileEntry*, u32);
/* 802D6978 */ void getExpandSize(JKRArchive::SDIFileEntry*) const;
static u8 sCurrentDirID[4 + 4 /* padding */];
};
struct JKRMemArchive {
/* 802D69B8 */ JKRMemArchive(s32, JKRArchive::EMountDirection);
/* 802D6A6C */ JKRMemArchive(void*, u32, JKRMemBreakFlag);
};
struct JKRFileLoader {
/* 802D41D4 */ void unmount();
static u8 sVolumeList[12];
static u8 sCurrentVolume[4 + 4 /* padding */];
};
struct JKRDvdArchive {
/* 802D7BF0 */ JKRDvdArchive(s32, JKRArchive::EMountDirection);
};
struct JKRCompArchive {
/* 802D87D4 */ JKRCompArchive(s32, JKRArchive::EMountDirection);
};
struct JKRArcFinder {
/* 802D4638 */ JKRArcFinder(JKRArchive*, s32, s32);
};
struct JKRAramArchive {
/* 802D70C0 */ JKRAramArchive(s32, JKRArchive::EMountDirection);
};
//
// Forward References:
//
extern "C" void check_mount_already__10JKRArchiveFlP7JKRHeap();
extern "C" void
mount__10JKRArchiveFPCcQ210JKRArchive10EMountModeP7JKRHeapQ210JKRArchive15EMountDirection();
extern "C" void mount__10JKRArchiveFPvP7JKRHeapQ210JKRArchive15EMountDirection();
extern "C" void
mount__10JKRArchiveFlQ210JKRArchive10EMountModeP7JKRHeapQ210JKRArchive15EMountDirection();
extern "C" void becomeCurrent__10JKRArchiveFPCc();
extern "C" void getDirEntry__10JKRArchiveCFPQ210JKRArchive9SDirEntryUl();
extern "C" void getGlbResource__10JKRArchiveFUlPCcP10JKRArchive();
extern "C" void getResource__10JKRArchiveFPCc();
extern "C" void getResource__10JKRArchiveFUlPCc();
extern "C" void getIdxResource__10JKRArchiveFUl();
extern "C" void getResource__10JKRArchiveFUs();
extern "C" void readResource__10JKRArchiveFPvUlUlPCc();
extern "C" void readResource__10JKRArchiveFPvUlPCc();
extern "C" void readIdxResource__10JKRArchiveFPvUlUl();
extern "C" void readResource__10JKRArchiveFPvUlUs();
extern "C" void removeResourceAll__10JKRArchiveFv();
extern "C" void removeResource__10JKRArchiveFPv();
extern "C" void detachResource__10JKRArchiveFPv();
extern "C" void getResSize__10JKRArchiveCFPCv();
extern "C" void countResource__10JKRArchiveCFv();
extern "C" void countFile__10JKRArchiveCFPCc();
extern "C" void getFirstFile__10JKRArchiveCFPCc();
extern "C" void getFileAttribute__10JKRArchiveCFUl();
extern "C" extern void* __vt__10JKRArchive[20];
//
// External References:
//
extern "C" void getExpandedResSize__10JKRArchiveCFPCv();
extern "C" void free__7JKRHeapFPvP7JKRHeap();
extern "C" void* __nw__FUlP7JKRHeapi();
extern "C" void unmount__13JKRFileLoaderFv();
extern "C" void __ct__12JKRArcFinderFP10JKRArchivell();
extern "C" void __dt__10JKRArchiveFv();
extern "C" void findDirectory__10JKRArchiveCFPCcUl();
extern "C" void findTypeResource__10JKRArchiveCFUlPCc();
extern "C" void findFsResource__10JKRArchiveCFPCcUl();
extern "C" void findIdxResource__10JKRArchiveCFUl();
extern "C" void findNameResource__10JKRArchiveCFPCc();
extern "C" void findPtrResource__10JKRArchiveCFPCv();
extern "C" void findIdResource__10JKRArchiveCFUs();
extern "C" void setExpandSize__10JKRArchiveFPQ210JKRArchive12SDIFileEntryUl();
extern "C" void getExpandSize__10JKRArchiveCFPQ210JKRArchive12SDIFileEntry();
extern "C" void __ct__13JKRMemArchiveFlQ210JKRArchive15EMountDirection();
extern "C" void __ct__13JKRMemArchiveFPvUl15JKRMemBreakFlag();
extern "C" void __ct__14JKRAramArchiveFlQ210JKRArchive15EMountDirection();
extern "C" void __ct__13JKRDvdArchiveFlQ210JKRArchive15EMountDirection();
extern "C" void __ct__14JKRCompArchiveFlQ210JKRArchive15EMountDirection();
extern "C" void DVDConvertPathToEntrynum();
extern "C" void _savegpr_27();
extern "C" void _savegpr_28();
extern "C" void _savegpr_29();
extern "C" void _restgpr_27();
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 sCurrentHeap__7JKRHeap[4];
extern "C" u8 sCurrentVolume__13JKRFileLoader[4 + 4 /* padding */];
extern "C" u8 sCurrentDirID__10JKRArchive[4 + 4 /* padding */];
//
// Declarations:
//
/* 802D5778-802D57E4 2D00B8 006C+00 2/2 0/0 0/0 .text check_mount_already__10JKRArchiveFlP7JKRHeap
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::check_mount_already(s32 param_0, JKRHeap* param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/check_mount_already__10JKRArchiveFlP7JKRHeap.s"
JKRArchive* JKRArchive::check_mount_already(s32 entryNum, JKRHeap* heap) {
if (heap == NULL) {
heap = JKRHeap::getCurrentHeap();
}
JSUList<JKRFileLoader>& volumeList = getVolumeList();
JSUListIterator<JKRFileLoader> iterator;
for (iterator = volumeList.getFirst(); iterator != volumeList.getEnd(); ++iterator) {
if (iterator->getVolumeType() == 'RARC') {
JKRArchive* archive = (JKRArchive*)iterator.getObject();
if (archive->mEntryNum == entryNum && archive->mHeap == heap) {
archive->mMountCount++;
return archive;
}
}
}
return NULL;
}
#pragma pop
/* 802D57E4-802D5840 2D0124 005C+00 0/0 1/1 0/0 .text
* mount__10JKRArchiveFPCcQ210JKRArchive10EMountModeP7JKRHeapQ210JKRArchive15EMountDirection */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::mount(char const* param_0, JKRArchive::EMountMode param_1, JKRHeap* param_2,
JKRArchive::EMountDirection param_3) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/func_802D57E4.s"
JKRArchive* JKRArchive::mount(const char* path, JKRArchive::EMountMode mountMode, JKRHeap* heap,
JKRArchive::EMountDirection mountDirection) {
s32 entryNum = DVDConvertPathToEntrynum(path);
if (entryNum < 0)
return NULL;
return mount(entryNum, mountMode, heap, mountDirection);
}
#pragma pop
/* 802D5840-802D58C8 2D0180 0088+00 0/0 1/1 0/0 .text
* mount__10JKRArchiveFPvP7JKRHeapQ210JKRArchive15EMountDirection */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::mount(void* param_0, JKRHeap* param_1, JKRArchive::EMountDirection param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/mount__10JKRArchiveFPvP7JKRHeapQ210JKRArchive15EMountDirection.s"
JKRArchive* JKRArchive::mount(void* ptr, JKRHeap* heap,
JKRArchive::EMountDirection mountDirection) {
JKRArchive* archive = check_mount_already((s32)ptr, heap);
if (archive)
return archive;
int alignment;
if (mountDirection == JKRArchive::MOUNT_DIRECTION_HEAD) {
alignment = 4;
} else {
alignment = -4;
}
archive = new (heap, alignment) JKRMemArchive(ptr, 0xFFFF, JKRMEMBREAK_FLAG_UNKNOWN0);
return archive;
}
#pragma pop
/* 802D58C8-802D5A38 2D0208 0170+00 1/1 1/1 0/0 .text
* mount__10JKRArchiveFlQ210JKRArchive10EMountModeP7JKRHeapQ210JKRArchive15EMountDirection */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::mount(s32 param_0, JKRArchive::EMountMode param_1, JKRHeap* param_2,
JKRArchive::EMountDirection param_3) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/func_802D58C8.s"
JKRArchive* JKRArchive::mount(s32 entryNum, JKRArchive::EMountMode mountMode, JKRHeap* heap,
JKRArchive::EMountDirection mountDirection) {
JKRArchive* archive = check_mount_already(entryNum, heap);
if (archive != NULL) {
return archive;
} else {
int alignment;
if (mountDirection == JKRArchive::MOUNT_DIRECTION_HEAD) {
alignment = 4;
} else {
alignment = -4;
}
JKRArchive* archive;
switch (mountMode) {
case JKRArchive::MOUNT_MEM:
archive = new (heap, alignment) JKRMemArchive(entryNum, mountDirection);
break;
case JKRArchive::MOUNT_ARAM:
archive = new (heap, alignment) JKRAramArchive(entryNum, mountDirection);
break;
case JKRArchive::MOUNT_DVD:
archive = new (heap, alignment) JKRDvdArchive(entryNum, mountDirection);
break;
case JKRArchive::MOUNT_COMP:
archive = new (heap, alignment) JKRCompArchive(entryNum, mountDirection);
break;
}
if (archive && archive->getMountMode() == JKRArchive::UNKNOWN_MOUNT_MODE) {
delete archive;
archive = NULL;
}
return archive;
}
}
#pragma pop
/* 802D5A38-802D5AC0 2D0378 0088+00 1/0 4/0 0/0 .text becomeCurrent__10JKRArchiveFPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::becomeCurrent(char const* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/becomeCurrent__10JKRArchiveFPCc.s"
bool JKRArchive::becomeCurrent(const char* path) {
SDirEntry* dirEntry;
if (*path == '/') {
path++;
if (*path == '\0')
path = NULL;
dirEntry = findDirectory(path, 0);
} else {
dirEntry = findDirectory(path, getCurrentDirID());
}
bool found = dirEntry != NULL;
if (found) {
setCurrentVolume(this);
setCurrentDirID(dirEntry - mNodes);
}
return found;
}
#pragma pop
/* 802D5AC0-802D5B38 2D0400 0078+00 0/0 1/1 0/0 .text
* getDirEntry__10JKRArchiveCFPQ210JKRArchive9SDirEntryUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::getDirEntry(JKRArchive::SDirEntry* param_0, u32 param_1) const {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/getDirEntry__10JKRArchiveCFPQ210JKRArchive9SDirEntryUl.s"
bool JKRArchive::getDirEntry(SDirEntry* dirEntry, u32 index) const {
SDIFileEntry* fileEntry = findIdxResource(index);
if (!fileEntry)
return false;
dirEntry->other.flags = fileEntry->getFlags();
dirEntry->other.id = fileEntry->getFileID();
dirEntry->name = mStringTable + fileEntry->getNameOffset();
return true;
}
#pragma pop
/* 802D5B38-802D5BE8 2D0478 00B0+00 0/0 9/9 0/0 .text
* getGlbResource__10JKRArchiveFUlPCcP10JKRArchive */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::getGlbResource(u32 param_0, char const* param_1, JKRArchive* param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/getGlbResource__10JKRArchiveFUlPCcP10JKRArchive.s"
void* JKRArchive::getGlbResource(u32 param_1, const char* path, JKRArchive* archive) {
void* resource = NULL;
if (archive) {
return archive->getResource(param_1, path);
}
JSUList<JKRFileLoader>& volumeList = getVolumeList();
JSUListIterator<JKRFileLoader> iterator;
for (iterator = volumeList.getFirst(); iterator != volumeList.getEnd(); ++iterator) {
if (iterator->getVolumeType() == 'RARC') {
resource = iterator->getResource(param_1, path);
if (resource)
break;
}
}
return resource;
}
#pragma pop
/* 802D5BE8-802D5C64 2D0528 007C+00 1/0 4/0 0/0 .text getResource__10JKRArchiveFPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::getResource(char const* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/getResource__10JKRArchiveFPCc.s"
void* JKRArchive::getResource(const char* path) {
SDIFileEntry* fileEntry;
if (*path == '/') {
fileEntry = findFsResource(path + 1, 0);
} else {
fileEntry = findFsResource(path, getCurrentDirID());
}
if (fileEntry) {
return fetchResource(fileEntry, NULL);
}
return NULL;
}
#pragma pop
/* 802D5C64-802D5CE4 2D05A4 0080+00 1/0 4/0 0/0 .text getResource__10JKRArchiveFUlPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::getResource(u32 param_0, char const* param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/getResource__10JKRArchiveFUlPCc.s"
void* JKRArchive::getResource(u32 type, const char* path) {
SDIFileEntry* fileEntry;
if (type == 0 || type == '????') {
fileEntry = findNameResource(path);
} else {
fileEntry = findTypeResource(type, path);
}
if (fileEntry) {
return fetchResource(fileEntry, NULL);
}
return NULL;
}
#pragma pop
/* 802D5CE4-802D5D38 2D0624 0054+00 0/0 1/1 0/0 .text getIdxResource__10JKRArchiveFUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::getIdxResource(u32 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/getIdxResource__10JKRArchiveFUl.s"
void* JKRArchive::getIdxResource(u32 index) {
SDIFileEntry* fileEntry = findIdxResource(index);
if (fileEntry) {
return fetchResource(fileEntry, NULL);
}
return NULL;
}
#pragma pop
/* 802D5D38-802D5D8C 2D0678 0054+00 0/0 1/1 0/0 .text getResource__10JKRArchiveFUs */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::getResource(u16 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/getResource__10JKRArchiveFUs.s"
void* JKRArchive::getResource(u16 id) {
SDIFileEntry* fileEntry = findIdResource(id);
if (fileEntry) {
return fetchResource(fileEntry, NULL);
}
return NULL;
}
#pragma pop
/* 802D5D8C-802D5E30 2D06CC 00A4+00 1/0 4/0 0/0 .text readResource__10JKRArchiveFPvUlUlPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::readResource(void* param_0, u32 param_1, u32 param_2, char const* param_3) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/readResource__10JKRArchiveFPvUlUlPCc.s"
u32 JKRArchive::readResource(void* buffer, u32 bufferSize, u32 type, const char* path) {
SDIFileEntry* fileEntry;
if (type == 0 || type == '????') {
fileEntry = findNameResource(path);
} else {
fileEntry = findTypeResource(type, path);
}
if (fileEntry) {
u32 resourceSize;
fetchResource(buffer, bufferSize, fileEntry, &resourceSize);
return resourceSize;
}
return 0;
}
#pragma pop
/* 802D5E30-802D5ECC 2D0770 009C+00 1/0 4/0 0/0 .text readResource__10JKRArchiveFPvUlPCc
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::readResource(void* param_0, u32 param_1, char const* param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/readResource__10JKRArchiveFPvUlPCc.s"
u32 JKRArchive::readResource(void* buffer, u32 bufferSize, const char* path) {
SDIFileEntry* fileEntry;
if (*path == '/') {
fileEntry = findFsResource(path + 1, 0);
} else {
fileEntry = findFsResource(path, getCurrentDirID());
}
if (fileEntry) {
u32 resourceSize;
fetchResource(buffer, bufferSize, fileEntry, &resourceSize);
return resourceSize;
}
return 0;
}
#pragma pop
/* 802D5ECC-802D5F40 2D080C 0074+00 0/0 7/7 1/1 .text readIdxResource__10JKRArchiveFPvUlUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::readIdxResource(void* param_0, u32 param_1, u32 param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/readIdxResource__10JKRArchiveFPvUlUl.s"
u32 JKRArchive::readIdxResource(void* buffer, u32 bufferSize, u32 index) {
SDIFileEntry* fileEntry = findIdxResource(index);
if (fileEntry) {
u32 resourceSize;
fetchResource(buffer, bufferSize, fileEntry, &resourceSize);
return resourceSize;
}
return 0;
}
#pragma pop
/* 802D5F40-802D5FB4 2D0880 0074+00 0/0 1/1 0/0 .text readResource__10JKRArchiveFPvUlUs
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::readResource(void* param_0, u32 param_1, u16 param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/readResource__10JKRArchiveFPvUlUs.s"
u32 JKRArchive::readResource(void* buffer, u32 bufferSize, u16 id) {
SDIFileEntry* fileEntry = findIdResource(id);
if (fileEntry) {
u32 resourceSize;
fetchResource(buffer, bufferSize, fileEntry, &resourceSize);
return resourceSize;
}
return 0;
}
#pragma pop
/* 802D5FB4-802D603C 2D08F4 0088+00 1/0 2/0 0/0 .text removeResourceAll__10JKRArchiveFv
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::removeResourceAll() {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/removeResourceAll__10JKRArchiveFv.s"
void JKRArchive::removeResourceAll(void) {
if (mArcInfoBlock && mMountMode != MOUNT_MEM) {
SDIFileEntry* fileEntry = mFiles;
for (int i = 0; i < mArcInfoBlock->num_file_entries; fileEntry++, i++) {
if (fileEntry->data) {
JKRFreeToHeap(mHeap, fileEntry->data);
fileEntry->data = NULL;
}
}
}
}
#pragma pop
/* 802D603C-802D609C 2D097C 0060+00 1/0 2/0 0/0 .text removeResource__10JKRArchiveFPv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::removeResource(void* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/removeResource__10JKRArchiveFPv.s"
bool JKRArchive::removeResource(void* resource) {
SDIFileEntry* fileEntry = findPtrResource(resource);
if (fileEntry == NULL)
return false;
fileEntry->data = NULL;
JKRFreeToHeap(mHeap, resource);
return true;
}
#pragma pop
/* 802D609C-802D60D8 2D09DC 003C+00 1/0 4/0 0/0 .text detachResource__10JKRArchiveFPv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::detachResource(void* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/detachResource__10JKRArchiveFPv.s"
bool JKRArchive::detachResource(void* resource) {
SDIFileEntry* fileEntry = findPtrResource(resource);
if (fileEntry == NULL)
return false;
fileEntry->data = NULL;
return true;
}
#pragma pop
/* 802D60D8-802D610C 2D0A18 0034+00 1/0 4/0 0/0 .text getResSize__10JKRArchiveCFPCv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::getResSize(void const* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/getResSize__10JKRArchiveCFPCv.s"
u32 JKRArchive::getResSize(const void* resource) const {
SDIFileEntry* fileEntry = findPtrResource(resource);
if (fileEntry == NULL)
return -1;
return fileEntry->data_size;
}
#pragma pop
/* 802D610C-802D6150 2D0A4C 0044+00 0/0 1/1 0/0 .text countResource__10JKRArchiveCFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::countResource() const {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/countResource__10JKRArchiveCFv.s"
u32 JKRArchive::countResource(void) const {
u32 count = 0;
for (int i = 0; i < mArcInfoBlock->num_file_entries; i++) {
if (mFiles[i].isUnknownFlag1()) {
count++;
}
}
return count;
}
#pragma pop
/* 802D6150-802D61B0 2D0A90 0060+00 1/0 4/0 0/0 .text countFile__10JKRArchiveCFPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::countFile(char const* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/countFile__10JKRArchiveCFPCc.s"
u32 JKRArchive::countFile(const char* path) const {
SDirEntry* dirEntry;
if (*path == '/') {
path++;
if (*path == '\0')
path = NULL;
dirEntry = findDirectory(path, 0);
} else {
dirEntry = findDirectory(path, getCurrentDirID());
}
if (dirEntry) {
return dirEntry->num_entries;
}
return 0;
}
#pragma pop
/* 802D61B0-802D625C 2D0AF0 00AC+00 1/0 4/0 0/0 .text getFirstFile__10JKRArchiveCFPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::getFirstFile(char const* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/getFirstFile__10JKRArchiveCFPCc.s"
JKRFileFinder* JKRArchive::getFirstFile(const char* path) const {
SDirEntry* dirEntry;
if (*path == '/') {
path++;
if (*path == '\0')
path = NULL;
dirEntry = findDirectory(path, 0);
} else {
dirEntry = findDirectory(path, getCurrentDirID());
}
if (dirEntry) {
// don't know what is correct here... for now we're casting away const
return new (JKRHeap::getSystemHeap(), 0)
JKRArcFinder((JKRArchive*)this, dirEntry->first_file_index, (u32)dirEntry->num_entries);
}
return NULL;
}
#pragma pop
/* 802D625C-802D6294 2D0B9C 0038+00 0/0 2/2 0/0 .text getFileAttribute__10JKRArchiveCFUl
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArchive::getFileAttribute(u32 param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRArchivePub/getFileAttribute__10JKRArchiveCFUl.s"
}
#pragma pop
u32 JKRArchive::getFileAttribute(u32 index) const {
SDIFileEntry* fileEntry = findIdxResource(index);
if (fileEntry) {
return fileEntry->getFlags();
}
/* ############################################################################################## */
/* 803CC288-803CC2D8 0293A8 0050+00 0/0 2/2 0/0 .data __vt__10JKRArchive */
SECTION_DATA extern void* __vt__10JKRArchive[20] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__10JKRArchiveFv,
(void*)unmount__13JKRFileLoaderFv,
(void*)becomeCurrent__10JKRArchiveFPCc,
(void*)getResource__10JKRArchiveFPCc,
(void*)getResource__10JKRArchiveFUlPCc,
(void*)readResource__10JKRArchiveFPvUlPCc,
(void*)readResource__10JKRArchiveFPvUlUlPCc,
(void*)removeResourceAll__10JKRArchiveFv,
(void*)removeResource__10JKRArchiveFPv,
(void*)detachResource__10JKRArchiveFPv,
(void*)getResSize__10JKRArchiveCFPCv,
(void*)countFile__10JKRArchiveCFPCc,
(void*)getFirstFile__10JKRArchiveCFPCc,
(void*)getExpandedResSize__10JKRArchiveCFPCv,
(void*)NULL,
(void*)NULL,
(void*)setExpandSize__10JKRArchiveFPQ210JKRArchive12SDIFileEntryUl,
(void*)getExpandSize__10JKRArchiveCFPQ210JKRArchive12SDIFileEntry,
};
return 0;
}
+40 -120
View File
@@ -11,44 +11,6 @@
// Types:
//
struct JKRHeap {
struct TState {};
/* 802CE138 */ JKRHeap(void*, u32, JKRHeap*, bool);
/* 802CE264 */ ~JKRHeap();
/* 802CE474 */ void alloc(u32, int, JKRHeap*);
/* 802CE574 */ void callAllDisposer();
/* 802CEAC0 */ void dispose();
/* 802CED84 */ void state_register(JKRHeap::TState*, u32) const;
/* 802CED88 */ void state_compare(JKRHeap::TState const&, JKRHeap::TState const&) const;
/* 802CEDA0 */ void state_dump(JKRHeap::TState const&) const;
static u8 sRootHeap[4];
};
struct JKRAssertHeap {
/* 802D12C4 */ JKRAssertHeap(void*, u32, JKRHeap*, bool);
/* 802D1300 */ ~JKRAssertHeap();
/* 802D1368 */ void create(JKRHeap*);
/* 802D13D8 */ void do_destroy();
/* 802D1408 */ void getHeapType();
/* 802D1414 */ bool check();
/* 802D141C */ bool dump();
/* 802D1424 */ bool dump_sort();
/* 802D142C */ bool do_changeGroupID(u8);
/* 802D1434 */ bool do_getCurrentGroupId();
/* 802D143C */ bool do_alloc(u32, int);
/* 802D1444 */ void do_free(void*);
/* 802D1448 */ void do_freeAll();
/* 802D144C */ void do_freeTail();
/* 802D1450 */ void do_fillFreeArea();
/* 802D1454 */ bool do_resize(void*, u32);
/* 802D145C */ bool do_getSize(void*);
/* 802D1464 */ bool do_getFreeSize();
/* 802D146C */ bool do_getMaxFreeBlock();
/* 802D1474 */ bool do_getTotalFreeSize();
};
//
// Forward References:
//
@@ -93,88 +55,45 @@ extern "C" u8 sRootHeap__7JKRHeap[4];
// Declarations:
//
/* ############################################################################################## */
/* 803CC090-803CC0F0 0291B0 0060+00 2/2 0/0 0/0 .data __vt__13JKRAssertHeap */
SECTION_DATA extern void* __vt__13JKRAssertHeap[24] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__13JKRAssertHeapFv,
(void*)callAllDisposer__7JKRHeapFv,
(void*)getHeapType__13JKRAssertHeapFv,
(void*)check__13JKRAssertHeapFv,
(void*)dump_sort__13JKRAssertHeapFv,
(void*)dump__13JKRAssertHeapFv,
(void*)do_destroy__13JKRAssertHeapFv,
(void*)do_alloc__13JKRAssertHeapFUli,
(void*)do_free__13JKRAssertHeapFPv,
(void*)do_freeAll__13JKRAssertHeapFv,
(void*)do_freeTail__13JKRAssertHeapFv,
(void*)do_fillFreeArea__13JKRAssertHeapFv,
(void*)do_resize__13JKRAssertHeapFPvUl,
(void*)do_getSize__13JKRAssertHeapFPv,
(void*)do_getFreeSize__13JKRAssertHeapFv,
(void*)do_getMaxFreeBlock__13JKRAssertHeapFv,
(void*)do_getTotalFreeSize__13JKRAssertHeapFv,
(void*)do_changeGroupID__13JKRAssertHeapFUc,
(void*)do_getCurrentGroupId__13JKRAssertHeapFv,
(void*)state_register__7JKRHeapCFPQ27JKRHeap6TStateUl,
(void*)state_compare__7JKRHeapCFRCQ27JKRHeap6TStateRCQ27JKRHeap6TState,
(void*)state_dump__7JKRHeapCFRCQ27JKRHeap6TState,
};
/* 802D12C4-802D1300 2CBC04 003C+00 1/1 0/0 0/0 .text __ct__13JKRAssertHeapFPvUlP7JKRHeapb */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRAssertHeap::JKRAssertHeap(void* param_0, u32 param_1, JKRHeap* param_2, bool param_3) {
nofralloc
#include "asm/JSystem/JKernel/JKRAssertHeap/__ct__13JKRAssertHeapFPvUlP7JKRHeapb.s"
}
#pragma pop
JKRAssertHeap::JKRAssertHeap(void* data, unsigned long size, JKRHeap* parent, bool errorFlag)
: JKRHeap(data, size, parent, errorFlag) {}
/* 802D1300-802D1368 2CBC40 0068+00 1/0 0/0 0/0 .text __dt__13JKRAssertHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRAssertHeap::~JKRAssertHeap() {
nofralloc
#include "asm/JSystem/JKernel/JKRAssertHeap/__dt__13JKRAssertHeapFv.s"
JKRAssertHeap::~JKRAssertHeap() {
this->dispose();
}
#pragma pop
/* 802D1368-802D13D8 2CBCA8 0070+00 0/0 1/1 0/0 .text create__13JKRAssertHeapFP7JKRHeap
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAssertHeap::create(JKRHeap* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRAssertHeap/create__13JKRAssertHeapFP7JKRHeap.s"
JKRAssertHeap* JKRAssertHeap::create(JKRHeap* parent) {
if (!parent) {
parent = JKRHeap::getRootHeap();
}
// 0x70 is sizeof(JKRAssertHeap) aligned to 16 bytes
u32 size = 0x70;
int alignment = 16;
void* ptr = JKRHeap::alloc(size, alignment, parent);
if (!ptr)
return NULL;
return new (ptr) JKRAssertHeap(NULL, 0, parent, false);
}
#pragma pop
/* 802D13D8-802D1408 2CBD18 0030+00 1/0 0/0 0/0 .text do_destroy__13JKRAssertHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAssertHeap::do_destroy() {
nofralloc
#include "asm/JSystem/JKernel/JKRAssertHeap/do_destroy__13JKRAssertHeapFv.s"
void JKRAssertHeap::do_destroy(void) {
this->~JKRAssertHeap();
}
#pragma pop
/* 802D1408-802D1414 2CBD48 000C+00 1/0 0/0 0/0 .text getHeapType__13JKRAssertHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRAssertHeap::getHeapType() {
nofralloc
#include "asm/JSystem/JKernel/JKRAssertHeap/getHeapType__13JKRAssertHeapFv.s"
u32 JKRAssertHeap::getHeapType(void) {
return 'ASTH';
}
#pragma pop
/* 802D1414-802D141C 2CBD54 0008+00 1/0 0/0 0/0 .text check__13JKRAssertHeapFv */
bool JKRAssertHeap::check() {
bool JKRAssertHeap::check(void) {
return true;
}
@@ -189,18 +108,19 @@ bool JKRAssertHeap::dump_sort() {
}
/* 802D142C-802D1434 2CBD6C 0008+00 1/0 0/0 0/0 .text do_changeGroupID__13JKRAssertHeapFUc */
bool JKRAssertHeap::do_changeGroupID(u8 param_0) {
return false;
u8 JKRAssertHeap::do_changeGroupID(u8) {
return 0;
}
/* 802D1434-802D143C 2CBD74 0008+00 1/0 0/0 0/0 .text do_getCurrentGroupId__13JKRAssertHeapFv */
bool JKRAssertHeap::do_getCurrentGroupId() {
return false;
u8 JKRAssertHeap::do_getCurrentGroupId(void) {
return 0;
}
/* 802D143C-802D1444 2CBD7C 0008+00 1/0 0/0 0/0 .text do_alloc__13JKRAssertHeapFUli */
bool JKRAssertHeap::do_alloc(u32 param_0, int param_1) {
return false;
void* JKRAssertHeap::do_alloc(u32, int) {
return NULL;
}
/* 802D1444-802D1448 2CBD84 0004+00 1/0 0/0 0/0 .text do_free__13JKRAssertHeapFPv */
@@ -225,27 +145,27 @@ void JKRAssertHeap::do_fillFreeArea() {
}
/* 802D1454-802D145C 2CBD94 0008+00 1/0 0/0 0/0 .text do_resize__13JKRAssertHeapFPvUl */
bool JKRAssertHeap::do_resize(void* param_0, u32 param_1) {
return false;
s32 JKRAssertHeap::do_resize(void*, u32) {
return 0;
}
/* 802D145C-802D1464 2CBD9C 0008+00 1/0 0/0 0/0 .text do_getSize__13JKRAssertHeapFPv */
bool JKRAssertHeap::do_getSize(void* param_0) {
return false;
s32 JKRAssertHeap::do_getSize(void*) {
return 0;
}
/* 802D1464-802D146C 2CBDA4 0008+00 1/0 0/0 0/0 .text do_getFreeSize__13JKRAssertHeapFv
*/
bool JKRAssertHeap::do_getFreeSize() {
return false;
s32 JKRAssertHeap::do_getFreeSize(void) {
return 0;
}
/* 802D146C-802D1474 2CBDAC 0008+00 1/0 0/0 0/0 .text do_getMaxFreeBlock__13JKRAssertHeapFv */
bool JKRAssertHeap::do_getMaxFreeBlock() {
return false;
void* JKRAssertHeap::do_getMaxFreeBlock(void) {
return NULL;
}
/* 802D1474-802D147C 2CBDB4 0008+00 1/0 0/0 0/0 .text do_getTotalFreeSize__13JKRAssertHeapFv */
bool JKRAssertHeap::do_getTotalFreeSize() {
return false;
s32 JKRAssertHeap::do_getTotalFreeSize(void) {
return 0;
}
+1 -1
View File
@@ -3,7 +3,7 @@
// Translation Unit: JKRCompArchive
//
#include "JSystem/JKernel/JKRCompArchive.h"
// #include "JSystem/JKernel/JKRCompArchive.h"
#include "dol2asm.h"
#include "dolphin/types.h"
+187 -161
View File
@@ -4,53 +4,11 @@
//
#include "JSystem/JKernel/JKRDecomp.h"
#include "JSystem/JKernel/JKRAramPiece.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JKRThread {
/* 802D1568 */ JKRThread(u32, int, int);
/* 802D1758 */ ~JKRThread();
};
struct JKRHeap {
static u8 sSystemHeap[4];
};
struct JKRDecompCommand {
/* 802DBD70 */ JKRDecompCommand();
/* 802DBDC0 */ ~JKRDecompCommand();
};
struct JKRDecomp {
/* 802DB680 */ void create(s32);
/* 802DB6E0 */ JKRDecomp(s32);
/* 802DB730 */ ~JKRDecomp();
/* 802DB790 */ void run();
/* 802DB858 */ void prepareCommand(u8*, u8*, u32, u32, void (*)(u32));
/* 802DB8D0 */ void sendCommand(JKRDecompCommand*);
/* 802DB900 */ void orderAsync(u8*, u8*, u32, u32, void (*)(u32));
/* 802DB934 */ void sync(JKRDecompCommand*, int);
/* 802DB988 */ void orderSync(u8*, u8*, u32, u32);
/* 802DB9DC */ void decode(u8*, u8*, u32, u32);
/* 802DBA58 */ void decodeSZP(u8*, u8*, u32, u32);
/* 802DBC14 */ void decodeSZS(u8*, u8*, u32, u32);
/* 802DBCF8 */ void checkCompressed(u8*);
static u8 sMessageBuffer[32];
static u8 sMessageQueue[32];
static u8 sDecompObject[4 + 4 /* padding */];
};
struct JKRAMCommand {};
struct JKRAramPiece {
/* 802D35F4 */ void sendCommand(JKRAMCommand*);
};
//
// Forward References:
//
@@ -83,10 +41,6 @@ extern "C" void __dl__FPv();
extern "C" void __ct__9JKRThreadFUlii();
extern "C" void __dt__9JKRThreadFv();
extern "C" void sendCommand__12JKRAramPieceFP12JKRAMCommand();
extern "C" void OSInitMessageQueue();
extern "C" void OSSendMessage();
extern "C" void OSReceiveMessage();
extern "C" void OSResumeThread();
extern "C" void _savegpr_27();
extern "C" void _savegpr_28();
extern "C" void _restgpr_27();
@@ -99,134 +53,207 @@ extern "C" u8 sSystemHeap__7JKRHeap[4];
/* ############################################################################################## */
/* 804514B0-804514B8 0009B0 0004+04 1/1 0/0 0/0 .sbss sDecompObject__9JKRDecomp */
u8 JKRDecomp::sDecompObject[4 + 4 /* padding */];
JKRDecomp* JKRDecomp::sDecompObject;
/* 802DB680-802DB6E0 2D5FC0 0060+00 0/0 1/1 0/0 .text create__9JKRDecompFl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDecomp::create(s32 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRDecomp/create__9JKRDecompFl.s"
JKRDecomp* JKRDecomp::create(long priority) {
if (!sDecompObject) {
sDecompObject = new (JKRHeap::getSystemHeap(), 0) JKRDecomp(priority);
}
return sDecompObject;
}
#pragma pop
/* ############################################################################################## */
/* 803CC460-803CC480 029580 0020+00 1/1 0/0 0/0 .data sMessageBuffer__9JKRDecomp */
SECTION_DATA u8 JKRDecomp::sMessageBuffer[32] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
OSMessage JKRDecomp::sMessageBuffer[8] = {0};
/* 803CC480-803CC4A0 0295A0 0020+00 2/2 0/0 0/0 .data sMessageQueue__9JKRDecomp */
SECTION_DATA u8 JKRDecomp::sMessageQueue[32] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/* 803CC4A0-803CC4B0 0295C0 0010+00 2/2 0/0 0/0 .data __vt__9JKRDecomp */
SECTION_DATA extern void* __vt__9JKRDecomp[4] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__9JKRDecompFv,
(void*)run__9JKRDecompFv,
};
OSMessageQueue JKRDecomp::sMessageQueue = {0};
/* 802DB6E0-802DB730 2D6020 0050+00 1/1 0/0 0/0 .text __ct__9JKRDecompFl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRDecomp::JKRDecomp(s32 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRDecomp/__ct__9JKRDecompFl.s"
JKRDecomp::JKRDecomp(long priority) : JKRThread(0x800, 0x10, priority) {
resume();
}
#pragma pop
/* 802DB730-802DB790 2D6070 0060+00 1/0 0/0 0/0 .text __dt__9JKRDecompFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRDecomp::~JKRDecomp() {
nofralloc
#include "asm/JSystem/JKernel/JKRDecomp/__dt__9JKRDecompFv.s"
}
#pragma pop
JKRDecomp::~JKRDecomp() {}
/* 802DB790-802DB858 2D60D0 00C8+00 1/0 0/0 0/0 .text run__9JKRDecompFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDecomp::run() {
nofralloc
#include "asm/JSystem/JKernel/JKRDecomp/run__9JKRDecompFv.s"
void* JKRDecomp::run(void) {
OSInitMessageQueue(&sMessageQueue, sMessageBuffer, 8);
for (;;) {
OSMessage message;
OSReceiveMessage(&sMessageQueue, &message, OS_MESSAGE_BLOCKING);
JKRDecompCommand* command = (JKRDecompCommand*)message;
decode(command->mSrcBuffer, command->mDstBuffer, command->mSrcLength, command->mDstLength);
if (command->field_0x20 != 0) {
if (command->field_0x20 == 1) {
JKRAramPiece::sendCommand(command->mAMCommand);
}
continue;
}
if (command->mCallback) {
(*command->mCallback)((u32)command);
continue;
}
if (command->field_0x1c) {
OSSendMessage(command->field_0x1c, (OSMessage)1, OS_MESSAGE_NON_BLOCKING);
} else {
OSSendMessage(&command->mMessageQueue, (OSMessage)1, OS_MESSAGE_NON_BLOCKING);
}
}
}
#pragma pop
/* 802DB858-802DB8D0 2D6198 0078+00 1/1 0/0 0/0 .text prepareCommand__9JKRDecompFPUcPUcUlUlPFUl_v
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDecomp::prepareCommand(u8* param_0, u8* param_1, u32 param_2, u32 param_3,
void (*param_4)(u32)) {
nofralloc
#include "asm/JSystem/JKernel/JKRDecomp/prepareCommand__9JKRDecompFPUcPUcUlUlPFUl_v.s"
JKRDecompCommand* JKRDecomp::prepareCommand(u8* srcBuffer, u8* dstBuffer, u32 srcLength,
u32 dstLength,
JKRDecompCommand::AsyncCallback callback) {
JKRDecompCommand* command = new (JKRHeap::getSystemHeap(), -4) JKRDecompCommand();
command->mSrcBuffer = srcBuffer;
command->mDstBuffer = dstBuffer;
command->mSrcLength = srcLength;
command->mDstLength = dstLength;
command->mCallback = callback;
return command;
}
#pragma pop
/* 802DB8D0-802DB900 2D6210 0030+00 1/1 1/1 0/0 .text sendCommand__9JKRDecompFP16JKRDecompCommand
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDecomp::sendCommand(JKRDecompCommand* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRDecomp/sendCommand__9JKRDecompFP16JKRDecompCommand.s"
void JKRDecomp::sendCommand(JKRDecompCommand* command) {
OSSendMessage(&sMessageQueue, command, OS_MESSAGE_NON_BLOCKING);
}
#pragma pop
/* 802DB900-802DB934 2D6240 0034+00 1/1 0/0 0/0 .text orderAsync__9JKRDecompFPUcPUcUlUlPFUl_v */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDecomp::orderAsync(u8* param_0, u8* param_1, u32 param_2, u32 param_3,
void (*param_4)(u32)) {
nofralloc
#include "asm/JSystem/JKernel/JKRDecomp/orderAsync__9JKRDecompFPUcPUcUlUlPFUl_v.s"
JKRDecompCommand* JKRDecomp::orderAsync(u8* srcBuffer, u8* dstBuffer, u32 srcLength, u32 dstLength,
JKRDecompCommand::AsyncCallback callback) {
JKRDecompCommand* command =
prepareCommand(srcBuffer, dstBuffer, srcLength, dstLength, callback);
sendCommand(command);
return command;
}
#pragma pop
/* 802DB934-802DB988 2D6274 0054+00 1/1 0/0 0/0 .text sync__9JKRDecompFP16JKRDecompCommandi */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDecomp::sync(JKRDecompCommand* param_0, int param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRDecomp/sync__9JKRDecompFP16JKRDecompCommandi.s"
bool JKRDecomp::sync(JKRDecompCommand* command, int isNonBlocking) {
OSMessage message;
bool result;
if (isNonBlocking == JKRDECOMP_SYNC_BLOCKING) {
OSReceiveMessage(&command->mMessageQueue, &message, OS_MESSAGE_BLOCKING);
result = true;
} else {
result =
OSReceiveMessage(&command->mMessageQueue, &message, OS_MESSAGE_NON_BLOCKING) != FALSE;
}
return result;
}
#pragma pop
/* 802DB988-802DB9DC 2D62C8 0054+00 0/0 5/5 0/0 .text orderSync__9JKRDecompFPUcPUcUlUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDecomp::orderSync(u8* param_0, u8* param_1, u32 param_2, u32 param_3) {
nofralloc
#include "asm/JSystem/JKernel/JKRDecomp/orderSync__9JKRDecompFPUcPUcUlUl.s"
bool JKRDecomp::orderSync(u8* srcBuffer, u8* dstBuffer, u32 srcLength, u32 dstLength) {
JKRDecompCommand* command = orderAsync(srcBuffer, dstBuffer, srcLength, dstLength, NULL);
bool result = sync(command, JKRDECOMP_SYNC_BLOCKING);
delete command;
return result;
}
#pragma pop
/* 802DB9DC-802DBA58 2D631C 007C+00 1/1 0/0 0/0 .text decode__9JKRDecompFPUcPUcUlUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDecomp::decode(u8* param_0, u8* param_1, u32 param_2, u32 param_3) {
nofralloc
#include "asm/JSystem/JKernel/JKRDecomp/decode__9JKRDecompFPUcPUcUlUl.s"
void JKRDecomp::decode(u8* srcBuffer, u8* dstBuffer, u32 srcLength, u32 dstLength) {
JKRCompression compression = checkCompressed(srcBuffer);
if (compression == COMPRESSION_YAY0) {
decodeSZP(srcBuffer, dstBuffer, srcLength, dstLength);
} else if (compression == COMPRESSION_YAZ0) {
decodeSZS(srcBuffer, dstBuffer, srcLength, dstLength);
}
}
#pragma pop
/* 802DBA58-802DBC14 2D6398 01BC+00 1/1 0/0 0/0 .text decodeSZP__9JKRDecompFPUcPUcUlUl */
// All instructions match. Wrong registers are used.
#ifdef NONMATCHING
void JKRDecomp::decodeSZP(u8* src, u8* dst, u32 srcLength, u32 dstLength) {
u32 decodedSize;
s32 srcChunkOffset;
s32 count;
s32 dstOffset;
u32 length;
u32 counter;
u32 srcDataOffset;
u32 linkTableOffset;
s32 offset;
s32 i;
decodedSize = read_big_endian_u32(src + 4);
linkTableOffset = read_big_endian_u32(src + 8);
srcDataOffset = read_big_endian_u32(src + 12);
dstOffset = 0;
counter = 0;
srcChunkOffset = 16;
u32 chunkBits;
if (srcLength == 0)
return;
if (dstLength > decodedSize)
return;
length = srcLength;
do {
if (counter == 0) {
chunkBits = read_big_endian_u32(src + srcChunkOffset);
srcChunkOffset += 4;
counter = 32;
}
if (chunkBits & 0x80000000) {
if (dstLength == 0) {
dst[dstOffset] = src[srcDataOffset];
length--;
if (length == 0) {
return;
}
} else {
dstLength--;
}
dstOffset++;
srcDataOffset++;
} else {
u32 linkInfo = read_big_endian_u16(src + linkTableOffset);
linkTableOffset += 2;
offset = dstOffset - (linkInfo & 0xFFF);
count = ((s32)linkInfo) >> 12;
if (count == 0) {
count = (u32)src[srcDataOffset] + 0x12;
srcDataOffset++;
} else {
count += 2;
}
if (count > decodedSize - dstOffset) {
count = decodedSize - dstOffset;
}
for (i = 0; i < count; i++, dstOffset++, offset++) {
if (dstLength == 0) {
dst[dstOffset] = dst[offset - 1];
length--;
if (length == 0) {
return;
}
} else {
dstLength--;
}
}
}
chunkBits <<= 1;
counter--;
} while ((s32)dstLength < decodedSize);
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -235,6 +262,7 @@ asm void JKRDecomp::decodeSZP(u8* param_0, u8* param_1, u32 param_2, u32 param_3
#include "asm/JSystem/JKernel/JKRDecomp/decodeSZP__9JKRDecompFPUcPUcUlUl.s"
}
#pragma pop
#endif
/* 802DBC14-802DBCF8 2D6554 00E4+00 1/1 0/0 0/0 .text decodeSZS__9JKRDecompFPUcPUcUlUl */
#pragma push
@@ -247,31 +275,29 @@ asm void JKRDecomp::decodeSZS(u8* param_0, u8* param_1, u32 param_2, u32 param_3
#pragma pop
/* 802DBCF8-802DBD70 2D6638 0078+00 1/1 4/4 0/0 .text checkCompressed__9JKRDecompFPUc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDecomp::checkCompressed(u8* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRDecomp/checkCompressed__9JKRDecompFPUc.s"
JKRCompression JKRDecomp::checkCompressed(u8* src) {
if ((src[0] == 'Y') && (src[1] == 'a') && (src[3] == '0')) {
if (src[2] == 'y') {
return COMPRESSION_YAY0;
}
if (src[2] == 'z') {
return COMPRESSION_YAZ0;
}
}
if ((src[0] == 'A') && (src[1] == 'S') && (src[2] == 'R')) {
return COMPRESSION_ASR;
}
return COMPRESSION_NONE;
}
#pragma pop
/* 802DBD70-802DBDC0 2D66B0 0050+00 1/1 0/0 0/0 .text __ct__16JKRDecompCommandFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRDecompCommand::JKRDecompCommand() {
nofralloc
#include "asm/JSystem/JKernel/JKRDecomp/__ct__16JKRDecompCommandFv.s"
JKRDecompCommand::JKRDecompCommand() {
OSInitMessageQueue(&mMessageQueue, &mMessage, 1);
mCallback = NULL;
field_0x1c = NULL;
mThis = this;
field_0x20 = 0;
}
#pragma pop
/* 802DBDC0-802DBDFC 2D6700 003C+00 1/1 0/0 0/0 .text __dt__16JKRDecompCommandFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRDecompCommand::~JKRDecompCommand() {
nofralloc
#include "asm/JSystem/JKernel/JKRDecomp/__dt__16JKRDecompCommandFv.s"
}
#pragma pop
JKRDecompCommand::~JKRDecompCommand() {}
+11 -65
View File
@@ -4,80 +4,26 @@
//
#include "JSystem/JKernel/JKRDisposer.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JSUPtrLink {
/* 802DBDFC */ JSUPtrLink(void*);
/* 802DBE14 */ ~JSUPtrLink();
};
struct JSUPtrList {
/* 802DBF4C */ void append(JSUPtrLink*);
/* 802DC15C */ void remove(JSUPtrLink*);
};
struct JKRHeap {
/* 802CE83C */ void findFromRoot(void*);
};
struct JKRDisposer {
/* 802D147C */ JKRDisposer();
/* 802D14E4 */ ~JKRDisposer();
};
//
// Forward References:
//
extern "C" void __ct__11JKRDisposerFv();
extern "C" void __dt__11JKRDisposerFv();
//
// External References:
//
extern "C" void findFromRoot__7JKRHeapFPv();
extern "C" void __dl__FPv();
extern "C" void __ct__10JSUPtrLinkFPv();
extern "C" void __dt__10JSUPtrLinkFv();
extern "C" void append__10JSUPtrListFP10JSUPtrLink();
extern "C" void remove__10JSUPtrListFP10JSUPtrLink();
//
// Declarations:
//
/* ############################################################################################## */
/* 803CC0F0-803CC100 029210 000C+04 2/2 0/0 0/0 .data __vt__11JKRDisposer */
SECTION_DATA extern void* __vt__11JKRDisposer[3 + 1 /* padding */] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__11JKRDisposerFv,
/* padding */
NULL,
};
/* 802D147C-802D14E4 2CBDBC 0068+00 0/0 12/12 0/0 .text __ct__11JKRDisposerFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRDisposer::JKRDisposer() {
nofralloc
#include "asm/JSystem/JKernel/JKRDisposer/__ct__11JKRDisposerFv.s"
JKRDisposer::JKRDisposer() : mLink(this) {
mHeap = JKRHeap::findFromRoot(this);
if (mHeap) {
mHeap->appendDisposer(this);
}
}
#pragma pop
/* 802D14E4-802D1568 2CBE24 0084+00 1/0 10/10 0/0 .text __dt__11JKRDisposerFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRDisposer::~JKRDisposer() {
nofralloc
#include "asm/JSystem/JKernel/JKRDisposer/__dt__11JKRDisposerFv.s"
JKRDisposer::~JKRDisposer() {
JKRHeap* heap = mHeap;
if (heap) {
heap->removeDisposer(this);
}
}
#pragma pop
+1 -1
View File
@@ -3,7 +3,7 @@
// Translation Unit: JKRDvdAramRipper
//
#include "JSystem/JKernel/JKRDvdAramRipper.h"
// #include "JSystem/JKernel/JKRDvdAramRipper.h"
#include "dol2asm.h"
#include "dolphin/types.h"
+364 -174
View File
@@ -4,88 +4,12 @@
//
#include "JSystem/JKernel/JKRDvdArchive.h"
#include "JSystem/JKernel/JKRDvdFile.h"
#include "JSystem/JKernel/JKRDvdRipper.h"
#include "JSystem/JKernel/JKRExpHeap.h"
#include "JSystem/JUtility/JUTException.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JUTException {
/* 802E21FC */ void panic_f(char const*, int, char const*, ...);
};
struct JSUPtrLink {};
struct JSUPtrList {
/* 802DBFF0 */ void prepend(JSUPtrLink*);
/* 802DC15C */ void remove(JSUPtrLink*);
};
struct JKRHeap {
/* 802CE4D4 */ void alloc(u32, int);
/* 802CE474 */ void alloc(u32, int, JKRHeap*);
/* 802CE500 */ void free(void*, JKRHeap*);
/* 802CE548 */ void free(void*);
/* 802CEB18 */ void copyMemory(void*, void*, u32);
static u8 sSystemHeap[4];
};
struct JKRFileLoader {
/* 802D41D4 */ void unmount();
static u8 sVolumeList[12];
};
struct JKRExpandSwitch {};
struct JKRDvdRipper {
struct EAllocDirection {};
/* 802D9C54 */ void loadToMainRAM(s32, u8*, JKRExpandSwitch, u32, JKRHeap*,
JKRDvdRipper::EAllocDirection, u32, int*, u32*);
};
struct JKRDvdFile {
/* 802D96A0 */ JKRDvdFile(s32);
};
struct JKRArchive {
struct EMountDirection {};
struct SDIFileEntry {};
struct EMountMode {};
/* 802D5A38 */ void becomeCurrent(char const*);
/* 802D5C64 */ void getResource(u32, char const*);
/* 802D5BE8 */ void getResource(char const*);
/* 802D5D8C */ void readResource(void*, u32, u32, char const*);
/* 802D5E30 */ void readResource(void*, u32, char const*);
/* 802D5FB4 */ void removeResourceAll();
/* 802D603C */ void removeResource(void*);
/* 802D609C */ void detachResource(void*);
/* 802D60D8 */ void getResSize(void const*) const;
/* 802D6150 */ void countFile(char const*) const;
/* 802D61B0 */ void getFirstFile(char const*) const;
/* 802D6294 */ JKRArchive(s32, JKRArchive::EMountMode);
/* 802D6334 */ ~JKRArchive();
/* 802D6734 */ void findPtrResource(void const*) const;
/* 802D693C */ void setExpandSize(JKRArchive::SDIFileEntry*, u32);
/* 802D6978 */ void getExpandSize(JKRArchive::SDIFileEntry*) const;
};
struct JKRDvdArchive {
/* 802D7BF0 */ JKRDvdArchive(s32, JKRArchive::EMountDirection);
/* 802D7C98 */ ~JKRDvdArchive();
/* 802D7DB4 */ void open(s32);
/* 802D8168 */ void fetchResource(void*, u32, JKRArchive::SDIFileEntry*, u32*);
/* 802D8050 */ void fetchResource(JKRArchive::SDIFileEntry*, u32*);
/* 802D826C */ void fetchResource_subroutine(s32, u32, u32, u8*, u32, int, int);
/* 802D8474 */ void fetchResource_subroutine(s32, u32, u32, JKRHeap*, int, int, u8**);
/* 802D8698 */ void getExpandedResSize(void const*) const;
};
#include "global.h"
//
// Forward References:
@@ -136,7 +60,6 @@ loadToMainRAM__12JKRDvdRipperFlPUc15JKRExpandSwitchUlP7JKRHeapQ212JKRDvdRipper15
extern "C" void prepend__10JSUPtrListFP10JSUPtrLink();
extern "C" void remove__10JSUPtrListFP10JSUPtrLink();
extern "C" void panic_f__12JUTExceptionFPCciPCce();
extern "C" void DCInvalidateRange();
extern "C" void _savegpr_25();
extern "C" void _savegpr_26();
extern "C" void _savegpr_27();
@@ -151,141 +74,408 @@ extern "C" void abs();
extern "C" u8 sVolumeList__13JKRFileLoader[12];
extern "C" u8 sSystemHeap__7JKRHeap[4];
extern "C" {
void DCInvalidateRange(void*, u32);
void DCStoreRange(void*, u32);
}
//
// Declarations:
//
/* ############################################################################################## */
/* 803CC398-803CC3E8 0294B8 0050+00 2/2 0/0 0/0 .data __vt__13JKRDvdArchive */
SECTION_DATA extern void* __vt__13JKRDvdArchive[20] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__13JKRDvdArchiveFv,
(void*)unmount__13JKRFileLoaderFv,
(void*)becomeCurrent__10JKRArchiveFPCc,
(void*)getResource__10JKRArchiveFPCc,
(void*)getResource__10JKRArchiveFUlPCc,
(void*)readResource__10JKRArchiveFPvUlPCc,
(void*)readResource__10JKRArchiveFPvUlUlPCc,
(void*)removeResourceAll__10JKRArchiveFv,
(void*)removeResource__10JKRArchiveFPv,
(void*)detachResource__10JKRArchiveFPv,
(void*)getResSize__10JKRArchiveCFPCv,
(void*)countFile__10JKRArchiveCFPCc,
(void*)getFirstFile__10JKRArchiveCFPCc,
(void*)getExpandedResSize__13JKRDvdArchiveCFPCv,
(void*)fetchResource__13JKRDvdArchiveFPQ210JKRArchive12SDIFileEntryPUl,
(void*)fetchResource__13JKRDvdArchiveFPvUlPQ210JKRArchive12SDIFileEntryPUl,
(void*)setExpandSize__10JKRArchiveFPQ210JKRArchive12SDIFileEntryUl,
(void*)getExpandSize__10JKRArchiveCFPQ210JKRArchive12SDIFileEntry,
};
/* 802D7BF0-802D7C98 2D2530 00A8+00 0/0 1/1 0/0 .text
* __ct__13JKRDvdArchiveFlQ210JKRArchive15EMountDirection */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRDvdArchive::JKRDvdArchive(s32 param_0, JKRArchive::EMountDirection param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdArchive/__ct__13JKRDvdArchiveFlQ210JKRArchive15EMountDirection.s"
JKRDvdArchive::JKRDvdArchive(s32 entryNum, JKRArchive::EMountDirection mountDirection)
: JKRArchive(entryNum, MOUNT_DVD), mMountDirection(mountDirection) {
if (!open(entryNum))
return;
mVolumeType = 'RARC';
mVolumeName = mStringTable + (u32)mNodes->name;
getVolumeList().prepend(&mFileLoaderLink);
mIsMounted = true;
}
#pragma pop
/* 802D7C98-802D7DB4 2D25D8 011C+00 1/0 0/0 0/0 .text __dt__13JKRDvdArchiveFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRDvdArchive::~JKRDvdArchive() {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdArchive/__dt__13JKRDvdArchiveFv.s"
JKRDvdArchive::~JKRDvdArchive() {
if (mIsMounted == true) {
if (mArcInfoBlock) {
SDIFileEntry* fileEntry = mFiles;
int i = 0;
for (; i < mArcInfoBlock->num_file_entries; fileEntry++, i++) {
if (fileEntry->data) {
JKRFreeToHeap(mHeap, fileEntry->data);
}
}
JKRFreeToHeap(mHeap, mArcInfoBlock);
mArcInfoBlock = NULL;
}
if (mExpandedSize) {
JKRFree(mExpandedSize);
mExpandedSize = NULL;
}
if (mDvdFile) {
delete mDvdFile;
}
getVolumeList().remove(&mFileLoaderLink);
mIsMounted = false;
}
}
#pragma pop
/* 802D7DB4-802D8050 2D26F4 029C+00 1/1 0/0 0/0 .text open__13JKRDvdArchiveFl */
#ifdef NONMATCHING
bool JKRDvdArchive::open(s32 entryNum) {
mArcInfoBlock = NULL;
field_0x64 = NULL;
mNodes = NULL;
mFiles = NULL;
mStringTable = NULL;
mDvdFile = new (JKRHeap::getSystemHeap(), 0) JKRDvdFile(entryNum);
if (!mDvdFile) {
mMountMode = UNKNOWN_MOUNT_MODE;
return false;
}
SArcHeader* arcHeader = (SArcHeader*)JKRAllocFromSysHeap(sizeof(SArcHeader), 0x20);
if (!arcHeader) {
mMountMode = UNKNOWN_MOUNT_MODE;
goto cleanup;
}
JKRDvdToMainRam(entryNum, (u8*)arcHeader, EXPAND_SWITCH_UNKNOWN1, sizeof(SArcHeader), NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD, 0, &mCompression, NULL);
DCInvalidateRange(arcHeader, sizeof(SArcHeader));
int alignment;
if (mMountDirection == MOUNT_DIRECTION_HEAD) {
alignment = 0x20;
} else {
alignment = -0x20;
}
mArcInfoBlock = (SArcDataInfo*)JKRAllocFromHeap(mHeap, arcHeader->file_data_offset, alignment);
if (!mArcInfoBlock) {
mMountMode = UNKNOWN_MOUNT_MODE;
goto cleanup;
}
JKRDvdToMainRam(entryNum, (u8*)mArcInfoBlock, EXPAND_SWITCH_UNKNOWN1,
arcHeader->file_data_offset, NULL, JKRDvdRipper::ALLOC_DIRECTION_FORWARD,
sizeof(SArcHeader), NULL, NULL);
DCInvalidateRange(mArcInfoBlock, arcHeader->file_data_offset);
mNodes = (SDirEntry*)((int)&mArcInfoBlock->num_nodes + mArcInfoBlock->node_offset);
mFiles = (SDIFileEntry*)((int)&mArcInfoBlock->num_nodes + mArcInfoBlock->file_entry_offset);
mStringTable = (char*)((int)&mArcInfoBlock->num_nodes + mArcInfoBlock->string_table_offset);
mExpandedSize = NULL;
bool useCompression = false;
SDIFileEntry* fileEntry = mFiles;
for (u32 i = 0; i < mArcInfoBlock->num_file_entries; fileEntry++, i++) {
if (!fileEntry->isUnknownFlag1()) {
useCompression |= fileEntry->isCompressed();
}
}
if (useCompression) {
mExpandedSize = (s32*)JKRAllocFromHeap(mHeap, sizeof(s32) * mArcInfoBlock->num_file_entries,
abs(alignment));
if (mExpandedSize) {
// !@bug: mArcInfoBlock is allocated from mHeap but free'd to sSystemHeap. I don't know
// what will happen if mHeap != sSystemHeap, but it's still a bug to free to the wrong
// allocator.
JKRFreeToSysHeap(mArcInfoBlock);
mMountMode = UNKNOWN_MOUNT_MODE;
goto cleanup;
}
memset(mExpandedSize, 0, sizeof(s32) * mArcInfoBlock->num_file_entries);
}
field_0x64 = arcHeader->header_length + arcHeader->file_data_offset;
cleanup:
if (arcHeader) {
JKRFreeToSysHeap(arcHeader);
}
if (mMountMode == UNKNOWN_MOUNT_MODE) {
if (mDvdFile) {
delete mDvdFile;
}
return false;
}
return true;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdArchive::open(s32 param_0) {
asm bool JKRDvdArchive::open(s32 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdArchive/open__13JKRDvdArchiveFl.s"
}
#pragma pop
#endif
/* 802D8050-802D8168 2D2990 0118+00 1/0 0/0 0/0 .text
* fetchResource__13JKRDvdArchiveFPQ210JKRArchive12SDIFileEntryPUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdArchive::fetchResource(JKRArchive::SDIFileEntry* param_0, u32* param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdArchive/fetchResource__13JKRDvdArchiveFPQ210JKRArchive12SDIFileEntryPUl.s"
void* JKRDvdArchive::fetchResource(SDIFileEntry* fileEntry, u32* returnSize) {
u32 tempReturnSize;
if (returnSize == NULL) {
returnSize = &tempReturnSize;
}
JKRCompression fileCompression = JKRConvertAttrToCompressionType(fileEntry->getAttr());
if (!fileEntry->data) {
u8* resourcePtr;
u32 resourceSize = fetchResource_subroutine(
mEntryNum, this->field_0x64 + fileEntry->data_offset, fileEntry->data_size, mHeap,
fileCompression, mCompression, &resourcePtr);
*returnSize = resourceSize;
if (resourceSize == 0) {
return NULL;
}
fileEntry->data = resourcePtr;
if (fileCompression == COMPRESSION_YAZ0) {
setExpandSize(fileEntry, *returnSize);
}
} else {
if (fileCompression == COMPRESSION_YAZ0) {
u32 resourceSize = getExpandSize(fileEntry);
*returnSize = resourceSize;
} else {
*returnSize = fileEntry->data_size;
}
}
return fileEntry->data;
}
#pragma pop
/* 802D8168-802D826C 2D2AA8 0104+00 1/0 0/0 0/0 .text
* fetchResource__13JKRDvdArchiveFPvUlPQ210JKRArchive12SDIFileEntryPUl */
// ALIGN_PREV(bufferSize, 0x20) is "inlined" in the function parameter.
#ifdef NONMATCHING
void* JKRDvdArchive::fetchResource(void* buffer, u32 bufferSize, SDIFileEntry* fileEntry,
u32* returnSize) {
ASSERT(isMounted());
u32 otherSize;
u32 size = fileEntry->data_size;
u32 dstSize = bufferSize;
JKRCompression fileCompression = JKRConvertAttrToCompressionType(fileEntry->getAttr());
if (!fileEntry->data) {
dstSize = ALIGN_PREV(bufferSize, 0x20);
size = fetchResource_subroutine(mEntryNum, field_0x64 + fileEntry->data_offset,
fileEntry->data_size, (u8*)buffer, dstSize, fileCompression,
mCompression);
} else {
if (fileCompression == COMPRESSION_YAZ0) {
otherSize = getExpandSize(fileEntry);
if (otherSize) {
size = otherSize;
}
}
if (size > bufferSize) {
size = bufferSize;
}
JKRHeap::copyMemory(buffer, fileEntry->data, size);
}
if (returnSize) {
*returnSize = size;
}
return buffer;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdArchive::fetchResource(void* param_0, u32 param_1, JKRArchive::SDIFileEntry* param_2,
u32* param_3) {
asm void* JKRDvdArchive::fetchResource(void* param_0, u32 param_1,
JKRArchive::SDIFileEntry* param_2, u32* param_3) {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdArchive/fetchResource__13JKRDvdArchiveFPvUlPQ210JKRArchive12SDIFileEntryPUl.s"
}
#pragma pop
/* ############################################################################################## */
/* 8039D1B0-8039D1B0 029810 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039D1B0 = "JKRDvdArchive.cpp";
SECTION_DEAD static char const* const stringBase_8039D1C2 = "%s";
SECTION_DEAD static char const* const stringBase_8039D1C5 = "Sorry, not applied for SZP archive.\n";
SECTION_DEAD static char const* const stringBase_8039D1EA = "??? bad sequence\n";
#pragma pop
#endif
/* 802D826C-802D8474 2D2BAC 0208+00 1/1 1/1 0/0 .text
* fetchResource_subroutine__13JKRDvdArchiveFlUlUlPUcUlii */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdArchive::fetchResource_subroutine(s32 param_0, u32 param_1, u32 param_2, u8* param_3,
u32 param_4, int param_5, int param_6) {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdArchive/fetchResource_subroutine__13JKRDvdArchiveFlUlUlPUcUlii.s"
}
#pragma pop
u32 JKRDvdArchive::fetchResource_subroutine(s32 entryNum, u32 offset, u32 size, u8* dst,
u32 dstLength, JKRCompression fileCompression,
JKRCompression archiveCompression) {
u32 alignedSize = ALIGN_NEXT(size, 0x20);
u32 alignedDstLength = ALIGN_PREV(dstLength, 0x20);
/* ############################################################################################## */
/* 8039D1B0-8039D1B0 029810 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039D1FC = "Sorry, not applied SZP archive.\n";
/* @stringBase0 padding */
SECTION_DEAD static char const* const pad_8039D21D = "\0\0";
#pragma pop
switch (archiveCompression) {
case COMPRESSION_NONE: {
switch (fileCompression) {
case COMPRESSION_NONE:
if (alignedSize > alignedDstLength) {
alignedSize = alignedDstLength;
}
JKRDvdToMainRam(entryNum, dst, EXPAND_SWITCH_UNKNOWN0, alignedSize, NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(dst, alignedSize);
return alignedSize;
case COMPRESSION_YAY0:
case COMPRESSION_YAZ0:
// The dst pointer to JKRDvdToMainRam should be aligned to 32 bytes. This will align
// arcHeader to 32 bytes on the stack.
char arcHeaderBuffer[64];
SArcHeader* arcHeader = (SArcHeader*)ALIGN_NEXT((u32)arcHeaderBuffer, 0x20);
JKRDvdToMainRam(entryNum, (u8*)arcHeader, EXPAND_SWITCH_UNKNOWN2, sizeof(SArcHeader),
NULL, JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(arcHeader, sizeof(SArcHeader));
u32 decompressedSize = JKRDecompExpandSize(arcHeader);
u32 alignedDecompressedSize = ALIGN_NEXT(decompressedSize, 0x20);
if (alignedDecompressedSize > alignedDstLength) {
alignedDecompressedSize = alignedDstLength;
}
JKRDvdToMainRam(entryNum, dst, EXPAND_SWITCH_UNKNOWN1, alignedDecompressedSize, NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(dst, alignedDecompressedSize);
return decompressedSize;
}
}
case COMPRESSION_YAZ0: {
if (size > alignedDstLength) {
size = alignedDstLength;
}
JKRDvdToMainRam(entryNum, dst, EXPAND_SWITCH_UNKNOWN1, size, NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(dst, size);
return size;
}
case COMPRESSION_YAY0: {
JUTException::panic_f("JKRDvdArchive.cpp", 0x289, "%s",
"Sorry, not applied for SZP archive.\n");
}
default: {
JUTException::panic_f("JKRDvdArchive.cpp", 0x28d, "%s", "??? bad sequence\n");
return 0;
}
}
}
/* 802D8474-802D8698 2D2DB4 0224+00 1/1 1/1 0/0 .text
* fetchResource_subroutine__13JKRDvdArchiveFlUlUlP7JKRHeapiiPPUc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdArchive::fetchResource_subroutine(s32 param_0, u32 param_1, u32 param_2,
JKRHeap* param_3, int param_4, int param_5,
u8** param_6) {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdArchive/fetchResource_subroutine__13JKRDvdArchiveFlUlUlP7JKRHeapiiPPUc.s"
u32 JKRDvdArchive::fetchResource_subroutine(s32 entryNum, u32 offset, u32 size, JKRHeap* heap,
JKRCompression fileCompression,
JKRCompression archiveCompression,
u8** returnResource) {
u32 alignedSize = ALIGN_NEXT(size, 0x20);
u8* buffer;
switch (archiveCompression) {
case COMPRESSION_NONE: {
switch (fileCompression) {
case COMPRESSION_NONE:
buffer = (u8*)JKRAllocFromHeap(heap, alignedSize, sizeof(SArcHeader));
ASSERT(buffer);
JKRDvdToMainRam(entryNum, buffer, EXPAND_SWITCH_UNKNOWN0, alignedSize, NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(buffer, alignedSize);
*returnResource = buffer;
return alignedSize;
case COMPRESSION_YAY0:
case COMPRESSION_YAZ0:
// The dst pointer to JKRDvdToMainRam should be aligned to 32 bytes. This will align
// arcHeader to 32 bytes on the stack.
char arcHeaderBuffer[64];
SArcHeader* arcHeader = (SArcHeader*)ALIGN_NEXT((u32)arcHeaderBuffer, 0x20);
JKRDvdToMainRam(entryNum, (u8*)arcHeader, EXPAND_SWITCH_UNKNOWN2, sizeof(SArcHeader),
NULL, JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(arcHeader, sizeof(SArcHeader));
alignedSize = JKRDecompExpandSize(arcHeader);
buffer = (u8*)JKRAllocFromHeap(heap, alignedSize, sizeof(SArcHeader));
ASSERT(buffer);
JKRDvdToMainRam(entryNum, buffer, EXPAND_SWITCH_UNKNOWN1, alignedSize, NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(buffer, alignedSize);
*returnResource = buffer;
return alignedSize;
}
}
case COMPRESSION_YAZ0: {
buffer = (u8*)JKRAllocFromHeap(heap, alignedSize, sizeof(SArcHeader));
ASSERT(buffer);
JKRDvdToMainRam(entryNum, buffer, EXPAND_SWITCH_UNKNOWN1, size, NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(buffer, size);
*returnResource = buffer;
return alignedSize;
}
case COMPRESSION_YAY0: {
JUTException::panic_f("JKRDvdArchive.cpp", 0x2f2, "%s",
"Sorry, not applied SZP archive.\n");
}
default: {
JUTException::panic_f("JKRDvdArchive.cpp", 0x2f6, "%s", "??? bad sequence\n");
return 0;
}
}
}
#pragma pop
/* 802D8698-802D87D4 2D2FD8 013C+00 1/0 0/0 0/0 .text getExpandedResSize__13JKRDvdArchiveCFPCv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdArchive::getExpandedResSize(void const* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdArchive/getExpandedResSize__13JKRDvdArchiveCFPCv.s"
u32 JKRDvdArchive::getExpandedResSize(const void* resource) const {
u32 resourceSize;
if (!mExpandedSize) {
return getResSize(resource);
}
SDIFileEntry* fileEntry = findPtrResource(resource);
if (!fileEntry) {
return -1;
}
if (!fileEntry->isCompressed()) {
return getResSize(resource);
}
resourceSize = getExpandSize(fileEntry);
if (resourceSize) {
return resourceSize;
}
// The dst pointer to JKRDvdToMainRam should be aligned to 32 bytes. This will align arcHeader
// to 32 bytes on the stack.
char buffer[64];
SArcHeader* arcHeader = (SArcHeader*)ALIGN_NEXT((u32)buffer, 0x20);
JKRDvdToMainRam(mEntryNum, (u8*)arcHeader, EXPAND_SWITCH_UNKNOWN2, sizeof(*arcHeader), NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD,
this->field_0x64 + fileEntry->data_offset, NULL, NULL);
DCInvalidateRange(arcHeader, sizeof(*arcHeader));
resourceSize = JKRDecompExpandSize(arcHeader);
// ???
((JKRDvdArchive*)this)->setExpandSize(fileEntry, resourceSize);
return resourceSize;
}
#pragma pop
/* 8039D1B0-8039D1B0 029810 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
+98 -250
View File
@@ -4,243 +4,124 @@
//
#include "JSystem/JKernel/JKRDvdFile.h"
#include "JSystem/JUtility/JUTException.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JUTException {
/* 802E21FC */ void panic_f(char const*, int, char const*, ...);
};
struct JSUPtrLink {
/* 802DBDFC */ JSUPtrLink(void*);
/* 802DBE14 */ ~JSUPtrLink();
};
struct JSUPtrList {
/* 802DBEAC */ ~JSUPtrList();
/* 802DBF14 */ void initiate();
/* 802DBF4C */ void append(JSUPtrLink*);
/* 802DC15C */ void remove(JSUPtrLink*);
};
template <typename A0>
struct JSUList {};
/* JSUList<JKRDvdFile> */
struct JSUList__template8 {
/* 802D9B44 */ void func_802D9B44(void* _this);
};
struct DVDFileInfo {};
struct JKRDvdFile {
/* 802D96A0 */ JKRDvdFile(s32);
/* 802D9584 */ JKRDvdFile();
/* 802D95F8 */ JKRDvdFile(char const*);
/* 802D9748 */ ~JKRDvdFile();
/* 802D97E4 */ void initiate();
/* 802D98C4 */ void open(s32);
/* 802D9850 */ void open(char const*);
/* 802D9938 */ void close();
/* 802D99B4 */ void readData(void*, s32, s32);
/* 802D9A68 */ s32 writeData(void const*, s32, s32);
/* 802D9A70 */ void sync();
/* 802D9AC4 */ void doneProcess(s32, DVDFileInfo*);
/* 802D9AF8 */ void getFileSize() const;
static u8 sDvdList[12];
};
struct JKRDisposer {
/* 802D147C */ JKRDisposer();
/* 802D14E4 */ ~JKRDisposer();
};
//
// Forward References:
//
extern "C" void __ct__10JKRDvdFileFv();
extern "C" void __ct__10JKRDvdFileFPCc();
extern "C" void __ct__10JKRDvdFileFl();
extern "C" void __dt__10JKRDvdFileFv();
extern "C" void initiate__10JKRDvdFileFv();
extern "C" void open__10JKRDvdFileFPCc();
extern "C" void open__10JKRDvdFileFl();
extern "C" void close__10JKRDvdFileFv();
extern "C" void readData__10JKRDvdFileFPvll();
extern "C" s32 writeData__10JKRDvdFileFPCvll();
extern "C" void sync__10JKRDvdFileFv();
extern "C" void doneProcess__10JKRDvdFileFlP11DVDFileInfo();
extern "C" void getFileSize__10JKRDvdFileCFv();
extern "C" void __sinit_JKRDvdFile_cpp();
extern "C" void func_802D9B44(void* _this);
extern "C" extern char const* const JKRDvdFile__stringBase0;
extern "C" u8 sDvdList__10JKRDvdFile[12];
//
// External References:
//
extern "C" void __dl__FPv();
extern "C" void __ct__11JKRDisposerFv();
extern "C" void __dt__11JKRDisposerFv();
extern "C" void __ct__10JSUPtrLinkFPv();
extern "C" void __dt__10JSUPtrLinkFv();
extern "C" void __dt__10JSUPtrListFv();
extern "C" void initiate__10JSUPtrListFv();
extern "C" void append__10JSUPtrListFP10JSUPtrLink();
extern "C" void remove__10JSUPtrListFP10JSUPtrLink();
extern "C" void panic_f__12JUTExceptionFPCciPCce();
extern "C" void OSInitMessageQueue();
extern "C" void OSSendMessage();
extern "C" void OSReceiveMessage();
extern "C" void OSInitMutex();
extern "C" void OSLockMutex();
extern "C" void OSUnlockMutex();
extern "C" void OSGetCurrentThread();
extern "C" void DVDFastOpen();
extern "C" void DVDOpen();
extern "C" void DVDClose();
extern "C" void DVDReadAsyncPrio();
extern "C" void DVDGetCommandBlockStatus();
extern "C" void __register_global_object();
extern "C" void _savegpr_27();
extern "C" void _savegpr_29();
extern "C" void _restgpr_27();
extern "C" void _restgpr_29();
extern "C" extern void* __vt__7JKRFile[8];
#include "global.h"
//
// Declarations:
//
/* ############################################################################################## */
/* 803CC438-803CC460 029558 0024+04 4/4 0/0 0/0 .data __vt__10JKRDvdFile */
SECTION_DATA extern void* __vt__10JKRDvdFile[9 + 1 /* padding */] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__10JKRDvdFileFv,
(void*)open__10JKRDvdFileFPCc,
(void*)close__10JKRDvdFileFv,
(void*)readData__10JKRDvdFileFPvll,
(void*)writeData__10JKRDvdFileFPCvll,
(void*)getFileSize__10JKRDvdFileCFv,
(void*)open__10JKRDvdFileFl,
/* padding */
NULL,
};
/* 8043436C-80434378 06108C 000C+00 4/4 0/0 0/0 .bss sDvdList__10JKRDvdFile */
JSUList<JKRDvdFile> JKRDvdFile::sDvdList;
/* 802D9584-802D95F8 2D3EC4 0074+00 0/0 3/3 0/0 .text __ct__10JKRDvdFileFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRDvdFile::JKRDvdFile() {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdFile/__ct__10JKRDvdFileFv.s"
JKRDvdFile::JKRDvdFile() : JKRFile(), mDvdLink(this) {
initiate();
}
#pragma pop
/* 802D95F8-802D96A0 2D3F38 00A8+00 0/0 2/2 0/0 .text __ct__10JKRDvdFileFPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRDvdFile::JKRDvdFile(char const* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdFile/__ct__10JKRDvdFileFPCc.s"
JKRDvdFile::JKRDvdFile(const char* name) : JKRFile(), mDvdLink(this) {
initiate();
bool result = open(name);
mIsAvailable = result;
// weird code. doesn't match without this, maybe remains from assert or something?
if (mIsAvailable)
return;
else
return;
}
#pragma pop
/* 802D96A0-802D9748 2D3FE0 00A8+00 0/0 3/3 0/0 .text __ct__10JKRDvdFileFl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRDvdFile::JKRDvdFile(s32 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdFile/__ct__10JKRDvdFileFl.s"
JKRDvdFile::JKRDvdFile(long entryNum) : JKRFile(), mDvdLink(this) {
initiate();
bool result = open(entryNum);
mIsAvailable = result;
// weird code. doesn't match without this, maybe remains from assert or something?
if (mIsAvailable)
return;
else
return;
}
#pragma pop
/* 802D9748-802D97E4 2D4088 009C+00 1/0 5/5 0/0 .text __dt__10JKRDvdFileFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRDvdFile::~JKRDvdFile() {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdFile/__dt__10JKRDvdFileFv.s"
JKRDvdFile::~JKRDvdFile() {
close();
}
#pragma pop
/* 802D97E4-802D9850 2D4124 006C+00 3/3 0/0 0/0 .text initiate__10JKRDvdFileFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdFile::initiate() {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdFile/initiate__10JKRDvdFileFv.s"
void JKRDvdFile::initiate(void) {
mDvdFile = this;
OSInitMutex(&mMutex1);
OSInitMutex(&mMutex2);
OSInitMessageQueue(&mMessageQueue2, &mMessage2, 1);
OSInitMessageQueue(&mMessageQueue1, &mMessage1, 1);
mOSThread = NULL;
field_0x50 = 0;
field_0x58 = 0;
}
#pragma pop
/* ############################################################################################## */
/* 80434360-8043436C 061080 000C+00 1/1 0/0 0/0 .bss @657 */
static u8 lit_657[12];
/* 8043436C-80434378 06108C 000C+00 4/4 0/0 0/0 .bss sDvdList__10JKRDvdFile */
u8 JKRDvdFile::sDvdList[12];
/* 802D9850-802D98C4 2D4190 0074+00 1/0 1/1 0/0 .text open__10JKRDvdFileFPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdFile::open(char const* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdFile/open__10JKRDvdFileFPCc.s"
bool JKRDvdFile::open(const char* param_1) {
if (!mIsAvailable) {
mIsAvailable = DVDOpen(param_1, &mFileInfo);
if (mIsAvailable) {
getDvdList().append(&mDvdLink);
getStatus();
}
}
return mIsAvailable;
}
#pragma pop
/* 802D98C4-802D9938 2D4204 0074+00 1/0 2/2 0/0 .text open__10JKRDvdFileFl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdFile::open(s32 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdFile/open__10JKRDvdFileFl.s"
bool JKRDvdFile::open(long entryNum) {
if (!mIsAvailable) {
mIsAvailable = DVDFastOpen(entryNum, &mFileInfo);
if (mIsAvailable) {
getDvdList().append(&mDvdLink);
getStatus();
}
}
return mIsAvailable;
}
#pragma pop
/* ############################################################################################## */
/* 8039D260-8039D260 0298C0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039D260 = "JKRDvdFile.cpp";
SECTION_DEAD static char const* const stringBase_8039D26F = "%s";
SECTION_DEAD static char const* const stringBase_8039D272 = "cannot close DVD file\n";
/* @stringBase0 padding */
SECTION_DEAD static char const* const pad_8039D289 = "\0\0\0\0\0\0";
#pragma pop
/* 802D9938-802D99B4 2D4278 007C+00 1/0 0/0 0/0 .text close__10JKRDvdFileFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdFile::close() {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdFile/close__10JKRDvdFileFv.s"
void JKRDvdFile::close() {
if (mIsAvailable) {
s32 result = DVDClose(&mFileInfo);
if (result != 0) {
mIsAvailable = false;
getDvdList().remove(&mDvdLink);
} else {
JUTException::panic_f("JKRDvdFile.cpp", 0xd5, "%s", "cannot close DVD file\n");
}
}
}
#pragma pop
/* 802D99B4-802D9A68 2D42F4 00B4+00 1/0 0/0 0/0 .text readData__10JKRDvdFileFPvll */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdFile::readData(void* param_0, s32 param_1, s32 param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdFile/readData__10JKRDvdFileFPvll.s"
s32 JKRDvdFile::readData(void* param_1, long length, long param_3) {
JUT_ASSERT((length & 0x1f) == 0);
OSLockMutex(&mMutex1);
if (mOSThread) {
OSUnlockMutex(&mMutex1);
return -1;
}
mOSThread = OSGetCurrentThread();
s32 result = -1;
s32 readAsyncResult =
DVDReadAsyncPrio(&mFileInfo, param_1, length, param_3, JKRDvdFile::doneProcess, 2);
if (readAsyncResult) {
result = sync();
}
mOSThread = NULL;
OSUnlockMutex(&mMutex1);
return result;
}
#pragma pop
/* 802D9A68-802D9A70 2D43A8 0008+00 1/0 0/0 0/0 .text writeData__10JKRDvdFileFPCvll */
s32 JKRDvdFile::writeData(void const* param_0, s32 param_1, s32 param_2) {
@@ -248,58 +129,25 @@ s32 JKRDvdFile::writeData(void const* param_0, s32 param_1, s32 param_2) {
}
/* 802D9A70-802D9AC4 2D43B0 0054+00 1/1 0/0 0/0 .text sync__10JKRDvdFileFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdFile::sync() {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdFile/sync__10JKRDvdFileFv.s"
s32 JKRDvdFile::sync(void) {
OSMessage message;
OSLockMutex(&mMutex1);
OSReceiveMessage(&mMessageQueue2, &message, 1);
mOSThread = NULL;
OSUnlockMutex(&mMutex1);
return (int)message;
}
#pragma pop
/* 802D9AC4-802D9AF8 2D4404 0034+00 1/1 0/0 0/0 .text doneProcess__10JKRDvdFileFlP11DVDFileInfo */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdFile::doneProcess(s32 param_0, DVDFileInfo* param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdFile/doneProcess__10JKRDvdFileFlP11DVDFileInfo.s"
void JKRDvdFile::doneProcess(long id, DVDFileInfo* fileInfo) {
// fileInfo->field_0x3c looks like some kind of user pointer?
JKRDvdFile* dvdFile = *(JKRDvdFile**)((u8*)fileInfo + 0x3c);
OSSendMessage(&dvdFile->mMessageQueue2, (OSMessage)id, OS_MESSAGE_NON_BLOCKING);
}
#pragma pop
/* 802D9AF8-802D9B00 2D4438 0008+00 1/0 0/0 0/0 .text getFileSize__10JKRDvdFileCFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdFile::getFileSize() const {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdFile/getFileSize__10JKRDvdFileCFv.s"
s32 JKRDvdFile::getFileSize(void) const {
return mFileInfo.length;
}
#pragma pop
/* 802D9B00-802D9B44 2D4440 0044+00 0/0 1/0 0/0 .text __sinit_JKRDvdFile_cpp */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void __sinit_JKRDvdFile_cpp() {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdFile/__sinit_JKRDvdFile_cpp.s"
}
#pragma pop
#pragma push
#pragma force_active on
REGISTER_CTORS(0x802D9B00, __sinit_JKRDvdFile_cpp);
#pragma pop
/* 802D9B44-802D9B98 2D4484 0054+00 1/1 0/0 0/0 .text __dt__21JSUList<10JKRDvdFile>Fv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
extern "C" asm void func_802D9B44(void* _this) {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdFile/func_802D9B44.s"
}
#pragma pop
/* 8039D260-8039D260 0298C0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
+13 -75
View File
@@ -7,63 +7,6 @@
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JUTException {
/* 802E21FC */ void panic_f(char const*, int, char const*, ...);
};
struct JSUPtrList {
/* 802DBEAC */ ~JSUPtrList();
/* 802DBF14 */ void initiate();
};
template <typename A0>
struct JSUList {};
/* JSUList<JKRDMCommand> */
struct JSUList__template9 {
/* 802DA820 */ void func_802DA820(void* _this);
};
struct JKRHeap {
/* 802CE4D4 */ void alloc(u32, int);
/* 802CE474 */ void alloc(u32, int, JKRHeap*);
/* 802CE500 */ void free(void*, JKRHeap*);
static u8 sSystemHeap[4];
};
struct JKRExpandSwitch {};
struct JKRDvdFile {
/* 802D9584 */ JKRDvdFile();
/* 802D9748 */ ~JKRDvdFile();
/* 802D9850 */ void open(char const*);
/* 802D98C4 */ void open(s32);
};
struct JKRDvdRipper {
struct EAllocDirection {};
/* 802D9D10 */ void loadToMainRAM(JKRDvdFile*, u8*, JKRExpandSwitch, u32, JKRHeap*,
JKRDvdRipper::EAllocDirection, u32, int*, u32*);
/* 802D9C54 */ void loadToMainRAM(s32, u8*, JKRExpandSwitch, u32, JKRHeap*,
JKRDvdRipper::EAllocDirection, u32, int*, u32*);
/* 802D9B98 */ void loadToMainRAM(char const*, u8*, JKRExpandSwitch, u32, JKRHeap*,
JKRDvdRipper::EAllocDirection, u32, int*, u32*);
/* 802DA7D4 */ u8 isErrorRetry();
static u8 sDvdAsyncList[12];
static u32 sSZSBufferSize;
};
struct JKRDecomp {
/* 802DB988 */ void orderSync(u8*, u8*, u32, u32);
/* 802DBCF8 */ void checkCompressed(u8*);
};
//
// Forward References:
//
@@ -105,12 +48,6 @@ extern "C" void initiate__10JSUPtrListFv();
extern "C" void panic_f__12JUTExceptionFPCciPCce();
extern "C" void DCInvalidateRange();
extern "C" void DCStoreRangeNoSync();
extern "C" void OSDisableInterrupts();
extern "C" void OSRestoreInterrupts();
extern "C" void OSInitMutex();
extern "C" void OSLockMutex();
extern "C" void OSUnlockMutex();
extern "C" void DVDReadPrio();
extern "C" void VIWaitForRetrace();
extern "C" void __register_global_object();
extern "C" void _savegpr_18();
@@ -135,10 +72,10 @@ extern "C" u8 sSystemHeap__7JKRHeap[4];
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdRipper::loadToMainRAM(char const* param_0, u8* param_1, JKRExpandSwitch param_2,
u32 param_3, JKRHeap* param_4,
JKRDvdRipper::EAllocDirection param_5, u32 param_6,
int* param_7, u32* param_8) {
asm void* JKRDvdRipper::loadToMainRAM(char const* param_0, u8* param_1, JKRExpandSwitch param_2,
u32 param_3, JKRHeap* param_4,
JKRDvdRipper::EAllocDirection param_5, u32 param_6,
int* param_7, u32* param_8) {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdRipper/func_802D9B98.s"
}
@@ -150,9 +87,10 @@ asm void JKRDvdRipper::loadToMainRAM(char const* param_0, u8* param_1, JKRExpand
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdRipper::loadToMainRAM(s32 param_0, u8* param_1, JKRExpandSwitch param_2, u32 param_3,
JKRHeap* param_4, JKRDvdRipper::EAllocDirection param_5,
u32 param_6, int* param_7, u32* param_8) {
asm void* JKRDvdRipper::loadToMainRAM(s32 param_0, u8* param_1, JKRExpandSwitch param_2,
u32 param_3, JKRHeap* param_4,
JKRDvdRipper::EAllocDirection param_5, u32 param_6,
int* param_7, u32* param_8) {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdRipper/func_802D9C54.s"
}
@@ -179,10 +117,10 @@ SECTION_SDATA static u32 data_804508C8 = 0x01000000;
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdRipper::loadToMainRAM(JKRDvdFile* param_0, u8* param_1, JKRExpandSwitch param_2,
u32 param_3, JKRHeap* param_4,
JKRDvdRipper::EAllocDirection param_5, u32 param_6,
int* param_7, u32* param_8) {
asm void* JKRDvdRipper::loadToMainRAM(JKRDvdFile* param_0, u8* param_1, JKRExpandSwitch param_2,
u32 param_3, JKRHeap* param_4,
JKRDvdRipper::EAllocDirection param_5, u32 param_6,
int* param_7, u32* param_8) {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdRipper/func_802D9D10.s"
}
@@ -272,7 +210,7 @@ static asm void decompSZS_subroutine(u8* param_0, u8* param_1) {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
static asm void firstSrcData() {
static asm u8* firstSrcData() {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdRipper/firstSrcData__Fv.s"
}
+16 -94
View File
@@ -4,86 +4,10 @@
//
#include "JSystem/JKernel/JKRExpHeap.h"
#include "JSystem/JUtility/JUTException.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JUTException {
/* 802E21FC */ void panic_f(char const*, int, char const*, ...);
};
struct JKRHeap {
struct TState {};
/* 802CE138 */ JKRHeap(void*, u32, JKRHeap*, bool);
/* 802CE264 */ ~JKRHeap();
/* 802CE378 */ void initArena(char**, u32*, int);
/* 802CE474 */ void alloc(u32, int, JKRHeap*);
/* 802CE500 */ void free(void*, JKRHeap*);
/* 802CE574 */ void callAllDisposer();
/* 802CE784 */ void getTotalFreeSize();
/* 802CE7DC */ void getMaxAllocatableSize(int);
/* 802CE894 */ void find(void*) const;
/* 802CEAC0 */ void dispose();
/* 802CEA78 */ void dispose(void*, u32);
/* 802CEDA0 */ void state_dump(JKRHeap::TState const&) const;
static u8 sCurrentHeap[4];
static u8 sRootHeap[4];
static u8 mErrorHandler[4];
};
struct JKRExpHeap {
struct CMemBlock {
/* 802D0810 */ void initiate(JKRExpHeap::CMemBlock*, JKRExpHeap::CMemBlock*, u32, u8, u8);
/* 802D0830 */ void allocFore(u32, u8, u8, u8, u8);
/* 802D0874 */ void allocBack(u32, u8, u8, u8, u8);
/* 802D08CC */ void free(JKRExpHeap*);
/* 802D091C */ void getHeapBlock(void*);
};
/* 802CEDB4 */ void createRoot(int, bool);
/* 802CEF00 */ void create(void*, u32, JKRHeap*, bool);
/* 802CEE2C */ void create(u32, JKRHeap*, bool);
/* 802CEFAC */ void do_destroy();
/* 802CF030 */ JKRExpHeap(void*, u32, JKRHeap*, bool);
/* 802CF0C0 */ ~JKRExpHeap();
/* 802CF128 */ void do_alloc(u32, int);
/* 802CF490 */ void allocFromHead(u32);
/* 802CF234 */ void allocFromHead(u32, int);
/* 802CF6D4 */ void allocFromTail(u32);
/* 802CF574 */ void allocFromTail(u32, int);
/* 802CF7AC */ void do_free(void*);
/* 802CF820 */ void do_freeAll();
/* 802CF89C */ void do_freeTail();
/* 802CF924 */ void do_fillFreeArea();
/* 802CF928 */ void do_changeGroupID(u8);
/* 802CF978 */ void do_resize(void*, u32);
/* 802CFB24 */ void do_getSize(void*);
/* 802CFBA4 */ void do_getFreeSize();
/* 802CFC10 */ void do_getMaxFreeBlock();
/* 802CFC84 */ void do_getTotalFreeSize();
/* 802CFCE8 */ void getUsedSize(u8) const;
/* 802CFD64 */ void getTotalUsedSize() const;
/* 802CFDCC */ void appendUsedList(JKRExpHeap::CMemBlock*);
/* 802CFE68 */ void setFreeBlock(JKRExpHeap::CMemBlock*, JKRExpHeap::CMemBlock*,
JKRExpHeap::CMemBlock*);
/* 802CFEB4 */ void removeFreeBlock(JKRExpHeap::CMemBlock*);
/* 802CFEE8 */ void removeUsedBlock(JKRExpHeap::CMemBlock*);
/* 802CFF1C */ void recycleFreeBlock(JKRExpHeap::CMemBlock*);
/* 802D00B4 */ void joinTwoBlocks(JKRExpHeap::CMemBlock*);
/* 802D0190 */ void check();
/* 802D03B8 */ void dump();
/* 802D05CC */ void dump_sort();
/* 802D0938 */ void state_register(JKRHeap::TState*, u32) const;
/* 802D09E0 */ void state_compare(JKRHeap::TState const&, JKRHeap::TState const&) const;
/* 802D0A10 */ void getHeapType();
/* 802D0A1C */ void do_getCurrentGroupId();
};
//
// Forward References:
//
@@ -155,8 +79,6 @@ extern "C" void JUTReportConsole_f();
extern "C" void JUTReportConsole();
extern "C" void JUTWarningConsole_f();
extern "C" void JUTWarningConsole();
extern "C" void OSLockMutex();
extern "C" void OSUnlockMutex();
extern "C" void _savegpr_25();
extern "C" void _savegpr_27();
extern "C" void _savegpr_28();
@@ -276,7 +198,7 @@ SECTION_DEAD static char const* const stringBase_8039CAF0 = ":::cannot alloc mem
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::do_alloc(u32 param_0, int param_1) {
asm void* JKRExpHeap::do_alloc(u32 param_0, int param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/do_alloc__10JKRExpHeapFUli.s"
}
@@ -378,7 +300,7 @@ void JKRExpHeap::do_fillFreeArea() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::do_changeGroupID(u8 param_0) {
asm u8 JKRExpHeap::do_changeGroupID(u8 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/do_changeGroupID__10JKRExpHeapFUc.s"
}
@@ -388,7 +310,7 @@ asm void JKRExpHeap::do_changeGroupID(u8 param_0) {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::do_resize(void* param_0, u32 param_1) {
asm s32 JKRExpHeap::do_resize(void* param_0, u32 param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/do_resize__10JKRExpHeapFPvUl.s"
}
@@ -398,7 +320,7 @@ asm void JKRExpHeap::do_resize(void* param_0, u32 param_1) {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::do_getSize(void* param_0) {
asm s32 JKRExpHeap::do_getSize(void* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/do_getSize__10JKRExpHeapFPv.s"
}
@@ -408,7 +330,7 @@ asm void JKRExpHeap::do_getSize(void* param_0) {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::do_getFreeSize() {
asm s32 JKRExpHeap::do_getFreeSize() {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/do_getFreeSize__10JKRExpHeapFv.s"
}
@@ -419,7 +341,7 @@ asm void JKRExpHeap::do_getFreeSize() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::do_getMaxFreeBlock() {
asm void* JKRExpHeap::do_getMaxFreeBlock() {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/do_getMaxFreeBlock__10JKRExpHeapFv.s"
}
@@ -430,7 +352,7 @@ asm void JKRExpHeap::do_getMaxFreeBlock() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::do_getTotalFreeSize() {
asm s32 JKRExpHeap::do_getTotalFreeSize() {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/do_getTotalFreeSize__10JKRExpHeapFv.s"
}
@@ -440,7 +362,7 @@ asm void JKRExpHeap::do_getTotalFreeSize() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::getUsedSize(u8 param_0) const {
asm s32 JKRExpHeap::getUsedSize(u8 param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/getUsedSize__10JKRExpHeapCFUc.s"
}
@@ -451,7 +373,7 @@ asm void JKRExpHeap::getUsedSize(u8 param_0) const {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::getTotalUsedSize() const {
asm s32 JKRExpHeap::getTotalUsedSize() const {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/getTotalUsedSize__10JKRExpHeapCFv.s"
}
@@ -565,7 +487,7 @@ SECTION_DEAD static char const* const stringBase_8039CC67 =
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::check() {
asm bool JKRExpHeap::check() {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/check__10JKRExpHeapFv.s"
}
@@ -606,7 +528,7 @@ SECTION_SDATA2 static f64 lit_1123 = 4503599627370496.0 /* cast u32 to float */;
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::dump() {
asm bool JKRExpHeap::dump() {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/dump__10JKRExpHeapFv.s"
}
@@ -616,7 +538,7 @@ asm void JKRExpHeap::dump() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::dump_sort() {
asm bool JKRExpHeap::dump_sort() {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/dump_sort__10JKRExpHeapFv.s"
}
@@ -696,7 +618,7 @@ asm void JKRExpHeap::state_register(JKRHeap::TState* param_0, u32 param_1) const
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::state_compare(JKRHeap::TState const& param_0,
asm bool JKRExpHeap::state_compare(JKRHeap::TState const& param_0,
JKRHeap::TState const& param_1) const {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/state_compare__10JKRExpHeapCFRCQ27JKRHeap6TStateRCQ27JKRHeap6TState.s"
@@ -707,7 +629,7 @@ asm void JKRExpHeap::state_compare(JKRHeap::TState const& param_0,
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::getHeapType() {
asm u32 JKRExpHeap::getHeapType() {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/getHeapType__10JKRExpHeapFv.s"
}
@@ -717,7 +639,7 @@ asm void JKRExpHeap::getHeapType() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::do_getCurrentGroupId() {
asm u8 JKRExpHeap::do_getCurrentGroupId() {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/do_getCurrentGroupId__10JKRExpHeapFv.s"
}
+9 -29
View File
@@ -6,39 +6,19 @@
#include "JSystem/JKernel/JKRFile.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JKRFile {
/* 802D9518 */ void read(void*, s32, s32);
};
//
// Forward References:
//
extern "C" void read__7JKRFileFPvll();
//
// External References:
//
extern "C" void VIWaitForRetrace();
extern "C" void _savegpr_28();
extern "C" void _restgpr_28();
#include "dolphin/vi/vi.h"
//
// Declarations:
//
/* 802D9518-802D9584 2D3E58 006C+00 0/0 2/2 0/0 .text read__7JKRFileFPvll */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFile::read(void* param_0, s32 param_1, s32 param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRFile/read__7JKRFileFPvll.s"
s32 JKRFile::read(void* data, s32 size, long offset) {
while (true) {
s32 result = readData(data, size, offset);
if (size != result)
VIWaitForRetrace();
else
return result;
}
}
#pragma pop
+366 -279
View File
@@ -4,87 +4,12 @@
//
#include "JSystem/JKernel/JKRFileCache.h"
#include "JSystem/JKernel/JKRDvdFile.h"
#include "JSystem/JKernel/JKRFileFinder.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JSUPtrLink {
/* 802DBDFC */ JSUPtrLink(void*);
/* 802DBE14 */ ~JSUPtrLink();
};
struct JSUPtrList {
/* 802DBEAC */ ~JSUPtrList();
/* 802DBF14 */ void initiate();
/* 802DBF4C */ void append(JSUPtrLink*);
/* 802DBFF0 */ void prepend(JSUPtrLink*);
/* 802DC15C */ void remove(JSUPtrLink*);
};
struct JKRHeap {
/* 802CE4D4 */ void alloc(u32, int);
/* 802CE474 */ void alloc(u32, int, JKRHeap*);
/* 802CE500 */ void free(void*, JKRHeap*);
/* 802CE548 */ void free(void*);
/* 802CE83C */ void findFromRoot(void*);
static u8 sSystemHeap[4];
};
struct JKRFileLoader {
/* 802D40F0 */ JKRFileLoader();
/* 802D4148 */ ~JKRFileLoader();
/* 802D41D4 */ void unmount();
static u8 sVolumeList[12];
static u8 sCurrentVolume[4 + 4 /* padding */];
};
struct JKRFileCache {
struct CCacheBlock {
/* 802D566C */ CCacheBlock(u32, u32, void const*);
};
/* 802D49B4 */ void mount(char const*, JKRHeap*, char const*);
/* 802D4AB4 */ JKRFileCache(char const*, char const*);
/* 802D4C70 */ ~JKRFileCache();
/* 802D4D44 */ void becomeCurrent(char const*);
/* 802D4DD8 */ void getResource(char const*);
/* 802D4EDC */ void getResource(u32, char const*);
/* 802D503C */ void readResource(void*, u32, u32, char const*);
/* 802D4F64 */ void readResource(void*, u32, char const*);
/* 802D50D4 */ void removeResourceAll();
/* 802D5164 */ void removeResource(void*);
/* 802D51F8 */ void detachResource(void*);
/* 802D526C */ void getResSize(void const*) const;
/* 802D52A0 */ void countFile(char const*) const;
/* 802D531C */ void getFirstFile(char const*) const;
/* 802D53B8 */ void findCacheBlock(void const*) const;
/* 802D53E4 */ void findCacheBlock(u32) const;
/* 802D5410 */ void findFile(char*, char const*) const;
/* 802D551C */ void getDvdPathName(char const*) const;
/* 802D5624 */ void convStrLower(char*) const;
/* 802D56C8 */ void getFsResource(char const*);
/* 802D56F4 */ void getNameResource(u32, char const*);
/* 802D5720 */ void readFsResource(void*, u32, char const*);
/* 802D574C */ void readNameResource(void*, u32, u32, char const*);
};
struct JKRFile {
/* 802D9518 */ void read(void*, s32, s32);
};
struct JKRDvdFinder {
/* 802D4770 */ JKRDvdFinder(char const*);
};
struct JKRDvdFile {
/* 802D95F8 */ JKRDvdFile(char const*);
/* 802D9748 */ ~JKRDvdFile();
};
#include "global.h"
#include "msl_c/string.h"
//
// Forward References:
@@ -120,7 +45,6 @@ extern "C" extern char const* const JKRFileCache__stringBase0;
// External References:
//
SECTION_INIT void memcpy();
extern "C" void alloc__7JKRHeapFUliP7JKRHeap();
extern "C" void alloc__7JKRHeapFUli();
extern "C" void free__7JKRHeapFPvP7JKRHeap();
@@ -142,10 +66,6 @@ extern "C" void initiate__10JSUPtrListFv();
extern "C" void append__10JSUPtrListFP10JSUPtrLink();
extern "C" void prepend__10JSUPtrListFP10JSUPtrLink();
extern "C" void remove__10JSUPtrListFP10JSUPtrLink();
extern "C" void DVDChangeDir();
extern "C" void DVDOpenDir();
extern "C" void DVDReadDir();
extern "C" bool DVDCloseDir();
extern "C" void _savegpr_26();
extern "C" void _savegpr_27();
extern "C" void _savegpr_28();
@@ -154,12 +74,6 @@ extern "C" void _restgpr_26();
extern "C" void _restgpr_27();
extern "C" void _restgpr_28();
extern "C" void _restgpr_29();
extern "C" void tolower();
extern "C" void strrchr();
extern "C" void strcmp();
extern "C" void strcat();
extern "C" void strcpy();
extern "C" void strlen();
extern "C" u8 sVolumeList__13JKRFileLoader[12];
extern "C" u8 sSystemHeap__7JKRHeap[4];
extern "C" u8 sCurrentVolume__13JKRFileLoader[4 + 4 /* padding */];
@@ -169,124 +83,248 @@ extern "C" u8 sCurrentVolume__13JKRFileLoader[4 + 4 /* padding */];
//
/* 802D49B4-802D4AB4 2CF2F4 0100+00 0/0 2/2 0/0 .text mount__12JKRFileCacheFPCcP7JKRHeapPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::mount(char const* param_0, JKRHeap* param_1, char const* param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/mount__12JKRFileCacheFPCcP7JKRHeapPCc.s"
JKRFileCache* JKRFileCache::mount(const char* path, JKRHeap* heap, const char* param_3) {
if (!path || *path != '/') {
return NULL;
}
u32 pathLength = strlen(path);
if (pathLength != 1 && path[pathLength - 1] == '/') {
return NULL;
}
JSUList<JKRFileLoader>& volumeList = getVolumeList();
JSUListIterator<JKRFileLoader> iterator;
for (iterator = volumeList.getFirst(); iterator != volumeList.getEnd(); ++iterator) {
if (iterator->getVolumeType() == 'CASH') {
JKRFileCache* fileCache = (JKRFileCache*)iterator.getObject();
if (fileCache->mRootPath) {
if (strcmp(fileCache->mRootPath, path) == 0) {
fileCache->mMountCount++;
return fileCache;
}
}
}
}
return new (heap, 0) JKRFileCache(path, param_3);
}
#pragma pop
/* ############################################################################################## */
/* 8039D158-8039D158 0297B8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039D158 = "/";
SECTION_DEAD static char const* const stringBase_8039D15A = "dvd";
/* @stringBase0 padding */
SECTION_DEAD static char const* const pad_8039D15E = "\0";
#pragma pop
/* 803CC238-803CC288 029358 004C+04 2/2 0/0 0/0 .data __vt__12JKRFileCache */
SECTION_DATA extern void* __vt__12JKRFileCache[19 + 1 /* padding */] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__12JKRFileCacheFv,
(void*)unmount__13JKRFileLoaderFv,
(void*)becomeCurrent__12JKRFileCacheFPCc,
(void*)getResource__12JKRFileCacheFPCc,
(void*)getResource__12JKRFileCacheFUlPCc,
(void*)readResource__12JKRFileCacheFPvUlPCc,
(void*)readResource__12JKRFileCacheFPvUlUlPCc,
(void*)removeResourceAll__12JKRFileCacheFv,
(void*)removeResource__12JKRFileCacheFPv,
(void*)detachResource__12JKRFileCacheFPv,
(void*)getResSize__12JKRFileCacheCFPCv,
(void*)countFile__12JKRFileCacheCFPCc,
(void*)getFirstFile__12JKRFileCacheCFPCc,
(void*)getFsResource__12JKRFileCacheFPCc,
(void*)getNameResource__12JKRFileCacheFUlPCc,
(void*)readFsResource__12JKRFileCacheFPvUlPCc,
(void*)readNameResource__12JKRFileCacheFPvUlUlPCc,
/* padding */
NULL,
};
// #pragma push
// #pragma force_active on
// SECTION_DEAD static char const* const stringBase_8039D158 = "/";
// SECTION_DEAD static char const* const stringBase_8039D15A = "dvd";
// /* @stringBase0 padding */
// SECTION_DEAD static char const* const pad_8039D15E = "\0";
// #pragma pop
/* 802D4AB4-802D4C70 2CF3F4 01BC+00 1/1 0/0 0/0 .text __ct__12JKRFileCacheFPCcPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRFileCache::JKRFileCache(char const* param_0, char const* param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/__ct__12JKRFileCacheFPCcPCc.s"
JKRFileCache::JKRFileCache(const char* path, const char* volume) : mCacheBlockList() {
mParentHeap = JKRHeap::findFromRoot(this);
mMountCount = 1;
mVolumeType = 'CASH';
u32 pathLength = strlen(path);
mRootPath = (char*)JKRAllocFromHeap(mParentHeap, pathLength + 1, 1);
mCurrentPath = (char*)JKRAllocFromSysHeap(pathLength + 2, 1);
strcpy(mRootPath, path);
strcpy(mCurrentPath, path);
if (path[1] != '\0') {
convStrLower(mRootPath);
convStrLower(mCurrentPath);
strcat(mCurrentPath, "/");
const char* volumePath = volume;
if (!volume) {
volumePath = strrchr(mRootPath, '/');
volumePath++;
}
u32 volumeLength = strlen(volumePath) + 1;
mVolumePath = (char*)JKRAllocFromSysHeap(volumeLength, 0);
strcpy(mVolumePath, volumePath);
convStrLower(mVolumePath);
mVolumeName = mVolumePath;
} else {
const char* volumePath = volume;
if (!volume) {
volumePath = "dvd";
}
u32 volumeLength = strlen(volumePath) + 1;
mVolumePath = (char*)JKRAllocFromSysHeap(volumeLength, 0);
strcpy(mVolumePath, volumePath);
convStrLower(mVolumePath);
mVolumeName = mVolumePath;
}
getVolumeList().prepend(&mFileLoaderLink);
mIsMounted = true;
}
#pragma pop
/* 802D4C70-802D4D44 2CF5B0 00D4+00 1/0 0/0 0/0 .text __dt__12JKRFileCacheFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRFileCache::~JKRFileCache() {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/__dt__12JKRFileCacheFv.s"
JKRFileCache::~JKRFileCache() {
removeResourceAll();
if (mRootPath)
JKRFreeToHeap(mParentHeap, mRootPath);
if (mCurrentPath)
JKRFreeToSysHeap(mCurrentPath);
if (mVolumePath)
JKRFreeToSysHeap(mVolumePath);
getVolumeList().remove(&mFileLoaderLink);
}
#pragma pop
/* 802D4D44-802D4DD8 2CF684 0094+00 1/0 0/0 0/0 .text becomeCurrent__12JKRFileCacheFPCc
*/
#ifdef NONMATCHING
bool JKRFileCache::becomeCurrent(const char* path) {
char* name = getDvdPathName(path);
BOOL result = DVDChangeDir(name);
bool didChangeDir = (result != 0);
if (didChangeDir) {
setCurrentVolume(this);
JKRFreeToSysHeap(mCurrentPath);
mCurrentPath = name;
if (mCurrentPath[1]) {
strcat(mCurrentPath, "/");
}
} else {
JKRFreeToSysHeap(name);
}
return didChangeDir;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::becomeCurrent(char const* param_0) {
asm bool JKRFileCache::becomeCurrent(char const* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/becomeCurrent__12JKRFileCacheFPCc.s"
}
#pragma pop
#endif
/* 802D4DD8-802D4EDC 2CF718 0104+00 1/0 0/0 0/0 .text getResource__12JKRFileCacheFPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::getResource(char const* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/getResource__12JKRFileCacheFPCc.s"
void* JKRFileCache::getResource(const char* path) {
ASSERT(isMounted());
void* buffer = NULL;
char* name = getDvdPathName(path);
JKRDvdFile dvdFile(name);
if (dvdFile.isAvailable()) {
CCacheBlock* cacheBlock = findCacheBlock(dvdFile.getFileID());
if (!cacheBlock) {
// dvdFile.getFileSize() not inlined
u32 fileSize = dvdFile.getFileInfo().length;
u32 alignedSize = ALIGN_NEXT(fileSize, 0x20);
buffer = JKRAllocFromHeap(mParentHeap, alignedSize, 0x20);
if (buffer) {
dvdFile.read(buffer, alignedSize, 0);
cacheBlock = new (JKRHeap::getSystemHeap(), 0)
CCacheBlock(dvdFile.getFileID(), dvdFile.getFileInfo().length, buffer);
mCacheBlockList.append(&cacheBlock->mCacheBlockLink);
}
} else {
cacheBlock->mReferenceCount++;
buffer = cacheBlock->mMemoryPtr;
}
}
JKRFreeToSysHeap(name);
return buffer;
}
#pragma pop
/* 802D4EDC-802D4F64 2CF81C 0088+00 1/0 0/0 0/0 .text getResource__12JKRFileCacheFUlPCc
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::getResource(u32 param_0, char const* param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/getResource__12JKRFileCacheFUlPCc.s"
void* JKRFileCache::getResource(u32, const char* path) {
ASSERT(isMounted());
char finalPath[256];
u32 rootLength = strlen(mRootPath);
char* filePath = finalPath + rootLength;
strcpy(finalPath, mRootPath);
bool found = findFile(finalPath, path);
if (!found)
return NULL;
return getResource(filePath);
}
#pragma pop
/* 802D4F64-802D503C 2CF8A4 00D8+00 1/0 0/0 0/0 .text readResource__12JKRFileCacheFPvUlPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::readResource(void* param_0, u32 param_1, char const* param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/readResource__12JKRFileCacheFPvUlPCc.s"
u32 JKRFileCache::readResource(void* dst, u32 dstLength, const char* path) {
ASSERT(isMounted());
char* name = getDvdPathName(path);
JKRDvdFile dvdFile(name);
u32 resourceSize = 0;
// !@bug: (maybe?) Infinite Loop: Because dvdFile.isAvailable() is never updated in the loop-body
// will would never exit the loop.
loop:
if (dvdFile.isAvailable()) {
// dvdFile.getFileSize() not inlined
u32 fileSize = dvdFile.getFileInfo().length;
resourceSize = ALIGN_NEXT(fileSize, 0x20);
dstLength = ALIGN_PREV(dstLength, 0x20);
if (resourceSize > dstLength) {
resourceSize = dstLength;
}
CCacheBlock* cacheBlock = findCacheBlock(dvdFile.getFileID());
if (!cacheBlock) {
dvdFile.read(dst, resourceSize, 0);
} else {
memcpy(dst, cacheBlock->mMemoryPtr, resourceSize);
}
goto loop;
}
JKRFreeToSysHeap(name);
return resourceSize;
}
#pragma pop
/* 802D503C-802D50D4 2CF97C 0098+00 1/0 0/0 0/0 .text readResource__12JKRFileCacheFPvUlUlPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::readResource(void* param_0, u32 param_1, u32 param_2, char const* param_3) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/readResource__12JKRFileCacheFPvUlUlPCc.s"
u32 JKRFileCache::readResource(void* dst, u32 dstLength, u32, const char* path) {
ASSERT(isMounted());
char finalPath[256];
u32 rootLength = strlen(mRootPath);
char* filePath = finalPath + rootLength;
strcpy(finalPath, mRootPath);
bool found = findFile(finalPath, path);
if (!found)
return NULL;
return readResource(dst, dstLength, filePath);
}
#pragma pop
/* 802D50D4-802D5164 2CFA14 0090+00 1/0 0/0 0/0 .text removeResourceAll__12JKRFileCacheFv
*/
#ifdef NONMATCHING
void JKRFileCache::removeResourceAll(void) {
ASSERT(isMounted());
JSUListIterator<CCacheBlock> iterator;
iterator = mCacheBlockList.getFirst();
while (iterator != mCacheBlockList.getEnd()) {
JKRFreeToHeap(mParentHeap, iterator->mMemoryPtr);
mCacheBlockList.remove(&iterator->mLink);
JSUListIterator<CCacheBlock> next = iterator++;
CCacheBlock* cacheBlock = next.getObject();
delete cacheBlock;
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -295,165 +333,214 @@ asm void JKRFileCache::removeResourceAll() {
#include "asm/JSystem/JKernel/JKRFileCache/removeResourceAll__12JKRFileCacheFv.s"
}
#pragma pop
#endif
/* 802D5164-802D51F8 2CFAA4 0094+00 1/0 0/0 0/0 .text removeResource__12JKRFileCacheFPv
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::removeResource(void* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/removeResource__12JKRFileCacheFPv.s"
bool JKRFileCache::removeResource(void* resource) {
ASSERT(isMounted());
CCacheBlock* cacheBlock = findCacheBlock(resource);
if (!cacheBlock)
return false;
u32 referenceCount = cacheBlock->mReferenceCount - 1;
cacheBlock->mReferenceCount = referenceCount;
if (referenceCount == 0) {
JKRFreeToHeap(mParentHeap, resource);
mCacheBlockList.remove(&cacheBlock->mCacheBlockLink);
delete cacheBlock;
}
return true;
}
#pragma pop
/* 802D51F8-802D526C 2CFB38 0074+00 1/0 0/0 0/0 .text detachResource__12JKRFileCacheFPv
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::detachResource(void* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/detachResource__12JKRFileCacheFPv.s"
bool JKRFileCache::detachResource(void* resource) {
ASSERT(isMounted());
CCacheBlock* cacheBlock = findCacheBlock(resource);
if (!cacheBlock)
return false;
mCacheBlockList.remove(&cacheBlock->mCacheBlockLink);
delete cacheBlock;
return true;
}
#pragma pop
/* 802D526C-802D52A0 2CFBAC 0034+00 1/0 0/0 0/0 .text getResSize__12JKRFileCacheCFPCv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::getResSize(void const* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/getResSize__12JKRFileCacheCFPCv.s"
u32 JKRFileCache::getResSize(const void* resource) const {
ASSERT(isMounted());
CCacheBlock* cacheBlock = findCacheBlock(resource);
if (cacheBlock == NULL) {
return -1;
} else {
return cacheBlock->mFileSize;
}
}
#pragma pop
/* 802D52A0-802D531C 2CFBE0 007C+00 1/0 0/0 0/0 .text countFile__12JKRFileCacheCFPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::countFile(char const* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/countFile__12JKRFileCacheCFPCc.s"
u32 JKRFileCache::countFile(const char* path) const {
ASSERT(isMounted());
DVDDirectory dir;
DVDDirectoryEntry dirEntry;
u32 count = 0;
char* name = getDvdPathName(path);
BOOL result = DVDOpenDir(name, &dir);
if (result != 0) {
while (result = DVDReadDir(&dir, &dirEntry), result != FALSE) {
count = count + 1;
}
DVDCloseDir(&dir);
}
JKRFreeToSysHeap(name);
return count;
}
#pragma pop
/* 802D531C-802D53B8 2CFC5C 009C+00 1/0 0/0 0/0 .text getFirstFile__12JKRFileCacheCFPCc
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::getFirstFile(char const* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/getFirstFile__12JKRFileCacheCFPCc.s"
JKRFileFinder* JKRFileCache::getFirstFile(const char* path) const {
char* name = getDvdPathName(path);
JKRHeap* systemHeap = JKRHeap::getSystemHeap();
JKRDvdFinder* finder = new (systemHeap, 0) JKRDvdFinder(name);
JKRFreeToSysHeap(name);
if (finder->isAvailable() != true) {
delete finder;
return NULL;
}
return finder;
}
#pragma pop
/* 802D53B8-802D53E4 2CFCF8 002C+00 3/3 0/0 0/0 .text findCacheBlock__12JKRFileCacheCFPCv
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::findCacheBlock(void const* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/findCacheBlock__12JKRFileCacheCFPCv.s"
JKRFileCache::CCacheBlock* JKRFileCache::findCacheBlock(const void* resource) const {
JSUListIterator<CCacheBlock> iterator;
for (iterator = mCacheBlockList.getFirst(); iterator != mCacheBlockList.getEnd(); ++iterator) {
if (iterator->mMemoryPtr == resource) {
return iterator.getObject();
}
}
return NULL;
}
#pragma pop
/* 802D53E4-802D5410 2CFD24 002C+00 2/2 0/0 0/0 .text findCacheBlock__12JKRFileCacheCFUl
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::findCacheBlock(u32 param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/findCacheBlock__12JKRFileCacheCFUl.s"
JKRFileCache::CCacheBlock* JKRFileCache::findCacheBlock(u32 fileID) const {
JSUListIterator<CCacheBlock> iterator;
for (iterator = mCacheBlockList.getFirst(); iterator != mCacheBlockList.getEnd(); ++iterator) {
if (iterator->mFileId == fileID) {
return iterator.getObject();
}
}
return NULL;
}
#pragma pop
/* 802D5410-802D551C 2CFD50 010C+00 2/2 0/0 0/0 .text findFile__12JKRFileCacheCFPcPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::findFile(char* param_0, char const* param_1) const {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/findFile__12JKRFileCacheCFPcPCc.s"
bool JKRFileCache::findFile(char* path, const char* fileName) const {
DVDDirectory dir;
DVDDirectoryEntry dirEntry;
bool result = false;
u32 pathLength = strlen(path);
if (DVDOpenDir(path, &dir)) {
while (DVDReadDir(&dir, &dirEntry)) {
if (dirEntry.is_directory) {
char* endOfPath = path + pathLength;
*endOfPath = '/';
strcpy(path + pathLength + 1, dirEntry.name);
result = findFile(path, fileName);
if (result)
break;
*endOfPath = '\0';
} else {
result = (strcmp(fileName, dirEntry.name) == 0);
if (result) {
strcat(path, "/");
strcat(path, fileName);
break;
}
}
}
DVDCloseDir(&dir);
}
return result;
}
#pragma pop
/* 802D551C-802D5624 2CFE5C 0108+00 5/5 0/0 0/0 .text getDvdPathName__12JKRFileCacheCFPCc
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::getDvdPathName(char const* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/getDvdPathName__12JKRFileCacheCFPCc.s"
char* JKRFileCache::getDvdPathName(const char* path) const {
char* newPath;
if (path[0] == '/') {
u32 length = strlen(mRootPath) + strlen(path) + 2;
newPath = (char*)JKRAllocFromSysHeap(length, 1);
strcpy(newPath, mRootPath);
if (path[1]) {
if (mRootPath[1] == 0) {
strcat(newPath, path + 1);
} else {
strcat(newPath, path);
}
}
} else {
u32 length = strlen(mCurrentPath) + strlen(path) + 2;
newPath = (char*)JKRAllocFromSysHeap(length, 1);
strcpy(newPath, mCurrentPath);
strcat(newPath, path);
}
convStrLower(newPath);
return newPath;
}
#pragma pop
/* 802D5624-802D566C 2CFF64 0048+00 2/2 0/0 0/0 .text convStrLower__12JKRFileCacheCFPc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::convStrLower(char* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/convStrLower__12JKRFileCacheCFPc.s"
void JKRFileCache::convStrLower(char* buffer) const {
while (*buffer) {
*buffer++ = tolower(*buffer);
}
}
#pragma pop
/* 802D566C-802D56C8 2CFFAC 005C+00 1/1 0/0 0/0 .text __ct__Q212JKRFileCache11CCacheBlockFUlUlPCv
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRFileCache::CCacheBlock::CCacheBlock(u32 param_0, u32 param_1, void const* param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/__ct__Q212JKRFileCache11CCacheBlockFUlUlPCv.s"
JKRFileCache::CCacheBlock::CCacheBlock(u32 fileId, u32 fileSize, const void* resource)
: mCacheBlockLink(this) {
mReferenceCount = 1;
mFileId = fileId;
mFileSize = fileSize;
mMemoryPtr = (void*)resource; // todo: don't cast away const
}
#pragma pop
/* 802D56C8-802D56F4 2D0008 002C+00 1/0 0/0 0/0 .text getFsResource__12JKRFileCacheFPCc
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::getFsResource(char const* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/getFsResource__12JKRFileCacheFPCc.s"
void* JKRFileCache::getFsResource(const char* path) {
return getResource(path);
}
#pragma pop
/* 802D56F4-802D5720 2D0034 002C+00 1/0 0/0 0/0 .text getNameResource__12JKRFileCacheFUlPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::getNameResource(u32 param_0, char const* param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/getNameResource__12JKRFileCacheFUlPCc.s"
void* JKRFileCache::getNameResource(u32 type, const char* path) {
return getResource(type, path);
}
#pragma pop
/* 802D5720-802D574C 2D0060 002C+00 1/0 0/0 0/0 .text readFsResource__12JKRFileCacheFPvUlPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::readFsResource(void* param_0, u32 param_1, char const* param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/readFsResource__12JKRFileCacheFPvUlPCc.s"
u32 JKRFileCache::readFsResource(void* dst, u32 dstLength, const char* path) {
return readResource(dst, dstLength, path);
}
#pragma pop
/* 802D574C-802D5778 2D008C 002C+00 1/0 0/0 0/0 .text readNameResource__12JKRFileCacheFPvUlUlPCc
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileCache::readNameResource(void* param_0, u32 param_1, u32 param_2,
char const* param_3) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileCache/readNameResource__12JKRFileCacheFPvUlUlPCc.s"
u32 JKRFileCache::readNameResource(void* dst, u32 dstLength, u32 type, const char* path) {
return readResource(dst, dstLength, type, path);
}
#pragma pop
/* 8039D158-8039D158 0297B8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
+63 -99
View File
@@ -4,35 +4,10 @@
//
#include "JSystem/JKernel/JKRFileFinder.h"
#include "JSystem/JKernel/JKRArchive.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JKRFileFinder {
/* 802D4910 */ ~JKRFileFinder();
};
struct JKRDvdFinder {
/* 802D4770 */ JKRDvdFinder(char const*);
/* 802D47F4 */ ~JKRDvdFinder();
/* 802D4874 */ void findNextFile();
};
struct JKRArchive {
struct SDirEntry {};
/* 802D5AC0 */ void getDirEntry(JKRArchive::SDirEntry*, u32) const;
};
struct JKRArcFinder {
/* 802D4638 */ JKRArcFinder(JKRArchive*, s32, s32);
/* 802D46C4 */ void findNextFile();
/* 802D4958 */ ~JKRArcFinder();
};
//
// Forward References:
//
@@ -44,6 +19,8 @@ extern "C" void __dt__12JKRDvdFinderFv();
extern "C" void findNextFile__12JKRDvdFinderFv();
extern "C" void __dt__13JKRFileFinderFv();
extern "C" void __dt__12JKRArcFinderFv();
extern "C" void* __vt__12JKRDvdFinder;
extern "C" void* __vt__13JKRFileFinder;
//
// External References:
@@ -51,70 +28,56 @@ extern "C" void __dt__12JKRArcFinderFv();
extern "C" void __dl__FPv();
extern "C" void getDirEntry__10JKRArchiveCFPQ210JKRArchive9SDirEntryUl();
extern "C" void DVDOpenDir();
extern "C" void DVDReadDir();
extern "C" bool DVDCloseDir();
//
// Declarations:
//
/* ############################################################################################## */
/* 803CC208-803CC218 029328 0010+00 2/2 0/0 0/0 .data __vt__12JKRDvdFinder */
SECTION_DATA extern void* __vt__12JKRDvdFinder[4] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__12JKRDvdFinderFv,
(void*)findNextFile__12JKRDvdFinderFv,
};
/* 803CC218-803CC228 029338 0010+00 2/2 0/0 0/0 .data __vt__12JKRArcFinder */
SECTION_DATA extern void* __vt__12JKRArcFinder[4] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__12JKRArcFinderFv,
(void*)findNextFile__12JKRArcFinderFv,
};
/* 803CC228-803CC238 029348 0010+00 5/5 0/0 0/0 .data __vt__13JKRFileFinder */
SECTION_DATA extern void* __vt__13JKRFileFinder[4] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__13JKRFileFinderFv,
(void*)NULL,
};
/* 802D4638-802D46C4 2CEF78 008C+00 0/0 1/1 0/0 .text __ct__12JKRArcFinderFP10JKRArchivell */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRArcFinder::JKRArcFinder(JKRArchive* param_0, s32 param_1, s32 param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileFinder/__ct__12JKRArcFinderFP10JKRArchivell.s"
JKRArcFinder::JKRArcFinder(JKRArchive* archive, s32 startIndex, s32 numEntries) : JKRFileFinder() {
mArchive = archive;
mIsAvailable = numEntries > 0;
mStartIndex = startIndex;
mEndIndex = startIndex + numEntries - 1;
mNextIndex = mStartIndex;
findNextFile();
}
#pragma pop
/* 802D46C4-802D4770 2CF004 00AC+00 1/0 0/0 0/0 .text findNextFile__12JKRArcFinderFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRArcFinder::findNextFile() {
nofralloc
#include "asm/JSystem/JKernel/JKRFileFinder/findNextFile__12JKRArcFinderFv.s"
bool JKRArcFinder::findNextFile(void) {
JKRArchive::SDirEntry entry;
if (mIsAvailable) {
mIsAvailable = !(mNextIndex > mEndIndex);
if (mIsAvailable) {
mIsAvailable = mArchive->getDirEntry(&entry, mNextIndex);
mEntryName = entry.name;
mEntryFileIndex = mNextIndex;
mEntryId = entry.other.id;
mEntryTypeFlags = entry.other.flags;
mIsFileOrDirectory = (mEntryTypeFlags >> 1) & 1;
mNextIndex++;
}
}
return mIsAvailable;
}
#pragma pop
/* 802D4770-802D47F4 2CF0B0 0084+00 0/0 1/1 0/0 .text __ct__12JKRDvdFinderFPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRDvdFinder::JKRDvdFinder(char const* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileFinder/__ct__12JKRDvdFinderFPCc.s"
JKRDvdFinder::JKRDvdFinder(const char* directory) : JKRFileFinder() {
mDvdIsOpen = DVDOpenDir(directory, &mDvdDirectory);
mIsAvailable = mDvdIsOpen;
findNextFile();
}
#pragma pop
/* 802D47F4-802D4874 2CF134 0080+00 1/0 0/0 0/0 .text __dt__12JKRDvdFinderFv */
// JKRFileFinder::~JKRFileFinder is not inlined
#ifdef NONMATCHING
JKRDvdFinder::~JKRDvdFinder() {
if (mDvdIsOpen) {
DVDCloseDir(&mDvdDirectory);
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -123,33 +86,34 @@ asm JKRDvdFinder::~JKRDvdFinder() {
#include "asm/JSystem/JKernel/JKRFileFinder/__dt__12JKRDvdFinderFv.s"
}
#pragma pop
#endif
/* 802D4874-802D4910 2CF1B4 009C+00 1/0 0/0 0/0 .text findNextFile__12JKRDvdFinderFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDvdFinder::findNextFile() {
nofralloc
#include "asm/JSystem/JKernel/JKRFileFinder/findNextFile__12JKRDvdFinderFv.s"
}
#pragma pop
bool JKRDvdFinder::findNextFile(void) {
if (mIsAvailable) {
DVDDirectoryEntry directoryEntry;
mIsAvailable = DVDReadDir(&mDvdDirectory, &directoryEntry);
/* 802D4910-802D4958 2CF250 0048+00 1/0 0/0 0/0 .text __dt__13JKRFileFinderFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRFileFinder::~JKRFileFinder() {
nofralloc
#include "asm/JSystem/JKernel/JKRFileFinder/__dt__13JKRFileFinderFv.s"
if (mIsAvailable) {
mIsFileOrDirectory = directoryEntry.is_directory != 0;
mEntryName = directoryEntry.name;
mEntryFileIndex = directoryEntry.entry_number;
mEntryId = 0;
// only matches with enum
// TODO: placeholder
enum EntryTypeFlags {
EntryTypeFlags1 = 1,
EntryTypeFlags2 = 2,
};
mEntryTypeFlags = mIsFileOrDirectory ? EntryTypeFlags2 : EntryTypeFlags1;
}
}
return mIsAvailable;
}
#pragma pop
inline JKRFileFinder::~JKRFileFinder() {}
/* 802D4958-802D49B4 2CF298 005C+00 1/0 0/0 0/0 .text __dt__12JKRArcFinderFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRArcFinder::~JKRArcFinder() {
nofralloc
#include "asm/JSystem/JKernel/JKRFileFinder/__dt__12JKRArcFinderFv.s"
}
#pragma pop
inline JKRArcFinder::~JKRArcFinder() {}
+134 -159
View File
@@ -5,48 +5,8 @@
#include "JSystem/JKernel/JKRFileLoader.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JSUPtrList {
/* 802DBEAC */ ~JSUPtrList();
/* 802DBF14 */ void initiate();
};
struct JSUPtrLink {
/* 802DBDFC */ JSUPtrLink(void*);
/* 802DBE14 */ ~JSUPtrLink();
};
template <typename A0>
struct JSUList {};
/* JSUList<JKRFileLoader> */
struct JSUList__template7 {
/* 802D45E4 */ void func_802D45E4(void* _this);
};
struct JKRFileLoader {
/* 802D40F0 */ JKRFileLoader();
/* 802D4148 */ ~JKRFileLoader();
/* 802D41D4 */ void unmount();
/* 802D4224 */ void getGlbResource(char const*);
/* 802D4270 */ void getGlbResource(char const*, JKRFileLoader*);
/* 802D4308 */ void removeResource(void*, JKRFileLoader*);
/* 802D43A0 */ void detachResource(void*, JKRFileLoader*);
/* 802D4438 */ void findVolume(char const**);
/* 802D44C4 */ void fetchVolumeName(char*, s32, char const*);
static u8 sVolumeList[12];
static u8 sCurrentVolume[4 + 4 /* padding */];
};
struct JKRDisposer {
/* 802D147C */ JKRDisposer();
/* 802D14E4 */ ~JKRDisposer();
};
#include "global.h"
#include "msl_c/string.h"
//
// Forward References:
@@ -81,8 +41,6 @@ extern "C" void initiate__10JSUPtrListFv();
extern "C" void __register_global_object();
extern "C" void _savegpr_29();
extern "C" void _restgpr_29();
extern "C" void strcmp();
extern "C" void strcpy();
extern "C" extern u8 __lower_map[256];
//
@@ -90,121 +48,124 @@ extern "C" extern u8 __lower_map[256];
//
/* ############################################################################################## */
/* 803CC1C8-803CC208 0292E8 003C+04 2/2 0/0 0/0 .data __vt__13JKRFileLoader */
SECTION_DATA extern void* __vt__13JKRFileLoader[15 + 1 /* padding */] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__13JKRFileLoaderFv,
(void*)unmount__13JKRFileLoaderFv,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
/* padding */
NULL,
};
/* 80451418-80451420 000918 0004+04 2/2 3/3 0/0 .sbss sCurrentVolume__13JKRFileLoader */
JKRFileLoader* JKRFileLoader::sCurrentVolume;
/* 80434354-80434360 061074 000C+00 5/5 14/14 0/0 .bss sVolumeList__13JKRFileLoader */
JSUList<JKRFileLoader> JKRFileLoader::sVolumeList;
/* 802D40F0-802D4148 2CEA30 0058+00 0/0 2/2 0/0 .text __ct__13JKRFileLoaderFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRFileLoader::JKRFileLoader() {
nofralloc
#include "asm/JSystem/JKernel/JKRFileLoader/__ct__13JKRFileLoaderFv.s"
}
#pragma pop
/* ############################################################################################## */
/* 80451418-80451420 000918 0004+04 2/2 3/3 0/0 .sbss sCurrentVolume__13JKRFileLoader */
u8 JKRFileLoader::sCurrentVolume[4 + 4 /* padding */];
JKRFileLoader::JKRFileLoader(void)
: mFileLoaderLink(this), mVolumeName(NULL), mVolumeType(0), mMountCount(0) {}
/* 802D4148-802D41D4 2CEA88 008C+00 1/0 2/2 0/0 .text __dt__13JKRFileLoaderFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRFileLoader::~JKRFileLoader() {
nofralloc
#include "asm/JSystem/JKernel/JKRFileLoader/__dt__13JKRFileLoaderFv.s"
JKRFileLoader::~JKRFileLoader() {
if (getCurrentVolume() == this) {
setCurrentVolume(NULL);
}
}
#pragma pop
/* 802D41D4-802D4224 2CEB14 0050+00 1/0 6/0 0/0 .text unmount__13JKRFileLoaderFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileLoader::unmount() {
nofralloc
#include "asm/JSystem/JKernel/JKRFileLoader/unmount__13JKRFileLoaderFv.s"
void JKRFileLoader::unmount(void) {
s32 count = mMountCount;
if (mMountCount != 0) {
count--;
mMountCount = count;
if (count == 0) {
delete this;
}
}
}
#pragma pop
/* 802D4224-802D4270 2CEB64 004C+00 0/0 2/2 0/0 .text getGlbResource__13JKRFileLoaderFPCc
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileLoader::getGlbResource(char const* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileLoader/getGlbResource__13JKRFileLoaderFPCc.s"
void* JKRFileLoader::getGlbResource(const char* name) {
const char* name_reference[1];
name_reference[0] = name;
JKRFileLoader* fileLoader = findVolume(name_reference);
void* resource;
if (fileLoader == NULL) {
resource = NULL;
} else {
resource = fileLoader->getResource(name_reference[0]);
}
return resource;
}
#pragma pop
/* ############################################################################################## */
/* 80434348-80434354 061068 000C+00 1/1 0/0 0/0 .bss @2182 */
static u8 lit_2182[12];
/* 80434354-80434360 061074 000C+00 5/5 14/14 0/0 .bss sVolumeList__13JKRFileLoader */
u8 JKRFileLoader::sVolumeList[12];
/* 802D4270-802D4308 2CEBB0 0098+00 0/0 29/29 1/1 .text
* getGlbResource__13JKRFileLoaderFPCcP13JKRFileLoader */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileLoader::getGlbResource(char const* param_0, JKRFileLoader* param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileLoader/getGlbResource__13JKRFileLoaderFPCcP13JKRFileLoader.s"
void* JKRFileLoader::getGlbResource(const char* name, JKRFileLoader* fileLoader) {
void* resource = NULL;
if (fileLoader) {
return fileLoader->getResource(0, name);
}
JSUList<JKRFileLoader>& volumeList = getVolumeList();
JSUListIterator<JKRFileLoader> iterator;
for (iterator = volumeList.getFirst(); iterator != volumeList.getEnd(); ++iterator) {
resource = iterator->getResource(0, name);
if (resource)
break;
}
return resource;
}
#pragma pop
/* 802D4308-802D43A0 2CEC48 0098+00 0/0 1/1 0/0 .text
* removeResource__13JKRFileLoaderFPvP13JKRFileLoader */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileLoader::removeResource(void* param_0, JKRFileLoader* param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileLoader/removeResource__13JKRFileLoaderFPvP13JKRFileLoader.s"
bool JKRFileLoader::removeResource(void* resource, JKRFileLoader* fileLoader) {
if (fileLoader) {
return fileLoader->removeResource(resource);
}
JSUList<JKRFileLoader>& volumeList = getVolumeList();
JSUListIterator<JKRFileLoader> iterator;
for (iterator = volumeList.getFirst(); iterator != volumeList.getEnd(); ++iterator) {
if (iterator->removeResource(resource)) {
return true;
}
}
return false;
}
#pragma pop
/* 802D43A0-802D4438 2CECE0 0098+00 0/0 2/2 0/0 .text
* detachResource__13JKRFileLoaderFPvP13JKRFileLoader */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileLoader::detachResource(void* param_0, JKRFileLoader* param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileLoader/detachResource__13JKRFileLoaderFPvP13JKRFileLoader.s"
bool JKRFileLoader::detachResource(void* resource, JKRFileLoader* fileLoader) {
if (fileLoader) {
return fileLoader->detachResource(resource);
}
JSUList<JKRFileLoader>& volumeList = getVolumeList();
JSUListIterator<JKRFileLoader> iterator;
for (iterator = volumeList.getFirst(); iterator != volumeList.getEnd(); ++iterator) {
if (iterator->detachResource(resource)) {
return true;
}
}
return false;
}
#pragma pop
/* 802D4438-802D44C4 2CED78 008C+00 1/1 0/0 0/0 .text findVolume__13JKRFileLoaderFPPCc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileLoader::findVolume(char const** param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileLoader/findVolume__13JKRFileLoaderFPPCc.s"
JKRFileLoader* JKRFileLoader::findVolume(const char** volumeName) {
if (*volumeName[0] != '/') {
return getCurrentVolume();
}
char volumeNameBuffer[0x101];
*volumeName = fetchVolumeName(volumeNameBuffer, ARRAY_SIZE(volumeNameBuffer), *volumeName);
JSUList<JKRFileLoader>& volumeList = getVolumeList();
JSUListIterator<JKRFileLoader> iterator;
for (iterator = volumeList.getFirst(); iterator != volumeList.getEnd(); ++iterator) {
if (strcmp(volumeNameBuffer, iterator->mVolumeName) == 0) {
return iterator.getObject();
}
}
return NULL;
}
#pragma pop
/* ############################################################################################## */
/* 8039D150-8039D150 0297B0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
@@ -229,39 +190,53 @@ SECTION_SDATA static u8 rootPath[2 + 6 /* padding */] = {
};
/* 802D44C4-802D45A0 2CEE04 00DC+00 1/1 0/0 0/0 .text fetchVolumeName__13JKRFileLoaderFPclPCc */
// matches, but lbl_804508C0 is accessed through r13
#ifdef NONMATCHING
const char* JKRFileLoader::fetchVolumeName(char* buffer, long bufferSize, const char* path) {
// lbl_803D2D18 = MSL_C.PPCEABI.bare.H::__lower_map
// lbl_8039D150 = JKernel::@stringBase0 "/"
// lbl_804508C0 = JKernel::rootPath$2498 "/"
// lbl_803D2D18 = MSL_C.PPCEABI.bare.H::__lower_map
if (strcmp(path, lbl_8039D150) == 0) {
strcpy(buffer, lbl_804508C0);
return lbl_804508C0;
}
path++;
while (*path != 0 && *path != '/') {
if (1 < bufferSize) {
u8 lower_char;
int ch = (int)*path;
if (ch == -1) {
lower_char = -1;
} else {
lower_char = lbl_803D2D18[ch & 0xFF];
}
*buffer = lower_char;
buffer++;
bufferSize--;
}
path++;
}
*buffer = '\0';
if (*path == '\0') {
path = lbl_804508C0;
}
return path;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRFileLoader::fetchVolumeName(char* param_0, s32 param_1, char const* param_2) {
asm const char* JKRFileLoader::fetchVolumeName(char* param_0, s32 param_1, char const* param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileLoader/fetchVolumeName__13JKRFileLoaderFPclPCc.s"
}
#pragma pop
/* 802D45A0-802D45E4 2CEEE0 0044+00 0/0 1/0 0/0 .text __sinit_JKRFileLoader_cpp */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void __sinit_JKRFileLoader_cpp() {
nofralloc
#include "asm/JSystem/JKernel/JKRFileLoader/__sinit_JKRFileLoader_cpp.s"
}
#pragma pop
#pragma push
#pragma force_active on
REGISTER_CTORS(0x802D45A0, __sinit_JKRFileLoader_cpp);
#pragma pop
/* 802D45E4-802D4638 2CEF24 0054+00 1/1 0/0 0/0 .text __dt__24JSUList<13JKRFileLoader>Fv
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
extern "C" asm void func_802D45E4(void* _this) {
nofralloc
#include "asm/JSystem/JKernel/JKRFileLoader/func_802D45E4.s"
}
#pragma pop
#endif
/* 8039D150-8039D150 0297B0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
+344 -421
View File
@@ -4,87 +4,9 @@
//
#include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/JUtility/JUTException.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JUTException {
/* 802E21FC */ void panic_f(char const*, int, char const*, ...);
};
struct JSUPtrLink {
/* 802DBDFC */ JSUPtrLink(void*);
/* 802DBE14 */ ~JSUPtrLink();
};
struct JSUPtrList {
/* 802DBEAC */ ~JSUPtrList();
/* 802DBF14 */ void initiate();
/* 802DBF4C */ void append(JSUPtrLink*);
/* 802DC15C */ void remove(JSUPtrLink*);
};
struct JKRHeap {
struct TState {};
/* 800065D8 */ bool dump_sort();
/* 802CE138 */ JKRHeap(void*, u32, JKRHeap*, bool);
/* 802CE264 */ ~JKRHeap();
/* 802CE378 */ void initArena(char**, u32*, int);
/* 802CE428 */ void becomeSystemHeap();
/* 802CE438 */ void becomeCurrentHeap();
/* 802CE448 */ void destroy();
/* 802CE4D4 */ void alloc(u32, int);
/* 802CE474 */ void alloc(u32, int, JKRHeap*);
/* 802CE500 */ void free(void*, JKRHeap*);
/* 802CE548 */ void free(void*);
/* 802CE574 */ void callAllDisposer();
/* 802CE5CC */ void freeAll();
/* 802CE5F8 */ void freeTail();
/* 802CE684 */ void resize(void*, u32);
/* 802CE624 */ void resize(void*, u32, JKRHeap*);
/* 802CE700 */ void getSize(void*);
/* 802CE6B0 */ void getSize(void*, JKRHeap*);
/* 802CE72C */ void getFreeSize();
/* 802CE758 */ void getMaxFreeBlock();
/* 802CE784 */ void getTotalFreeSize();
/* 802CE7B0 */ void changeGroupID(u8);
/* 802CE7DC */ void getMaxAllocatableSize(int);
/* 802CE83C */ void findFromRoot(void*);
/* 802CE894 */ void find(void*) const;
/* 802CE93C */ void findAllHeap(void*) const;
/* 802CE9E4 */ void dispose_subroutine(u32, u32);
/* 802CEAA0 */ void dispose(void*, void*);
/* 802CEA78 */ void dispose(void*, u32);
/* 802CEAC0 */ void dispose();
/* 802CEB18 */ void copyMemory(void*, void*, u32);
/* 802CEB78 */ void setErrorFlag(bool);
/* 802CEB88 */ void setErrorHandler(void (*)(void*, u32, int));
/* 802CEBA8 */ void isSubHeap(JKRHeap*) const;
/* 802CED84 */ void state_register(JKRHeap::TState*, u32) const;
/* 802CED88 */ void state_compare(JKRHeap::TState const&, JKRHeap::TState const&) const;
/* 802CEDA0 */ void state_dump(JKRHeap::TState const&) const;
/* 802CEDA4 */ bool do_changeGroupID(u8);
/* 802CEDAC */ bool do_getCurrentGroupId();
static u8 sSystemHeap[4];
static u8 sCurrentHeap[4];
static u8 sRootHeap[4];
static u8 mErrorHandler[4];
static u8 mCodeStart[4];
static u8 mCodeEnd[4];
static u8 mUserRamStart[4];
static u8 mUserRamEnd[4];
static u8 mMemorySize[4];
};
struct JKRDisposer {
/* 802D147C */ JKRDisposer();
/* 802D14E4 */ ~JKRDisposer();
};
#include "global.h"
//
// Forward References:
@@ -120,7 +42,7 @@ extern "C" void dispose__7JKRHeapFPvUl();
extern "C" void dispose__7JKRHeapFPvPv();
extern "C" void dispose__7JKRHeapFv();
extern "C" void copyMemory__7JKRHeapFPvPvUl();
extern "C" static void JKRDefaultMemoryErrorRoutine__FPvUli();
extern "C" void JKRDefaultMemoryErrorRoutine__FPvUli();
extern "C" void setErrorFlag__7JKRHeapFb();
extern "C" void setErrorHandler__7JKRHeapFPFPvUli_v();
extern "C" void isSubHeap__7JKRHeapCFP7JKRHeap();
@@ -162,12 +84,6 @@ extern "C" void initiate__10JSUPtrListFv();
extern "C" void append__10JSUPtrListFP10JSUPtrLink();
extern "C" void remove__10JSUPtrListFP10JSUPtrLink();
extern "C" void panic_f__12JUTExceptionFPCciPCce();
extern "C" void OSInitAlloc();
extern "C" void OSGetArenaHi();
extern "C" void OSGetArenaLo();
extern "C" void OSSetArenaHi();
extern "C" void OSSetArenaLo();
extern "C" void OSInitMutex();
extern "C" void _savegpr_26();
extern "C" void _savegpr_27();
extern "C" void _savegpr_28();
@@ -176,67 +92,91 @@ extern "C" void _restgpr_26();
extern "C" void _restgpr_27();
extern "C" void _restgpr_28();
extern "C" void _restgpr_29();
extern "C" extern u8 data_804508B0[8];
extern "C" extern bool data_804508B0;
extern "C" void* __vt__7JKRHeap;
//
// Declarations:
//
/* ############################################################################################## */
/* 803CBF70-803CBFD0 029090 0060+00 2/2 0/0 0/0 .data __vt__7JKRHeap */
SECTION_DATA extern void* __vt__7JKRHeap[24] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__7JKRHeapFv,
(void*)callAllDisposer__7JKRHeapFv,
(void*)NULL,
(void*)NULL,
(void*)dump_sort__7JKRHeapFv,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)NULL,
(void*)do_changeGroupID__7JKRHeapFUc,
(void*)do_getCurrentGroupId__7JKRHeapFv,
(void*)state_register__7JKRHeapCFPQ27JKRHeap6TStateUl,
(void*)state_compare__7JKRHeapCFRCQ27JKRHeap6TStateRCQ27JKRHeap6TState,
(void*)state_dump__7JKRHeapCFRCQ27JKRHeap6TState,
};
/* 80451370-80451374 000870 0004+00 3/3 44/44 0/0 .sbss sSystemHeap__7JKRHeap */
u8 JKRHeap::sSystemHeap[4];
JKRHeap* JKRHeap::sSystemHeap;
/* 80451374-80451378 000874 0004+00 4/4 23/22 0/0 .sbss sCurrentHeap__7JKRHeap */
u8 JKRHeap::sCurrentHeap[4];
JKRHeap* JKRHeap::sCurrentHeap;
/* 80451378-8045137C 000878 0004+00 3/3 10/10 0/0 .sbss sRootHeap__7JKRHeap */
u8 JKRHeap::sRootHeap[4];
JKRHeap* JKRHeap::sRootHeap;
/* 8045137C-80451380 00087C 0004+00 2/2 3/3 0/0 .sbss mErrorHandler__7JKRHeap */
u8 JKRHeap::mErrorHandler[4];
JKRErrorHandler JKRHeap::mErrorHandler;
/* 80451380-80451384 000880 0004+00 1/1 0/0 0/0 .sbss None */
static u8 data_80451380[4];
static bool data_80451380;
/* 802CE138-802CE264 2C8A78 012C+00 0/0 3/3 0/0 .text __ct__7JKRHeapFPvUlP7JKRHeapb */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRHeap::JKRHeap(void* param_0, u32 param_1, JKRHeap* param_2, bool param_3) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/__ct__7JKRHeapFPvUlP7JKRHeapb.s"
JKRHeap::JKRHeap(void* data, u32 size, JKRHeap* parent, bool errorFlag)
: JKRDisposer(), mChildTree(this), mDisposerList() {
OSInitMutex(&mMutex);
mSize = size;
mStart = (u8*)data;
mEnd = (u8*)data + size;
if (parent == NULL) {
becomeSystemHeap();
becomeCurrentHeap();
} else {
parent->mChildTree.appendChild(&mChildTree);
if (getSystemHeap() == getRootHeap()) {
becomeSystemHeap();
}
if (getCurrentHeap() == getRootHeap()) {
becomeCurrentHeap();
}
}
mErrorFlag = errorFlag;
if ((mErrorFlag == true) && (mErrorHandler == NULL)) {
mErrorHandler = JKRDefaultMemoryErrorRoutine;
}
mDebugFill = data_804508B0;
mCheckMemoryFilled = data_80451380;
mInitFlag = false;
}
#pragma pop
/* 802CE264-802CE378 2C8BA4 0114+00 1/0 3/3 0/0 .text __dt__7JKRHeapFv */
// using the wrong register for storing the results
#ifdef NONMATCHING
JKRHeap::~JKRHeap() {
JSUTree<JKRHeap>* parent = mChildTree.getParent();
parent->removeChild(&mChildTree);
JSUTree<JKRHeap>* nextRootHeap = getRootHeap()->mChildTree.getFirstChild();
JKRHeap* rootHeap = getRootHeap();
JKRHeap* currentHeap = getCurrentHeap();
if (currentHeap == this) {
if (!nextRootHeap) {
currentHeap = rootHeap;
} else {
currentHeap = nextRootHeap->getObject();
}
}
setCurrentHeap(currentHeap);
JKRHeap* systemHeap = getSystemHeap();
if (systemHeap == this) {
if (!nextRootHeap) {
systemHeap = rootHeap;
} else {
systemHeap = nextRootHeap->getObject();
}
}
setSystemHeap(systemHeap);
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -245,102 +185,103 @@ asm JKRHeap::~JKRHeap() {
#include "asm/JSystem/JKernel/JKRHeap/__dt__7JKRHeapFv.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 80451384-80451388 000884 0004+00 1/1 1/1 0/0 .sbss mCodeStart__7JKRHeap */
u8 JKRHeap::mCodeStart[4];
void* JKRHeap::mCodeStart;
/* 80451388-8045138C 000888 0004+00 1/1 1/1 0/0 .sbss mCodeEnd__7JKRHeap */
u8 JKRHeap::mCodeEnd[4];
void* JKRHeap::mCodeEnd;
/* 8045138C-80451390 00088C 0004+00 1/1 1/1 0/0 .sbss mUserRamStart__7JKRHeap */
u8 JKRHeap::mUserRamStart[4];
void* JKRHeap::mUserRamStart;
/* 80451390-80451394 000890 0004+00 1/1 1/1 0/0 .sbss mUserRamEnd__7JKRHeap */
u8 JKRHeap::mUserRamEnd[4];
void* JKRHeap::mUserRamEnd;
/* 80451394-80451398 000894 0004+00 1/1 2/2 0/0 .sbss mMemorySize__7JKRHeap */
u8 JKRHeap::mMemorySize[4];
u32 JKRHeap::mMemorySize;
/* 802CE378-802CE428 2C8CB8 00B0+00 0/0 1/1 0/0 .text initArena__7JKRHeapFPPcPUli */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::initArena(char** param_0, u32* param_1, int param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/initArena__7JKRHeapFPPcPUli.s"
bool JKRHeap::initArena(char** memory, u32* size, int param_3) {
u32 ram_start;
u32 ram_end;
u32 ram;
u32 low = OSGetArenaLo();
u32 high = OSGetArenaHi();
if (low == high)
return false;
ram = OSInitAlloc(low, high, param_3);
ram_start = ALIGN_NEXT(ram, 0x20);
ram_end = ALIGN_PREV(high, 0x20);
GLOBAL_MEMORY* globalMemory = (GLOBAL_MEMORY*)OSPhysicalToCached(0);
mCodeStart = globalMemory;
mCodeEnd = (void*)ram_start;
mUserRamStart = (void*)ram_start;
mUserRamEnd = (void*)ram_end;
mMemorySize = globalMemory->memory_size;
OSSetArenaLo(ram_end);
OSSetArenaHi(ram_end);
*memory = (char*)ram_start;
*size = ram_end - ram_start;
return true;
}
#pragma pop
/* 802CE428-802CE438 2C8D68 0010+00 1/1 0/0 0/0 .text becomeSystemHeap__7JKRHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::becomeSystemHeap() {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/becomeSystemHeap__7JKRHeapFv.s"
JKRHeap* JKRHeap::becomeSystemHeap() {
JKRHeap* prev = JKRHeap::getSystemHeap();
setSystemHeap(this);
return prev;
}
#pragma pop
/* 802CE438-802CE448 2C8D78 0010+00 1/1 22/22 1/1 .text becomeCurrentHeap__7JKRHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::becomeCurrentHeap() {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/becomeCurrentHeap__7JKRHeapFv.s"
JKRHeap* JKRHeap::becomeCurrentHeap() {
JKRHeap* prev = getCurrentHeap();
setCurrentHeap(this);
return prev;
}
#pragma pop
/* 802CE448-802CE474 2C8D88 002C+00 0/0 5/5 1/1 .text destroy__7JKRHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::destroy() {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/destroy__7JKRHeapFv.s"
void JKRHeap::destroy() {
do_destroy();
}
#pragma pop
/* 802CE474-802CE4D4 2C8DB4 0060+00 6/6 23/23 0/0 .text alloc__7JKRHeapFUliP7JKRHeap */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::alloc(u32 param_0, int param_1, JKRHeap* param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/alloc__7JKRHeapFUliP7JKRHeap.s"
void* JKRHeap::alloc(u32 size, int alignment, JKRHeap* heap) {
if (heap != NULL) {
return heap->alloc(size, alignment);
}
if (getCurrentHeap() != NULL) {
return getCurrentHeap()->alloc(size, alignment);
}
return NULL;
}
#pragma pop
/* 802CE4D4-802CE500 2C8E14 002C+00 1/1 30/30 1/1 .text alloc__7JKRHeapFUli */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::alloc(u32 param_0, int param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/alloc__7JKRHeapFUli.s"
void* JKRHeap::alloc(u32 size, int alignment) {
return do_alloc(size, alignment);
}
#pragma pop
/* 802CE500-802CE548 2C8E40 0048+00 2/2 38/38 1/1 .text free__7JKRHeapFPvP7JKRHeap */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::free(void* param_0, JKRHeap* param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/free__7JKRHeapFPvP7JKRHeap.s"
void JKRHeap::free(void* ptr, JKRHeap* heap) {
if (!heap) {
heap = findFromRoot(ptr);
if (!heap)
return;
}
heap->free(ptr);
}
#pragma pop
/* 802CE548-802CE574 2C8E88 002C+00 1/1 29/29 0/0 .text free__7JKRHeapFPv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::free(void* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/free__7JKRHeapFPv.s"
void JKRHeap::free(void* ptr) {
do_free(ptr);
}
#pragma pop
/* 802CE574-802CE5CC 2C8EB4 0058+00 1/0 5/2 0/0 .text callAllDisposer__7JKRHeapFv */
#pragma push
@@ -353,178 +294,200 @@ asm void JKRHeap::callAllDisposer() {
#pragma pop
/* 802CE5CC-802CE5F8 2C8F0C 002C+00 0/0 12/12 0/0 .text freeAll__7JKRHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::freeAll() {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/freeAll__7JKRHeapFv.s"
void JKRHeap::freeAll() {
do_freeAll();
}
#pragma pop
/* 802CE5F8-802CE624 2C8F38 002C+00 0/0 1/1 0/0 .text freeTail__7JKRHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::freeTail() {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/freeTail__7JKRHeapFv.s"
void JKRHeap::freeTail() {
do_freeTail();
}
#pragma pop
/* 802CE624-802CE684 2C8F64 0060+00 0/0 1/1 0/0 .text resize__7JKRHeapFPvUlP7JKRHeap */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::resize(void* param_0, u32 param_1, JKRHeap* param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/resize__7JKRHeapFPvUlP7JKRHeap.s"
s32 JKRHeap::resize(void* ptr, u32 size, JKRHeap* heap) {
if (!heap) {
heap = findFromRoot(ptr);
if (!heap)
return -1;
}
return heap->resize(ptr, size);
}
#pragma pop
/* 802CE684-802CE6B0 2C8FC4 002C+00 1/1 1/1 0/0 .text resize__7JKRHeapFPvUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::resize(void* param_0, u32 param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/resize__7JKRHeapFPvUl.s"
s32 JKRHeap::resize(void* ptr, u32 size) {
return do_resize(ptr, size);
}
#pragma pop
/* 802CE6B0-802CE700 2C8FF0 0050+00 0/0 4/4 0/0 .text getSize__7JKRHeapFPvP7JKRHeap */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::getSize(void* param_0, JKRHeap* param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/getSize__7JKRHeapFPvP7JKRHeap.s"
s32 JKRHeap::getSize(void* ptr, JKRHeap* heap) {
if (!heap) {
heap = findFromRoot(ptr);
if (!heap)
return -1;
}
return heap->getSize(ptr);
}
#pragma pop
/* 802CE700-802CE72C 2C9040 002C+00 1/1 1/1 0/0 .text getSize__7JKRHeapFPv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::getSize(void* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/getSize__7JKRHeapFPv.s"
s32 JKRHeap::getSize(void* ptr) {
return do_getSize(ptr);
}
#pragma pop
/* 802CE72C-802CE758 2C906C 002C+00 1/1 18/18 0/0 .text getFreeSize__7JKRHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::getFreeSize() {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/getFreeSize__7JKRHeapFv.s"
s32 JKRHeap::getFreeSize() {
return do_getFreeSize();
}
#pragma pop
/* 802CE758-802CE784 2C9098 002C+00 1/1 0/0 0/0 .text getMaxFreeBlock__7JKRHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::getMaxFreeBlock() {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/getMaxFreeBlock__7JKRHeapFv.s"
void* JKRHeap::getMaxFreeBlock() {
return do_getMaxFreeBlock();
}
#pragma pop
/* 802CE784-802CE7B0 2C90C4 002C+00 0/0 32/32 0/0 .text getTotalFreeSize__7JKRHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::getTotalFreeSize() {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/getTotalFreeSize__7JKRHeapFv.s"
s32 JKRHeap::getTotalFreeSize() {
return do_getTotalFreeSize();
}
#pragma pop
/* 802CE7B0-802CE7DC 2C90F0 002C+00 0/0 1/1 0/0 .text changeGroupID__7JKRHeapFUc */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::changeGroupID(u8 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/changeGroupID__7JKRHeapFUc.s"
u8 JKRHeap::changeGroupID(u8 param_1) {
return do_changeGroupID(param_1);
}
#pragma pop
/* 802CE7DC-802CE83C 2C911C 0060+00 0/0 2/2 0/0 .text getMaxAllocatableSize__7JKRHeapFi
*/
// "not/nor" instruction in the wrong place
#ifdef NONMATCHING
s32 JKRHeap::getMaxAllocatableSize(int alignment) {
u32 maxFreeBlock = (u32)getMaxFreeBlock();
s32 freeSize = getFreeSize();
u32 mask = alignment - 1U;
s32 ptrOffset = mask & (alignment - (maxFreeBlock & 0xf));
s32 alignedSize = (freeSize - ptrOffset) & ~(alignment - 1U);
return alignedSize;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::getMaxAllocatableSize(int param_0) {
asm u32 JKRHeap::getMaxAllocatableSize(int param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/getMaxAllocatableSize__7JKRHeapFi.s"
}
#pragma pop
#endif
/* 802CE83C-802CE894 2C917C 0058+00 3/3 8/8 0/0 .text findFromRoot__7JKRHeapFPv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::findFromRoot(void* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/findFromRoot__7JKRHeapFPv.s"
JKRHeap* JKRHeap::findFromRoot(void* ptr) {
JKRHeap* rootHeap = getRootHeap();
if (rootHeap == NULL) {
return NULL;
}
if (rootHeap->getStartAddr() <= ptr && ptr < rootHeap->getEndAddr()) {
return rootHeap->find(ptr);
}
return rootHeap->findAllHeap(ptr);
}
#pragma pop
/* 802CE894-802CE93C 2C91D4 00A8+00 1/1 1/1 0/0 .text find__7JKRHeapCFPv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::find(void* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/find__7JKRHeapCFPv.s"
JKRHeap* JKRHeap::find(void* ptr) const {
if (getStartAddr() <= ptr && ptr < getEndAddr()) {
const JSUTree<JKRHeap>& tree = mChildTree;
if (tree.getNumChildren() != 0) {
JSUTreeIterator<JKRHeap> iterator;
for (iterator = tree.getFirstChild(); iterator != tree.getEndChild(); iterator++) {
JKRHeap* child = iterator.getObject();
JKRHeap* result = child->find(ptr);
if (result) {
return result;
}
}
}
// todo: not sure about this... casting away const for now.
return (JKRHeap*)this;
}
return NULL;
}
#pragma pop
/* 802CE93C-802CE9E4 2C927C 00A8+00 1/1 0/0 0/0 .text findAllHeap__7JKRHeapCFPv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::findAllHeap(void* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/findAllHeap__7JKRHeapCFPv.s"
JKRHeap* JKRHeap::findAllHeap(void* ptr) const {
const JSUTree<JKRHeap>& tree = mChildTree;
if (tree.getNumChildren() != 0) {
JSUTreeIterator<JKRHeap> iterator;
for (iterator = tree.getFirstChild(); iterator != tree.getEndChild(); iterator++) {
JKRHeap* child = iterator.getObject();
JKRHeap* result = child->findAllHeap(ptr);
if (result) {
return result;
}
}
}
if (getStartAddr() <= ptr && ptr < getEndAddr()) {
// todo: not sure about this... casting away const for now.
return (JKRHeap*)this;
}
return NULL;
}
#pragma pop
/* 802CE9E4-802CEA78 2C9324 0094+00 2/2 0/0 0/0 .text dispose_subroutine__7JKRHeapFUlUl
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::dispose_subroutine(u32 param_0, u32 param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/dispose_subroutine__7JKRHeapFUlUl.s"
void JKRHeap::dispose_subroutine(u32 begin, u32 end) {
JSUListIterator<JKRDisposer> last_iterator;
JSUListIterator<JKRDisposer> next_iterator;
JSUListIterator<JKRDisposer> iterator;
for (iterator = mDisposerList.getFirst(); iterator != mDisposerList.getEnd();
iterator = next_iterator) {
JKRDisposer* disposer = iterator.getObject();
if ((void*)begin <= disposer && disposer < (void*)end) {
disposer->~JKRDisposer();
if (last_iterator == NULL) {
next_iterator = mDisposerList.getFirst();
} else {
next_iterator = last_iterator;
next_iterator++;
}
} else {
last_iterator = iterator;
next_iterator = iterator;
next_iterator++;
}
}
}
#pragma pop
/* 802CEA78-802CEAA0 2C93B8 0028+00 0/0 1/1 0/0 .text dispose__7JKRHeapFPvUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::dispose(void* param_0, u32 param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/dispose__7JKRHeapFPvUl.s"
bool JKRHeap::dispose(void* ptr, u32 size) {
u32 begin = (u32)ptr;
u32 end = (u32)ptr + size;
dispose_subroutine(begin, end);
return false;
}
#pragma pop
/* 802CEAA0-802CEAC0 2C93E0 0020+00 0/0 1/1 0/0 .text dispose__7JKRHeapFPvPv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::dispose(void* param_0, void* param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/dispose__7JKRHeapFPvPv.s"
void JKRHeap::dispose(void* begin, void* end) {
dispose_subroutine((u32)begin, (u32)end);
}
#pragma pop
/* 802CEAC0-802CEB18 2C9400 0058+00 0/0 3/3 0/0 .text dispose__7JKRHeapFv */
// missing stack variable?
#ifdef NONMATCHING
void JKRHeap::dispose() {
const JSUList<JKRDisposer>& list = mDisposerList;
JSUListIterator<JKRDisposer> iterator;
while (list.getFirst() != list.getEnd()) {
iterator = list.getFirst();
iterator->~JKRDisposer();
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -533,180 +496,140 @@ asm void JKRHeap::dispose() {
#include "asm/JSystem/JKernel/JKRHeap/dispose__7JKRHeapFv.s"
}
#pragma pop
#endif
/* 802CEB18-802CEB40 2C9458 0028+00 0/0 4/4 0/0 .text copyMemory__7JKRHeapFPvPvUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::copyMemory(void* param_0, void* param_1, u32 param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/copyMemory__7JKRHeapFPvPvUl.s"
}
#pragma pop
void JKRHeap::copyMemory(void* dst, void* src, u32 size) {
u32 count = (size + 3) / 4;
/* ############################################################################################## */
/* 8039CAD8-8039CAD8 029138 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039CAD8 = "JKRHeap.cpp";
SECTION_DEAD static char const* const stringBase_8039CAE4 = "%s";
SECTION_DEAD static char const* const stringBase_8039CAE7 = "abort\n";
/* @stringBase0 padding */
SECTION_DEAD static char const* const pad_8039CAEE = "\0";
#pragma pop
u32* dst_32 = (u32*)dst;
u32* src_32 = (u32*)src;
while (count > 0) {
*dst_32 = *src_32;
dst_32++;
src_32++;
count--;
}
}
/* 802CEB40-802CEB78 2C9480 0038+00 2/2 0/0 0/0 .text JKRDefaultMemoryErrorRoutine__FPvUli */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
static asm void JKRDefaultMemoryErrorRoutine(void* param_0, u32 param_1, int param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/JKRDefaultMemoryErrorRoutine__FPvUli.s"
void JKRDefaultMemoryErrorRoutine(void* heap, u32 size, int alignment) {
JUTException::panic_f("JKRHeap.cpp", 0x33f, "%s", "abort\n");
}
#pragma pop
/* 802CEB78-802CEB88 2C94B8 0010+00 0/0 2/2 0/0 .text setErrorFlag__7JKRHeapFb */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::setErrorFlag(bool param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/setErrorFlag__7JKRHeapFb.s"
bool JKRHeap::setErrorFlag(bool errorFlag) {
bool prev = mErrorFlag;
mErrorFlag = errorFlag;
return prev;
}
#pragma pop
/* 802CEB88-802CEBA8 2C94C8 0020+00 0/0 1/1 0/0 .text setErrorHandler__7JKRHeapFPFPvUli_v
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::setErrorHandler(void (*param_0)(void*, u32, int)) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/setErrorHandler__7JKRHeapFPFPvUli_v.s"
JKRErrorHandler JKRHeap::setErrorHandler(JKRErrorHandler errorHandler) {
JKRErrorHandler prev = mErrorHandler;
if (!errorHandler) {
errorHandler = JKRDefaultMemoryErrorRoutine;
}
mErrorHandler = errorHandler;
return prev;
}
#pragma pop
/* 802CEBA8-802CEC4C 2C94E8 00A4+00 0/0 1/1 0/0 .text isSubHeap__7JKRHeapCFP7JKRHeap */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::isSubHeap(JKRHeap* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/isSubHeap__7JKRHeapCFP7JKRHeap.s"
bool JKRHeap::isSubHeap(JKRHeap* heap) const {
if (!heap)
return false;
const JSUTree<JKRHeap>& tree = mChildTree;
if (tree.getNumChildren() != 0) {
JSUTreeIterator<JKRHeap> iterator;
for (iterator = tree.getFirstChild(); iterator != tree.getEndChild(); ++iterator) {
JKRHeap* child = iterator.getObject();
if (child == heap) {
return true;
}
bool is_sub_heap = child->isSubHeap(heap);
if (is_sub_heap) {
return true;
}
}
}
return false;
}
#pragma pop
/* 802CEC4C-802CEC74 2C958C 0028+00 0/0 278/278 377/377 .text __nw__FUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void* operator new(u32 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/__nw__FUl.s"
void* operator new(u32 size) {
return JKRHeap::alloc(size, 4, NULL);
}
#pragma pop
/* 802CEC74-802CEC98 2C95B4 0024+00 0/0 15/15 0/0 .text __nw__FUli */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void* operator new(u32 param_0, int param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/__nw__FUli.s"
void* operator new(u32 size, int alignment) {
return JKRHeap::alloc(size, alignment, NULL);
}
#pragma pop
/* 802CEC98-802CECC4 2C95D8 002C+00 0/0 47/47 0/0 .text __nw__FUlP7JKRHeapi */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void* operator new(u32 param_0, JKRHeap* param_1, int param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/__nw__FUlP7JKRHeapi.s"
void* operator new(u32 size, JKRHeap* heap, int alignment) {
return JKRHeap::alloc(size, alignment, heap);
}
#pragma pop
/* 802CECC4-802CECEC 2C9604 0028+00 0/0 52/52 15/15 .text __nwa__FUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void* operator new[](u32 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/__nwa__FUl.s"
void* operator new[](u32 size) {
return JKRHeap::alloc(size, 4, NULL);
}
#pragma pop
/* 802CECEC-802CED10 2C962C 0024+00 0/0 29/29 0/0 .text __nwa__FUli */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void* operator new[](u32 param_0, int param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/__nwa__FUli.s"
void* operator new[](u32 size, int alignment) {
return JKRHeap::alloc(size, alignment, NULL);
}
#pragma pop
/* 802CED10-802CED3C 2C9650 002C+00 0/0 25/25 0/0 .text __nwa__FUlP7JKRHeapi */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void* operator new[](u32 param_0, JKRHeap* param_1, int param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/__nwa__FUlP7JKRHeapi.s"
void* operator new[](u32 size, JKRHeap* heap, int alignment) {
return JKRHeap::alloc(size, alignment, heap);
}
#pragma pop
/* 802CED3C-802CED60 2C967C 0024+00 1/1 847/847 4665/4665 .text __dl__FPv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void operator delete(void* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/__dl__FPv.s"
void operator delete(void* ptr) {
JKRHeap::free(ptr, NULL);
}
#pragma pop
/* 802CED60-802CED84 2C96A0 0024+00 0/0 20/20 3/3 .text __dla__FPv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void operator delete[](void* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/__dla__FPv.s"
void operator delete[](void* ptr) {
JKRHeap::free(ptr, NULL);
}
#pragma pop
/* 802CED84-802CED88 2C96C4 0004+00 1/0 1/0 0/0 .text
* state_register__7JKRHeapCFPQ27JKRHeap6TStateUl */
void JKRHeap::state_register(JKRHeap::TState* param_0, u32 param_1) const {
/* empty function */
void JKRHeap::state_register(JKRHeap::TState* p, u32 id) const {
JUT_ASSERT(p != 0);
JUT_ASSERT(p->getHeap() == this);
}
/* 802CED88-802CEDA0 2C96C8 0018+00 1/0 1/0 0/0 .text
* state_compare__7JKRHeapCFRCQ27JKRHeap6TStateRCQ27JKRHeap6TState */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRHeap::state_compare(JKRHeap::TState const& param_0,
JKRHeap::TState const& param_1) const {
nofralloc
#include "asm/JSystem/JKernel/JKRHeap/state_compare__7JKRHeapCFRCQ27JKRHeap6TStateRCQ27JKRHeap6TState.s"
bool JKRHeap::state_compare(JKRHeap::TState const& r1, JKRHeap::TState const& r2) const {
JUT_ASSERT(r1.getHeap() == r2.getHeap());
return r1.getCheckCode() == r2.getCheckCode();
}
#pragma pop
/* 802CEDA0-802CEDA4 2C96E0 0004+00 1/0 3/0 0/0 .text state_dump__7JKRHeapCFRCQ27JKRHeap6TState */
void JKRHeap::state_dump(JKRHeap::TState const& param_0) const {
/* empty function */
void JKRHeap::state_dump(JKRHeap::TState const& p) const {
LOGF("check-code : 0x%08x", p.getCheckCode());
LOGF("id : 0x%08x", p.getId());
LOGF("used size : %u", p.getUsedSize());
}
/* 802CEDA4-802CEDAC 2C96E4 0008+00 1/0 1/0 0/0 .text do_changeGroupID__7JKRHeapFUc */
bool JKRHeap::do_changeGroupID(u8 param_0) {
return false;
u8 JKRHeap::do_changeGroupID(u8 param_0) {
return 0;
}
/* 802CEDAC-802CEDB4 2C96EC 0008+00 1/0 1/0 0/0 .text do_getCurrentGroupId__7JKRHeapFv */
bool JKRHeap::do_getCurrentGroupId() {
return false;
u8 JKRHeap::do_getCurrentGroupId() {
return 0;
}
/* 8039CAD8-8039CAD8 029138 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
+272 -159
View File
@@ -4,86 +4,90 @@
//
#include "JSystem/JKernel/JKRMemArchive.h"
#include "JSystem/JKernel/JKRDvdRipper.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/JUtility/JUTException.h"
#include "dol2asm.h"
#include "dolphin/types.h"
#include "msl_c/string.h"
//
// Types:
//
struct JUTException {
/* 802E21FC */ void panic_f(char const*, int, char const*, ...);
};
// struct JUTException {
// /* 802E21FC */ void panic_f(char const*, int, char const*, ...);
// };
struct JSUPtrLink {};
// struct JSUPtrLink {};
struct JSUPtrList {
/* 802DBFF0 */ void prepend(JSUPtrLink*);
/* 802DC15C */ void remove(JSUPtrLink*);
};
// struct JSUPtrList {
// /* 802DBFF0 */ void prepend(JSUPtrLink*);
// /* 802DC15C */ void remove(JSUPtrLink*);
// };
struct JKRMemBreakFlag {};
// struct JKRMemBreakFlag {};
struct JKRArchive {
struct EMountDirection {};
// struct JKRArchive {
// struct EMountDirection {};
struct SDIFileEntry {};
// struct SDIFileEntry {};
struct EMountMode {};
// struct EMountMode {};
/* 802D5A38 */ void becomeCurrent(char const*);
/* 802D5C64 */ void getResource(u32, char const*);
/* 802D5BE8 */ void getResource(char const*);
/* 802D5D8C */ void readResource(void*, u32, u32, char const*);
/* 802D5E30 */ void readResource(void*, u32, char const*);
/* 802D609C */ void detachResource(void*);
/* 802D60D8 */ void getResSize(void const*) const;
/* 802D6150 */ void countFile(char const*) const;
/* 802D61B0 */ void getFirstFile(char const*) const;
/* 802D6294 */ JKRArchive(s32, JKRArchive::EMountMode);
/* 802D6334 */ ~JKRArchive();
/* 802D6734 */ void findPtrResource(void const*) const;
/* 802D693C */ void setExpandSize(JKRArchive::SDIFileEntry*, u32);
/* 802D6978 */ void getExpandSize(JKRArchive::SDIFileEntry*) const;
};
// /* 802D5A38 */ void becomeCurrent(char const*);
// /* 802D5C64 */ void getResource(u32, char const*);
// /* 802D5BE8 */ void getResource(char const*);
// /* 802D5D8C */ void readResource(void*, u32, u32, char const*);
// /* 802D5E30 */ void readResource(void*, u32, char const*);
// /* 802D609C */ void detachResource(void*);
// /* 802D60D8 */ void getResSize(void const*) const;
// /* 802D6150 */ void countFile(char const*) const;
// /* 802D61B0 */ void getFirstFile(char const*) const;
// /* 802D6294 */ JKRArchive(s32, JKRArchive::EMountMode);
// /* 802D6334 */ ~JKRArchive();
// /* 802D6734 */ void findPtrResource(void const*) const;
// /* 802D693C */ void setExpandSize(JKRArchive::SDIFileEntry*, u32);
// /* 802D6978 */ void getExpandSize(JKRArchive::SDIFileEntry*) const;
// };
struct JKRMemArchive {
/* 802D6A6C */ JKRMemArchive(void*, u32, JKRMemBreakFlag);
/* 802D69B8 */ JKRMemArchive(s32, JKRArchive::EMountDirection);
/* 802D6B24 */ ~JKRMemArchive();
/* 802D6BCC */ void open(s32, JKRArchive::EMountDirection);
/* 802D6D30 */ void open(void*, u32, JKRMemBreakFlag);
/* 802D6E10 */ void fetchResource(void*, u32, JKRArchive::SDIFileEntry*, u32*);
/* 802D6DDC */ void fetchResource(JKRArchive::SDIFileEntry*, u32*);
/* 802D6ED0 */ void removeResourceAll();
/* 802D6F20 */ void removeResource(void*);
/* 802D6F5C */ void fetchResource_subroutine(u8*, u32, u8*, u32, int);
/* 802D7030 */ void getExpandedResSize(void const*) const;
};
// struct JKRMemArchive {
// /* 802D6A6C */ JKRMemArchive(void*, u32, JKRMemBreakFlag);
// /* 802D69B8 */ JKRMemArchive(s32, JKRArchive::EMountDirection);
// /* 802D6B24 */ ~JKRMemArchive();
// /* 802D6BCC */ void open(s32, JKRArchive::EMountDirection);
// /* 802D6D30 */ void open(void*, u32, JKRMemBreakFlag);
// /* 802D6E10 */ void fetchResource(void*, u32, JKRArchive::SDIFileEntry*, u32*);
// /* 802D6DDC */ void fetchResource(JKRArchive::SDIFileEntry*, u32*);
// /* 802D6ED0 */ void removeResourceAll();
// /* 802D6F20 */ void removeResource(void*);
// /* 802D6F5C */ void fetchResource_subroutine(u8*, u32, u8*, u32, int);
// /* 802D7030 */ void getExpandedResSize(void const*) const;
// };
struct JKRHeap {
/* 802CE500 */ void free(void*, JKRHeap*);
/* 802CE83C */ void findFromRoot(void*);
};
// struct JKRHeap {
// /* 802CE500 */ void free(void*, JKRHeap*);
// /* 802CE83C */ void findFromRoot(void*);
// };
struct JKRFileLoader {
/* 802D41D4 */ void unmount();
// struct JKRFileLoader {
// /* 802D41D4 */ void unmount();
static u8 sVolumeList[12];
};
// static u8 sVolumeList[12];
// };
struct JKRExpandSwitch {};
// struct JKRExpandSwitch {};
struct JKRDvdRipper {
struct EAllocDirection {};
// struct JKRDvdRipper {
// struct EAllocDirection {};
/* 802D9C54 */ void loadToMainRAM(s32, u8*, JKRExpandSwitch, u32, JKRHeap*,
JKRDvdRipper::EAllocDirection, u32, int*, u32*);
};
// /* 802D9C54 */ void loadToMainRAM(s32, u8*, JKRExpandSwitch, u32, JKRHeap*,
// JKRDvdRipper::EAllocDirection, u32, int*, u32*);
// };
struct JKRDecomp {
/* 802DB988 */ void orderSync(u8*, u8*, u32, u32);
};
// struct JKRDecomp {
// /* 802DB988 */ void orderSync(u8*, u8*, u32, u32);
// };
//
// Forward References:
@@ -106,7 +110,6 @@ extern "C" extern char const* const JKRMemArchive__stringBase0;
// External References:
//
SECTION_INIT void memcpy();
extern "C" void free__7JKRHeapFPvP7JKRHeap();
extern "C" void findFromRoot__7JKRHeapFPv();
extern "C" void __dl__FPv();
@@ -142,160 +145,270 @@ extern "C" u8 sVolumeList__13JKRFileLoader[12];
// Declarations:
//
/* ############################################################################################## */
/* 803CC2D8-803CC328 0293F8 0050+00 3/3 0/0 0/0 .data __vt__13JKRMemArchive */
SECTION_DATA extern void* __vt__13JKRMemArchive[20] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__13JKRMemArchiveFv,
(void*)unmount__13JKRFileLoaderFv,
(void*)becomeCurrent__10JKRArchiveFPCc,
(void*)getResource__10JKRArchiveFPCc,
(void*)getResource__10JKRArchiveFUlPCc,
(void*)readResource__10JKRArchiveFPvUlPCc,
(void*)readResource__10JKRArchiveFPvUlUlPCc,
(void*)removeResourceAll__13JKRMemArchiveFv,
(void*)removeResource__13JKRMemArchiveFPv,
(void*)detachResource__10JKRArchiveFPv,
(void*)getResSize__10JKRArchiveCFPCv,
(void*)countFile__10JKRArchiveCFPCc,
(void*)getFirstFile__10JKRArchiveCFPCc,
(void*)getExpandedResSize__13JKRMemArchiveCFPCv,
(void*)fetchResource__13JKRMemArchiveFPQ210JKRArchive12SDIFileEntryPUl,
(void*)fetchResource__13JKRMemArchiveFPvUlPQ210JKRArchive12SDIFileEntryPUl,
(void*)setExpandSize__10JKRArchiveFPQ210JKRArchive12SDIFileEntryUl,
(void*)getExpandSize__10JKRArchiveCFPQ210JKRArchive12SDIFileEntry,
};
/* 802D69B8-802D6A6C 2D12F8 00B4+00 0/0 2/2 0/0 .text
* __ct__13JKRMemArchiveFlQ210JKRArchive15EMountDirection */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRMemArchive::JKRMemArchive(s32 param_0, JKRArchive::EMountDirection param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRMemArchive/__ct__13JKRMemArchiveFlQ210JKRArchive15EMountDirection.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;
}
#pragma pop
/* 802D6A6C-802D6B24 2D13AC 00B8+00 0/0 2/2 0/0 .text __ct__13JKRMemArchiveFPvUl15JKRMemBreakFlag
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRMemArchive::JKRMemArchive(void* param_0, u32 param_1, JKRMemBreakFlag param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRMemArchive/__ct__13JKRMemArchiveFPvUl15JKRMemBreakFlag.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;
}
#pragma pop
/* 802D6B24-802D6BCC 2D1464 00A8+00 1/0 0/0 0/0 .text __dt__13JKRMemArchiveFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRMemArchive::~JKRMemArchive() {
nofralloc
#include "asm/JSystem/JKernel/JKRMemArchive/__dt__13JKRMemArchiveFv.s"
JKRMemArchive::~JKRMemArchive() {
if (mIsMounted == true) {
if (mIsOpen) {
if (mArcHeader)
JKRFreeToHeap(mHeap, mArcHeader);
}
getVolumeList().remove(&mFileLoaderLink);
mIsMounted = false;
}
}
#pragma pop
/* 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;
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
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRMemArchive::open(s32 param_0, JKRArchive::EMountDirection param_1) {
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 = (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
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRMemArchive::open(void* param_0, u32 param_1, JKRMemBreakFlag param_2) {
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 */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRMemArchive::fetchResource(JKRArchive::SDIFileEntry* param_0, u32* param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRMemArchive/fetchResource__13JKRMemArchiveFPQ210JKRArchive12SDIFileEntryPUl.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;
}
#pragma pop
/* 802D6E10-802D6ED0 2D1750 00C0+00 1/0 0/0 0/0 .text
* fetchResource__13JKRMemArchiveFPvUlPQ210JKRArchive12SDIFileEntryPUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRMemArchive::fetchResource(void* param_0, u32 param_1, JKRArchive::SDIFileEntry* param_2,
u32* param_3) {
nofralloc
#include "asm/JSystem/JKernel/JKRMemArchive/fetchResource__13JKRMemArchiveFPvUlPQ210JKRArchive12SDIFileEntryPUl.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 = JKRConvertAttrToCompressionType(fileEntry->getAttr());
void* data = mArchiveData + fileEntry->data_offset;
srcLength =
fetchResource_subroutine((u8*)data, srcLength, (u8*)buffer, bufferSize, compression);
}
if (resourceSize) {
*resourceSize = srcLength;
}
return buffer;
}
#pragma pop
/* 802D6ED0-802D6F20 2D1810 0050+00 1/0 0/0 0/0 .text removeResourceAll__13JKRMemArchiveFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRMemArchive::removeResourceAll() {
nofralloc
#include "asm/JSystem/JKernel/JKRMemArchive/removeResourceAll__13JKRMemArchiveFv.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;
}
}
}
#pragma pop
/* 802D6F20-802D6F5C 2D1860 003C+00 1/0 0/0 0/0 .text removeResource__13JKRMemArchiveFPv
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRMemArchive::removeResource(void* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRMemArchive/removeResource__13JKRMemArchiveFPv.s"
bool JKRMemArchive::removeResource(void* resource) {
ASSERT(isMounted());
SDIFileEntry* fileEntry = findPtrResource(resource);
if (!fileEntry)
return false;
fileEntry->data = NULL;
return true;
}
#pragma pop
/* ############################################################################################## */
/* 8039D160-8039D160 0297C0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039D160 = "JKRMemArchive.cpp";
SECTION_DEAD static char const* const stringBase_8039D172 = "%s";
SECTION_DEAD static char const* const stringBase_8039D175 = "??? bad sequence\n";
/* @stringBase0 padding */
SECTION_DEAD static char const* const pad_8039D187 = "";
#pragma pop
// #pragma push
// #pragma force_active on
// SECTION_DEAD static char const* const stringBase_8039D160 = "JKRMemArchive.cpp";
// SECTION_DEAD static char const* const stringBase_8039D172 = "%s";
// SECTION_DEAD static char const* const stringBase_8039D175 = "??? bad sequence\n";
// /* @stringBase0 padding */
// SECTION_DEAD static char const* const pad_8039D187 = "";
// #pragma pop
/* 802D6F5C-802D7030 2D189C 00D4+00 1/1 1/1 0/0 .text
* fetchResource_subroutine__13JKRMemArchiveFPUcUlPUcUli */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRMemArchive::fetchResource_subroutine(u8* param_0, u32 param_1, u8* param_2, u32 param_3,
int param_4) {
nofralloc
#include "asm/JSystem/JKernel/JKRMemArchive/fetchResource_subroutine__13JKRMemArchiveFPUcUlPUcUli.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((SArcHeader*)src);
srcLength = expendedSize;
if (expendedSize > dstLength) {
srcLength = dstLength;
}
JKRDecompress(src, dst, srcLength, 0);
return srcLength;
default: {
JUTException::panic_f("JKRMemArchive.cpp", 0x2d3, "%s", "??? bad sequence\n");
} break;
}
return 0;
}
#pragma pop
/* 802D7030-802D70C0 2D1970 0090+00 1/0 0/0 0/0 .text getExpandedResSize__13JKRMemArchiveCFPCv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRMemArchive::getExpandedResSize(void const* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRMemArchive/getExpandedResSize__13JKRMemArchiveCFPCv.s"
u32 JKRMemArchive::getExpandedResSize(const void* resource) const {
SDIFileEntry* fileEntry = findPtrResource(resource);
if (fileEntry == NULL)
return -1;
if (fileEntry->isCompressed() == false) {
return getResSize(resource);
} else {
return JKRDecompExpandSize((SArcHeader*)resource);
}
}
#pragma pop
/* 8039D160-8039D160 0297C0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
+225 -267
View File
@@ -5,59 +5,7 @@
#include "JSystem/JKernel/JKRSolidHeap.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JKRHeap {
struct TState {};
/* 800065D8 */ bool dump_sort();
/* 802CE138 */ JKRHeap(void*, u32, JKRHeap*, bool);
/* 802CE264 */ ~JKRHeap();
/* 802CE474 */ void alloc(u32, int, JKRHeap*);
/* 802CE500 */ void free(void*, JKRHeap*);
/* 802CE574 */ void callAllDisposer();
/* 802CE684 */ void resize(void*, u32);
/* 802CE72C */ void getFreeSize();
/* 802CE784 */ void getTotalFreeSize();
/* 802CE7DC */ void getMaxAllocatableSize(int);
/* 802CEAA0 */ void dispose(void*, void*);
/* 802CEAC0 */ void dispose();
/* 802CEDA0 */ void state_dump(JKRHeap::TState const&) const;
/* 802CEDA4 */ bool do_changeGroupID(u8);
/* 802CEDAC */ bool do_getCurrentGroupId();
static u8 sRootHeap[4];
static u8 mErrorHandler[4];
};
struct JKRSolidHeap {
/* 802D0A24 */ void create(u32, JKRHeap*, bool);
/* 802D0AD0 */ void do_destroy();
/* 802D0B30 */ JKRSolidHeap(void*, u32, JKRHeap*, bool);
/* 802D0B8C */ ~JKRSolidHeap();
/* 802D0BF4 */ void adjustSize();
/* 802D0CB0 */ void do_alloc(u32, int);
/* 802D0D58 */ void allocFromHead(u32, int);
/* 802D0E20 */ void allocFromTail(u32, int);
/* 802D0EE4 */ void do_free(void*);
/* 802D0F14 */ void do_freeAll();
/* 802D0F74 */ void do_freeTail();
/* 802D1000 */ void do_fillFreeArea();
/* 802D1004 */ void do_resize(void*, u32);
/* 802D1038 */ void do_getSize(void*);
/* 802D106C */ void check();
/* 802D10FC */ void dump();
/* 802D11FC */ void state_register(JKRHeap::TState*, u32) const;
/* 802D1258 */ void state_compare(JKRHeap::TState const&, JKRHeap::TState const&) const;
/* 802D1288 */ void getHeapType();
/* 802D1294 */ void do_getFreeSize();
/* 802D129C */ void do_getMaxFreeBlock();
/* 802D12A4 */ void do_getTotalFreeSize();
};
#include "global.h"
//
// Forward References:
@@ -107,10 +55,8 @@ 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();
extern "C" void JUTWarningConsole_f();
extern "C" void OSLockMutex();
extern "C" void OSUnlockMutex();
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();
@@ -124,94 +70,119 @@ extern "C" u8 mErrorHandler__7JKRHeap[4];
/* 802D0A24-802D0AD0 2CB364 00AC+00 0/0 4/4 1/1 .text create__12JKRSolidHeapFUlP7JKRHeapb
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::create(u32 param_0, JKRHeap* param_1, bool param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/create__12JKRSolidHeapFUlP7JKRHeapb.s"
JKRSolidHeap* JKRSolidHeap::create(u32 size, JKRHeap* heap, bool useErrorHandler) {
if (!heap) {
heap = getRootHeap();
}
if (size == 0xffffffff) {
size = heap->getMaxAllocatableSize(0x10);
}
u32 alignedSize = ALIGN_PREV(size, 0x10);
u32 solidHeapSize = ALIGN_NEXT(sizeof(JKRSolidHeap), 0x10);
if (alignedSize < solidHeapSize)
return NULL;
JKRSolidHeap* solidHeap = (JKRSolidHeap*)JKRAllocFromHeap(heap, alignedSize, 0x10);
void* dataPtr = (u8*)solidHeap + solidHeapSize;
if (!solidHeap)
return NULL;
solidHeap =
new (solidHeap) JKRSolidHeap(dataPtr, alignedSize - solidHeapSize, heap, useErrorHandler);
return solidHeap;
}
#pragma pop
/* 802D0AD0-802D0B30 2CB410 0060+00 1/0 0/0 0/0 .text do_destroy__12JKRSolidHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::do_destroy() {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/do_destroy__12JKRSolidHeapFv.s"
void JKRSolidHeap::do_destroy(void) {
JKRHeap* parent = getParent();
if (parent) {
this->~JKRSolidHeap();
JKRFreeToHeap(parent, this);
}
}
#pragma pop
/* ############################################################################################## */
/* 803CC030-803CC090 029150 0060+00 2/2 0/0 0/0 .data __vt__12JKRSolidHeap */
SECTION_DATA extern void* __vt__12JKRSolidHeap[24] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__12JKRSolidHeapFv,
(void*)callAllDisposer__7JKRHeapFv,
(void*)getHeapType__12JKRSolidHeapFv,
(void*)check__12JKRSolidHeapFv,
(void*)dump_sort__7JKRHeapFv,
(void*)dump__12JKRSolidHeapFv,
(void*)do_destroy__12JKRSolidHeapFv,
(void*)do_alloc__12JKRSolidHeapFUli,
(void*)do_free__12JKRSolidHeapFPv,
(void*)do_freeAll__12JKRSolidHeapFv,
(void*)do_freeTail__12JKRSolidHeapFv,
(void*)do_fillFreeArea__12JKRSolidHeapFv,
(void*)do_resize__12JKRSolidHeapFPvUl,
(void*)do_getSize__12JKRSolidHeapFPv,
(void*)do_getFreeSize__12JKRSolidHeapFv,
(void*)do_getMaxFreeBlock__12JKRSolidHeapFv,
(void*)do_getTotalFreeSize__12JKRSolidHeapFv,
(void*)do_changeGroupID__7JKRHeapFUc,
(void*)do_getCurrentGroupId__7JKRHeapFv,
(void*)state_register__12JKRSolidHeapCFPQ27JKRHeap6TStateUl,
(void*)state_compare__12JKRSolidHeapCFRCQ27JKRHeap6TStateRCQ27JKRHeap6TState,
(void*)state_dump__7JKRHeapCFRCQ27JKRHeap6TState,
};
/* 802D0B30-802D0B8C 2CB470 005C+00 1/1 0/0 0/0 .text __ct__12JKRSolidHeapFPvUlP7JKRHeapb
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRSolidHeap::JKRSolidHeap(void* param_0, u32 param_1, JKRHeap* param_2, bool param_3) {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/__ct__12JKRSolidHeapFPvUlP7JKRHeapb.s"
JKRSolidHeap::JKRSolidHeap(void* start, u32 size, JKRHeap* parent, bool useErrorHandler)
: JKRHeap(start, size, parent, useErrorHandler) {
mFreeSize = mSize;
mSolidHead = (u8*)mStart;
mSolidTail = (u8*)mEnd;
field_0x78 = NULL;
}
#pragma pop
/* 802D0B8C-802D0BF4 2CB4CC 0068+00 1/0 0/0 0/0 .text __dt__12JKRSolidHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRSolidHeap::~JKRSolidHeap() {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/__dt__12JKRSolidHeapFv.s"
JKRSolidHeap::~JKRSolidHeap(void) {
dispose();
}
#pragma pop
/* 802D0BF4-802D0CB0 2CB534 00BC+00 0/0 5/5 1/1 .text adjustSize__12JKRSolidHeapFv */
#ifdef NONMATCHING
s32 JKRSolidHeap::adjustSize(void) {
JKRHeap* parent = getParent();
if (parent) {
lock();
s32 start = mStart;
s32 newSize = (s32)this->mSolidHead - ALIGN_NEXT(start, 0x20);
s32 newSizeThis = newSize + (start - (s32)this);
s32 actualSize = parent->resize(this, newSizeThis);
if (actualSize != -1) {
mFreeSize = 0;
mSize = newSize;
mEnd = mStart + mSize;
mSolidHead = (void*)mEnd;
mSolidTail = (void*)mEnd;
}
unlock();
return newSizeThis;
}
return -1;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::adjustSize() {
asm s32 JKRSolidHeap::adjustSize() {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/adjustSize__12JKRSolidHeapFv.s"
}
#pragma pop
#endif
/* 802D0CB0-802D0D58 2CB5F0 00A8+00 1/0 0/0 0/0 .text do_alloc__12JKRSolidHeapFUli */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::do_alloc(u32 param_0, int param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/do_alloc__12JKRSolidHeapFUli.s"
void* JKRSolidHeap::do_alloc(u32 size, int alignment) {
if (alignment != 0) {
JUT_ASSERT(abs(alignment));
JUT_ASSERT(isPower2(alignment));
}
lock();
if (size < 4) {
size = 4;
}
void* ptr;
if (alignment >= 0) {
ptr = allocFromHead(size, alignment < 4 ? 4 : alignment);
} else {
if (-alignment < 4) {
alignment = 4;
} else {
alignment = -alignment;
}
ptr = allocFromTail(size, alignment);
}
unlock();
return ptr;
}
#pragma pop
/* ############################################################################################## */
/* 8039CE50-8039CE50 0294B0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
@@ -223,14 +194,41 @@ SECTION_DEAD static char const* const stringBase_8039CE50 =
/* 802D0D58-802D0E20 2CB698 00C8+00 1/1 0/0 0/0 .text allocFromHead__12JKRSolidHeapFUli
*/
#ifdef NONMATCHING
void* JKRSolidHeap::allocFromHead(u32 size, int alignment) {
void* ptr;
u32 offset;
u32 alignedSize;
u32 alignedStart;
u32 totalSize;
alignedSize = ALIGN_NEXT(size, 0x4);
ptr = NULL;
alignedStart = (alignment - 1 + (u32)mSolidHead) & ~(alignment - 1);
offset = alignedStart - (u32)mSolidHead;
totalSize = alignedSize + offset;
if (totalSize <= mFreeSize) {
ptr = (void*)alignedStart;
mSolidHead += totalSize;
mFreeSize -= totalSize;
} else {
JUTWarningConsole_f("allocFromHead: cannot alloc memory (0x%x byte).\n", totalSize);
if (getErrorFlag() == true) {
callErrorHandler(this, alignedSize, alignment);
}
}
return ptr;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::allocFromHead(u32 param_0, int param_1) {
asm void* JKRSolidHeap::allocFromHead(u32 param_0, int param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/allocFromHead__12JKRSolidHeapFUli.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 8039CE50-8039CE50 0294B0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
@@ -245,146 +243,120 @@ SECTION_DEAD static char const* const stringBase_8039CE81 =
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::allocFromTail(u32 param_0, int param_1) {
asm void* JKRSolidHeap::allocFromTail(u32 param_0, int param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/allocFromTail__12JKRSolidHeapFUli.s"
}
#pragma pop
/* ############################################################################################## */
/* 8039CE50-8039CE50 0294B0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039CEB2 =
"free: cannot free memory block (%08x)\n";
#pragma pop
/* 802D0EE4-802D0F14 2CB824 0030+00 1/0 0/0 0/0 .text do_free__12JKRSolidHeapFPv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::do_free(void* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/do_free__12JKRSolidHeapFPv.s"
void JKRSolidHeap::do_free(void* ptr) {
JUTWarningConsole_f("free: cannot free memory block (%08x)\n", ptr);
}
#pragma pop
/* 802D0F14-802D0F74 2CB854 0060+00 1/0 0/0 0/0 .text do_freeAll__12JKRSolidHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::do_freeAll() {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/do_freeAll__12JKRSolidHeapFv.s"
void JKRSolidHeap::do_freeAll(void) {
lock();
this->JKRHeap::callAllDisposer();
mFreeSize = mSize;
mSolidHead = (u8*)mStart;
mSolidTail = (u8*)mEnd;
field_0x78 = NULL;
unlock();
}
#pragma pop
/* 802D0F74-802D1000 2CB8B4 008C+00 1/0 0/0 0/0 .text do_freeTail__12JKRSolidHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::do_freeTail() {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/do_freeTail__12JKRSolidHeapFv.s"
void JKRSolidHeap::do_freeTail(void) {
lock();
if (mSolidTail != mEnd) {
dispose(mSolidTail, mEnd);
}
this->mFreeSize = ((u32)mEnd - (u32)mSolidTail + mFreeSize);
this->mSolidTail = mEnd;
JKRSolidHeap::Unknown* unknown = field_0x78;
while (unknown) {
unknown->field_0xc = mEnd;
unknown = unknown->mNext;
}
unlock();
}
#pragma pop
/* 802D1000-802D1004 2CB940 0004+00 1/0 0/0 0/0 .text do_fillFreeArea__12JKRSolidHeapFv
*/
void JKRSolidHeap::do_fillFreeArea() {
/* empty function */
#if DEBUG
fillMemory(mSolidHead, mEnd - mSolidHead, (uint)DAT_8074a8ba);
#endif
}
/* ############################################################################################## */
/* 8039CE50-8039CE50 0294B0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039CED9 =
"resize: cannot resize memory block (%08x: %d)\n";
#pragma pop
/* 802D1004-802D1038 2CB944 0034+00 1/0 0/0 0/0 .text do_resize__12JKRSolidHeapFPvUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::do_resize(void* param_0, u32 param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/do_resize__12JKRSolidHeapFPvUl.s"
s32 JKRSolidHeap::do_resize(void* ptr, u32 newSize) {
JUTWarningConsole_f("resize: cannot resize memory block (%08x: %d)\n", ptr, newSize);
return -1;
}
#pragma pop
/* ############################################################################################## */
/* 8039CE50-8039CE50 0294B0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039CF08 =
"getSize: cannot get memory block size (%08x)\n";
#pragma pop
/* 802D1038-802D106C 2CB978 0034+00 1/0 0/0 0/0 .text do_getSize__12JKRSolidHeapFPv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::do_getSize(void* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/do_getSize__12JKRSolidHeapFPv.s"
s32 JKRSolidHeap::do_getSize(void* ptr) {
JUTWarningConsole_f("getSize: cannot get memory block size (%08x)\n", ptr);
return -1;
}
#pragma pop
/* ############################################################################################## */
/* 8039CE50-8039CE50 0294B0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039CF36 =
"check: bad total memory block size (%08X, %08X)\n";
#pragma pop
/* 802D106C-802D10FC 2CB9AC 0090+00 1/0 0/0 0/0 .text check__12JKRSolidHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::check() {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/check__12JKRSolidHeapFv.s"
bool JKRSolidHeap::check(void) {
lock();
bool result = true;
u32 calculatedSize =
((u32)mSolidHead - (u32)mStart) + mFreeSize + ((u32)mEnd - (u32)mSolidTail);
u32 availableSize = mSize;
if (calculatedSize != availableSize) {
result = false;
JUTWarningConsole_f("check: bad total memory block size (%08X, %08X)\n", availableSize,
calculatedSize);
}
unlock();
return result;
}
#pragma pop
/* ############################################################################################## */
/* 8039CE50-8039CE50 0294B0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039CF67 = "head %08x: %08x\n";
SECTION_DEAD static char const* const stringBase_8039CF78 = "tail %08x: %08x\n";
SECTION_DEAD static char const* const stringBase_8039CF89 = "%d / %d bytes (%6.2f%%) used\n";
/* @stringBase0 padding */
SECTION_DEAD static char const* const pad_8039CFA7 = "";
#pragma pop
/* 80455FA8-80455FB0 0045A8 0004+04 1/1 0/0 0/0 .sdata2 @693 */
SECTION_SDATA2 static f32 lit_693[1 + 1 /* padding */] = {
100.0f,
/* padding */
0.0f,
};
/* 80455FB0-80455FB8 0045B0 0008+00 1/1 0/0 0/0 .sdata2 @695 */
SECTION_SDATA2 static f64 lit_695 = 4503601774854144.0 /* cast s32 to float */;
/* 80455FB8-80455FC0 0045B8 0008+00 1/1 0/0 0/0 .sdata2 @697 */
SECTION_SDATA2 static f64 lit_697 = 4503599627370496.0 /* cast u32 to float */;
/* 802D10FC-802D11FC 2CBA3C 0100+00 1/0 0/0 0/0 .text dump__12JKRSolidHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::dump() {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/dump__12JKRSolidHeapFv.s"
}
#pragma pop
bool JKRSolidHeap::dump(void) {
bool result = check();
lock();
u32 headSize = ((u32)mSolidHead - (u32)mStart);
u32 tailSize = ((u32)mEnd - (u32)mSolidTail);
s32 htSize = headSize + tailSize;
JUTReportConsole_f("head %08x: %08x\n", mStart, headSize);
JUTReportConsole_f("tail %08x: %08x\n", mSolidTail, ((u32)mEnd - (u32)mSolidTail));
u32 totalSize = mSize;
float percentage = (float)htSize / (float)totalSize * 100.0f;
JUTReportConsole_f("%d / %d bytes (%6.2f%%) used\n", htSize, totalSize, percentage);
unlock();
return result;
}
/* 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 {
JUT_ASSERT(p != 0);
JUT_ASSERT(p->getHeap() == this);
getState_(p);
setState_u32ID_(p, id);
setState_uUsedSize_(p, getUsedSize());
setState_u32CheckCode_(p, (u32)mSolidHead + (u32)mSolidTail * 3);
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -393,57 +365,43 @@ asm void JKRSolidHeap::state_register(JKRHeap::TState* param_0, u32 param_1) con
#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 */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::state_compare(JKRHeap::TState const& param_0,
JKRHeap::TState const& param_1) const {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/state_compare__12JKRSolidHeapCFRCQ27JKRHeap6TStateRCQ27JKRHeap6TState.s"
bool JKRSolidHeap::state_compare(JKRHeap::TState const& r1, JKRHeap::TState const& r2) const {
JUT_ASSERT(r1.getHeap() == r2.getHeap());
bool result = true;
if (r1.getCheckCode() != r2.getCheckCode()) {
result = false;
}
if (r1.getUsedSize() != r2.getUsedSize()) {
result = false;
}
return result;
}
#pragma pop
/* 802D1288-802D1294 2CBBC8 000C+00 1/0 0/0 0/0 .text getHeapType__12JKRSolidHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::getHeapType() {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/getHeapType__12JKRSolidHeapFv.s"
u32 JKRSolidHeap::getHeapType(void) {
return 'SLID';
}
#pragma pop
/* 802D1294-802D129C 2CBBD4 0008+00 1/0 0/0 0/0 .text do_getFreeSize__12JKRSolidHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::do_getFreeSize() {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/do_getFreeSize__12JKRSolidHeapFv.s"
s32 JKRSolidHeap::do_getFreeSize(void) {
return mFreeSize;
}
#pragma pop
/* 802D129C-802D12A4 2CBBDC 0008+00 1/0 0/0 0/0 .text do_getMaxFreeBlock__12JKRSolidHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::do_getMaxFreeBlock() {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/do_getMaxFreeBlock__12JKRSolidHeapFv.s"
void* JKRSolidHeap::do_getMaxFreeBlock(void) {
return mSolidHead;
}
#pragma pop
/* 802D12A4-802D12C4 2CBBE4 0020+00 1/0 0/0 0/0 .text do_getTotalFreeSize__12JKRSolidHeapFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRSolidHeap::do_getTotalFreeSize() {
nofralloc
#include "asm/JSystem/JKernel/JKRSolidHeap/do_getTotalFreeSize__12JKRSolidHeapFv.s"
s32 JKRSolidHeap::do_getTotalFreeSize(void) {
return getFreeSize();
}
#pragma pop
/* 8039CE50-8039CE50 0294B0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
+97 -213
View File
@@ -4,6 +4,7 @@
//
#include "JSystem/JKernel/JKRThread.h"
#include "JSystem/JKernel/JKRExpHeap.h"
#include "dol2asm.h"
#include "dolphin/types.h"
@@ -11,93 +12,12 @@
// Types:
//
struct OSThread {};
struct JUTConsole {
/* 802E75EC */ void clear();
/* 802E7BB8 */ void print_f(char const*, ...);
/* 802E7C38 */ void print(char const*);
};
struct JSUPtrLink {
/* 802DBDFC */ JSUPtrLink(void*);
/* 802DBE14 */ ~JSUPtrLink();
};
struct JSUPtrList {
/* 802DBE74 */ JSUPtrList(bool);
/* 802DBEAC */ ~JSUPtrList();
/* 802DBF14 */ void initiate();
/* 802DBF4C */ void append(JSUPtrLink*);
/* 802DC15C */ void remove(JSUPtrLink*);
};
template <typename A0>
struct JSUList {};
/* JSUList<JKRTask> */
struct JSUList__template3 {
/* 802D1EFC */ void func_802D1EFC(void* _this);
};
/* JSUList<JKRThread> */
struct JSUList__template4 {
/* 802D1F50 */ void func_802D1F50(void* _this);
};
struct JKRHeap {
/* 802CE438 */ void becomeCurrentHeap();
/* 802CE474 */ void alloc(u32, int, JKRHeap*);
/* 802CE500 */ void free(void*, JKRHeap*);
/* 802CE83C */ void findFromRoot(void*);
/* 802CEBA8 */ void isSubHeap(JKRHeap*) const;
static u8 sSystemHeap[4];
static u8 sCurrentHeap[4];
static u8 sRootHeap[4];
};
struct JKRThread {
/* 802D1568 */ JKRThread(u32, int, int);
/* 802D16B8 */ JKRThread(OSThread*, int);
/* 802D1610 */ JKRThread(JKRHeap*, u32, int, int);
/* 802D1758 */ ~JKRThread();
/* 802D1830 */ void setCommon_mesgQueue(JKRHeap*, int);
/* 802D18A4 */ void setCommon_heapSpecified(JKRHeap*, u32, int);
/* 802D1934 */ void start(void*);
/* 802D1960 */ void searchThread(OSThread*);
/* 802D1E14 */ bool run();
static u8 sThreadList[12];
};
struct JKRThreadName_ {};
struct JKRThreadSwitch {
/* 802D199C */ JKRThreadSwitch(JKRHeap*);
/* 802D1A14 */ void createManager(JKRHeap*);
/* 802D1A70 */ void enter(JKRThread*, int);
/* 802D1AE4 */ void callback(OSThread*, OSThread*);
/* 802D1C74 */ void draw(JKRThreadName_*, JUTConsole*);
/* 802D1E1C */ void draw(JKRThreadName_*);
/* 802D1E4C */ ~JKRThreadSwitch();
static u8 sManager[4];
static u8 sTotalCount[4];
static u8 sTotalStart[4];
static u8 mUserPreCallback[4];
static u8 mUserPostCallback[4];
};
struct JKRTask {
static u8 sTaskList[12];
static u8 sEndMesgQueue[32];
};
struct JKRDisposer {
/* 802D147C */ JKRDisposer();
/* 802D14E4 */ ~JKRDisposer();
};
//
// Forward References:
//
@@ -155,13 +75,6 @@ extern "C" void clear__10JUTConsoleFv();
extern "C" void print_f__10JUTConsoleFPCce();
extern "C" void print__10JUTConsoleFPCc();
extern "C" void JUTWarningConsole();
extern "C" void OSInitMessageQueue();
extern "C" void OSSetSwitchThreadCallback();
extern "C" void OSIsThreadTerminated();
extern "C" void OSCreateThread();
extern "C" void OSCancelThread();
extern "C" void OSDetachThread();
extern "C" void OSGetTick();
extern "C" void __register_global_object();
extern "C" void __cvt_fp2unsigned();
extern "C" void _savegpr_25();
@@ -177,120 +90,124 @@ extern "C" void sprintf();
extern "C" u8 sSystemHeap__7JKRHeap[4];
extern "C" u8 sCurrentHeap__7JKRHeap[4];
extern "C" u8 sRootHeap__7JKRHeap[4];
extern "C" void* __vt__15JKRThreadSwitch;
//
// Declarations:
//
/* ############################################################################################## */
/* 803CC100-803CC114 029220 0014+00 2/2 0/0 0/0 .data __vt__15JKRThreadSwitch */
SECTION_DATA extern void* __vt__15JKRThreadSwitch[5] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)draw__15JKRThreadSwitchFP14JKRThreadName_P10JUTConsole,
(void*)draw__15JKRThreadSwitchFP14JKRThreadName_,
(void*)__dt__15JKRThreadSwitchFv,
};
/* 803CC114-803CC128 029234 0010+04 4/4 0/0 0/0 .data __vt__9JKRThread */
SECTION_DATA extern void* __vt__9JKRThread[4 + 1 /* padding */] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__9JKRThreadFv,
(void*)run__9JKRThreadFv,
/* padding */
NULL,
};
/* 802D1568-802D1610 2CBEA8 00A8+00 0/0 4/4 0/0 .text __ct__9JKRThreadFUlii */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRThread::JKRThread(u32 param_0, int param_1, int param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRThread/__ct__9JKRThreadFUlii.s"
JKRThread::JKRThread(u32 stack_size, int message_count, int param_3) : mThreadListLink(this) {
mSwitchCount = 0;
mCost = 0;
field_0x6c = 0;
field_0x60 = 0;
field_0x70 = 0;
JKRHeap* heap = JKRHeap::findFromRoot(this);
if (heap == NULL) {
heap = JKRHeap::getSystemHeap();
}
setCommon_heapSpecified(heap, stack_size, param_3);
setCommon_mesgQueue(mHeap, message_count);
}
#pragma pop
/* 802D1610-802D16B8 2CBF50 00A8+00 0/0 2/2 0/0 .text __ct__9JKRThreadFP7JKRHeapUlii */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRThread::JKRThread(JKRHeap* param_0, u32 param_1, int param_2, int param_3) {
nofralloc
#include "asm/JSystem/JKernel/JKRThread/__ct__9JKRThreadFP7JKRHeapUlii.s"
JKRThread::JKRThread(JKRHeap* heap, u32 stack_size, int message_count, int param_4)
: mThreadListLink(this) {
mSwitchCount = 0;
mCost = 0;
field_0x6c = 0;
field_0x60 = 0;
field_0x70 = 0;
if (heap == NULL) {
heap = JKRHeap::getCurrentHeap();
}
setCommon_heapSpecified(heap, stack_size, param_4);
setCommon_mesgQueue(mHeap, message_count);
}
#pragma pop
/* 802D16B8-802D1758 2CBFF8 00A0+00 0/0 5/5 0/0 .text __ct__9JKRThreadFP8OSThreadi */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRThread::JKRThread(OSThread* param_0, int param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRThread/__ct__9JKRThreadFP8OSThreadi.s"
}
#pragma pop
JKRThread::JKRThread(OSThread* thread, int message_count) : mThreadListLink(this) {
mSwitchCount = 0;
mCost = 0;
field_0x6c = 0;
field_0x60 = 0;
field_0x70 = 0;
mHeap = NULL;
mThreadRecord = thread;
mStackSize = (u32)thread->stack_end - (u32)thread->stack_base;
mStackMemory = thread->stack_base;
/* ############################################################################################## */
/* 80434280-8043428C 060FA0 000C+00 1/1 0/0 0/0 .bss @481 */
static u8 lit_481[12];
setCommon_mesgQueue(JKRHeap::getSystemHeap(), message_count);
}
/* 8043428C-80434298 060FAC 000C+00 5/6 0/0 0/0 .bss sThreadList__9JKRThread */
u8 JKRThread::sThreadList[12];
JSUList<JKRThread> JKRThread::sThreadList(0);
/* 802D1758-802D1830 2CC098 00D8+00 1/0 9/9 0/0 .text __dt__9JKRThreadFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRThread::~JKRThread() {
nofralloc
#include "asm/JSystem/JKernel/JKRThread/__dt__9JKRThreadFv.s"
JKRThread::~JKRThread() {
getList().remove(&mThreadListLink);
if (mHeap) {
BOOL result = OSIsThreadTerminated(mThreadRecord);
if (result == FALSE) {
OSDetachThread(mThreadRecord);
OSCancelThread(mThreadRecord);
}
JKRFreeToHeap(mHeap, mStackMemory);
JKRFreeToHeap(mHeap, mThreadRecord);
}
JKRFree(mMessages);
}
#pragma pop
/* 802D1830-802D18A4 2CC170 0074+00 3/3 0/0 0/0 .text setCommon_mesgQueue__9JKRThreadFP7JKRHeapi
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRThread::setCommon_mesgQueue(JKRHeap* param_0, int param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRThread/setCommon_mesgQueue__9JKRThreadFP7JKRHeapi.s"
void JKRThread::setCommon_mesgQueue(JKRHeap* heap, int message_count) {
mMessageCount = message_count;
mMessages = (OSMessage*)JKRHeap::alloc(mMessageCount * sizeof(OSMessage), 0, heap);
OSInitMessageQueue(&mMessageQueue, mMessages, mMessageCount);
getList().append(&mThreadListLink);
mCurrentHeap = NULL;
mCurrentHeapError = NULL;
}
#pragma pop
/* 802D18A4-802D1934 2CC1E4 0090+00 2/2 0/0 0/0 .text
* setCommon_heapSpecified__9JKRThreadFP7JKRHeapUli */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRThread::setCommon_heapSpecified(JKRHeap* param_0, u32 param_1, int param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRThread/setCommon_heapSpecified__9JKRThreadFP7JKRHeapUli.s"
void JKRThread::setCommon_heapSpecified(JKRHeap* heap, u32 stack_size, int param_3) {
mHeap = heap;
mStackSize = stack_size & 0xffffffe0;
mStackMemory = JKRAllocFromHeap(mHeap, mStackSize, 0x20);
mThreadRecord = (OSThread*)JKRAllocFromHeap(mHeap, sizeof(OSThread), 0x20);
void* stackBase = (void*)((int)mStackMemory + mStackSize);
OSCreateThread(mThreadRecord, start, this, stackBase, mStackSize, param_3, 1);
}
#pragma pop
/* 802D1934-802D1960 2CC274 002C+00 1/1 0/0 0/0 .text start__9JKRThreadFPv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRThread::start(void* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRThread/start__9JKRThreadFPv.s"
void* JKRThread::start(void* param) {
JKRThread* thread = (JKRThread*)param;
return thread->run();
}
#pragma pop
/* 802D1960-802D199C 2CC2A0 003C+00 1/1 0/0 0/0 .text searchThread__9JKRThreadFP8OSThread
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRThread::searchThread(OSThread* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRThread/searchThread__9JKRThreadFP8OSThread.s"
JKRThread* JKRThread::searchThread(OSThread* thread) {
JSUList<JKRThread>& threadList = getList();
JSUListIterator<JKRThread> iterator;
for (iterator = threadList.getFirst(); iterator != threadList.getEnd(); ++iterator) {
if (iterator->getThreadRecord() == thread) {
return iterator.getObject();
}
}
return NULL;
}
#pragma pop
/* ############################################################################################## */
/* 804513B0-804513B4 0008B0 0004+00 2/2 1/1 0/0 .sbss sManager__15JKRThreadSwitch */
@@ -321,7 +238,7 @@ asm JKRThreadSwitch::JKRThreadSwitch(JKRHeap* param_0) {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRThreadSwitch::createManager(JKRHeap* param_0) {
asm JKRThreadSwitch* JKRThreadSwitch::createManager(JKRHeap* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRThread/createManager__15JKRThreadSwitchFP7JKRHeap.s"
}
@@ -331,7 +248,7 @@ asm void JKRThreadSwitch::createManager(JKRHeap* param_0) {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRThreadSwitch::enter(JKRThread* param_0, int param_1) {
asm JKRThread* JKRThreadSwitch::enter(JKRThread* param_0, int param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRThread/enter__15JKRThreadSwitchFP9JKRThreadi.s"
}
@@ -394,6 +311,7 @@ SECTION_SDATA2 static f64 lit_937 = 4503599627370496.0 /* cast u32 to float */;
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
#pragma force_active on
asm void JKRThreadSwitch::draw(JKRThreadName_* param_0, JUTConsole* param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRThread/draw__15JKRThreadSwitchFP14JKRThreadName_P10JUTConsole.s"
@@ -401,14 +319,15 @@ asm void JKRThreadSwitch::draw(JKRThreadName_* param_0, JUTConsole* param_1) {
#pragma pop
/* 802D1E14-802D1E1C 2CC754 0008+00 1/0 0/0 0/0 .text run__9JKRThreadFv */
bool JKRThread::run() {
return false;
void* JKRThread::run() {
return NULL;
}
/* 802D1E1C-802D1E4C 2CC75C 0030+00 1/0 0/0 0/0 .text draw__15JKRThreadSwitchFP14JKRThreadName_ */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
#pragma force_active on
asm void JKRThreadSwitch::draw(JKRThreadName_* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRThread/draw__15JKRThreadSwitchFP14JKRThreadName_.s"
@@ -427,50 +346,15 @@ asm JKRThreadSwitch::~JKRThreadSwitch() {
/* ############################################################################################## */
/* 80434298-804342A4 060FB8 000C+00 0/1 0/0 0/0 .bss @989 */
#pragma push
#pragma force_active on
static u8 lit_989[12];
#pragma pop
// #pragma push
// #pragma force_active on
// static u8 lit_989[12];
// #pragma pop
/* 804342A4-804342B0 060FC4 000C+00 0/1 0/0 0/0 .bss sTaskList__7JKRTask */
#pragma push
#pragma force_active on
u8 JKRTask::sTaskList[12];
#pragma pop
/* 802D1E94-802D1EFC 2CC7D4 0068+00 0/0 1/0 0/0 .text __sinit_JKRThread_cpp */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void __sinit_JKRThread_cpp() {
nofralloc
#include "asm/JSystem/JKernel/JKRThread/__sinit_JKRThread_cpp.s"
}
#pragma pop
#pragma push
#pragma force_active on
REGISTER_CTORS(0x802D1E94, __sinit_JKRThread_cpp);
#pragma pop
/* 802D1EFC-802D1F50 2CC83C 0054+00 1/1 0/0 0/0 .text __dt__17JSUList<7JKRTask>Fv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
extern "C" asm void func_802D1EFC(void* _this) {
nofralloc
#include "asm/JSystem/JKernel/JKRThread/func_802D1EFC.s"
}
#pragma pop
/* 802D1F50-802D1FA4 2CC890 0054+00 1/1 0/0 0/0 .text __dt__19JSUList<9JKRThread>Fv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
extern "C" asm void func_802D1F50(void* _this) {
nofralloc
#include "asm/JSystem/JKernel/JKRThread/func_802D1F50.s"
}
JSUList<JKRTask> JKRTask::sTaskList;
#pragma pop
/* ############################################################################################## */
+3 -25
View File
@@ -7,28 +7,6 @@
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JSUStreamSeekFrom {};
struct JSURandomInputStream {
/* 802D4094 */ void getAvailable() const;
/* 802DC3FC */ void skip(s32);
};
struct JKRFile {};
struct JSUFileInputStream {
/* 802DADD8 */ ~JSUFileInputStream();
/* 802DC638 */ JSUFileInputStream(JKRFile*);
/* 802DC67C */ void readData(void*, s32);
/* 802DC74C */ void seekPos(s32, JSUStreamSeekFrom);
/* 802DC82C */ void getLength() const;
/* 802DC85C */ void getPosition() const;
};
//
// Forward References:
//
@@ -89,7 +67,7 @@ asm JSUFileInputStream::JSUFileInputStream(JKRFile* param_0) {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUFileInputStream::readData(void* param_0, s32 param_1) {
asm s32 JSUFileInputStream::readData(void* param_0, s32 param_1) {
nofralloc
#include "asm/JSystem/JSupport/JSUFileStream/readData__18JSUFileInputStreamFPvl.s"
}
@@ -111,7 +89,7 @@ asm void JSUFileInputStream::seekPos(s32 param_0, JSUStreamSeekFrom param_1) {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUFileInputStream::getLength() const {
asm s32 JSUFileInputStream::getLength() const {
nofralloc
#include "asm/JSystem/JSupport/JSUFileStream/getLength__18JSUFileInputStreamCFv.s"
}
@@ -121,7 +99,7 @@ asm void JSUFileInputStream::getLength() const {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUFileInputStream::getPosition() const {
asm s32 JSUFileInputStream::getPosition() const {
nofralloc
#include "asm/JSystem/JSupport/JSUFileStream/getPosition__18JSUFileInputStreamCFv.s"
}
+3 -19
View File
@@ -4,6 +4,7 @@
//
#include "JSystem/JSupport/JSUInputStream.h"
#include "JSystem/JSupport/JSURandomInputStream.h"
#include "dol2asm.h"
#include "dolphin/types.h"
@@ -11,23 +12,6 @@
// Types:
//
struct JSUStreamSeekFrom {};
struct JSURandomInputStream {
/* 80255328 */ ~JSURandomInputStream();
/* 802D4094 */ void getAvailable() const;
/* 802DC370 */ void align(s32);
/* 802DC3FC */ void skip(s32);
/* 802DC458 */ void peek(void*, s32);
/* 802DC4DC */ void seek(s32, JSUStreamSeekFrom);
};
struct JSUInputStream {
/* 802DC23C */ ~JSUInputStream();
/* 802DC298 */ void read(void*, s32);
/* 802DC2F0 */ void skip(s32);
};
//
// Forward References:
//
@@ -107,7 +91,7 @@ asm void JSUInputStream::read(void* param_0, s32 param_1) {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUInputStream::skip(s32 param_0) {
asm s32 JSUInputStream::skip(s32 param_0) {
nofralloc
#include "asm/JSystem/JSupport/JSUInputStream/skip__14JSUInputStreamFl.s"
}
@@ -127,7 +111,7 @@ asm void JSURandomInputStream::align(s32 param_0) {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSURandomInputStream::skip(s32 param_0) {
asm s32 JSURandomInputStream::skip(s32 param_0) {
nofralloc
#include "asm/JSystem/JSupport/JSUInputStream/skip__20JSURandomInputStreamFl.s"
}
+137 -142
View File
@@ -7,163 +7,158 @@
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JSUPtrLink {
/* 802DBDFC */ JSUPtrLink(void*);
/* 802DBE14 */ ~JSUPtrLink();
};
struct JSUPtrList {
/* 802DBE74 */ JSUPtrList(bool);
/* 802DBEAC */ ~JSUPtrList();
/* 802DBF14 */ void initiate();
/* 802DBF28 */ void setFirst(JSUPtrLink*);
/* 802DBF4C */ void append(JSUPtrLink*);
/* 802DBFF0 */ void prepend(JSUPtrLink*);
/* 802DC094 */ void insert(JSUPtrLink*, JSUPtrLink*);
/* 802DC15C */ void remove(JSUPtrLink*);
/* 802DC20C */ void getNthLink(u32) const;
};
//
// Forward References:
//
extern "C" void __ct__10JSUPtrLinkFPv();
extern "C" void __dt__10JSUPtrLinkFv();
extern "C" void __ct__10JSUPtrListFb();
extern "C" void __dt__10JSUPtrListFv();
extern "C" void initiate__10JSUPtrListFv();
extern "C" void setFirst__10JSUPtrListFP10JSUPtrLink();
extern "C" void append__10JSUPtrListFP10JSUPtrLink();
extern "C" void prepend__10JSUPtrListFP10JSUPtrLink();
extern "C" void insert__10JSUPtrListFP10JSUPtrLinkP10JSUPtrLink();
extern "C" void remove__10JSUPtrListFP10JSUPtrLink();
extern "C" void getNthLink__10JSUPtrListCFUl();
//
// External References:
//
extern "C" void __dl__FPv();
extern "C" void _savegpr_29();
extern "C" void _restgpr_29();
//
// Declarations:
//
/* 802DBDFC-802DBE14 2D673C 0018+00 0/0 34/34 0/0 .text __ct__10JSUPtrLinkFPv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JSUPtrLink::JSUPtrLink(void* param_0) {
nofralloc
#include "asm/JSystem/JSupport/JSUList/__ct__10JSUPtrLinkFPv.s"
JSUPtrLink::JSUPtrLink(void* object) {
this->mList = NULL;
this->mObject = object;
this->mPrev = NULL;
this->mNext = NULL;
}
#pragma pop
/* 802DBE14-802DBE74 2D6754 0060+00 0/0 27/27 0/0 .text __dt__10JSUPtrLinkFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JSUPtrLink::~JSUPtrLink() {
nofralloc
#include "asm/JSystem/JSupport/JSUList/__dt__10JSUPtrLinkFv.s"
JSUPtrLink::~JSUPtrLink() {
if (this->mList != NULL) {
this->mList->remove(this);
}
}
#pragma pop
/* 802DBE74-802DBEAC 2D67B4 0038+00 0/0 4/4 0/0 .text __ct__10JSUPtrListFb */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JSUPtrList::JSUPtrList(bool param_0) {
nofralloc
#include "asm/JSystem/JSupport/JSUList/__ct__10JSUPtrListFb.s"
JSUPtrList::JSUPtrList(bool init) {
if (init) {
this->initiate();
}
}
#pragma pop
/* 802DBEAC-802DBF14 2D67EC 0068+00 0/0 25/25 0/0 .text __dt__10JSUPtrListFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JSUPtrList::~JSUPtrList() {
nofralloc
#include "asm/JSystem/JSupport/JSUList/__dt__10JSUPtrListFv.s"
JSUPtrList::~JSUPtrList() {
JSUPtrLink* node = this->mHead;
s32 removed = 0;
while (this->mLength > removed) {
node->mList = NULL;
node = node->getNext();
removed += 1;
}
}
#pragma pop
/* 802DBF14-802DBF28 2D6854 0014+00 1/1 27/27 0/0 .text initiate__10JSUPtrListFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUPtrList::initiate() {
nofralloc
#include "asm/JSystem/JSupport/JSUList/initiate__10JSUPtrListFv.s"
void JSUPtrList::initiate() {
this->mHead = NULL;
this->mTail = NULL;
this->mLength = 0;
}
#pragma pop
/* 802DBF28-802DBF4C 2D6868 0024+00 2/2 0/0 0/0 .text setFirst__10JSUPtrListFP10JSUPtrLink */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUPtrList::setFirst(JSUPtrLink* param_0) {
nofralloc
#include "asm/JSystem/JSupport/JSUList/setFirst__10JSUPtrListFP10JSUPtrLink.s"
void JSUPtrList::setFirst(JSUPtrLink* first) {
first->mList = this;
first->mPrev = NULL;
first->mNext = NULL;
this->mTail = first;
this->mHead = first;
this->mLength = 1;
}
#pragma pop
/* 802DBF4C-802DBFF0 2D688C 00A4+00 1/1 29/29 0/0 .text append__10JSUPtrListFP10JSUPtrLink */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUPtrList::append(JSUPtrLink* param_0) {
nofralloc
#include "asm/JSystem/JSupport/JSUList/append__10JSUPtrListFP10JSUPtrLink.s"
}
#pragma pop
bool JSUPtrList::append(JSUPtrLink* ptr) {
JSUPtrList* list = ptr->mList;
bool result = (NULL == list);
if (!result) {
result = list->remove(ptr);
}
/* 802DBFF0-802DC094 2D6930 00A4+00 1/1 8/8 0/0 .text prepend__10JSUPtrListFP10JSUPtrLink
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUPtrList::prepend(JSUPtrLink* param_0) {
nofralloc
#include "asm/JSystem/JSupport/JSUList/prepend__10JSUPtrListFP10JSUPtrLink.s"
}
#pragma pop
if (result) {
if (this->mLength == 0) {
this->setFirst(ptr);
} else {
ptr->mList = this;
ptr->mPrev = this->mTail;
ptr->mNext = NULL;
this->mTail->mNext = ptr;
this->mTail = ptr;
this->mLength++;
}
}
/* 802DC094-802DC15C 2D69D4 00C8+00 0/0 4/4 0/0 .text
* insert__10JSUPtrListFP10JSUPtrLinkP10JSUPtrLink */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUPtrList::insert(JSUPtrLink* param_0, JSUPtrLink* param_1) {
nofralloc
#include "asm/JSystem/JSupport/JSUList/insert__10JSUPtrListFP10JSUPtrLinkP10JSUPtrLink.s"
return result;
}
#pragma pop
/* 802DC15C-802DC20C 2D6A9C 00B0+00 4/4 31/31 0/0 .text remove__10JSUPtrListFP10JSUPtrLink */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUPtrList::remove(JSUPtrLink* param_0) {
nofralloc
#include "asm/JSystem/JSupport/JSUList/remove__10JSUPtrListFP10JSUPtrLink.s"
}
#pragma pop
bool JSUPtrList::prepend(JSUPtrLink* ptr) {
JSUPtrList* list = ptr->mList;
bool result = (NULL == list);
if (!result) {
result = list->remove(ptr);
}
/* 802DC20C-802DC23C 2D6B4C 0030+00 0/0 3/3 0/0 .text getNthLink__10JSUPtrListCFUl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUPtrList::getNthLink(u32 param_0) const {
nofralloc
#include "asm/JSystem/JSupport/JSUList/getNthLink__10JSUPtrListCFUl.s"
if (result) {
if (this->mLength == 0) {
this->setFirst(ptr);
} else {
ptr->mList = this;
ptr->mPrev = NULL;
ptr->mNext = this->mHead;
this->mHead->mPrev = ptr;
this->mHead = ptr;
this->mLength++;
}
}
return result;
}
#pragma pop
bool JSUPtrList::insert(JSUPtrLink* before, JSUPtrLink* ptr) {
if (before == this->mHead) {
return this->prepend(ptr);
} else if (before == NULL) {
return this->append(ptr);
}
if (before->mList != this) {
return false;
}
bool result = (NULL == ptr->mList);
if (!result) {
result = ptr->mList->remove(ptr);
}
if (result) {
JSUPtrLink* prev = before->mPrev;
ptr->mList = this;
ptr->mPrev = prev;
ptr->mNext = before;
prev->mNext = ptr;
before->mPrev = ptr;
this->mLength++;
}
return result;
}
bool JSUPtrList::remove(JSUPtrLink* ptr) {
bool is_parent = (ptr->mList == this);
if (is_parent) {
if (this->mLength == 1) {
this->mHead = NULL;
this->mTail = NULL;
} else if (ptr == this->mHead) {
ptr->mNext->mPrev = NULL;
this->mHead = ptr->mNext;
} else if (ptr == this->mTail) {
ptr->mPrev->mNext = NULL;
this->mTail = ptr->mPrev;
} else {
ptr->mPrev->mNext = ptr->mNext;
ptr->mNext->mPrev = ptr->mPrev;
}
ptr->mList = NULL;
this->mLength--;
}
return is_parent;
}
JSUPtrLink* JSUPtrList::getNthLink(u32 index) const {
if (index >= this->mLength) {
return NULL;
}
JSUPtrLink* node = this->mHead;
for (u32 i = 0; i < index; i++) {
node = node->getNext();
}
return node;
}
-9
View File
@@ -31,15 +31,6 @@ struct JUTDbPrint {
static u8 sDebugPrint[4 + 4 /* padding */];
};
struct JUTAssertion {
/* 802E495C */ void create();
/* 802E4960 */ void flush_subroutine();
/* 802E499C */ void flushMessage();
/* 802E4A54 */ void flushMessage_dbPrint();
/* 802E4C34 */ void setVisible(bool);
/* 802E4C3C */ void setMessageCount(int);
};
//
// Forward References:
//
-78
View File
@@ -11,14 +11,6 @@
// Types:
//
struct __va_list_struct {};
struct _GXRenderModeObj {};
struct _GXGamma {};
struct OSContext {};
struct JUTGamePad {
struct EPadPort {};
@@ -28,61 +20,6 @@ struct JUTGamePad {
/* 802E0C6C */ void checkResetCallback(s64);
};
struct JUTExternalFB {
/* 802E40CC */ JUTExternalFB(_GXRenderModeObj*, _GXGamma, void*, u32);
};
struct JUTDirectPrint {
/* 802E456C */ void changeFrameBuffer(void*, u16, u16);
};
struct JUTException {
struct EInfoPage {};
/* 802E1D5C */ JUTException(JUTDirectPrint*);
/* 802E1E40 */ void create(JUTDirectPrint*);
/* 802E1EA8 */ void run();
/* 802E1FCC */ void errorHandler(u16, OSContext*, u32, u32);
/* 802E20C0 */ void panic_f_va(char const*, int, char const*, __va_list_struct*);
/* 802E21FC */ void panic_f(char const*, int, char const*, ...);
/* 802E227C */ void setFPException(u32);
/* 802E22C4 */ void showFloatSub(int, f32);
/* 802E2454 */ void showFloat(OSContext*);
/* 802E2578 */ void searchPartialModule(u32, u32*, u32*, u32*, u32*);
/* 802E26B0 */ void showStack(OSContext*);
/* 802E27B0 */ void showMainInfo(u16, OSContext*, u32, u32);
/* 802E2A84 */ void showGPR(OSContext*);
/* 802E2B44 */ void showMapInfo_subroutine(u32, bool);
/* 802E2CA0 */ void showGPRMap(OSContext*);
/* 802E2DAC */ void showSRR0Map(OSContext*);
/* 802E2E70 */ void printDebugInfo(JUTException::EInfoPage, u16, OSContext*, u32, u32);
/* 802E2F18 */ void isEnablePad() const;
/* 802E2F54 */ void readPad(u32*, u32*);
/* 802E34C0 */ void printContext(u16, OSContext*, u32, u32);
/* 802E3980 */ void waitTime(s32);
/* 802E3A08 */ void createFB();
/* 802E3AEC */ void setPreUserCallback(void (*)(u16, OSContext*, u32, u32));
/* 802E3AFC */ void setPostUserCallback(void (*)(u16, OSContext*, u32, u32));
/* 802E3B0C */ void appendMapFile(char const*);
/* 802E3BA0 */ void queryMapAddress(char*, u32, s32, u32*, u32*, char*, u32, bool, bool);
/* 802E3C90 */ void queryMapAddress_single(char*, u32, s32, u32*, u32*, char*, u32, bool, bool);
/* 802E3FEC */ void createConsole(void*, u32);
/* 802E40EC */ ~JUTException();
static u8 sMessageQueue[32];
static void* sCpuExpName[17];
static u8 sMapFileList[12 + 4 /* padding */];
static u8 sMessageBuffer[4 + 4 /* padding */];
static u8 sErrorManager[4];
static u8 sPreUserCallback[4];
static u8 sPostUserCallback[4];
static u8 sConsoleBuffer[4];
static u8 sConsoleBufferSize[4];
static u8 sConsole[4];
static u8 msr[4];
static u8 fpscr[4];
};
struct JUTDirectFile {
/* 802E87F8 */ JUTDirectFile();
/* 802E881C */ ~JUTDirectFile();
@@ -191,8 +128,6 @@ extern "C" u8 fpscr__12JUTException[4];
//
SECTION_INIT void memcpy();
extern "C" void OSReport();
extern "C" void OSPanic();
extern "C" void* __nw__FUl();
extern "C" void* __nw__FUlP7JKRHeapi();
extern "C" void __dl__FPv();
@@ -223,24 +158,11 @@ extern "C" void fclose__13JUTDirectFileFv();
extern "C" void fgets__13JUTDirectFileFPvi();
extern "C" void PPCMfmsr();
extern "C" void PPCMtmsr();
extern "C" void OSGetArenaHi();
extern "C" void OSGetCurrentContext();
extern "C" void OSGetStackPointer();
extern "C" void OSFillFPUContext();
extern "C" void OSSetErrorHandler();
extern "C" void OSDisableInterrupts();
extern "C" void OSEnableInterrupts();
extern "C" void OSRestoreInterrupts();
extern "C" void OSInitMessageQueue();
extern "C" void OSSendMessage();
extern "C" void OSReceiveMessage();
extern "C" void OSProtectRange();
extern "C" void OSGetCurrentThread();
extern "C" void OSEnableScheduler();
extern "C" void OSYieldThread();
extern "C" void OSResumeThread();
extern "C" void OSSuspendThread();
extern "C" void OSGetTime();
extern "C" void VISetPreRetraceCallback();
extern "C" void VISetPostRetraceCallback();
extern "C" void VIConfigure();
+40 -42
View File
@@ -7,18 +7,6 @@
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JUTFont {
/* 802DECF8 */ JUTFont();
/* 802DED24 */ void initialize_state();
/* 802DED70 */ void setCharColor(JUtility::TColor);
/* 802DEDC4 */ void setGradColor(JUtility::TColor, JUtility::TColor);
/* 802DEE28 */ void drawString_size_scale(f32, f32, f32, f32, char const*, u32, bool);
};
//
// Forward References:
//
@@ -42,54 +30,64 @@ extern "C" extern void* __vt__7JUTFont[17];
//
/* 802DECF8-802DED24 2D9638 002C+00 0/0 2/2 0/0 .text __ct__7JUTFontFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JUTFont::JUTFont() {
nofralloc
#include "asm/JSystem/JUtility/JUTFont/__ct__7JUTFontFv.s"
JUTFont::JUTFont() : mColor1(), mColor2(), mColor3(), mColor4() {
unk4 = 0;
}
#pragma pop
/* 802DED24-802DED70 2D9664 004C+00 0/0 9/9 0/0 .text initialize_state__7JUTFontFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JUTFont::initialize_state() {
nofralloc
#include "asm/JSystem/JUtility/JUTFont/initialize_state__7JUTFontFv.s"
void JUTFont::initialize_state() {
setCharColor(JUtility::TColor());
unk5 = false;
unk8 = 0;
unk4 = false;
}
#pragma pop
/* 802DED70-802DEDC4 2D96B0 0054+00 1/1 3/3 0/0 .text setCharColor__7JUTFontFQ28JUtility6TColor */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JUTFont::setCharColor(JUtility::TColor param_0) {
nofralloc
#include "asm/JSystem/JUtility/JUTFont/setCharColor__7JUTFontFQ28JUtility6TColor.s"
void JUTFont::setCharColor(JUtility::TColor col1) {
mColor1 = col1;
mColor2 = col1;
mColor3 = col1;
mColor4 = col1;
}
#pragma pop
/* 802DEDC4-802DEE28 2D9704 0064+00 0/0 2/2 0/0 .text
* setGradColor__7JUTFontFQ28JUtility6TColorQ28JUtility6TColor */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JUTFont::setGradColor(JUtility::TColor param_0, JUtility::TColor param_1) {
nofralloc
#include "asm/JSystem/JUtility/JUTFont/setGradColor__7JUTFontFQ28JUtility6TColorQ28JUtility6TColor.s"
void JUTFont::setGradColor(JUtility::TColor col1, JUtility::TColor col2) {
mColor1 = col1;
mColor2 = col1;
mColor3 = col2;
mColor4 = col2;
}
#pragma pop
/* 802DEE28-802DEF48 2D9768 0120+00 0/0 3/3 0/0 .text drawString_size_scale__7JUTFontFffffPCcUlb
*/
#ifdef NON_MATCHING
f32 JUTFont::drawString_size_scale(f32 a1, f32 a2, f32 a3, f32 a4, const char* str, u32 usz,
bool a7) {
f32 temp = a1;
for (; usz > 0; usz--, str++) {
u32 b = *(u8*)str;
if (isLeadByte(b)) {
str++;
b = (b << 8 | *(u8*)str);
usz--;
}
a1 += drawChar_scale(temp, a2, a3, a4, b, a7);
a7 = 1;
}
return a1 - temp;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JUTFont::drawString_size_scale(f32 param_0, f32 param_1, f32 param_2, f32 param_3,
char const* param_4, u32 param_5, bool param_6) {
asm f32 JUTFont::drawString_size_scale(f32 param_0, f32 param_1, f32 param_2, f32 param_3,
char const* param_4, u32 param_5, bool param_6) {
nofralloc
#include "asm/JSystem/JUtility/JUTFont/drawString_size_scale__7JUTFontFffffPCcUlb.s"
}
#pragma pop
#endif
+84 -178
View File
@@ -7,127 +7,14 @@
#include "dol2asm.h"
#include "dolphin/types.h"
// can't type mPadList correctly because of __sinit
// remove this once __sinit is decompiled
#define mPadListHack (*(JSUList<JUTGamePad>*)&mPadList)
//
// Types:
//
struct PADStatus {};
struct JUTGamePadLongPress {
/* 802E1AFC */ void checkCallback(int, u32);
static u8 sPatternList[12];
};
struct JUTGamePad {
struct EPadPort {};
struct CButton {
/* 802E1050 */ void clear();
/* 802E108C */ void update(PADStatus const*, u32);
/* 802E1A7C */ void setRepeat(u32, u32, u32);
/* 802E1CD8 */ CButton();
};
struct EStickMode {};
struct EWhichStick {};
struct CStick {
/* 802E121C */ void clear();
/* 802E1238 */ void update(s8, s8, JUTGamePad::EStickMode, JUTGamePad::EWhichStick, u32);
/* 802E1500 */ void getButton(u32);
/* 802E1CA8 */ CStick();
static f32 sPressPoint;
static f32 sReleasePoint;
};
struct CRumble {
struct ERumble {};
/* 802E15B4 */ void clear();
/* 802E15D8 */ void clear(JUTGamePad*);
/* 802E1634 */ void startMotor(int);
/* 802E168C */ void stopMotor(int, bool);
/* 802E1720 */ void update(s16);
/* 802E18A4 */ void triggerPatternedRumble(u32);
/* 802E18CC */ void startPatternedRumble(void*, JUTGamePad::CRumble::ERumble, u32);
/* 802E1948 */ void stopPatternedRumble(s16);
/* 802E1978 */ void stopPatternedRumbleAtThePeriod();
/* 802E19D8 */ void setEnabled(u32);
static u8 sChannelMask[16];
static u8 mStatus[4];
static u8 mEnabled[4];
};
struct C3ButtonReset {
static u32 sResetPattern;
static u32 sResetMaskPattern;
static u8 sCallback[4];
static u8 sCallbackArg[4 + 4 /* padding */];
static u8 sThreshold[4];
static u8 sResetOccurredPort[4];
};
/* 802E06DC */ JUTGamePad(JUTGamePad::EPadPort);
/* 802E07B0 */ ~JUTGamePad();
/* 802E085C */ void initList();
/* 802E0898 */ void init();
/* 802E08D0 */ void clear();
/* 802E08E4 */ void read();
/* 802E0BBC */ void assign();
/* 802E0C6C */ void checkResetCallback(s64);
/* 802E0CD8 */ void update();
/* 802E0FA4 */ void checkResetSwitch();
/* 802E1024 */ void clearForReset();
/* 802E199C */ void getGamePad(int);
/* 802E1A98 */ void recalibrate(u32);
static u8 mPadList[12];
static u8 mPadStatus[48];
static u8 mPadButton[192];
static u8 mPadMStick[64];
static u8 mPadSStick[64];
static u32 sStickMode;
static u32 sClampMode;
static u8 mPadAssign[4];
static u8 sSuppressPadReset[4];
static u8 sAnalogMode[4];
static u8 sRumbleSupported[4];
};
struct JSUPtrLink {
/* 802DBDFC */ JSUPtrLink(void*);
/* 802DBE14 */ ~JSUPtrLink();
};
struct JSUPtrList {
/* 802DBE74 */ JSUPtrList(bool);
/* 802DBEAC */ ~JSUPtrList();
/* 802DBF14 */ void initiate();
/* 802DBF4C */ void append(JSUPtrLink*);
/* 802DC15C */ void remove(JSUPtrLink*);
};
template <typename A0>
struct JSUList {};
/* JSUList<JUTGamePadLongPress> */
struct JSUList__template11 {
/* 802E1C54 */ void func_802E1C54(void* _this);
};
/* JSUList<JUTGamePad> */
struct JSUList__template12 {
/* 802E1D08 */ void func_802E1D08(void* _this);
};
struct JKRDisposer {
/* 802D147C */ JKRDisposer();
/* 802D14E4 */ ~JKRDisposer();
};
//
// Forward References:
//
@@ -208,16 +95,6 @@ extern "C" void initiate__10JSUPtrListFv();
extern "C" void append__10JSUPtrListFP10JSUPtrLink();
extern "C" void remove__10JSUPtrListFP10JSUPtrLink();
extern "C" void OSGetResetSwitchState();
extern "C" void OSGetTime();
extern "C" void PADClamp();
extern "C" void PADClampCircle();
extern "C" void PADReset();
extern "C" void PADRecalibrate();
extern "C" void PADInit();
extern "C" void PADRead();
extern "C" void PADControlMotor();
extern "C" void PADSetSpec();
extern "C" void PADSetAnalogMode();
extern "C" void __register_global_object();
extern "C" void __construct_array();
extern "C" void _savegpr_22();
@@ -237,8 +114,11 @@ extern "C" extern u32 __float_nan;
/* ############################################################################################## */
/* 803CC5F0-803CC600 029710 0010+00 3/3 0/0 0/0 .data sChannelMask__Q210JUTGamePad7CRumble */
SECTION_DATA u8 JUTGamePad::CRumble::sChannelMask[16] = {
0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
SECTION_DATA PADMask JUTGamePad::CRumble::sChannelMask[4] = {
PAD_CHAN0_BIT,
PAD_CHAN1_BIT,
PAD_CHAN2_BIT,
PAD_CHAN3_BIT,
};
/* 803CC600-803CC610 029720 0010+00 2/2 0/0 0/0 .data channel_mask */
@@ -262,13 +142,22 @@ static u8 lit_525[12];
u8 JUTGamePad::mPadList[12];
/* 804514D0-804514D4 0009D0 0004+00 1/1 0/0 0/0 .sbss None */
static u8 data_804514D0[4];
static bool data_804514D0;
/* 804514D4-804514D8 0009D4 0004+00 3/3 0/0 0/0 .sbss mPadAssign__10JUTGamePad */
u8 JUTGamePad::mPadAssign[4];
/* 802E06DC-802E07B0 2DB01C 00D4+00 0/0 4/4 0/0 .text __ct__10JUTGamePadFQ210JUTGamePad8EPadPort
*/
#ifdef NONMATCHING
// TODO(erin): probably ~easy to do, i just didn't do it yet :)
JUTGamePad::JUTGamePad(EPadPort port) : ptr_link(this) {
this->buttons.clear();
this->control_stick.clear();
this->c_stick.clear();
this->rumble.clear();
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -277,6 +166,7 @@ asm JUTGamePad::JUTGamePad(JUTGamePad::EPadPort param_0) {
#include "asm/JSystem/JUtility/JUTGamePad/__ct__10JUTGamePadFQ210JUTGamePad8EPadPort.s"
}
#pragma pop
#endif
/* 802E07B0-802E085C 2DB0F0 00AC+00 1/0 2/2 0/0 .text __dt__10JUTGamePadFv */
#pragma push
@@ -289,45 +179,38 @@ asm JUTGamePad::~JUTGamePad() {
#pragma pop
/* 802E085C-802E0898 2DB19C 003C+00 1/1 0/0 0/0 .text initList__10JUTGamePadFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JUTGamePad::initList() {
nofralloc
#include "asm/JSystem/JUtility/JUTGamePad/initList__10JUTGamePadFv.s"
void JUTGamePad::initList() {
if (/* mIsPadListInitialized */ data_804514D0 == false) {
mPadListHack.initiate();
data_804514D0 = true;
}
}
#pragma pop
/* ############################################################################################## */
/* 804514D8-804514DC 0009D8 0004+00 2/2 0/0 0/0 .sbss sSuppressPadReset__10JUTGamePad */
u8 JUTGamePad::sSuppressPadReset[4];
/* 804514DC-804514E0 0009DC 0004+00 1/1 1/1 0/0 .sbss sAnalogMode__10JUTGamePad */
u8 JUTGamePad::sAnalogMode[4];
s32 JUTGamePad::sAnalogMode;
/* 802E0898-802E08D0 2DB1D8 0038+00 0/0 1/1 0/0 .text init__10JUTGamePadFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JUTGamePad::init() {
nofralloc
#include "asm/JSystem/JUtility/JUTGamePad/init__10JUTGamePadFv.s"
s32 JUTGamePad::init() {
PADSetSpec(5);
sAnalogMode = 3;
PADSetAnalogMode(3);
return PADInit();
}
#pragma pop
/* 802E08D0-802E08E4 2DB210 0014+00 1/1 0/0 0/0 .text clear__10JUTGamePadFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JUTGamePad::clear() {
nofralloc
#include "asm/JSystem/JUtility/JUTGamePad/clear__10JUTGamePadFv.s"
void JUTGamePad::clear() {
this->field_0x98 = 0;
this->field_0xa8 = 1;
}
#pragma pop
/* ############################################################################################## */
/* 804343F0-80434420 061110 0030+00 1/3 1/1 0/0 .bss mPadStatus__10JUTGamePad */
u8 JUTGamePad::mPadStatus[48];
PADStatus JUTGamePad::mPadStatus[4];
/* 80434420-804344E0 061140 00C0+00 1/4 0/0 0/0 .bss mPadButton__10JUTGamePad */
u8 JUTGamePad::mPadButton[192];
@@ -364,6 +247,27 @@ asm void JUTGamePad::read() {
#pragma pop
/* 802E0BBC-802E0C6C 2DB4FC 00B0+00 1/1 0/0 0/0 .text assign__10JUTGamePadFv */
#if 0
// matches if all static variables have their proper type
void JUTGamePad::assign() {
s32 iVar3 = 0;
for (s32 i = 4; i > 0; i--) {
if ((/* mPadStatus */ lbl_804343F0[iVar3].error == 0) &&
(/* *puVar2 */ lbl_804514D4[iVar3] == 0)) {
this->pad_port = iVar3;
/* JUTGamePad::mPadAssign[iVar3] */ /* *puVar2 */ lbl_804514D4[iVar3] = 1;
/* JUTGamePad::mPadButton */ lbl_80434420[iVar3].setRepeat(
this->buttons.field_0x24, this->buttons.field_0x28, this->buttons.field_0x2c);
this->rumble.clear(this);
return;
}
iVar3++;
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -372,47 +276,49 @@ asm void JUTGamePad::assign() {
#include "asm/JSystem/JUtility/JUTGamePad/assign__10JUTGamePadFv.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 804514E4-804514E8 0009E4 0004+00 5/5 0/0 0/0 .sbss mStatus__Q210JUTGamePad7CRumble */
u8 JUTGamePad::CRumble::mStatus[4];
bool JUTGamePad::CRumble::mStatus[4];
/* 804514E8-804514EC 0009E8 0004+00 5/5 0/0 0/0 .sbss mEnabled__Q210JUTGamePad7CRumble */
u8 JUTGamePad::CRumble::mEnabled[4];
PADMask JUTGamePad::CRumble::mEnabled;
/* 804514EC-804514F0 0009EC 0004+00 2/2 4/4 0/0 .sbss sCallback__Q210JUTGamePad13C3ButtonReset */
u8 JUTGamePad::C3ButtonReset::sCallback[4];
callbackFn JUTGamePad::C3ButtonReset::sCallback;
/* 804514F0-804514F8 0009F0 0004+04 2/2 4/4 0/0 .sbss sCallbackArg__Q210JUTGamePad13C3ButtonReset
*/
u8 JUTGamePad::C3ButtonReset::sCallbackArg[4 + 4 /* padding */];
void* JUTGamePad::C3ButtonReset::sCallbackArg;
/* 804514F8-804514FC 0009F8 0004+00 2/2 0/0 0/0 .sbss sThreshold__Q210JUTGamePad13C3ButtonReset */
u8 JUTGamePad::C3ButtonReset::sThreshold[4];
/* 804514FC-80451500 0009FC 0004+00 2/2 0/0 0/0 .sbss None */
static u8 data_804514FC[4];
/* 804514F8-80451500 0009F8 0008+00 2/2 0/0 0/0 .sbss sThreshold__Q210JUTGamePad13C3ButtonReset */
OSTime JUTGamePad::C3ButtonReset::sThreshold;
/* 80451500-80451504 -00001 0004+00 3/3 6/6 0/0 .sbss None */
/* 80451500 0001+00 data_80451500 None */
/* 80451501 0003+00 data_80451501 None */
extern u8 struct_80451500[4];
u8 struct_80451500[4];
extern bool struct_80451500;
bool struct_80451500;
bool struct_80451501;
/* 80451504-80451508 000A04 0004+00 2/2 0/0 0/0 .sbss
* sResetOccurredPort__Q210JUTGamePad13C3ButtonReset */
u8 JUTGamePad::C3ButtonReset::sResetOccurredPort[4];
s32 JUTGamePad::C3ButtonReset::sResetOccurredPort;
/* 802E0C6C-802E0CD8 2DB5AC 006C+00 1/1 1/1 0/0 .text checkResetCallback__10JUTGamePadFx
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JUTGamePad::checkResetCallback(s64 param_0) {
nofralloc
#include "asm/JSystem/JUtility/JUTGamePad/checkResetCallback__10JUTGamePadFx.s"
void JUTGamePad::checkResetCallback(OSTime unk) {
if (unk < JUTGamePad::C3ButtonReset::sThreshold)
return;
struct_80451501 = true;
JUTGamePad::C3ButtonReset::sResetOccurredPort = this->pad_port;
if (JUTGamePad::C3ButtonReset::sCallback != NULL) {
JUTGamePad::C3ButtonReset::sCallback(this->pad_port,
JUTGamePad::C3ButtonReset::sCallbackArg);
}
}
#pragma pop
/* ############################################################################################## */
/* 80434560-8043456C 061280 000C+00 0/1 0/0 0/0 .bss @1373 */
@@ -496,7 +402,7 @@ SECTION_SDATA2 static f64 lit_1050 = 4503601774854144.0 /* cast s32 to float */;
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JUTGamePad::CButton::update(PADStatus const* param_0, u32 param_1) {
asm u32 JUTGamePad::CButton::update(PADStatus const* param_0, u32 param_1) {
nofralloc
#include "asm/JSystem/JUtility/JUTGamePad/update__Q210JUTGamePad7CButtonFPC9PADStatusUl.s"
}
@@ -543,8 +449,8 @@ SECTION_SDATA2 static f32 lit_1121 = 10430.37890625f;
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JUTGamePad::CStick::update(s8 param_0, s8 param_1, JUTGamePad::EStickMode param_2,
JUTGamePad::EWhichStick param_3, u32 param_4) {
asm u32 JUTGamePad::CStick::update(s8 param_0, s8 param_1, JUTGamePad::EStickMode param_2,
JUTGamePad::EWhichStick param_3, u32 param_4) {
nofralloc
#include "asm/JSystem/JUtility/JUTGamePad/func_802E1238.s"
}
@@ -555,7 +461,7 @@ asm void JUTGamePad::CStick::update(s8 param_0, s8 param_1, JUTGamePad::EStickMo
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JUTGamePad::CStick::getButton(u32 param_0) {
asm u32 JUTGamePad::CStick::getButton(u32 param_0) {
nofralloc
#include "asm/JSystem/JUtility/JUTGamePad/getButton__Q210JUTGamePad6CStickFUl.s"
}
@@ -672,7 +578,7 @@ asm void JUTGamePad::CRumble::stopPatternedRumbleAtThePeriod() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JUTGamePad::getGamePad(int param_0) {
asm JUTGamePad* JUTGamePad::getGamePad(int param_0) {
nofralloc
#include "asm/JSystem/JUtility/JUTGamePad/getGamePad__10JUTGamePadFi.s"
}
@@ -702,7 +608,7 @@ asm void JUTGamePad::CButton::setRepeat(u32 param_0, u32 param_1, u32 param_2) {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JUTGamePad::recalibrate(u32 param_0) {
asm bool JUTGamePad::recalibrate(u32 param_0) {
nofralloc
#include "asm/JSystem/JUtility/JUTGamePad/recalibrate__10JUTGamePadFUl.s"
}
+1 -26
View File
@@ -11,30 +11,10 @@
// Types:
//
struct _GXRenderModeObj {};
struct JUTXfb {
static u8 sManager[4 + 4 /* padding */];
};
struct JUTVideo {
/* 802E4C54 */ void createManager(_GXRenderModeObj const*);
/* 802E4CAC */ void destroyManager();
/* 802E4CF4 */ JUTVideo(_GXRenderModeObj const*);
/* 802E4DE8 */ ~JUTVideo();
/* 802E4E50 */ void preRetraceProc(u32);
/* 802E5088 */ void drawDoneStart();
/* 802E50B0 */ void dummyNoDrawWait();
/* 802E50BC */ void drawDoneCallback();
/* 802E5144 */ void postRetraceProc(u32);
/* 802E5198 */ void setRenderMode(_GXRenderModeObj const*);
/* 802E5210 */ void waitRetraceIfNeed();
static u8 sManager[4];
static u8 sVideoLastTick[4];
static u8 sVideoInterval[4];
};
struct JUTDirectPrint {
/* 802E456C */ void changeFrameBuffer(void*, u16, u16);
@@ -67,9 +47,6 @@ extern "C" u8 sVideoInterval__8JUTVideo[4];
extern "C" void* __nw__FUl();
extern "C" void __dl__FPv();
extern "C" void changeFrameBuffer__14JUTDirectPrintFPvUsUs();
extern "C" void OSInitMessageQueue();
extern "C" void OSSendMessage();
extern "C" void OSGetTick();
extern "C" void VISetPreRetraceCallback();
extern "C" void VISetPostRetraceCallback();
extern "C" void VIInit();
@@ -80,9 +57,7 @@ extern "C" void VISetNextFrameBuffer();
extern "C" void VIGetNextFrameBuffer();
extern "C" void VISetBlack();
extern "C" void VIGetRetraceCount();
extern "C" void GXFlush();
extern "C" void GXSetDrawDone();
extern "C" void GXSetDrawDoneCallback();
extern "C" void GXCopyDisp();
extern "C" u8 sDirectPrint__14JUTDirectPrint[4 + 4 /* padding */];
extern "C" u8 sManager__6JUTXfb[4 + 4 /* padding */];
@@ -93,7 +68,7 @@ extern "C" u8 sManager__6JUTXfb[4 + 4 /* padding */];
/* ############################################################################################## */
/* 80451538-8045153C 000A38 0004+00 4/4 18/18 1/1 .sbss sManager__8JUTVideo */
u8 JUTVideo::sManager[4];
JUTVideo* JUTVideo::sManager;
/* 802E4C54-802E4CAC 2DF594 0058+00 0/0 1/1 0/0 .text
* createManager__8JUTVideoFPC16_GXRenderModeObj */
+1
View File
@@ -8,6 +8,7 @@
#include "SSystem/SComponent/c_math.h"
#include "SSystem/SComponent/c_xyz.h"
#include "dol2asm.h"
#include "dolphin/mtx/mtxvec.h"
#include "dolphin/types.h"
#include "msl_c/math.h"
#include "msl_c/string.h"
+1 -1
View File
@@ -5,8 +5,8 @@
#include "SSystem/SComponent/c_m3d_g_aab.h"
#include "dol2asm.h"
#include "dolphin/mtx/vec.h"
#include "dolphin/types.h"
#include "mtx_vec.h"
//
// Declarations:
-1
View File
@@ -8,7 +8,6 @@
#include "dol2asm.h"
#include "global.h"
#include "msl_c/math.h"
#include "mtx_vec.h"
//
// Declarations:
+2 -5
View File
@@ -14,9 +14,6 @@
extern "C" void ARRegisterDMACallback();
extern "C" void ARGetDMAStatus();
extern "C" void ARStartDMA();
extern "C" void ARAlloc();
extern "C" void ARInit();
extern "C" u32 ARGetSize();
extern "C" void __ARHandler();
extern "C" void __ARClearInterrupt();
extern "C" void __ARGetInterruptStatus();
@@ -99,7 +96,7 @@ static u8 __AR_BlockLength[4];
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void ARAlloc() {
asm u32 ARAlloc(u32) {
nofralloc
#include "asm/dolphin/ar/ar/ARAlloc.s"
}
@@ -197,7 +194,7 @@ static u8 __AR_init_flag[4];
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void ARInit() {
asm u32 ARInit(u32*, u32) {
nofralloc
#include "asm/dolphin/ar/ar/ARInit.s"
}
+2 -2
View File
@@ -15,7 +15,6 @@ extern "C" void __ARQServiceQueueLo();
extern "C" void __ARQCallbackHack();
extern "C" void __ARQInterruptServiceRoutine();
extern "C" void ARQInit();
extern "C" void ARQPostRequest();
//
// External References:
@@ -186,7 +185,8 @@ asm void ARQInit() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void ARQPostRequest() {
asm void ARQPostRequest(ARQRequest* task, u32 owner, u32 type, u32 priority, u32 source,
u32 destination, u32 length, ARQCallback callback) {
nofralloc
#include "asm/dolphin/ar/arq/ARQPostRequest.s"
}
+4 -8
View File
@@ -47,15 +47,11 @@ extern "C" void DVDReadDiskID();
extern "C" void DVDCancelStreamAsync();
extern "C" void DVDInquiryAsync();
extern "C" void DVDReset();
extern "C" void DVDGetCommandBlockStatus();
extern "C" void DVDGetDriveStatus();
extern "C" void DVDSetAutoInvalidation();
extern "C" void DVDResume();
extern "C" static void DVDCancelAsync();
extern "C" void DVDCancel();
extern "C" static void cbForCancelSync();
extern "C" void DVDGetCurrentDiskID();
extern "C" void DVDCheckDisk();
extern "C" void __DVDPrepareResetAsync();
extern "C" void __DVDTestAlarm();
@@ -689,7 +685,7 @@ asm void DVDReset() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void DVDGetCommandBlockStatus() {
asm int DVDGetCommandBlockStatus(DVDCommandBlock*) {
nofralloc
#include "asm/dolphin/dvd/dvd/DVDGetCommandBlockStatus.s"
}
@@ -699,7 +695,7 @@ asm void DVDGetCommandBlockStatus() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void DVDGetDriveStatus() {
asm DVDState DVDGetDriveStatus() {
nofralloc
#include "asm/dolphin/dvd/dvd/DVDGetDriveStatus.s"
}
@@ -847,7 +843,7 @@ static asm void cbForCancelSync() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void DVDGetCurrentDiskID() {
asm DVDDiskID* DVDGetCurrentDiskID() {
nofralloc
#include "asm/dolphin/dvd/dvd/DVDGetCurrentDiskID.s"
}
@@ -877,7 +873,7 @@ SECTION_DATA static void* lit_1060[13 + 1 /* padding */] = {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void DVDCheckDisk() {
asm s32 DVDCheckDisk() {
nofralloc
#include "asm/dolphin/dvd/dvd/DVDCheckDisk.s"
}
+20 -47
View File
@@ -5,38 +5,9 @@
#include "dolphin/mtx/mtx.h"
#include "dol2asm.h"
#include "dolphin/mtx/mtxvec.h"
#include "dolphin/types.h"
//
// Forward References:
//
extern "C" void PSMTXIdentity();
extern "C" void PSMTXCopy();
extern "C" void PSMTXConcat();
extern "C" void PSMTXInverse();
extern "C" void PSMTXRotRad();
extern "C" static void PSMTXRotTrig();
extern "C" void __PSMTXRotAxisRadInternal();
extern "C" void PSMTXRotAxisRad();
extern "C" void PSMTXTrans();
extern "C" void PSMTXTransApply();
extern "C" void PSMTXScale();
extern "C" void PSMTXScaleApply();
extern "C" void PSMTXQuat();
extern "C" void C_MTXLookAt();
extern "C" void C_MTXLightPerspective();
extern "C" void C_MTXLightOrtho();
//
// External References:
//
extern "C" void PSVECNormalize();
extern "C" void PSVECCrossProduct();
extern "C" void tanf();
extern "C" void sinf();
extern "C" void cosf();
#include "msl_c/math.h"
//
// Declarations:
@@ -58,7 +29,7 @@ SECTION_SDATA2 static u8 lit_97[4] = {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSMTXIdentity() {
asm void PSMTXIdentity(Mtx matrix) {
nofralloc
#include "asm/dolphin/mtx/mtx/PSMTXIdentity.s"
}
@@ -68,7 +39,7 @@ asm void PSMTXIdentity() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSMTXCopy() {
asm void PSMTXCopy(const Mtx src, Mtx dst) {
nofralloc
#include "asm/dolphin/mtx/mtx/PSMTXCopy.s"
}
@@ -84,7 +55,7 @@ SECTION_SDATA static u8 Unit01[8] = {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSMTXConcat() {
asm void PSMTXConcat(const Mtx src_a, const Mtx src_b, Mtx dst) {
nofralloc
#include "asm/dolphin/mtx/mtx/PSMTXConcat.s"
}
@@ -94,7 +65,7 @@ asm void PSMTXConcat() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSMTXInverse() {
asm u32 PSMTXInverse(const Mtx src, Mtx dst) {
nofralloc
#include "asm/dolphin/mtx/mtx/PSMTXInverse.s"
}
@@ -104,7 +75,7 @@ asm void PSMTXInverse() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSMTXRotRad() {
asm void PSMTXRotRad(Mtx matrix, u8 axis, float rad) {
nofralloc
#include "asm/dolphin/mtx/mtx/PSMTXRotRad.s"
}
@@ -114,7 +85,7 @@ asm void PSMTXRotRad() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
static asm void PSMTXRotTrig() {
asm void PSMTXRotTrig(Mtx matrix, u8 axis, float sin, float cos) {
nofralloc
#include "asm/dolphin/mtx/mtx/PSMTXRotTrig.s"
}
@@ -131,7 +102,7 @@ SECTION_SDATA2 static f32 lit_191 = 3.0f;
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void __PSMTXRotAxisRadInternal() {
asm double __PSMTXRotAxisRadInternal(double param_1, double param_2, int param_3, int param_4) {
nofralloc
#include "asm/dolphin/mtx/mtx/__PSMTXRotAxisRadInternal.s"
}
@@ -141,7 +112,7 @@ asm void __PSMTXRotAxisRadInternal() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSMTXRotAxisRad() {
asm void PSMTXRotAxisRad(Mtx matrix, const Vec* axis, float rad) {
nofralloc
#include "asm/dolphin/mtx/mtx/PSMTXRotAxisRad.s"
}
@@ -151,7 +122,7 @@ asm void PSMTXRotAxisRad() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSMTXTrans() {
asm void PSMTXTrans(Mtx matrix, float x_trans, float y_trans, float z_trans) {
nofralloc
#include "asm/dolphin/mtx/mtx/PSMTXTrans.s"
}
@@ -161,7 +132,7 @@ asm void PSMTXTrans() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSMTXTransApply() {
asm void PSMTXTransApply(const Mtx src, Mtx dst, float x, float y, float z) {
nofralloc
#include "asm/dolphin/mtx/mtx/PSMTXTransApply.s"
}
@@ -171,7 +142,7 @@ asm void PSMTXTransApply() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSMTXScale() {
asm void PSMTXScale(Mtx matrix, float x_scale, float y_scale, float z_scale) {
nofralloc
#include "asm/dolphin/mtx/mtx/PSMTXScale.s"
}
@@ -181,7 +152,7 @@ asm void PSMTXScale() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSMTXScaleApply() {
asm void PSMTXScaleApply(const Mtx src, Mtx dst, float x_scale, float y_scale, float z_scale) {
nofralloc
#include "asm/dolphin/mtx/mtx/PSMTXScaleApply.s"
}
@@ -191,7 +162,7 @@ asm void PSMTXScaleApply() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSMTXQuat() {
asm void PSMTXQuat(Mtx matrix, const Quaternion* quat) {
nofralloc
#include "asm/dolphin/mtx/mtx/PSMTXQuat.s"
}
@@ -201,7 +172,7 @@ asm void PSMTXQuat() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void C_MTXLookAt() {
asm void C_MTXLookAt(Mtx param_1, const Vec* param_2, const Vec* param_3, const Vec* param_4) {
nofralloc
#include "asm/dolphin/mtx/mtx/C_MTXLookAt.s"
}
@@ -225,7 +196,8 @@ SECTION_SDATA2 static f32 lit_230[1 + 1 /* padding */] = {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void C_MTXLightPerspective() {
asm void C_MTXLightPerspective(Mtx matrix, float fov_y, float aspect, float scale_s, float scale_t,
float trans_s, float trans_t) {
nofralloc
#include "asm/dolphin/mtx/mtx/C_MTXLightPerspective.s"
}
@@ -235,7 +207,8 @@ asm void C_MTXLightPerspective() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void C_MTXLightOrtho() {
asm void C_MTXLightOrtho(Mtx matrix, float top, float bottom, float left, float right,
float scale_s, float scale_t, float trans_s, float trans_t) {
nofralloc
#include "asm/dolphin/mtx/mtx/C_MTXLightOrtho.s"
}
+4 -15
View File
@@ -6,19 +6,7 @@
#include "dolphin/mtx/mtx44.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Forward References:
//
extern "C" void C_MTXPerspective();
extern "C" void C_MTXOrtho();
//
// External References:
//
extern "C" void tanf();
#include "msl_c/math.h"
//
// Declarations:
@@ -52,7 +40,7 @@ SECTION_SDATA2 static f32 lit_106 = 0.01745329238474369f;
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void C_MTXPerspective() {
asm void C_MTXPerspective(Mtx44 matrix, float fov_y, float aspect, float near, float far) {
nofralloc
#include "asm/dolphin/mtx/mtx44/C_MTXPerspective.s"
}
@@ -62,7 +50,8 @@ asm void C_MTXPerspective() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void C_MTXOrtho() {
asm void C_MTXOrtho(Mtx44 matrix, float top, float bottom, float left, float right, float near,
float far) {
nofralloc
#include "asm/dolphin/mtx/mtx44/C_MTXOrtho.s"
}
+4 -17
View File
@@ -7,19 +7,6 @@
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Forward References:
//
extern "C" void PSMTXMultVec();
extern "C" void PSMTXMultVecArray();
extern "C" void PSMTXMultVecSR();
extern "C" void PSMTXMultVecArraySR();
//
// External References:
//
//
// Declarations:
//
@@ -28,7 +15,7 @@ extern "C" void PSMTXMultVecArraySR();
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSMTXMultVec() {
asm void PSMTXMultVec(const Mtx matrix, const Vec* src, Vec* dst) {
nofralloc
#include "asm/dolphin/mtx/mtxvec/PSMTXMultVec.s"
}
@@ -38,7 +25,7 @@ asm void PSMTXMultVec() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSMTXMultVecArray() {
asm void PSMTXMultVecArray(const Mtx matrix, const Vec* src, Vec* dst, u32 count) {
nofralloc
#include "asm/dolphin/mtx/mtxvec/PSMTXMultVecArray.s"
}
@@ -48,7 +35,7 @@ asm void PSMTXMultVecArray() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSMTXMultVecSR() {
asm void PSMTXMultVecSR(const Mtx matrix, const Vec* src, Vec* dst) {
nofralloc
#include "asm/dolphin/mtx/mtxvec/PSMTXMultVecSR.s"
}
@@ -58,7 +45,7 @@ asm void PSMTXMultVecSR() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSMTXMultVecArraySR() {
asm void PSMTXMultVecArraySR(const Mtx matrix, const Vec* src, Vec* dst, u32 count) {
nofralloc
#include "asm/dolphin/mtx/mtxvec/PSMTXMultVecArraySR.s"
}
+4 -20
View File
@@ -6,23 +6,7 @@
#include "dolphin/mtx/quat.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Forward References:
//
extern "C" void PSQUATMultiply();
extern "C" void C_QUATRotAxisRad();
extern "C" void C_QUATSlerp();
//
// External References:
//
extern "C" void PSVECNormalize();
extern "C" void sinf();
extern "C" void cosf();
extern "C" void acosf();
#include "msl_c/math.h"
//
// Declarations:
@@ -32,7 +16,7 @@ extern "C" void acosf();
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSQUATMultiply() {
asm void PSQUATMultiply(const Quaternion* src_a, const Quaternion* src_b, Quaternion* dst) {
nofralloc
#include "asm/dolphin/mtx/quat/PSQUATMultiply.s"
}
@@ -57,7 +41,7 @@ SECTION_SDATA2 static f32 lit_135 = 0.5f;
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void C_QUATRotAxisRad() {
asm void C_QUATRotAxisRad(Quaternion* quat, const Vec* axis, float rad) {
nofralloc
#include "asm/dolphin/mtx/quat/C_QUATRotAxisRad.s"
}
@@ -71,7 +55,7 @@ SECTION_SDATA2 static f32 lit_261 = 0.9999899864196777f;
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void C_QUATSlerp() {
asm void C_QUATSlerp(const Quaternion* p, const Quaternion* q, Quaternion* r, float t) {
nofralloc
#include "asm/dolphin/mtx/quat/C_QUATSlerp.s"
}
+12 -33
View File
@@ -7,27 +7,6 @@
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Forward References:
//
extern "C" void PSVECAdd();
extern "C" void PSVECSubtract();
extern "C" void PSVECScale();
extern "C" void PSVECNormalize();
extern "C" void PSVECSquareMag();
extern "C" void PSVECMag();
extern "C" void PSVECDotProduct();
extern "C" void PSVECCrossProduct();
extern "C" void C_VECHalfAngle();
extern "C" void C_VECReflect();
extern "C" void PSVECSquareDistance();
extern "C" void PSVECDistance();
//
// External References:
//
//
// Declarations:
//
@@ -36,7 +15,7 @@ extern "C" void PSVECDistance();
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSVECAdd() {
asm void PSVECAdd(const Vec* src_a, const Vec* src_b, Vec* dst) {
nofralloc
#include "asm/dolphin/mtx/vec/PSVECAdd.s"
}
@@ -46,7 +25,7 @@ asm void PSVECAdd() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSVECSubtract() {
asm void PSVECSubtract(const Vec* a, const Vec* b, Vec* dst) {
nofralloc
#include "asm/dolphin/mtx/vec/PSVECSubtract.s"
}
@@ -56,7 +35,7 @@ asm void PSVECSubtract() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSVECScale() {
asm void PSVECScale(const Vec* src, Vec* dst, float scale) {
nofralloc
#include "asm/dolphin/mtx/vec/PSVECScale.s"
}
@@ -81,7 +60,7 @@ SECTION_SDATA2 static f32 lit_119 = 3.0f;
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSVECNormalize() {
asm void PSVECNormalize(const Vec* src, Vec* dst) {
nofralloc
#include "asm/dolphin/mtx/vec/PSVECNormalize.s"
}
@@ -91,7 +70,7 @@ asm void PSVECNormalize() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSVECSquareMag() {
asm float PSVECSquareMag(const Vec* vec) {
nofralloc
#include "asm/dolphin/mtx/vec/PSVECSquareMag.s"
}
@@ -101,7 +80,7 @@ asm void PSVECSquareMag() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSVECMag() {
asm float PSVECMag(const Vec* data) {
nofralloc
#include "asm/dolphin/mtx/vec/PSVECMag.s"
}
@@ -111,7 +90,7 @@ asm void PSVECMag() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSVECDotProduct() {
asm float PSVECDotProduct(const Vec* a, const Vec* b) {
nofralloc
#include "asm/dolphin/mtx/vec/PSVECDotProduct.s"
}
@@ -121,7 +100,7 @@ asm void PSVECDotProduct() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSVECCrossProduct() {
asm void PSVECCrossProduct(const Vec* src_a, const Vec* src_b, Vec* dst) {
nofralloc
#include "asm/dolphin/mtx/vec/PSVECCrossProduct.s"
}
@@ -131,7 +110,7 @@ asm void PSVECCrossProduct() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void C_VECHalfAngle() {
asm void C_VECHalfAngle(const Vec* incident, const Vec* line_of_sight, Vec* out_half) {
nofralloc
#include "asm/dolphin/mtx/vec/C_VECHalfAngle.s"
}
@@ -145,7 +124,7 @@ SECTION_SDATA2 static f32 lit_161 = 2.0f;
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void C_VECReflect() {
asm void C_VECReflect(const Vec* src, const Vec* surface_normal, Vec* dst) {
nofralloc
#include "asm/dolphin/mtx/vec/C_VECReflect.s"
}
@@ -155,7 +134,7 @@ asm void C_VECReflect() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSVECSquareDistance() {
asm float PSVECSquareDistance(const Vec* a, const Vec* b) {
nofralloc
#include "asm/dolphin/mtx/vec/PSVECSquareDistance.s"
}
@@ -165,7 +144,7 @@ asm void PSVECSquareDistance() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PSVECDistance() {
asm float PSVECDistance(const Vec* a, const Vec* b) {
nofralloc
#include "asm/dolphin/mtx/vec/PSVECDistance.s"
}
+1 -10
View File
@@ -22,7 +22,6 @@ struct daBgObj_c {
//
extern "C" void __OSFPRInit();
extern "C" void OSGetConsoleType();
extern "C" static void InquiryCallback();
extern "C" void OSInit();
extern "C" static void OSExceptionInit();
@@ -45,7 +44,6 @@ extern "C" void OSRegisterVersion();
SECTION_INIT void memset();
SECTION_INIT void memcpy();
extern "C" void OSReport();
extern "C" void PPCMtmmcr0();
extern "C" void PPCMtmmcr1();
extern "C" void PPCMtpmc1();
@@ -57,10 +55,6 @@ extern "C" void PPCMthid2();
extern "C" void PPCDisableSpeculation();
extern "C" void PPCSetFpNonIEEEMode();
extern "C" void OSInitAlarm();
extern "C" void OSGetArenaHi();
extern "C" void OSGetArenaLo();
extern "C" void OSSetArenaHi();
extern "C" void OSSetArenaLo();
extern "C" void __OSInitAudioSystem();
extern "C" void DCInvalidateRange();
extern "C" void DCFlushRangeNoSync();
@@ -70,13 +64,10 @@ extern "C" void __OSCacheInit();
extern "C" void __OSContextInit();
extern "C" void __OSUnhandledException();
extern "C" void __OSGetExecParams();
extern "C" void OSDisableInterrupts();
extern "C" void OSEnableInterrupts();
extern "C" void __OSSetInterruptHandler();
extern "C" void __OSInterruptInit();
extern "C" void __OSModuleInit();
extern "C" void __OSInitMemoryProtection();
extern "C" void OSGetResetCode();
extern "C" void __OSResetSWInterruptHandler();
extern "C" void __OSInitSram();
extern "C" void __OSInitSystemCall();
@@ -132,7 +123,7 @@ asm void __OSFPRInit() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void OSGetConsoleType() {
asm s32 OSGetConsoleType() {
nofralloc
#include "asm/dolphin/os/OS/OSGetConsoleType.s"
}
+2 -4
View File
@@ -12,9 +12,7 @@
//
extern "C" static void DCEnable();
extern "C" void DCInvalidateRange();
extern "C" void DCFlushRange();
extern "C" void DCStoreRange();
extern "C" void DCFlushRangeNoSync();
extern "C" void DCStoreRangeNoSync();
extern "C" void DCZeroRange();
@@ -68,7 +66,7 @@ static asm void DCEnable() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void DCInvalidateRange() {
asm void DCInvalidateRange(void*, u32) {
nofralloc
#include "asm/dolphin/os/OSCache/DCInvalidateRange.s"
}
@@ -88,7 +86,7 @@ asm void DCFlushRange() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void DCStoreRange() {
asm void DCStoreRange(void*, u32) {
nofralloc
#include "asm/dolphin/os/OSCache/DCStoreRange.s"
}
+7 -14
View File
@@ -17,16 +17,9 @@ extern "C" static void PADOriginUpdateCallback();
extern "C" static void PADProbeCallback();
extern "C" static void PADTypeAndStatusCallback();
extern "C" static void PADReceiveCheckCallback();
extern "C" void PADReset();
extern "C" void PADRecalibrate();
extern "C" void PADInit();
extern "C" void PADRead();
extern "C" void PADControlMotor();
extern "C" void PADSetSpec();
extern "C" static void SPEC0_MakeStatus();
extern "C" static void SPEC1_MakeStatus();
extern "C" static void SPEC2_MakeStatus();
extern "C" void PADSetAnalogMode();
extern "C" static void OnReset();
extern "C" static void SamplingHandler();
extern "C" static void PADSetSamplingCallback();
@@ -265,7 +258,7 @@ static asm void PADReceiveCheckCallback() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PADReset() {
asm s32 PADReset(PADMask mask) {
nofralloc
#include "asm/dolphin/pad/Pad/PADReset.s"
}
@@ -275,7 +268,7 @@ asm void PADReset() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PADRecalibrate() {
asm s32 PADRecalibrate(PADMask mask) {
nofralloc
#include "asm/dolphin/pad/Pad/PADRecalibrate.s"
}
@@ -310,7 +303,7 @@ u8 __PADSpec[4 + 4 /* padding */];
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PADInit() {
asm u32 PADInit() {
nofralloc
#include "asm/dolphin/pad/Pad/PADInit.s"
}
@@ -320,7 +313,7 @@ asm void PADInit() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PADRead() {
asm u32 PADRead(PADStatus*) {
nofralloc
#include "asm/dolphin/pad/Pad/PADRead.s"
}
@@ -330,7 +323,7 @@ asm void PADRead() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PADControlMotor() {
asm void PADControlMotor(s32 channel, u32 command) {
nofralloc
#include "asm/dolphin/pad/Pad/PADControlMotor.s"
}
@@ -340,7 +333,7 @@ asm void PADControlMotor() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PADSetSpec() {
asm void PADSetSpec(int spec) {
nofralloc
#include "asm/dolphin/pad/Pad/PADSetSpec.s"
}
@@ -380,7 +373,7 @@ static asm void SPEC2_MakeStatus() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void PADSetAnalogMode() {
asm void PADSetAnalogMode(u32 mode) {
nofralloc
#include "asm/dolphin/pad/Pad/PADSetAnalogMode.s"
}