clean JKernel

This commit is contained in:
TakaRikka 2023-02-26 17:50:56 -08:00
parent c54f0816ea
commit 090dcee012
30 changed files with 609 additions and 1285 deletions

View File

@ -9,12 +9,12 @@ public:
JKRCompArchive(long, JKRArchive::EMountDirection);
virtual ~JKRCompArchive();
void open(long);
bool open(long);
/* vt[09] */ void removeResourceAll(void); /* override */
/* vt[10] */ bool removeResource(void*); /* override */
/* vt[15] */ u32 getExpandedResSize(const void*); /* override */
/* vt[15] */ u32 getExpandedResSize(const void*) const; /* override */
/* vt[16] */ void* fetchResource(SDIFileEntry*, u32*); /* override */
/* vt[17] */ void* fetchResource(void*, u32, SDIFileEntry*, u32*); /* override */
@ -23,9 +23,9 @@ private:
/* 0x00 */ // vtable
/* 0x04 */ // JKRArchive
/* 0x5C */ int field_0x5c;
/* 0x60 */ int field_0x60;
/* 0x60 */ EMountDirection mMountDirection;
/* 0x64 */ int field_0x64;
/* 0x68 */ int field_0x68;
/* 0x68 */ JKRAramBlock* field_0x68;
/* 0x6C */ int field_0x6c;
/* 0x70 */ JKRDvdFile* field_0x70;
/* 0x74 */ u32 mSizeOfMemPart;

View File

@ -1,6 +1,8 @@
#ifndef JSUPPORT_H
#define JSUPPORT_H
#include "dolphin/types.h"
template <typename T>
T* JSUConvertOffsetToPtr(const void* ptr, const void* offset) {
if (offset == NULL) {
@ -10,4 +12,12 @@ T* JSUConvertOffsetToPtr(const void* ptr, const void* offset) {
}
}
inline u8 JSULoByte(u16 in) {
return in & 0xff;
}
inline u8 JSUHiByte(u16 in) {
return in >> 8;
}
#endif

View File

@ -147,5 +147,6 @@ extern "C" void JUTSetWarningConsole(JUTConsole*);
extern "C" JUTConsole* JUTGetWarningConsole();
extern "C" void JUTReportConsole_f_va(const char*, va_list);
extern "C" void JUTReportConsole_f(const char*, ...);
extern "C" void JUTWarningConsole(const char* message);
#endif /* JUTCONSOLE_H */

View File

@ -26,7 +26,8 @@ typedef u32 OSHeapHandle;
extern volatile s32 __OSCurrHeap;
#define OSRoundUp32B(v) (((u32)(v + 31) & ~31))
#define OSRoundUp32B(x) (((u32)(x) + 0x1F) & ~(0x1F))
#define OSRoundDown32B(x) (((u32)(x)) & ~(0x1F))
#define OSRoundUp(x, align) (((x) + (align)-1) & (-(align)))
#define OSRoundUpPtr(x, align) ((void*)((((u32)(x)) + (align)-1) & (~((align)-1))))

View File

@ -124,7 +124,7 @@ JKRAram::JKRAram(u32 audio_buffer_size, u32 audio_graph_size, long priority)
u32 aramSize = ARGetSize();
mAudioMemorySize = audio_buffer_size;
if (audio_graph_size == 0xffffffff) {
if (audio_graph_size == 0xFFFFFFFF) {
mGraphMemorySize = (aramSize - audio_buffer_size) - aramBase;
mAramMemorySize = 0;
} else {
@ -171,24 +171,15 @@ void* JKRAram::run(void) {
} while (true);
}
/* ############################################################################################## */
/* 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
/* 802D2248-802D22DC 2CCB88 0094+00 2/2 0/0 0/0 .text
* checkOkAddress__7JKRAramFPUcUlP12JKRAramBlockUl */
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.");
JUTException::panic_f(__FILE__, 219, "%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.");
JUTException::panic_f(__FILE__, 227, "%s", ":::address not 32Byte aligned.");
}
}
@ -445,5 +436,3 @@ SECTION_DEAD static char const* const stringBase_8039D0A6 = "bad aramSync\n";
/* @stringBase0 padding */
SECTION_DEAD static char const* const pad_8039D0B4 = "\0\0\0";
#pragma pop
/* 8039D078-8039D078 0296D8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */

View File

@ -8,19 +8,11 @@
#include "JSystem/JKernel/JKRDvdAramRipper.h"
#include "JSystem/JKernel/JKRDvdRipper.h"
#include "JSystem/JKernel/JKRFile.h"
#include "JSystem/JUtility/JUTException.h"
#include "MSL_C/MSL_Common/Src/string.h"
#include "MSL_C/math.h"
#include "dol2asm.h"
#include "dolphin/os/OSCache.h"
#include "dolphin/types.h"
//
// Types:
//
struct JUTException {
/* 802E21FC */ static void panic_f(char const*, int, char const*, ...);
};
//
// Forward References:
@ -112,9 +104,11 @@ SECTION_DATA extern void* __vt__7JKRFile[8] = {
JKRAramArchive::JKRAramArchive(s32 param_0, JKRArchive::EMountDirection mountDirection)
: JKRArchive(param_0, MOUNT_ARAM) {
mMountDirection = mountDirection;
if (!this->open(param_0)) {
return;
}
mVolumeType = 'RARC';
mVolumeName = mStringTable + mNodes->name_offset;
JKRFileLoader::sVolumeList.prepend(&mFileLoaderLink);
@ -131,19 +125,24 @@ JKRAramArchive::~JKRAramArchive() {
JKRHeap::free(entry->data, mHeap);
}
}
JKRHeap::free(mArcInfoBlock, mHeap);
mArcInfoBlock = NULL;
}
if (mExpandedSize != NULL) {
JKRHeap::free(mExpandedSize, NULL);
mExpandedSize = NULL;
}
if (mDvdFile != NULL) {
delete mDvdFile;
}
if (mBlock != NULL) {
delete mBlock;
}
JKRFileLoader::sVolumeList.remove(&mFileLoaderLink);
mIsMounted = false;
}
@ -174,6 +173,7 @@ bool JKRAramArchive::open(s32 entryNum) {
mMountMode = UNKNOWN_MOUNT_MODE;
return false;
}
SArcHeader* header = static_cast<SArcHeader*>(JKRAllocFromSysHeap(0x20, -0x20));
if (header == NULL) {
mMountMode = UNKNOWN_MOUNT_MODE;
@ -263,15 +263,18 @@ void* JKRAramArchive::fetchResource(JKRArchive::SDIFileEntry* pEntry, u32* pOutS
if (pOutSize == NULL) {
pOutSize = &outSize;
}
JKRCompression compression = JKRConvertAttrToCompressionType(pEntry->getFlags());
if (pEntry->data == NULL) {
u32 size = JKRAramArchive::fetchResource_subroutine(
pEntry->data_offset + mBlock->getAddress(), pEntry->data_size, mHeap, compression,
&outBuf);
*pOutSize = size;
if (size == NULL) {
return NULL;
}
pEntry->data = outBuf;
if (compression == COMPRESSION_YAZ0) {
this->setExpandSize(pEntry, *pOutSize);
@ -283,6 +286,7 @@ void* JKRAramArchive::fetchResource(JKRArchive::SDIFileEntry* pEntry, u32* pOutS
*pOutSize = pEntry->data_size;
}
}
return pEntry->data;
}
@ -352,6 +356,7 @@ u32 JKRAramArchive::fetchResource_subroutine(u32 src, u32 srcLength, u8* dst, u3
u32 outLen;
u32 srcSize = ALIGN_NEXT(srcLength, 0x20);
u32 dstSize = ALIGN_PREV(dstLength, 0x20);
switch (compression) {
case COMPRESSION_NONE:
if (srcSize > dstSize) {
@ -366,7 +371,7 @@ u32 JKRAramArchive::fetchResource_subroutine(u32 src, u32 srcLength, u8* dst, u3
&outLen);
return outLen;
default:
JUTException::panic_f("JKRAramArchive.cpp", 0x28F, "%s", "??? bad sequence\n");
JUTException::panic_f(__FILE__, 655, "%s", "??? bad sequence\n");
return 0;
}
}
@ -400,7 +405,7 @@ u32 JKRAramArchive::fetchResource_subroutine(u32 entryNum, u32 length, JKRHeap*
*out = tmpBufAligned;
return readLen;
default:
JUTException::panic_f("JKRAramArchive.cpp", 0x2c9, "%s", "??? bad sequence\n");
JUTException::panic_f(__FILE__, 0x2c9, "%s", "??? bad sequence\n");
return 0;
}
}
@ -420,29 +425,30 @@ asm u32 JKRAramArchive::fetchResource_subroutine(u32 param_0, u32 param_1, JKRHe
u32 JKRAramArchive::getExpandedResSize(void const* ptr) const {
if (mExpandedSize == NULL) {
return this->getResSize(ptr);
} else {
JKRArchive::SDIFileEntry* entry = this->findPtrResource(ptr);
if (entry == NULL) {
return 0xFFFFFFFF;
} else {
if (entry->getCompressFlag() == 0) {
return this->getResSize(ptr);
} else {
u32 expandSize = this->getExpandSize(entry);
if (expandSize != 0) {
return expandSize;
}
u8 tmpBuf[0x40];
SArcHeader* buf = (SArcHeader*)ALIGN_PREV((s32)&tmpBuf[0x1F], 0x20);
JKRAramToMainRam(entry->data_offset + mBlock->getAddress(), (u8*)buf, 0x20,
EXPAND_SWITCH_UNKNOWN0, 0, NULL, -1, NULL);
expandSize = JKRDecompExpandSize(buf);
// ??? casting away const?
((JKRArchive*)this)->setExpandSize(entry, expandSize);
return expandSize;
}
}
}
JKRArchive::SDIFileEntry* entry = this->findPtrResource(ptr);
if (entry == NULL) {
return 0xFFFFFFFF;
}
if (entry->getCompressFlag() == 0) {
return this->getResSize(ptr);
}
u32 expandSize = this->getExpandSize(entry);
if (expandSize != 0) {
return expandSize;
}
u8 tmpBuf[0x40];
SArcHeader* buf = (SArcHeader*)ALIGN_PREV((s32)&tmpBuf[0x1F], 0x20);
JKRAramToMainRam(entry->data_offset + mBlock->getAddress(), (u8*)buf, 0x20,
EXPAND_SWITCH_UNKNOWN0, 0, NULL, -1, NULL);
expandSize = JKRDecompExpandSize(buf);
// ??? casting away const?
((JKRArchive*)this)->setExpandSize(entry, expandSize);
return expandSize;
}
/* 802D7B90-802D7BF0 2D24D0 0060+00 1/0 0/0 0/0 .text __dt__7JKRFileFv */
@ -455,5 +461,3 @@ extern "C" asm void __dt__7JKRFileFv() {
#include "asm/JSystem/JKernel/JKRAramArchive/__dt__7JKRFileFv.s"
}
#pragma pop
/* 8039D188-8039D188 0297E8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */

View File

@ -6,12 +6,6 @@
#include "JSystem/JKernel/JKRAramBlock.h"
#include "JSystem/JKernel/JKRAramHeap.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Declarations:
//
/* 802D3304-802D3378 2CDC44 0074+00 2/2 1/1 0/0 .text __ct__12JKRAramBlockFUlUlUlUcb */
JKRAramBlock::JKRAramBlock(u32 address, u32 size, u32 freeSize, u8 groupId, bool isTempMemory)
@ -27,6 +21,7 @@ JKRAramBlock::JKRAramBlock(u32 address, u32 size, u32 freeSize, u8 groupId, bool
JKRAramBlock::~JKRAramBlock() {
JSUList<JKRAramBlock>* list = mBlockLink.getSupervisor();
JSULink<JKRAramBlock>* prev = mBlockLink.getPrev();
if (prev) {
JKRAramBlock* block = prev->getObject();
block->mFreeSize = mSize + mFreeSize + block->mFreeSize;

View File

@ -5,48 +5,20 @@
#include "JSystem/JKernel/JKRAramHeap.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "dol2asm.h"
#include "global.h"
//
// Forward References:
//
extern "C" void __ct__11JKRAramHeapFUlUl();
extern "C" void __dt__11JKRAramHeapFv();
extern "C" void alloc__11JKRAramHeapFUlQ211JKRAramHeap10EAllocMode();
extern "C" void allocFromHead__11JKRAramHeapFUl();
extern "C" void allocFromTail__11JKRAramHeapFUl();
extern "C" void getFreeSize__11JKRAramHeapFv();
extern "C" void getTotalFreeSize__11JKRAramHeapFv();
extern "C" void dump__11JKRAramHeapFv();
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();
extern "C" void __ct__11JKRDisposerFv();
extern "C" void __dt__11JKRDisposerFv();
extern "C" void __ct__12JKRAramBlockFUlUlUlUcb();
extern "C" void allocHead__12JKRAramBlockFUlUcP11JKRAramHeap();
extern "C" void allocTail__12JKRAramBlockFUlUcP11JKRAramHeap();
extern "C" void __dt__10JSUPtrListFv();
extern "C" void initiate__10JSUPtrListFv();
extern "C" void append__10JSUPtrListFP10JSUPtrLink();
extern "C" void __register_global_object();
extern "C" void _savegpr_29();
extern "C" void _restgpr_29();
@ -54,9 +26,6 @@ extern "C" void _restgpr_29();
// Declarations:
//
/* 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 */
JSUList<JKRAramBlock> JKRAramHeap::sAramList;
@ -206,9 +175,7 @@ void JKRAramHeap::dump(void) {
JSUList<JKRAramBlock>* list = &sAramList;
JSUListIterator<JKRAramBlock> iterator = list;
for (; iterator != list->getEnd(); ++iterator) {
// The debug version calls OSReport
}
for (; iterator != list->getEnd(); ++iterator) {}
unlock();
}

View File

@ -8,13 +8,7 @@
#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"
//
// Declarations:
//
/* 802D3574-802D35F4 2CDEB4 0080+00 1/1 0/0 0/0 .text
* prepareCommand__12JKRAramPieceFiUlUlUlP12JKRAramBlockPFUl_v */
@ -49,12 +43,12 @@ OSMutex JKRAramPiece::mMutex;
JKRAMCommand* JKRAramPiece::orderAsync(int direction, u32 source, u32 destination, u32 length,
JKRAramBlock* block, JKRAMCommand::AsyncCallback callback) {
lock();
if (((source & 0x1f) != 0) || ((destination & 0x1f) != 0)) {
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.");
JUTException::panic_f(__FILE__, 108, "%s", "illegal address. abort.");
}
Message* message = new (JKRHeap::getSystemHeap(), -4) Message();
@ -167,5 +161,3 @@ JKRAMCommand::~JKRAMCommand() {
if (field_0x94)
JKRHeap::free(field_0x94, NULL);
}
/* 8039D0B8-8039D0B8 029718 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */

View File

@ -9,57 +9,6 @@
#include "JSystem/JSupport/JSUFileStream.h"
#include "JSystem/JSupport/JSURandomInputStream.h"
#include "JSystem/JUtility/JUTException.h"
#include "dol2asm.h"
#include "global.h"
//
// Forward References:
//
extern "C" void create__13JKRAramStreamFl();
extern "C" void __ct__13JKRAramStreamFl();
extern "C" void __dt__13JKRAramStreamFv();
extern "C" void run__13JKRAramStreamFv();
extern "C" bool readFromAram__13JKRAramStreamFv();
extern "C" void writeToAram__13JKRAramStreamFP20JKRAramStreamCommand();
extern "C" void write_StreamToAram_Async__13JKRAramStreamFP18JSUFileInputStreamUlUlUlPUl();
extern "C" void sync__13JKRAramStreamFP20JKRAramStreamCommandi();
extern "C" void setTransBuffer__13JKRAramStreamFPUcUlP7JKRHeap();
extern "C" void __ct__20JKRAramStreamCommandFv();
extern "C" s32 getAvailable__20JSURandomInputStreamCFv(JSURandomInputStream*);
extern "C" extern char const* const JKRAramStream__stringBase0;
extern "C" u8 sMessageBuffer__13JKRAramStream[16];
extern "C" u8 sMessageQueue__13JKRAramStream[32];
extern "C" u8 sAramStreamObject__13JKRAramStream[4];
extern "C" u8 transBuffer__13JKRAramStream[4];
extern "C" u8 transSize__13JKRAramStream[4];
extern "C" u8 transHeap__13JKRAramStream[4];
//
// External References:
//
extern "C" void alloc__7JKRHeapFUliP7JKRHeap();
extern "C" void alloc__7JKRHeapFUli();
extern "C" void free__7JKRHeapFPvP7JKRHeap();
extern "C" void* __nw__FUlP7JKRHeapi();
extern "C" void __dl__FPv();
extern "C" void __ct__9JKRThreadFUlii();
extern "C" void __dt__9JKRThreadFv();
extern "C" void orderSync__12JKRAramPieceFiUlUlUlP12JKRAramBlock();
extern "C" void read__14JSUInputStreamFPvl();
extern "C" void seek__20JSURandomInputStreamFl17JSUStreamSeekFrom();
extern "C" void panic_f__12JUTExceptionFPCciPCce();
extern "C" void _savegpr_24();
extern "C" void _savegpr_26();
extern "C" void _restgpr_24();
extern "C" void _restgpr_26();
extern "C" u8 sSystemHeap__7JKRHeap[4];
extern "C" u8 sCurrentHeap__7JKRHeap[4];
//
// Declarations:
//
/* ############################################################################################## */
/* 80451408-8045140C 000908 0004+00 1/1 0/0 0/0 .sbss sAramStreamObject__13JKRAramStream
@ -97,7 +46,7 @@ JKRAramStream::JKRAramStream(long priority) : JKRThread(0xc00, 0x10, priority) {
JKRAramStream::~JKRAramStream() {}
/* 802D3C68-802D3CD8 2CE5A8 0070+00 1/0 0/0 0/0 .text run__13JKRAramStreamFv */
void* JKRAramStream::run(void) {
void* JKRAramStream::run() {
OSInitMessageQueue(&sMessageQueue, sMessageBuffer, ARRAY_SIZE(sMessageBuffer));
for (;;) {
@ -117,16 +66,13 @@ void* JKRAramStream::run(void) {
}
/* 802D3CD8-802D3CE0 2CE618 0008+00 1/1 0/0 0/0 .text readFromAram__13JKRAramStreamFv */
s32 JKRAramStream::readFromAram(void) {
s32 JKRAramStream::readFromAram() {
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->mSize;
u32 offset = command->mOffset;
u32 writtenLength = 0;
@ -134,31 +80,24 @@ s32 JKRAramStream::writeToAram(JKRAramStreamCommand* command) {
u8* buffer = command->mTransferBuffer;
u32 bufferSize = command->mTransferBufferSize;
JKRHeap* heap = command->mHeap;
if (buffer) {
if (bufferSize) {
size = bufferSize;
} else {
size = 0x8000;
}
command->mTransferBufferSize = size;
if (buffer) {
bufferSize = (bufferSize) ? bufferSize : 0x8000;
command->mTransferBufferSize = bufferSize;
command->mAllocatedTransferBuffer = false;
} else {
if (bufferSize) {
size = bufferSize;
} else {
size = 0x8000;
}
bufferSize = (bufferSize) ? bufferSize : 0x8000;
if (heap) {
buffer = (u8*)JKRAllocFromHeap(heap, size, -0x20);
buffer = (u8*)JKRAllocFromHeap(heap, bufferSize, -0x20);
command->mTransferBuffer = buffer;
} else {
buffer = (u8*)JKRAllocFromSysHeap(size, -0x20);
buffer = (u8*)JKRAllocFromSysHeap(bufferSize, -0x20);
command->mTransferBuffer = buffer;
}
command->mTransferBufferSize = size;
command->mTransferBufferSize = bufferSize;
command->mAllocatedTransferBuffer = true;
}
@ -169,20 +108,15 @@ s32 JKRAramStream::writeToAram(JKRAramStreamCommand* command) {
heap->dump();
}
JUTException::panic_f("JKRAramStream.cpp", 0xac, "%s", ":::Cannot alloc memory\n");
JUTException::panic_f(__FILE__, 172, "%s", ":::Cannot alloc memory\n");
}
if (buffer) {
((JSURandomInputStream*)command->mStream)->seek(offset, JSUStreamSeekFrom_SET);
command->mStream->seek(offset, JSUStreamSeekFrom_SET);
while (dstSize != 0) {
u32 length;
if (dstSize > size) {
length = size;
} else {
length = dstSize;
}
u32 length = (dstSize > bufferSize) ? bufferSize : dstSize;
s32 readLength = ((JSURandomInputStream*)command->mStream)->read(buffer, length);
s32 readLength = command->mStream->read(buffer, length);
if (readLength == 0) {
writtenLength = 0;
break;
@ -190,7 +124,7 @@ s32 JKRAramStream::writeToAram(JKRAramStreamCommand* command) {
JKRAramPcs(0, (u32)buffer, destination, length, NULL);
dstSize -= length;
writtenLength += writtenLength;
writtenLength += length;
destination += length;
if (command->mReturnSize) {
@ -204,30 +138,9 @@ s32 JKRAramStream::writeToAram(JKRAramStreamCommand* command) {
}
}
OSSendMessage(&command->mMessageQueue, (OSMessage)writtenLength, OS_MESSAGE_NON_BLOCKING);
OSSendMessage(&command->mMessageQueue, (OSMessage)writtenLength, OS_MESSAGE_NOBLOCK);
return writtenLength;
}
#else
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039D120 = "JKRAramStream.cpp";
SECTION_DEAD static char const* const stringBase_8039D132 = "%s";
SECTION_DEAD static char const* const stringBase_8039D135 = ":::Cannot alloc memory\n";
/* @stringBase0 padding */
SECTION_DEAD static char const* const pad_8039D14D = "\0\0";
#pragma pop
/* 802D3CE0-802D3ED0 2CE620 01F0+00 1/1 0/0 0/0 .text
* writeToAram__13JKRAramStreamFP20JKRAramStreamCommand */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
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 */
@ -322,5 +235,3 @@ JKRAramStreamCommand::JKRAramStreamCommand() {
extern "C" s32 getAvailable__20JSURandomInputStreamCFv(JSURandomInputStream* self) {
return self->getLength() - self->getPosition();
}
/* 8039D120-8039D120 029780 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */

View File

@ -7,12 +7,6 @@
#include "JSystem/JKernel/JKRHeap.h"
#include "MSL_C/MSL_Common/Src/ctype.h"
#include "MSL_C/MSL_Common/Src/string.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Declarations:
//
/* ############################################################################################## */
/* 80451420-80451428 000920 0004+04 1/1 5/5 0/0 .sbss sCurrentDirID__10JKRArchive */
@ -78,7 +72,6 @@ JKRArchive::SDIDirEntry* JKRArchive::findDirectory(const char* name, u32 directo
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);
@ -95,6 +88,7 @@ JKRArchive::SDIFileEntry* JKRArchive::findTypeResource(u32 type, const char* nam
if (type) {
CArcName arcName(name);
SDIDirEntry* dirEntry = findResType(type);
if (dirEntry) {
SDIFileEntry* fileEntry = mFiles + dirEntry->first_file_index;
for (int i = 0; i < dirEntry->num_entries; fileEntry++, i++) {
@ -115,8 +109,8 @@ JKRArchive::SDIFileEntry* JKRArchive::findFsResource(const char* name, u32 direc
CArcName arcName(&name, '/');
SDIDirEntry* 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);

View File

@ -12,12 +12,6 @@
#include "JSystem/JKernel/JKRFileLoader.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/JKernel/JKRMemArchive.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Declarations:
//
/* 802D5778-802D57E4 2D00B8 006C+00 2/2 0/0 0/0 .text check_mount_already__10JKRArchiveFlP7JKRHeap
*/
@ -283,7 +277,7 @@ u32 JKRArchive::readResource(void* buffer, u32 bufferSize, u16 id) {
/* 802D5FB4-802D603C 2D08F4 0088+00 1/0 2/0 0/0 .text removeResourceAll__10JKRArchiveFv
*/
void JKRArchive::removeResourceAll(void) {
void JKRArchive::removeResourceAll() {
if (mArcInfoBlock && mMountMode != MOUNT_MEM) {
SDIFileEntry* fileEntry = mFiles;
for (int i = 0; i < mArcInfoBlock->num_file_entries; fileEntry++, i++) {
@ -326,7 +320,7 @@ u32 JKRArchive::getResSize(const void* resource) const {
}
/* 802D610C-802D6150 2D0A4C 0044+00 0/0 1/1 0/0 .text countResource__10JKRArchiveCFv */
u32 JKRArchive::countResource(void) const {
u32 JKRArchive::countResource() const {
u32 count = 0;
for (int i = 0; i < mArcInfoBlock->num_file_entries; i++) {
if (mFiles[i].isUnknownFlag1()) {

View File

@ -4,56 +4,6 @@
//
#include "JSystem/JKernel/JKRAssertHeap.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
//
// Forward References:
//
extern "C" void __ct__13JKRAssertHeapFPvUlP7JKRHeapb();
extern "C" void __dt__13JKRAssertHeapFv();
extern "C" void create__13JKRAssertHeapFP7JKRHeap();
extern "C" void do_destroy__13JKRAssertHeapFv();
extern "C" void getHeapType__13JKRAssertHeapFv();
extern "C" bool check__13JKRAssertHeapFv();
extern "C" bool dump__13JKRAssertHeapFv();
extern "C" bool dump_sort__13JKRAssertHeapFv();
extern "C" bool do_changeGroupID__13JKRAssertHeapFUc();
extern "C" bool do_getCurrentGroupId__13JKRAssertHeapFv();
extern "C" bool do_alloc__13JKRAssertHeapFUli();
extern "C" void do_free__13JKRAssertHeapFPv();
extern "C" void do_freeAll__13JKRAssertHeapFv();
extern "C" void do_freeTail__13JKRAssertHeapFv();
extern "C" void do_fillFreeArea__13JKRAssertHeapFv();
extern "C" bool do_resize__13JKRAssertHeapFPvUl();
extern "C" bool do_getSize__13JKRAssertHeapFPv();
extern "C" bool do_getFreeSize__13JKRAssertHeapFv();
extern "C" bool do_getMaxFreeBlock__13JKRAssertHeapFv();
extern "C" bool do_getTotalFreeSize__13JKRAssertHeapFv();
//
// External References:
//
extern "C" void __ct__7JKRHeapFPvUlP7JKRHeapb();
extern "C" void __dt__7JKRHeapFv();
extern "C" void alloc__7JKRHeapFUliP7JKRHeap();
extern "C" void callAllDisposer__7JKRHeapFv();
extern "C" void dispose__7JKRHeapFv();
extern "C" void __dl__FPv();
extern "C" void state_register__7JKRHeapCFPQ27JKRHeap6TStateUl();
extern "C" void state_compare__7JKRHeapCFRCQ27JKRHeap6TStateRCQ27JKRHeap6TState();
extern "C" void state_dump__7JKRHeapCFRCQ27JKRHeap6TState();
extern "C" u8 sRootHeap__7JKRHeap[4];
//
// Declarations:
//
/* 802D12C4-802D1300 2CBC04 003C+00 1/1 0/0 0/0 .text __ct__13JKRAssertHeapFPvUlP7JKRHeapb */
JKRAssertHeap::JKRAssertHeap(void* data, unsigned long size, JKRHeap* parent, bool errorFlag)
@ -83,17 +33,17 @@ JKRAssertHeap* JKRAssertHeap::create(JKRHeap* parent) {
}
/* 802D13D8-802D1408 2CBD18 0030+00 1/0 0/0 0/0 .text do_destroy__13JKRAssertHeapFv */
void JKRAssertHeap::do_destroy(void) {
void JKRAssertHeap::do_destroy() {
this->~JKRAssertHeap();
}
/* 802D1408-802D1414 2CBD48 000C+00 1/0 0/0 0/0 .text getHeapType__13JKRAssertHeapFv */
u32 JKRAssertHeap::getHeapType(void) {
u32 JKRAssertHeap::getHeapType() {
return 'ASTH';
}
/* 802D1414-802D141C 2CBD54 0008+00 1/0 0/0 0/0 .text check__13JKRAssertHeapFv */
bool JKRAssertHeap::check(void) {
bool JKRAssertHeap::check() {
return true;
}
@ -114,7 +64,7 @@ s32 JKRAssertHeap::do_changeGroupID(u8) {
}
/* 802D1434-802D143C 2CBD74 0008+00 1/0 0/0 0/0 .text do_getCurrentGroupId__13JKRAssertHeapFv */
u8 JKRAssertHeap::do_getCurrentGroupId(void) {
u8 JKRAssertHeap::do_getCurrentGroupId() {
return 0;
}
@ -124,25 +74,17 @@ void* JKRAssertHeap::do_alloc(u32, int) {
}
/* 802D1444-802D1448 2CBD84 0004+00 1/0 0/0 0/0 .text do_free__13JKRAssertHeapFPv */
void JKRAssertHeap::do_free(void* param_0) {
/* empty function */
}
void JKRAssertHeap::do_free(void* param_0) {}
/* 802D1448-802D144C 2CBD88 0004+00 1/0 0/0 0/0 .text do_freeAll__13JKRAssertHeapFv */
void JKRAssertHeap::do_freeAll() {
/* empty function */
}
void JKRAssertHeap::do_freeAll() {}
/* 802D144C-802D1450 2CBD8C 0004+00 1/0 0/0 0/0 .text do_freeTail__13JKRAssertHeapFv */
void JKRAssertHeap::do_freeTail() {
/* empty function */
}
void JKRAssertHeap::do_freeTail() {}
/* 802D1450-802D1454 2CBD90 0004+00 1/0 0/0 0/0 .text do_fillFreeArea__13JKRAssertHeapFv
*/
void JKRAssertHeap::do_fillFreeArea() {
/* empty function */
}
void JKRAssertHeap::do_fillFreeArea() {}
/* 802D1454-802D145C 2CBD94 0008+00 1/0 0/0 0/0 .text do_resize__13JKRAssertHeapFPvUl */
s32 JKRAssertHeap::do_resize(void*, u32) {
@ -156,16 +98,16 @@ s32 JKRAssertHeap::do_getSize(void*) {
/* 802D1464-802D146C 2CBDA4 0008+00 1/0 0/0 0/0 .text do_getFreeSize__13JKRAssertHeapFv
*/
s32 JKRAssertHeap::do_getFreeSize(void) {
s32 JKRAssertHeap::do_getFreeSize() {
return 0;
}
/* 802D146C-802D1474 2CBDAC 0008+00 1/0 0/0 0/0 .text do_getMaxFreeBlock__13JKRAssertHeapFv */
void* JKRAssertHeap::do_getMaxFreeBlock(void) {
void* JKRAssertHeap::do_getMaxFreeBlock() {
return NULL;
}
/* 802D1474-802D147C 2CBDB4 0008+00 1/0 0/0 0/0 .text do_getTotalFreeSize__13JKRAssertHeapFv */
s32 JKRAssertHeap::do_getTotalFreeSize(void) {
s32 JKRAssertHeap::do_getTotalFreeSize() {
return 0;
}

View File

@ -3,122 +3,15 @@
// Translation Unit: JKRCompArchive
//
// #include "JSystem/JKernel/JKRCompArchive.h"
#include "JSystem/JKernel/JKRCompArchive.h"
#include "JSystem/JKernel/JKRAram.h"
#include "JSystem/JKernel/JKRDvdAramRipper.h"
#include "JSystem/JKernel/JKRDvdArchive.h"
#include "JSystem/JKernel/JKRMemArchive.h"
#include "JSystem/JUtility/JUTException.h"
#include "MSL_C/MSL_Common/Src/string.h"
#include "MSL_C/math.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 JKRMemArchive {
/* 802D6F5C */ void fetchResource_subroutine(u8*, u32, u8*, u32, int);
};
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 JKRDvdArchive {
/* 802D8474 */ void fetchResource_subroutine(s32, u32, u32, JKRHeap*, int, int, u8**);
/* 802D826C */ void fetchResource_subroutine(s32, u32, u32, u8*, u32, int, int);
};
struct JKRDvdAramRipper {
/* 802DA874 */ void loadToAram(s32, u32, JKRExpandSwitch, u32, u32, u32*);
};
struct JKRDecomp {
/* 802DB988 */ void orderSync(u8*, u8*, u32, u32);
};
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*);
/* 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 JKRCompArchive {
/* 802D87D4 */ JKRCompArchive(s32, JKRArchive::EMountDirection);
/* 802D887C */ ~JKRCompArchive();
/* 802D89BC */ void open(s32);
/* 802D8F40 */ void fetchResource(JKRArchive::SDIFileEntry*, u32*);
/* 802D90C0 */ void fetchResource(void*, u32, JKRArchive::SDIFileEntry*, u32*);
/* 802D9260 */ void removeResourceAll();
/* 802D92F4 */ void removeResource(void*);
/* 802D9360 */ void getExpandedResSize(void const*) const;
};
struct JKRAramHeap {
struct EAllocMode {};
/* 802D2FBC */ void alloc(u32, JKRAramHeap::EAllocMode);
};
struct JKRAramArchive {
/* 802D7858 */ void fetchResource_subroutine(u32, u32, u8*, u32, int);
/* 802D7914 */ void fetchResource_subroutine(u32, u32, JKRHeap*, int, u8**);
};
struct JKRAram {
/* 802D233C */ void mainRamToAram(u8*, u32, u32, JKRExpandSwitch, u32, JKRHeap*, int, u32*);
/* 802D25B4 */ void aramToMainRam(u32, u8*, u32, JKRExpandSwitch, u32, JKRHeap*, int, u32*);
static u8 sAramObject[4];
};
//
// Forward References:
@ -138,7 +31,6 @@ extern "C" extern char const* const JKRCompArchive__stringBase0;
// External References:
//
SECTION_INIT void memset();
extern "C" void alloc__7JKRHeapFUliP7JKRHeap();
extern "C" void alloc__7JKRHeapFUli();
extern "C" void free__7JKRHeapFPvP7JKRHeap();
@ -177,7 +69,6 @@ extern "C" void orderSync__9JKRDecompFPUcPUcUlUl();
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_28();
@ -186,7 +77,6 @@ extern "C" void _restgpr_25();
extern "C" void _restgpr_26();
extern "C" void _restgpr_28();
extern "C" void _restgpr_29();
extern "C" void abs();
extern "C" u8 sVolumeList__13JKRFileLoader[12];
extern "C" u8 sSystemHeap__7JKRHeap[4];
extern "C" u8 sAramObject__7JKRAram[4];
@ -195,57 +85,60 @@ extern "C" u8 sAramObject__7JKRAram[4];
// Declarations:
//
/* ############################################################################################## */
/* 803CC3E8-803CC438 029508 0050+00 2/2 0/0 0/0 .data __vt__14JKRCompArchive */
SECTION_DATA extern void* __vt__14JKRCompArchive[20] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__14JKRCompArchiveFv,
(void*)unmount__13JKRFileLoaderFv,
(void*)becomeCurrent__10JKRArchiveFPCc,
(void*)getResource__10JKRArchiveFPCc,
(void*)getResource__10JKRArchiveFUlPCc,
(void*)readResource__10JKRArchiveFPvUlPCc,
(void*)readResource__10JKRArchiveFPvUlUlPCc,
(void*)removeResourceAll__14JKRCompArchiveFv,
(void*)removeResource__14JKRCompArchiveFPv,
(void*)detachResource__10JKRArchiveFPv,
(void*)getResSize__10JKRArchiveCFPCv,
(void*)countFile__10JKRArchiveCFPCc,
(void*)getFirstFile__10JKRArchiveCFPCc,
(void*)getExpandedResSize__14JKRCompArchiveCFPCv,
(void*)fetchResource__14JKRCompArchiveFPQ210JKRArchive12SDIFileEntryPUl,
(void*)fetchResource__14JKRCompArchiveFPvUlPQ210JKRArchive12SDIFileEntryPUl,
(void*)setExpandSize__10JKRArchiveFPQ210JKRArchive12SDIFileEntryUl,
(void*)getExpandSize__10JKRArchiveCFPQ210JKRArchive12SDIFileEntry,
};
/* 802D87D4-802D887C 2D3114 00A8+00 0/0 1/1 0/0 .text
* __ct__14JKRCompArchiveFlQ210JKRArchive15EMountDirection */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRCompArchive::JKRCompArchive(s32 param_0, JKRArchive::EMountDirection param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRCompArchive/__ct__14JKRCompArchiveFlQ210JKRArchive15EMountDirection.s"
JKRCompArchive::JKRCompArchive(s32 entryNum, JKRArchive::EMountDirection eMountDirection)
: JKRArchive(entryNum, MOUNT_COMP) {
mMountDirection = eMountDirection;
if (!open(entryNum)) {
return;
}
mVolumeType = 'RARC';
mVolumeName = &mStringTable[mNodes->name_offset];
sVolumeList.prepend(&mFileLoaderLink);
mIsMounted = true;
}
#pragma pop
/* 802D887C-802D89BC 2D31BC 0140+00 1/0 0/0 0/0 .text __dt__14JKRCompArchiveFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRCompArchive::~JKRCompArchive() {
nofralloc
#include "asm/JSystem/JKernel/JKRCompArchive/__dt__14JKRCompArchiveFv.s"
JKRCompArchive::~JKRCompArchive() {
if (mArcInfoBlock != NULL) {
SDIFileEntry* file = mFiles;
for (int i = 0; i < mArcInfoBlock->num_file_entries; i++) {
if (!((file->type_flags_and_name_offset >> 0x18) & 0x10) && file->data != NULL) {
JKRFreeToHeap(mHeap, file->data);
}
file++;
}
JKRFreeToHeap(mHeap, mArcInfoBlock);
mArcInfoBlock = NULL;
}
if (field_0x68 != NULL) {
delete field_0x68;
}
if (mExpandedSize != NULL) {
i_JKRFree(mExpandedSize);
mExpandedSize = NULL;
}
if (field_0x70 != NULL) {
delete field_0x70;
}
sVolumeList.remove(&mFileLoaderLink);
mIsMounted = false;
}
#pragma pop
/* 802D89BC-802D8F40 2D32FC 0584+00 1/1 0/0 0/0 .text open__14JKRCompArchiveFl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRCompArchive::open(s32 param_0) {
asm bool JKRCompArchive::open(s32 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRCompArchive/open__14JKRCompArchiveFl.s"
}
@ -256,7 +149,7 @@ asm void JKRCompArchive::open(s32 param_0) {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRCompArchive::fetchResource(JKRArchive::SDIFileEntry* param_0, u32* param_1) {
asm void* JKRCompArchive::fetchResource(JKRArchive::SDIFileEntry* param_0, u32* param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRCompArchive/fetchResource__14JKRCompArchiveFPQ210JKRArchive12SDIFileEntryPUl.s"
}
@ -276,33 +169,45 @@ SECTION_DEAD static char const* const stringBase_8039D236 = "illegal archive.";
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRCompArchive::fetchResource(void* param_0, u32 param_1,
JKRArchive::SDIFileEntry* param_2, u32* param_3) {
asm void* JKRCompArchive::fetchResource(void* param_0, u32 param_1,
JKRArchive::SDIFileEntry* param_2, u32* param_3) {
nofralloc
#include "asm/JSystem/JKernel/JKRCompArchive/fetchResource__14JKRCompArchiveFPvUlPQ210JKRArchive12SDIFileEntryPUl.s"
}
#pragma pop
/* 802D9260-802D92F4 2D3BA0 0094+00 1/0 0/0 0/0 .text removeResourceAll__14JKRCompArchiveFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRCompArchive::removeResourceAll() {
nofralloc
#include "asm/JSystem/JKernel/JKRCompArchive/removeResourceAll__14JKRCompArchiveFv.s"
void JKRCompArchive::removeResourceAll() {
if (mArcInfoBlock != NULL && mMountMode != MOUNT_MEM) {
SDIFileEntry* fileEntry = mFiles;
for (int i = 0; i < mArcInfoBlock->num_file_entries; i++) {
int tmp = fileEntry->type_flags_and_name_offset >> 0x18;
if (fileEntry->data != NULL) {
if (!(tmp & 0x10)) {
JKRFreeToHeap(mHeap, fileEntry->data);
}
fileEntry->data = NULL;
}
}
}
}
#pragma pop
/* 802D92F4-802D9360 2D3C34 006C+00 1/0 0/0 0/0 .text removeResource__14JKRCompArchiveFPv
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRCompArchive::removeResource(void* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRCompArchive/removeResource__14JKRCompArchiveFPv.s"
bool JKRCompArchive::removeResource(void* resource) {
SDIFileEntry* fileEntry = findPtrResource(resource);
if (!fileEntry)
return false;
if (!((fileEntry->type_flags_and_name_offset >> 0x18) & 0x10)) {
JKRFreeToHeap(mHeap, resource);
}
fileEntry->data = NULL;
return true;
}
#pragma pop
/* ############################################################################################## */
/* 8039D220-8039D220 029880 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
@ -317,7 +222,7 @@ SECTION_DEAD static char const* const pad_8039D259 = "\0\0\0\0\0\0";
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRCompArchive::getExpandedResSize(void const* param_0) const {
asm u32 JKRCompArchive::getExpandedResSize(void const* param_0) const {
nofralloc
#include "asm/JSystem/JKernel/JKRCompArchive/getExpandedResSize__14JKRCompArchiveCFPCv.s"
}

View File

@ -5,10 +5,9 @@
#include "JSystem/JKernel/JKRDecomp.h"
#include "JSystem/JKernel/JKRAramPiece.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/JKernel/JKRArchive.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Forward References:
@ -80,7 +79,7 @@ JKRDecomp::JKRDecomp(long priority) : JKRThread(0x800, 0x10, priority) {
JKRDecomp::~JKRDecomp() {}
/* 802DB790-802DB858 2D60D0 00C8+00 1/0 0/0 0/0 .text run__9JKRDecompFv */
void* JKRDecomp::run(void) {
void* JKRDecomp::run() {
OSInitMessageQueue(&sMessageQueue, sMessageBuffer, 8);
for (;;) {
OSMessage message;
@ -172,26 +171,23 @@ void JKRDecomp::decode(u8* srcBuffer, u8* dstBuffer, u32 srcLength, u32 dstLengt
}
/* 802DBA58-802DBC14 2D6398 01BC+00 1/1 0/0 0/0 .text decodeSZP__9JKRDecompFPUcPUcUlUl */
// All instructions match. Wrong registers are used.
// 2 extra mr instructions
#ifdef NONMATCHING
void JKRDecomp::decodeSZP(u8* src, u8* dst, u32 srcLength, u32 dstLength) {
u32 decodedSize;
// s32 decodedSize;
s32 srcChunkOffset;
s32 count;
u32 count;
s32 dstOffset;
u32 length;
u32 counter;
u32 srcDataOffset;
u32 linkTableOffset;
s32 linkInfo;
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);
s32 decodedSize = read_big_endian_u32(src + 4);
s32 linkTableOffset = read_big_endian_u32(src + 8);
s32 srcDataOffset = read_big_endian_u32(src + 12);
dstOffset = 0;
counter = 0;
u32 counter = 0;
srcChunkOffset = 16;
u32 chunkBits;
@ -204,55 +200,50 @@ void JKRDecomp::decodeSZP(u8* src, u8* dst, u32 srcLength, u32 dstLength) {
do {
if (counter == 0) {
chunkBits = read_big_endian_u32(src + srcChunkOffset);
srcChunkOffset += 4;
counter = 32;
srcChunkOffset += sizeof(u32);
counter = sizeof(u32) * 8;
}
if (chunkBits & 0x80000000) {
if (dstLength == 0) {
dst[dstOffset] = src[srcDataOffset];
length--;
if (length == 0) {
if (length == 0)
return;
}
} else {
dstLength--;
}
dstOffset++;
srcDataOffset++;
} else {
u32 linkInfo = read_big_endian_u16(src + linkTableOffset);
linkTableOffset += 2;
linkInfo = src[linkTableOffset] << 8 | src[linkTableOffset + 1];
linkTableOffset += sizeof(u16);
offset = dstOffset - (linkInfo & 0xFFF);
count = ((s32)linkInfo) >> 12;
count = (linkInfo >> 12);
if (count == 0) {
count = (u32)src[srcDataOffset] + 0x12;
srcDataOffset++;
} else {
} else
count += 2;
}
if (count > decodedSize - dstOffset) {
if ((s32)count > decodedSize - dstOffset)
count = decodedSize - dstOffset;
}
for (i = 0; i < count; i++, dstOffset++, offset++) {
for (i = 0; i < (s32)count; i++, dstOffset++, offset++) {
if (dstLength == 0) {
dst[dstOffset] = dst[offset - 1];
length--;
if (length == 0) {
if (length == 0)
return;
}
} else {
} else
dstLength--;
}
}
}
chunkBits <<= 1;
counter--;
} while ((s32)dstLength < decodedSize);
} while (dstOffset < decodedSize);
}
#else
#pragma push
@ -267,19 +258,20 @@ asm void JKRDecomp::decodeSZP(u8* param_0, u8* param_1, u32 param_2, u32 param_3
/* 802DBC14-802DBCF8 2D6554 00E4+00 1/1 0/0 0/0 .text decodeSZS__9JKRDecompFPUcPUcUlUl */
#ifdef NONMATCHING
void JKRDecomp::decodeSZS(u8* src_buffer, u8* dst_buffer, u32 param_3, u32 param_4) {
int copyByteCount;
void JKRDecomp::decodeSZS(u8* src_buffer, u8* dst_buffer, u32 srcSize, u32 dstSize) {
u8* decompEnd;
u8* copyStart;
int chunkBitsLeft = 0;
int chunkBits;
decompEnd = dst_buffer + *(int*)(src_buffer + 4) - param_4;
if (param_3 == 0) {
s32 copyByteCount;
s32 chunkBitsLeft = 0;
s32 chunkBits;
decompEnd = dst_buffer + *(int*)(src_buffer + 4) - dstSize;
if (srcSize == 0)
return;
}
if (param_4 > *(u32*)src_buffer) {
if (dstSize > *(u32*)src_buffer)
return;
}
u8* curSrcPos = src_buffer + 0x10;
do {
if (chunkBitsLeft == 0) {
@ -288,19 +280,18 @@ void JKRDecomp::decodeSZS(u8* src_buffer, u8* dst_buffer, u32 param_3, u32 param
curSrcPos++;
}
if ((chunkBits & 0x80) != 0) {
if (param_4 == 0) {
if (dstSize == 0) {
*dst_buffer = *curSrcPos;
param_3--;
srcSize--;
dst_buffer++;
if (param_3 == 0) {
if (srcSize == 0)
return;
}
} else {
param_4--;
dstSize--;
}
curSrcPos++;
} else {
int curVal = *curSrcPos;
u8 curVal = *curSrcPos;
// load is inversed
copyStart = dst_buffer - ((curVal & 0xF) << 8 | curSrcPos[1]);
// copyByteCount = ;
@ -313,15 +304,14 @@ void JKRDecomp::decodeSZS(u8* src_buffer, u8* dst_buffer, u32 param_3, u32 param
copyByteCount = (curVal >> 4) + 2;
}
do {
if (param_4 == 0) {
if (dstSize == 0) {
*dst_buffer = *(copyStart - 1);
param_3--;
srcSize--;
dst_buffer++;
if (param_3 == 0) {
if (srcSize == 0)
return;
}
} else {
param_4--;
dstSize--;
}
copyByteCount--;
copyStart++;
@ -348,13 +338,16 @@ JKRCompression JKRDecomp::checkCompressed(u8* src) {
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;
}

View File

@ -5,12 +5,6 @@
#include "JSystem/JKernel/JKRDisposer.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Declarations:
//
/* 802D147C-802D14E4 2CBDBC 0068+00 0/0 12/12 0/0 .text __ct__11JKRDisposerFv */
JKRDisposer::JKRDisposer() : mLink(this) {

View File

@ -7,10 +7,10 @@
#include "JSystem/JKernel/JKRAram.h"
#include "JSystem/JKernel/JKRAramStream.h"
#include "JSystem/JKernel/JKRDvdFile.h"
// #include "JSystem/JSupport/JSUFileStream.h"
#include "JSystem/JSupport/JSUFileStream.h"
#include "JSystem/JSupport/JSUList.h"
#include "dol2asm.h"
#include "dolphin/os/OSCache.h"
#include "dolphin/types.h"
#include "dolphin/vi/vi.h"
#include "global.h"
@ -23,16 +23,6 @@ struct JSUList__template10 {
/* 802DB62C */ void func_802DB62C(void* _this);
};
struct JSUInputStream {
/* 802DC23C */ ~JSUInputStream();
};
struct JSUFileInputStream {
/* 802DADD8 */ ~JSUFileInputStream();
/* 802DC638 */ JSUFileInputStream(JKRFile*);
int padding[4];
};
struct JKRAramPiece {
/* 802D3838 */ void orderSync(int, u32, u32, u32, JKRAramBlock*);
};
@ -120,14 +110,17 @@ JKRAramBlock* JKRDvdAramRipper::loadToAram(JKRDvdFile* dvdFile, u32 param_1,
JKRADCommand* command =
loadToAram_Async(dvdFile, param_1, param_2, NULL, param_3, param_4, param_5);
syncAram(command, 0);
if (command->field_0x48 < 0) {
delete command;
return NULL;
}
if (param_1) {
delete command;
return (JKRAramBlock*)-1;
}
JKRAramBlock* result = command->mBlock;
delete command;
return result;
@ -147,10 +140,12 @@ JKRADCommand* JKRDvdAramRipper::loadToAram_Async(JKRDvdFile* dvdFile, u32 param_
command->field_0x3c = param_4;
command->field_0x40 = param_5;
command->field_0x44 = param_6;
if (!callCommand_Async(command)) {
delete command;
return NULL;
}
return command;
}
@ -176,6 +171,7 @@ JKRADCommand* JKRDvdAramRipper::callCommand_Async(JKRADCommand* command) {
if (command->field_0x44) {
*command->field_0x44 = 0;
}
if (dvdFile->field_0x50) {
bVar1 = false;
} else {
@ -194,17 +190,21 @@ JKRADCommand* JKRDvdAramRipper::callCommand_Async(JKRADCommand* command) {
if (DVDReadPrio(&dvdFile->mFileInfo, bufPtr, 0x20, 0, 2) >= 0) {
break;
}
if (data_804508D0 == 0) {
delete stream;
return NULL;
}
VIWaitForRetrace();
}
DCInvalidateRange(bufPtr, 0x20);
JKRCompression tmpCompression = JKRDecomp::checkCompressed(bufPtr);
if (tmpCompression == 3) {
tmpCompression = 0;
}
compression = tmpCompression;
uncompressedSize =
bufPtr[4] << 0x18 | bufPtr[5] << 0x10 | bufPtr[6] << 0x08 | bufPtr[7];
@ -212,9 +212,11 @@ JKRADCommand* JKRDvdAramRipper::callCommand_Async(JKRADCommand* command) {
uncompressedSize = command->field_0x40;
}
}
if (compression == 0) {
command->field_0x34 = 0;
}
if (command->field_0x34 == 1) {
if (command->field_0x2c == 0 && command->mBlock == NULL) {
command->mBlock =
@ -224,9 +226,11 @@ JKRADCommand* JKRDvdAramRipper::callCommand_Async(JKRADCommand* command) {
}
dvdFile->mBlock = command->mBlock;
}
if (command->mBlock) {
command->field_0x2c = command->mBlock->mAddress;
}
if (command->field_0x2c == 0) {
dvdFile->field_0x50 = NULL;
return NULL;
@ -235,14 +239,17 @@ JKRADCommand* JKRDvdAramRipper::callCommand_Async(JKRADCommand* command) {
if (command->field_0x2c == 0 && !command->mBlock) {
command->mBlock = JKRAram::getAramHeap()->alloc(fileSize, JKRAramHeap::HEAD);
}
if (command->mBlock) {
command->field_0x2c = command->mBlock->mAddress;
}
if (command->field_0x2c == 0) {
dvdFile->field_0x50 = NULL;
return NULL;
}
}
if (compression == 0) {
command->mStreamCommand = JKRAramStream::write_StreamToAram_Async(
stream, command->field_0x2c, fileSize - command->field_0x3c, command->field_0x3c,
@ -257,12 +264,14 @@ JKRADCommand* JKRDvdAramRipper::callCommand_Async(JKRADCommand* command) {
uncompressedSize, command->field_0x3c, 0,
command->field_0x44);
}
if (!command->field_0x38) {
(*((JSUList<JKRADCommand>*)&sDvdAramAsyncList)).append(&command->mLink);
} else {
command->field_0x38((u32)command);
}
}
OSUnlockMutex(&dvdFile->mMutex2);
return bVar1 == true ? command : NULL;
}
@ -281,7 +290,8 @@ asm JKRADCommand* JKRDvdAramRipper::callCommand_Async(JKRADCommand* command) {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JSUFileInputStream::~JSUFileInputStream() {
// asm JSUFileInputStream::~JSUFileInputStream() {
extern "C" asm void __dt__18JSUFileInputStreamFv() {
nofralloc
#include "asm/JSystem/JKernel/JKRDvdAramRipper/__dt__18JSUFileInputStreamFv.s"
}
@ -289,22 +299,27 @@ asm JSUFileInputStream::~JSUFileInputStream() {
/* 802DAE48-802DAF1C 2D5788 00D4+00 1/1 0/0 0/0 .text
* syncAram__16JKRDvdAramRipperFP12JKRADCommandi */
// should match when other functions using sDvdAramAsyncList are decompiled
#ifdef NONMATCHING
bool JKRDvdAramRipper::syncAram(JKRADCommand* command, int param_1) {
JKRDvdFile* dvdFile = command->mDvdFile;
OSLockMutex(&dvdFile->mMutex2);
if (command->mStreamCommand) {
JKRAramStreamCommand* var1 = JKRAramStream::sync(command->mStreamCommand, param_1);
command->field_0x48 = -(var1 == NULL);
if (param_1 != 0 && var1 == NULL) {
OSUnlockMutex(&dvdFile->mMutex2);
return false;
}
}
(*((JSUList<JKRADCommand>*)&sDvdAramAsyncList)).remove(&command->mLink);
if (command->mStreamCommand) {
delete command->mStreamCommand;
}
delete dvdFile->mFileStream;
dvdFile->field_0x50 = NULL;
OSUnlockMutex(&dvdFile->mMutex2);
@ -405,6 +420,7 @@ int JKRDecompressFromDVDToAram(JKRDvdFile* dvdFile, u32 param_1, u32 fileSize, u
OSInitMutex(&decompMutex);
data_804514A4 = true;
}
OSRestoreInterrupts(level);
OSLockMutex(&decompMutex);
u32 bufferSize = JKRDvdAramRipper::sSZSBufferSize;
@ -478,8 +494,7 @@ static asm int dmaBufferFlush(u32 param_0) {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void __sinit_JKRDvdAramRipper_cpp() {
nofralloc
asm void __sinit_JKRDvdAramRipper_cpp(){nofralloc
#include "asm/JSystem/JKernel/JKRDvdAramRipper/__sinit_JKRDvdAramRipper_cpp.s"
}
#pragma pop

View File

@ -11,6 +11,7 @@
#include "MSL_C/math.h"
#include "MSL_C/string.h"
#include "dol2asm.h"
#include "dolphin/os/OS.h"
#include "global.h"
//
@ -74,11 +75,6 @@ extern "C" void _restgpr_29();
extern "C" u8 sVolumeList__13JKRFileLoader[12];
extern "C" u8 sSystemHeap__7JKRHeap[4];
extern "C" {
void DCInvalidateRange(void*, u32);
void DCStoreRange(void*, u32);
}
//
// Declarations:
//
@ -226,6 +222,7 @@ void* JKRDvdArchive::fetchResource(SDIFileEntry* fileEntry, u32* returnSize) {
if (resourceSize == 0) {
return NULL;
}
fileEntry->data = resourcePtr;
if (fileCompression == COMPRESSION_YAZ0) {
setExpandSize(fileEntry, *returnSize);
@ -346,12 +343,11 @@ u32 JKRDvdArchive::fetchResource_subroutine(s32 entryNum, u32 offset, u32 size,
}
case COMPRESSION_YAY0: {
JUTException::panic_f("JKRDvdArchive.cpp", 0x289, "%s",
"Sorry, not applied for SZP archive.\n");
JUTException::panic_f(__FILE__, 649, "%s", "Sorry, not applied for SZP archive.\n");
}
default: {
JUTException::panic_f("JKRDvdArchive.cpp", 0x28d, "%s", "??? bad sequence\n");
JUTException::panic_f(__FILE__, 653, "%s", "??? bad sequence\n");
return 0;
}
}
@ -414,12 +410,11 @@ u32 JKRDvdArchive::fetchResource_subroutine(s32 entryNum, u32 offset, u32 size,
}
case COMPRESSION_YAY0: {
JUTException::panic_f("JKRDvdArchive.cpp", 0x2f2, "%s",
"Sorry, not applied SZP archive.\n");
JUTException::panic_f(__FILE__, 754, "%s", "Sorry, not applied SZP archive.\n");
}
default: {
JUTException::panic_f("JKRDvdArchive.cpp", 0x2f6, "%s", "??? bad sequence\n");
JUTException::panic_f(__FILE__, 758, "%s", "??? bad sequence\n");
return 0;
}
}
@ -461,5 +456,3 @@ u32 JKRDvdArchive::getExpandedResSize(const void* resource) const {
return resourceSize;
}
/* 8039D1B0-8039D1B0 029810 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */

View File

@ -9,10 +9,6 @@
#include "dol2asm.h"
#include "global.h"
//
// Declarations:
//
/* 8043436C-80434378 06108C 000C+00 4/4 0/0 0/0 .bss sDvdList__10JKRDvdFile */
JSUList<JKRDvdFile> JKRDvdFile::sDvdList;
@ -94,7 +90,7 @@ void JKRDvdFile::close() {
mIsAvailable = false;
getDvdList().remove(&mDvdLink);
} else {
JUTException::panic_f("JKRDvdFile.cpp", 0xd5, "%s", "cannot close DVD file\n");
JUTException::panic_f(__FILE__, 213, "%s", "cannot close DVD file\n");
}
}
}
@ -105,7 +101,7 @@ s32 JKRDvdFile::readData(void* param_1, long length, long param_3) {
// The assert condition gets stringified as "( length & 0x1f ) == 0",
// with out disabling clang-format the spaces in the condition will
// get removed and the string will be incorrect.
JUT_ASSERT("JKRDvdFile.cpp", 0xee, ( length & 0x1f ) == 0);
JUT_ASSERT(__FILE__, 238, ( length & 0x1f ) == 0);
/* clang-format on */
OSLockMutex(&mMutex1);
@ -155,5 +151,3 @@ void JKRDvdFile::doneProcess(long id, DVDFileInfo* fileInfo) {
s32 JKRDvdFile::getFileSize(void) const {
return mFileInfo.length;
}
/* 8039D260-8039D260 0298C0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */

View File

@ -9,7 +9,6 @@
#include "MSL_C/MSL_Common/Src/string.h"
#include "dol2asm.h"
#include "dolphin/os/OSCache.h"
#include "dolphin/types.h"
#include "global.h"
//
@ -107,7 +106,7 @@ void* JKRDvdRipper::loadToMainRAM(s32 entryNumber, u8* dst, JKRExpandSwitch expa
/* 8039D290-8039D290 0298F0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039D290 = "JKRDvdRipper.cpp";
SECTION_DEAD static char const* const stringBase_8039D290 = __FILE__;
SECTION_DEAD static char const* const stringBase_8039D2A1 = "%s";
SECTION_DEAD static char const* const stringBase_8039D2A4 = "Sorry, not applied for SZP archive.";
SECTION_DEAD static char const* const stringBase_8039D2C8 = "Not support SZP with offset read";
@ -151,21 +150,26 @@ void* JKRDvdRipper::loadToMainRAM(JKRDvdFile* dvdFile, u8* dst, JKRExpandSwitch
}
r26 = (bufPtr[4] << 0x18) | (bufPtr[5] << 0x10) | (bufPtr[6] << 0x08) | (bufPtr[7]);
}
if (pCompression) {
*pCompression = compression;
}
if (expandSwitch == EXPAND_SWITCH_UNKNOWN1 && compression) {
if (dstLength != 0 && r26 > dstLength) {
r26 = dstLength;
}
if (!dst) {
dst = (u8*)JKRHeap::alloc(r26, allocDirection == ALLOC_DIRECTION_FORWARD ? 0x20 : -0x20,
heap);
did_alloc = true;
}
if (!dst) {
return NULL;
}
if (compression == 1) {
mem = (u8*)JKRHeap::alloc(fileSizeAligned, 0x20, heap);
if (mem == NULL && did_alloc == true) {
@ -183,10 +187,12 @@ void* JKRDvdRipper::loadToMainRAM(JKRDvdFile* dvdFile, u8* dst, JKRExpandSwitch
var2, allocDirection == ALLOC_DIRECTION_FORWARD ? 0x20 : -0x20, heap);
did_alloc = true;
}
if (!dst) {
return NULL;
}
}
if (compression == 0) {
int count = 0;
if (offset != 0) {
@ -197,31 +203,38 @@ void* JKRDvdRipper::loadToMainRAM(JKRDvdFile* dvdFile, u8* dst, JKRExpandSwitch
if (count >= 0) {
break;
}
if (count == -3 || !data_804508C8) {
if (did_alloc == true) {
JKRHeap::free(dst, NULL);
}
return NULL;
}
VIWaitForRetrace();
}
DCInvalidateRange(bufPtr, 0x20);
count = JKRDecomp::checkCompressed(bufPtr);
if (count == 3) {
count = 0;
}
}
if (count == 0 || expandSwitch == EXPAND_SWITCH_UNKNOWN2 ||
expandSwitch == EXPAND_SWITCH_UNKNOWN0) {
expandSwitch == EXPAND_SWITCH_UNKNOWN0)
{
fileSizeAligned -= offset;
if (dstLength != 0 && dstLength < fileSizeAligned) {
fileSizeAligned = dstLength;
}
while (true) {
count = DVDReadPrio(dvdFile->getFileInfo(), dst, fileSizeAligned, offset, 2);
if (count >= 0) {
break;
}
if (count == -3 || !data_804508C8) {
if (did_alloc == true) {
JKRHeap::free(dst, NULL);
@ -230,6 +243,7 @@ void* JKRDvdRipper::loadToMainRAM(JKRDvdFile* dvdFile, u8* dst, JKRExpandSwitch
}
VIWaitForRetrace();
}
if (param_8) {
*param_8 = fileSizeAligned;
}
@ -237,24 +251,25 @@ void* JKRDvdRipper::loadToMainRAM(JKRDvdFile* dvdFile, u8* dst, JKRExpandSwitch
} else if (count == 2) {
JKRDecompressFromDVD(dvdFile, dst, fileSizeAligned, dstLength, 0, offset, param_8);
} else {
JUTException::panic_f("JKRDvdRipper.cpp", 0x143, "%s",
"Sorry, not applied for SZP archive.");
JUTException::panic_f(__FILE__, 0x143, "%s", "Sorry, not applied for SZP archive.");
}
return dst;
} else if (compression == 1) {
if (offset) {
JUTException::panic_f("JKRDvdRipper.cpp", 0x14d, "%s",
"Not support SZP with offset read");
JUTException::panic_f(__FILE__, 0x14d, "%s", "Not support SZP with offset read");
}
while (true) {
int count = DVDReadPrio(dvdFile->getFileInfo(), mem, fileSizeAligned, 0, 2);
if (count >= 0) {
break;
}
if (count == -3 || !data_804508C8) {
if (did_alloc == true) {
JKRHeap::free(dst, NULL);
}
JKRHeap::free(mem, NULL);
return NULL;
}
@ -356,6 +371,7 @@ static u32 tsArea;
/* 802DA1E4-802DA35C 2D4B24 0178+00 1/1 0/0 0/0 .text
* JKRDecompressFromDVD__FP10JKRDvdFilePvUlUlUlUlPUl */
// wrong reg at the end
#ifdef NONMATCHING
static int JKRDecompressFromDVD(JKRDvdFile* dvdFile, void* dst, u32 fileSize, u32 param_3,
u32 param_4, u32 param_5, u32* param_6) {
@ -364,11 +380,13 @@ static int JKRDecompressFromDVD(JKRDvdFile* dvdFile, void* dst, u32 fileSize, u3
OSInitMutex(&decompMutex);
data_80451458 = true;
}
OSRestoreInterrupts(level);
OSLockMutex(&decompMutex);
u32 bufferSize = JKRDvdRipper::sSZSBufferSize;
szpBuf = (u8*)JKRHeap::sSystemHeap->alloc(bufferSize, -0x20);
szpEnd = szpBuf + bufferSize;
if (param_4) {
refBuf = (u8*)JKRHeap::sSystemHeap->alloc(0x1120, -4);
refEnd = refBuf + 0x1120;
@ -376,24 +394,29 @@ static int JKRDecompressFromDVD(JKRDvdFile* dvdFile, void* dst, u32 fileSize, u3
} else {
refBuf = NULL;
}
srcFile = dvdFile;
srcOffset = param_5;
transLeft = fileSize - param_5;
fileOffset = param_4;
readCount = 0;
maxDest = param_3;
if (!param_6) {
tsPtr = &tsArea;
} else {
tsPtr = param_6;
}
*tsPtr = 0;
u8* first = firstSrcData();
int result = first ? decompSZS_subroutine(first, (u8*)dst) : -1;
JKRHeap::free(szpBuf, 0);
i_JKRFree(szpBuf);
if (refBuf) {
JKRHeap::free(refBuf, 0);
i_JKRFree(refBuf);
}
DCStoreRangeNoSync(dst, *tsPtr);
OSUnlockMutex(&decompMutex);
return result;
@ -542,16 +565,19 @@ static u8* firstSrcData() {
u8* buffer = szpBuf;
u32 bufSize = szpEnd - buffer;
u32 length = transLeft < bufSize ? transLeft : bufSize;
while (true) {
int result = DVDReadPrio(srcFile->getFileInfo(), buffer, length, srcOffset, 2);
if (result >= 0) {
break;
}
if (result == -3 || !data_804508C8) {
return NULL;
}
VIWaitForRetrace();
}
DCInvalidateRange(buffer, length);
srcOffset += length;
transLeft -= length;
@ -566,9 +592,11 @@ static u8* nextSrcData(u8* param_0) {
memcpy(dest, param_0, size);
u8* end = dest + size;
u32 transSize = szpEnd - end;
if (transSize > transLeft) {
transSize = transLeft;
}
while (true) {
s32 result = DVDReadPrio(srcFile->getFileInfo(), end, transSize, srcOffset, 2);
if (result >= 0) {
@ -580,12 +608,15 @@ static u8* nextSrcData(u8* param_0) {
}
VIWaitForRetrace();
}
DCInvalidateRange(end, transSize);
srcOffset += transSize;
transLeft -= transSize;
if (transLeft == 0) {
srcLimit = end + transSize;
}
return dest;
}
#else
@ -608,8 +639,7 @@ u8 JKRDvdRipper::isErrorRetry() {
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void __sinit_JKRDvdRipper_cpp() {
nofralloc
asm void __sinit_JKRDvdRipper_cpp(){nofralloc
#include "asm/JSystem/JKernel/JKRDvdRipper/__sinit_JKRDvdRipper_cpp.s"
}
#pragma pop
@ -629,5 +659,3 @@ extern "C" asm void func_802DA820(void* _this) {
#include "asm/JSystem/JKernel/JKRDvdRipper/func_802DA820.s"
}
#pragma pop
/* 8039D290-8039D290 0298F0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */

View File

@ -4,9 +4,9 @@
//
#include "JSystem/JKernel/JKRExpHeap.h"
#include "JSystem/JSupport/JSupport.h"
#include "JSystem/JUtility/JUTException.h"
#include "dol2asm.h"
#include "dolphin/types.h"
#include "global.h"
//
@ -114,7 +114,6 @@ JKRExpHeap* JKRExpHeap::createRoot(int maxHeaps, bool errorFlag) {
/* 802CEE2C-802CEF00 2C976C 00D4+00 0/0 19/19 1/1 .text create__10JKRExpHeapFUlP7JKRHeapb
*/
#ifdef NONMATCHING
JKRExpHeap* JKRExpHeap::create(u32 size, JKRHeap* parent, bool errorFlag) {
if (!parent) {
parent = sRootHeap;
@ -129,30 +128,23 @@ JKRExpHeap* JKRExpHeap::create(u32 size, JKRHeap* parent, bool errorFlag) {
if (alignedSize < 0xa0)
return NULL;
void* memory = alloc(alignedSize, 0x10, parent);
void* dataPtr = (u8*)memory + expHeapSize;
u8* memory = (u8*)JKRAllocFromHeap(parent, alignedSize, 0x10);
u8* dataPtr = (memory + expHeapSize);
if (!memory) {
return NULL;
}
JKRExpHeap* newHeap =
new (memory) JKRExpHeap(dataPtr, alignedSize - expHeapSize, parent, errorFlag);
if (newHeap == NULL) {
free(memory, NULL);
i_JKRFree(memory);
return NULL;
};
}
newHeap->field_0x6e = false;
return newHeap;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRExpHeap* JKRExpHeap::create(u32 param_0, JKRHeap* param_1, bool param_2) {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/create__10JKRExpHeapFUlP7JKRHeapb.s"
}
#pragma pop
#endif
/* 802CEF00-802CEFAC 2C9840 00AC+00 0/0 1/1 0/0 .text create__10JKRExpHeapFPvUlP7JKRHeapb
*/
@ -165,15 +157,18 @@ JKRExpHeap* JKRExpHeap::create(void* ptr, u32 size, JKRHeap* parent, bool errorF
} else {
parent2 = parent;
}
JKRExpHeap* newHeap = NULL;
u32 expHeapSize = ALIGN_NEXT(sizeof(JKRExpHeap), 0x10);
if (size < expHeapSize)
return NULL;
void* dataPtr = (u8*)ptr + expHeapSize;
u32 alignedSize = ALIGN_PREV((u32)ptr + size - (u32)dataPtr, 0x10);
if (ptr) {
newHeap = new (ptr) JKRExpHeap(dataPtr, alignedSize, parent2, errorFlag);
}
newHeap->field_0x6e = true;
newHeap->field_0x70 = ptr;
newHeap->field_0x74 = size;
@ -193,35 +188,6 @@ void JKRExpHeap::do_destroy() {
}
}
/* ############################################################################################## */
/* 803CBFD0-803CC030 0290F0 0060+00 2/2 0/0 0/0 .data __vt__10JKRExpHeap */
SECTION_DATA extern void* __vt__10JKRExpHeap[24] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__10JKRExpHeapFv,
(void*)callAllDisposer__7JKRHeapFv,
(void*)getHeapType__10JKRExpHeapFv,
(void*)check__10JKRExpHeapFv,
(void*)dump_sort__10JKRExpHeapFv,
(void*)dump__10JKRExpHeapFv,
(void*)do_destroy__10JKRExpHeapFv,
(void*)do_alloc__10JKRExpHeapFUli,
(void*)do_free__10JKRExpHeapFPv,
(void*)do_freeAll__10JKRExpHeapFv,
(void*)do_freeTail__10JKRExpHeapFv,
(void*)do_fillFreeArea__10JKRExpHeapFv,
(void*)do_resize__10JKRExpHeapFPvUl,
(void*)do_getSize__10JKRExpHeapFPv,
(void*)do_getFreeSize__10JKRExpHeapFv,
(void*)do_getMaxFreeBlock__10JKRExpHeapFv,
(void*)do_getTotalFreeSize__10JKRExpHeapFv,
(void*)do_changeGroupID__10JKRExpHeapFUc,
(void*)do_getCurrentGroupId__10JKRExpHeapFv,
(void*)state_register__10JKRExpHeapCFPQ27JKRHeap6TStateUl,
(void*)state_compare__10JKRExpHeapCFRCQ27JKRHeap6TStateRCQ27JKRHeap6TState,
(void*)state_dump__7JKRHeapCFRCQ27JKRHeap6TState,
};
/* 802CF030-802CF0C0 2C9970 0090+00 3/3 0/0 0/0 .text __ct__10JKRExpHeapFPvUlP7JKRHeapb
*/
JKRExpHeap::JKRExpHeap(void* data, u32 size, JKRHeap* parent, bool errorFlag)
@ -248,6 +214,7 @@ void* JKRExpHeap::do_alloc(u32 size, int alignment) {
if (size < 4) {
size = 4;
}
if (alignment >= 0) {
if (alignment <= 4) {
ptr = allocFromHead(size);
@ -261,6 +228,7 @@ void* JKRExpHeap::do_alloc(u32 size, int alignment) {
ptr = allocFromTail(size, -alignment);
}
}
if (ptr == NULL) {
JUTWarningConsole_f(":::cannot alloc memory (0x%x byte).\n", size);
if (mErrorFlag == true) {
@ -289,68 +257,82 @@ static JKRExpHeap::CMemBlock* DBnewFreeBlock;
static JKRExpHeap::CMemBlock* DBnewUsedBlock;
/* 802CF234-802CF490 2C9B74 025C+00 1/1 0/0 0/0 .text allocFromHead__10JKRExpHeapFUli */
// wrong register at end
#ifdef NONMATCHING
void* JKRExpHeap::allocFromHead(u32 size, int align) {
size = ALIGN_NEXT(size, 4);
s32 foundSize = -1;
u32 foundOffset = 0;
CMemBlock* foundBlock = NULL;
u32 foundOffset;
int foundSize;
CMemBlock* newFreeBlock;
CMemBlock* newUsedBlock;
CMemBlock* foundBlock;
for (CMemBlock* block = mHeadFreeList; block; block = block->getNextBlock()) {
u32 start = (u32)(block->getContent());
u32 offset = ALIGN_PREV(align - 1 + start, align) - start;
if (block->getSize() < size + offset) {
size = ALIGN_NEXT(size, 4);
foundSize = -1;
foundOffset = 0;
foundBlock = NULL;
for (CMemBlock* block = mHeadFreeList; block; block = block->mNext) {
u32 offset =
ALIGN_PREV(align - 1 + (u32)block->getContent(), align) - (u32)block->getContent();
if (block->size < size + offset) {
continue;
}
if (foundSize <= block->getSize()) {
if (foundSize <= (u32)block->size) {
continue;
}
foundSize = block->getSize();
foundSize = block->size;
foundBlock = block;
foundOffset = offset;
if (mAllocMode != 0) {
break;
}
u32 blockSize = block->getSize();
u32 blockSize = block->size;
if (blockSize == size) {
break;
}
}
DBfoundSize = foundSize;
DBfoundOffset = foundOffset;
DBfoundBlock = foundBlock;
if (foundBlock) {
if (foundOffset >= sizeof(CMemBlock)) {
CMemBlock* prev = foundBlock->getPrevBlock();
CMemBlock* next = foundBlock->getNextBlock();
CMemBlock* newUsedBlock =
foundBlock->allocFore(foundOffset - sizeof(CMemBlock), 0, 0, 0, 0);
CMemBlock* newFreeBlock;
CMemBlock* prev = foundBlock->mPrev;
CMemBlock* next = foundBlock->mNext;
newUsedBlock = foundBlock->allocFore(foundOffset - sizeof(CMemBlock), 0, 0, 0, 0);
if (newUsedBlock) {
newFreeBlock = newUsedBlock->allocFore(size, mCurrentGroupId, 0, 0, 0);
} else {
newFreeBlock = NULL;
}
if (newFreeBlock) {
setFreeBlock(foundBlock, prev, newFreeBlock);
} else {
setFreeBlock(foundBlock, prev, next);
}
if (newFreeBlock) {
setFreeBlock(newFreeBlock, foundBlock, next);
}
appendUsedList(newUsedBlock);
DBnewFreeBlock = newFreeBlock;
DBnewUsedBlock = newUsedBlock;
return newUsedBlock->getContent();
} else {
if (foundOffset != 0) {
CMemBlock* prev = foundBlock->getPrevBlock();
CMemBlock* next = foundBlock->getNextBlock();
CMemBlock* prev = foundBlock->mPrev;
CMemBlock* next = foundBlock->mNext;
removeFreeBlock(foundBlock);
CMemBlock* newUsedBlock = (CMemBlock*)((u32)foundBlock + foundOffset);
newUsedBlock->size = foundBlock->getSize() - foundOffset;
CMemBlock* newFreeBlock =
newUsedBlock = (CMemBlock*)((u32)foundBlock + foundOffset);
newUsedBlock->size = foundBlock->size - foundOffset;
newFreeBlock =
newUsedBlock->allocFore(size, mCurrentGroupId, (u8)foundOffset, 0, 0);
if (newFreeBlock) {
setFreeBlock(newFreeBlock, prev, next);
@ -358,9 +340,9 @@ void* JKRExpHeap::allocFromHead(u32 size, int align) {
appendUsedList(newUsedBlock);
return newUsedBlock->getContent();
} else {
CMemBlock* prev = foundBlock->getPrevBlock();
CMemBlock* next = foundBlock->getNextBlock();
CMemBlock* newFreeBlock = foundBlock->allocFore(size, mCurrentGroupId, 0, 0, 0);
CMemBlock* prev = foundBlock->mPrev;
CMemBlock* next = foundBlock->mNext;
newFreeBlock = foundBlock->allocFore(size, mCurrentGroupId, 0, 0, 0);
removeFreeBlock(foundBlock);
if (newFreeBlock) {
setFreeBlock(newFreeBlock, prev, next);
@ -370,6 +352,7 @@ void* JKRExpHeap::allocFromHead(u32 size, int align) {
}
}
}
return NULL;
}
#else
@ -392,18 +375,22 @@ void* JKRExpHeap::allocFromHead(u32 size) {
if (block->getSize() < size) {
continue;
}
if (foundSize <= block->getSize()) {
continue;
}
foundSize = block->getSize();
foundBlock = block;
if (mAllocMode != 0) {
break;
}
if (foundSize == size) {
break;
}
}
if (foundBlock) {
CMemBlock* newblock = foundBlock->allocFore(size, mCurrentGroupId, 0, 0, 0);
if (newblock) {
@ -418,25 +405,24 @@ void* JKRExpHeap::allocFromHead(u32 size) {
}
/* 802CF574-802CF6D4 2C9EB4 0160+00 1/1 0/0 0/0 .text allocFromTail__10JKRExpHeapFUli */
#ifdef NONMATCHING
void* JKRExpHeap::allocFromTail(u32 size, int align) {
u32 offset = 0;
CMemBlock* foundBlock = NULL;
CMemBlock* newBlock = NULL;
u32 end;
u32 start;
u32 usedSize;
for (CMemBlock* block = mTailFreeList; block; block = block->getPrevBlock()) {
end = (u32)block->getContent() + block->getSize();
start = ALIGN_PREV(end - size, align);
usedSize = end - start;
if (block->getSize() >= usedSize) {
u32 start;
for (CMemBlock* block = mTailFreeList; block; block = block->mPrev) {
start = ALIGN_PREV((u32)block->getContent() + block->size - size, align);
usedSize = (u32)block->getContent() + block->size - start;
if (block->size >= usedSize) {
foundBlock = block;
offset = block->getSize() - usedSize;
offset = block->size - usedSize;
newBlock = (CMemBlock*)start - 1;
break;
}
}
if (foundBlock != NULL) {
if (offset >= sizeof(CMemBlock)) {
newBlock->initiate(NULL, NULL, usedSize, mCurrentGroupId, -0x80);
@ -457,18 +443,9 @@ void* JKRExpHeap::allocFromTail(u32 size, int align) {
}
}
}
return NULL;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void* JKRExpHeap::allocFromTail(u32 param_0, int param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/allocFromTail__10JKRExpHeapFUli.s"
}
#pragma pop
#endif
/* 802CF6D4-802CF7AC 2CA014 00D8+00 1/1 0/0 0/0 .text allocFromTail__10JKRExpHeapFUl */
void* JKRExpHeap::allocFromTail(u32 size) {
@ -480,6 +457,7 @@ void* JKRExpHeap::allocFromTail(u32 size) {
break;
}
}
if (foundBlock != NULL) {
CMemBlock* usedBlock = foundBlock->allocBack(size2, 0, 0, mCurrentGroupId, 0);
CMemBlock* freeBlock;
@ -490,6 +468,7 @@ void* JKRExpHeap::allocFromTail(u32 size) {
usedBlock = foundBlock;
freeBlock = NULL;
}
if (freeBlock) {
setFreeBlock(freeBlock, foundBlock->getPrevBlock(), foundBlock->getNextBlock());
}
@ -524,37 +503,23 @@ void JKRExpHeap::do_freeAll() {
}
/* 802CF89C-802CF924 2CA1DC 0088+00 1/0 0/0 0/0 .text do_freeTail__10JKRExpHeapFv */
#ifdef NONMATCHING
void JKRExpHeap::do_freeTail() {
lock();
CMemBlock* block = mHeadUsedList;
while (block) {
if (block->_isTempMemBlock()) {
dispose(block->getContent(), block->getSize());
CMemBlock* next = block->getNextBlock();
for (CMemBlock* block = mHeadUsedList; block != NULL;) {
if ((block->mFlags & 0x80) != 0) {
dispose(block + 1, block->size);
CMemBlock* temp = block->mNext;
block->free(this);
block = next;
block = temp;
} else {
block = block->getNextBlock();
block = block->mNext;
}
}
unlock();
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::do_freeTail() {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/do_freeTail__10JKRExpHeapFv.s"
}
#pragma pop
#endif
/* 802CF924-802CF928 2CA264 0004+00 1/0 0/0 0/0 .text do_fillFreeArea__10JKRExpHeapFv */
void JKRExpHeap::do_fillFreeArea() {
/* empty function */
}
void JKRExpHeap::do_fillFreeArea() {}
/* 802CF928-802CF978 2CA268 0050+00 1/0 0/0 0/0 .text do_changeGroupID__10JKRExpHeapFUc
*/
@ -567,67 +532,59 @@ s32 JKRExpHeap::do_changeGroupID(u8 param_0) {
}
/* 802CF978-802CFB24 2CA2B8 01AC+00 1/0 0/0 0/0 .text do_resize__10JKRExpHeapFPvUl */
#ifdef NONMATCHING
s32 JKRExpHeap::do_resize(void* ptr, u32 size) {
lock();
CMemBlock* block = CMemBlock::getHeapBlock(ptr);
if (block == NULL || ptr < getStartAddr() || getEndAddr() < ptr) {
if (block == NULL || ptr < mStart || mEnd < ptr) {
unlock();
return -1;
}
u32 newSize = ALIGN_NEXT(size, 4);
if (newSize == block->getSize()) {
size = ALIGN_NEXT(size, 4);
if (size == block->size) {
unlock();
return newSize;
return size;
}
if (newSize > block->getSize()) {
if (size > block->size) {
CMemBlock* foundBlock = NULL;
for (CMemBlock* freeBlock = mHeadFreeList; freeBlock;
freeBlock = freeBlock->getNextBlock()) {
if (freeBlock == (CMemBlock*)((u32)block->getContent() + block->getSize())) {
for (CMemBlock* freeBlock = mHeadFreeList; freeBlock; freeBlock = freeBlock->mNext) {
if (freeBlock == (CMemBlock*)((u32)(block + 1) + block->size)) {
foundBlock = freeBlock;
break;
}
}
if (foundBlock == NULL) {
unlock();
return -1;
}
if (newSize > block->getSize() + sizeof(CMemBlock) + foundBlock->getSize()) {
if (size > block->size + sizeof(CMemBlock) + foundBlock->size) {
unlock();
return -1;
}
removeFreeBlock(foundBlock);
block->size += foundBlock->getSize() + sizeof(CMemBlock);
if (block->getSize() - newSize > sizeof(CMemBlock)) {
CMemBlock* newBlock =
block->allocFore(newSize, block->getGroupId(), block->mFlags, 0, 0);
block->size += foundBlock->size + sizeof(CMemBlock);
if (block->size - size > sizeof(CMemBlock)) {
CMemBlock* newBlock = block->allocFore(size, block->mGroupId, block->mFlags, 0, 0);
if (newBlock) {
recycleFreeBlock(newBlock);
}
}
} else {
if (block->getSize() - newSize > 0x10) {
CMemBlock* freeBlock =
block->allocFore(newSize, block->getGroupId(), block->mFlags, 0, 0);
if (block->size - size > sizeof(CMemBlock)) {
CMemBlock* freeBlock = block->allocFore(size, block->mGroupId, block->mFlags, 0, 0);
if (freeBlock) {
recycleFreeBlock(freeBlock);
}
}
}
unlock();
return block->getSize();
return block->size;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm s32 JKRExpHeap::do_resize(void* param_0, u32 param_1) {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/do_resize__10JKRExpHeapFPvUl.s"
}
#pragma pop
#endif
/* 802CFB24-802CFBA4 2CA464 0080+00 1/0 0/0 0/0 .text do_getSize__10JKRExpHeapFPv */
s32 JKRExpHeap::do_getSize(void* ptr) {
@ -687,12 +644,14 @@ s32 JKRExpHeap::getUsedSize(u8 groupId) const {
JKRExpHeap* this2 = const_cast<JKRExpHeap*>(this);
this2->lock();
u32 size = 0;
for (CMemBlock* block = mHeadUsedList; block; block = block->getNextBlock()) {
u8 blockGroupId = block->getGroupId();
if (blockGroupId == groupId) {
size += block->getSize() + sizeof(CMemBlock);
}
}
this2->unlock();
return size;
}
@ -703,9 +662,11 @@ s32 JKRExpHeap::getTotalUsedSize() const {
JKRExpHeap* this2 = const_cast<JKRExpHeap*>(this);
this2->lock();
u32 size = 0;
for (CMemBlock* block = mHeadUsedList; block; block = block->getNextBlock()) {
size += block->getSize() + sizeof(CMemBlock);
}
this2->unlock();
return size;
}
@ -714,16 +675,19 @@ s32 JKRExpHeap::getTotalUsedSize() const {
* appendUsedList__10JKRExpHeapFPQ210JKRExpHeap9CMemBlock */
void JKRExpHeap::appendUsedList(JKRExpHeap::CMemBlock* newblock) {
if (!newblock) {
JUTException::panic_f("JKRExpHeap.cpp", 0x620, "%s", "bad appendUsedList\n");
JUTException::panic_f(__FILE__, 1568, "%s", "bad appendUsedList\n");
}
CMemBlock* block = mTailUsedList;
newblock->mMagic = 'HM';
if (block) {
block->mNext = newblock;
newblock->mPrev = block;
} else {
newblock->mPrev = NULL;
}
mTailUsedList = newblock;
if (!mHeadUsedList) {
mHeadUsedList = newblock;
@ -742,6 +706,7 @@ void JKRExpHeap::setFreeBlock(CMemBlock* block, CMemBlock* prev, CMemBlock* next
prev->mNext = block;
block->mPrev = prev;
}
if (next == NULL) {
mTailFreeList = block;
block->mNext = NULL;
@ -749,6 +714,7 @@ void JKRExpHeap::setFreeBlock(CMemBlock* block, CMemBlock* prev, CMemBlock* next
next->mPrev = block;
block->mNext = next;
}
block->mMagic = 0;
}
@ -757,11 +723,13 @@ void JKRExpHeap::setFreeBlock(CMemBlock* block, CMemBlock* prev, CMemBlock* next
void JKRExpHeap::removeFreeBlock(CMemBlock* block) {
CMemBlock* prev = block->mPrev;
CMemBlock* next = block->mNext;
if (prev == NULL) {
mHeadFreeList = next;
} else {
prev->mNext = next;
}
if (next == NULL) {
mTailFreeList = prev;
} else {
@ -774,11 +742,13 @@ void JKRExpHeap::removeFreeBlock(CMemBlock* block) {
void JKRExpHeap::removeUsedBlock(JKRExpHeap::CMemBlock* block) {
CMemBlock* prev = block->mPrev;
CMemBlock* next = block->mNext;
if (prev == NULL) {
mHeadUsedList = next;
} else {
prev->mNext = next;
}
if (next == NULL) {
mTailUsedList = prev;
} else {
@ -788,143 +758,99 @@ void JKRExpHeap::removeUsedBlock(JKRExpHeap::CMemBlock* block) {
/* 802CFF1C-802D00B4 2CA85C 0198+00 2/2 0/0 0/0 .text
* recycleFreeBlock__10JKRExpHeapFPQ210JKRExpHeap9CMemBlock */
#ifdef NONMATCHING
void JKRExpHeap::recycleFreeBlock(JKRExpHeap::CMemBlock* block) {
u32 size = block->size;
JKRExpHeap::CMemBlock* newBlock = block;
int size = block->size;
void* blockEnd = (u8*)block + size;
block->mMagic = 0;
u32 offset = block->getAlignment();
if (offset) {
block = (CMemBlock*)((u8*)block - offset);
size += offset;
blockEnd = (u8*)block + size;
block->mGroupId = 0;
block->mFlags = 0;
block->size = size;
if ((block->mFlags & 0x7f) != 0) {
newBlock = (CMemBlock*)((u8*)block - (block->mFlags & 0x7f));
size += (block->mFlags & 0x7f);
blockEnd = (u8*)newBlock + size;
newBlock->mGroupId = 0;
newBlock->mFlags = 0;
newBlock->size = size;
}
if (!mHeadFreeList) {
block->initiate(NULL, NULL, size, 0, 0);
mHeadFreeList = block;
mTailFreeList = block;
setFreeBlock(block, NULL, NULL);
newBlock->initiate(NULL, NULL, size, 0, 0);
mHeadFreeList = newBlock;
mTailFreeList = newBlock;
setFreeBlock(newBlock, NULL, NULL);
return;
}
if (mHeadFreeList >= blockEnd) {
block->initiate(NULL, NULL, size, 0, 0);
setFreeBlock(block, NULL, mHeadFreeList);
joinTwoBlocks(block);
newBlock->initiate(NULL, NULL, size, 0, 0);
setFreeBlock(newBlock, NULL, mHeadFreeList);
joinTwoBlocks(newBlock);
return;
}
if (mTailFreeList <= block) {
block->initiate(NULL, NULL, size, 0, 0);
setFreeBlock(block, mTailFreeList, NULL);
joinTwoBlocks(block->getPrevBlock());
if (mTailFreeList <= newBlock) {
newBlock->initiate(NULL, NULL, size, 0, 0);
setFreeBlock(newBlock, mTailFreeList, NULL);
joinTwoBlocks(newBlock->mPrev);
return;
}
for (CMemBlock* freeBlock = mHeadFreeList; freeBlock; freeBlock = freeBlock->getNextBlock()) {
if (freeBlock >= block || block >= freeBlock->getNextBlock()) {
for (CMemBlock* freeBlock = mHeadFreeList; freeBlock; freeBlock = freeBlock->mNext) {
if (freeBlock >= newBlock || newBlock >= freeBlock->mNext) {
continue;
}
block->mNext = freeBlock->getNextBlock();
block->mPrev = freeBlock;
freeBlock->mNext = block;
block->mNext->mPrev = block;
block->mGroupId = 0;
joinTwoBlocks(block);
newBlock->mNext = freeBlock->mNext;
newBlock->mPrev = freeBlock;
freeBlock->mNext = newBlock;
newBlock->mNext->mPrev = newBlock;
newBlock->mGroupId = 0;
joinTwoBlocks(newBlock);
joinTwoBlocks(freeBlock);
return;
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::recycleFreeBlock(JKRExpHeap::CMemBlock* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/recycleFreeBlock__10JKRExpHeapFPQ210JKRExpHeap9CMemBlock.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 8039CAF0-8039CAF0 029150 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039CB3B = ":::Heap may be broken. (block = %x)";
SECTION_DEAD static char const* const stringBase_8039CB5F = "Bad Block\n";
#pragma pop
/* 802D00B4-802D0190 2CA9F4 00DC+00 1/1 0/0 0/0 .text
* joinTwoBlocks__10JKRExpHeapFPQ210JKRExpHeap9CMemBlock */
#ifdef NONMATCHING
void JKRExpHeap::joinTwoBlocks(CMemBlock* block) {
u32 endAddr = (u32)block->getContent() + block->getSize();
CMemBlock* next = block->getNextBlock();
u32 nextAddr = (u32)next - next->getAlignment();
u32 endAddr = (u32)(block + 1) + block->size;
CMemBlock* next = block->mNext;
u32 nextAddr = (u32)next - (next->mFlags & 0x7f);
if (endAddr > nextAddr) {
JUTWarningConsole_f(":::Heap may be broken. (block = %x)", block);
getCurrentHeap()->dump();
JUTException::panic_f("JKRExpHeap.cpp", 0x71c, "%s", "Bad Block\n");
JKRGetCurrentHeap()->dump();
JUTException::panic_f(__FILE__, 1820, "%s", "Bad Block\n");
}
if (endAddr == nextAddr) {
block->size = next->getSize() + sizeof(CMemBlock) + next->getAlignment() + block->getSize();
setFreeBlock(block, block->getPrevBlock(), next->getNextBlock());
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRExpHeap::joinTwoBlocks(JKRExpHeap::CMemBlock* param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/joinTwoBlocks__10JKRExpHeapFPQ210JKRExpHeap9CMemBlock.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 8039CAF0-8039CAF0 029150 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039CB6A =
":::addr %08x: bad heap signature. (%c%c)\n";
SECTION_DEAD static char const* const stringBase_8039CB94 =
":::addr %08x: bad next pointer (%08x)\nabort\n";
SECTION_DEAD static char const* const stringBase_8039CBC1 =
":::addr %08x: bad previous pointer (%08x)\n";
SECTION_DEAD static char const* const stringBase_8039CBEC =
":::addr %08x: bad used list(REV) (%08x)\n";
SECTION_DEAD static char const* const stringBase_8039CC15 = ":::addr %08x: bad block size (%08x)\n";
SECTION_DEAD static char const* const stringBase_8039CC3A =
":::bad total memory block size (%08X, %08X)\n";
SECTION_DEAD static char const* const stringBase_8039CC67 =
":::there is some error in this heap!\n";
#pragma pop
if (endAddr == nextAddr) {
block->size = next->size + sizeof(CMemBlock) + next->getAlignment() + block->size;
setFreeBlock(block, block->mPrev, next->mNext);
}
}
/* 802D0190-802D03B8 2CAAD0 0228+00 1/0 0/0 0/0 .text check__10JKRExpHeapFv */
#ifdef NONMATCHING
bool JKRExpHeap::check() {
lock();
int totalBytes = 0;
bool ok = true;
for (CMemBlock* block = mHeadUsedList; block; block = block->getNextBlock()) {
for (CMemBlock* block = mHeadUsedList; block; block = block->mNext) {
if (!block->isValid()) {
ok = false;
JUTWarningConsole_f(":::addr %08x: bad heap signature. (%c%c)\n", block,
block->mMagic >> 8, block->mMagic & 0xff);
JSUHiByte(block->mMagic), JSULoByte(block->mMagic));
}
if (block->getNextBlock()) {
if (!block->getNextBlock()->isValid()) {
if (block->mNext) {
if (!block->mNext->isValid()) {
ok = false;
JUTWarningConsole_f(":::addr %08x: bad next pointer (%08x)\nabort\n", block,
block->getNextBlock());
block->mNext);
break;
}
if (block->getNextBlock()->getPrevBlock() != block) {
if (block->mNext->mPrev != block) {
ok = false;
JUTWarningConsole_f(":::addr %08x: bad previous pointer (%08x)\n",
block->getNextBlock(), block->getNextBlock()->getPrevBlock());
JUTWarningConsole_f(":::addr %08x: bad previous pointer (%08x)\n", block->mNext,
block->mNext->mPrev);
}
} else {
if (mTailUsedList != block) {
@ -933,20 +859,21 @@ bool JKRExpHeap::check() {
mTailUsedList);
}
}
totalBytes += sizeof(CMemBlock) + block->getSize() + block->getAlignment();
totalBytes += sizeof(CMemBlock) + block->size + block->getAlignment();
}
for (CMemBlock* block = mHeadFreeList; block; block = block->getNextBlock()) {
totalBytes += block->getSize() + sizeof(CMemBlock);
if (block->getNextBlock()) {
if (block->getNextBlock()->getPrevBlock() != block) {
for (CMemBlock* block = mHeadFreeList; block; block = block->mNext) {
totalBytes += block->size + sizeof(CMemBlock);
if (block->mNext) {
if (block->mNext->mPrev != block) {
ok = false;
JUTWarningConsole_f(":::addr %08x: bad previous pointer (%08x)\n",
block->getNextBlock(), block->getNextBlock()->getPrevBlock());
JUTWarningConsole_f(":::addr %08x: bad previous pointer (%08x)\n", block->mNext,
block->mNext->mPrev);
}
if ((u32)block + block->getSize() + sizeof(CMemBlock) > (u32)block->getNextBlock()) {
if ((u32)block + block->size + sizeof(CMemBlock) > (u32)block->mNext) {
ok = false;
JUTWarningConsole_f(":::addr %08x: bad block size (%08x)\n", block,
block->getSize());
JUTWarningConsole_f(":::addr %08x: bad block size (%08x)\n", block, block->size);
}
} else {
if (mTailFreeList != block) {
@ -956,9 +883,10 @@ bool JKRExpHeap::check() {
}
}
}
if (totalBytes != getSize()) {
if (totalBytes != mSize) {
ok = false;
JUTWarningConsole_f(":::bad total memory block size (%08X, %08X)\n", getSize(), totalBytes);
JUTWarningConsole_f(":::bad total memory block size (%08X, %08X)\n", mSize, totalBytes);
}
if (!ok) {
@ -968,16 +896,6 @@ bool JKRExpHeap::check() {
unlock();
return ok;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm bool JKRExpHeap::check() {
nofralloc
#include "asm/JSystem/JKernel/JKRExpHeap/check__10JKRExpHeapFv.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 8039CAF0-8039CAF0 029150 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
@ -1011,6 +929,7 @@ SECTION_SDATA2 static f32 lit_1121[1 + 1 /* padding */] = {
SECTION_SDATA2 static f64 lit_1123 = 4503599627370496.0 /* cast u32 to float */;
/* 802D03B8-802D05CC 2CACF8 0214+00 1/0 0/0 0/0 .text dump__10JKRExpHeapFv */
// matches with literals
#ifdef NONMATCHING
bool JKRExpHeap::dump() {
lock();
@ -1018,39 +937,42 @@ bool JKRExpHeap::dump() {
u32 usedBytes = 0;
u32 usedCount = 0;
u32 freeCount = 0;
JUTReportConsole(" attr address: size gid aln prev_ptr next_ptr\n");
JUTReportConsole("(Used Blocks)\n");
if (!mHeadUsedList) {
JUTReportConsole(" NONE\n");
}
for (CMemBlock* block = mHeadUsedList; block; block = block->getNextBlock()) {
for (CMemBlock* block = mHeadUsedList; block; block = block->mNext) {
if (!block->isValid()) {
JUTReportConsole_f("xxxxx %08x: -------- --- --- (-------- --------)\nabort\n",
block);
break;
}
int offset = block->getAlignment();
void* content = block->getContent();
const char* type = block->_isTempMemBlock() ? " temp" : "alloc";
JUTReportConsole_f("%s %08x: %08x %3d %3d (%08x %08x)\n", type, content, block->getSize(),
block->getGroupId(), offset, block->getPrevBlock(),
block->getNextBlock());
usedBytes += sizeof(CMemBlock) + block->getSize() + block->getAlignment();
JUTReportConsole_f("%s %08x: %08x %3d %3d (%08x %08x)\n",
block->_isTempMemBlock() ? " temp" : "alloc", block->getContent(),
block->size, block->mGroupId, block->getAlignment(), block->mPrev,
block->mNext);
usedBytes += sizeof(CMemBlock) + block->size + block->getAlignment();
usedCount++;
}
JUTReportConsole("(Free Blocks)\n");
if (!mHeadFreeList) {
JUTReportConsole(" NONE\n");
}
for (CMemBlock* block = mHeadFreeList; block; block = block->getNextBlock()) {
for (CMemBlock* block = mHeadFreeList; block; block = block->mNext) {
JUTReportConsole_f("%s %08x: %08x %3d %3d (%08x %08x)\n", " free", block->getContent(),
block->getSize(), block->getGroupId(), block->getAlignment(),
block->getPrevBlock(), block->getNextBlock());
block->size, block->mGroupId, block->getAlignment(), block->mPrev,
block->mNext);
freeCount++;
}
float percent = ((float)usedBytes / (float)getSize()) * 100.0f;
JUTReportConsole_f("%d / %d bytes (%6.2f%%) used (U:%d F:%d)\n", usedBytes, getSize(), percent,
float percent = ((float)usedBytes / (float)mSize) * 100.0f;
JUTReportConsole_f("%d / %d bytes (%6.2f%%) used (U:%d F:%d)\n", usedBytes, mSize, percent,
usedCount, freeCount);
unlock();
return result;
@ -1067,6 +989,7 @@ asm bool JKRExpHeap::dump() {
#endif
/* 802D05CC-802D0810 2CAF0C 0244+00 1/0 0/0 0/0 .text dump_sort__10JKRExpHeapFv */
// using r0 instead of r4
#ifdef NONMATCHING
bool JKRExpHeap::dump_sort() {
lock();
@ -1076,48 +999,53 @@ bool JKRExpHeap::dump_sort() {
u32 freeCount = 0;
JUTReportConsole(" attr address: size gid aln prev_ptr next_ptr\n");
JUTReportConsole("(Used Blocks)\n");
if (mHeadUsedList == NULL) {
JUTReportConsole(" NONE\n");
} else {
CMemBlock* var1 = NULL;
while (true) {
CMemBlock* block = (CMemBlock*)0xffffffff;
for (CMemBlock* iterBlock = mHeadUsedList; iterBlock;
iterBlock = iterBlock->getNextBlock()) {
for (CMemBlock* iterBlock = mHeadUsedList; iterBlock; iterBlock = iterBlock->mNext) {
if (var1 < iterBlock && iterBlock < block) {
block = iterBlock;
}
}
if (block == (CMemBlock*)0xffffffff) {
break;
}
if (!block->isValid()) {
JUTReportConsole_f("xxxxx %08x: -------- --- --- (-------- --------)\nabort\n");
break;
}
int offset = block->getAlignment();
void* content = block->getContent();
const char* type = block->_isTempMemBlock() ? " temp" : "alloc";
JUTReportConsole_f("%s %08x: %08x %3d %3d (%08x %08x)\n", type, content,
block->getSize(), block->getGroupId(), offset, block->getPrevBlock(),
block->getNextBlock());
usedBytes += sizeof(CMemBlock) + block->getSize() + block->getAlignment();
JUTReportConsole_f("%s %08x: %08x %3d %3d (%08x %08x)\n", type, content, block->size,
block->getGroupId(), offset, block->mPrev, block->mNext);
usedBytes += sizeof(CMemBlock) + block->size + block->getAlignment();
usedCount++;
var1 = block;
}
}
JUTReportConsole("(Free Blocks)\n");
if (mHeadFreeList == NULL) {
JUTReportConsole(" NONE\n");
}
for (CMemBlock* block = mHeadFreeList; block; block = block->getNextBlock()) {
for (CMemBlock* block = mHeadFreeList; block; block = block->mNext) {
JUTReportConsole_f("%s %08x: %08x %3d %3d (%08x %08x)\n", " free", block->getContent(),
block->getSize(), block->getGroupId(), block->getAlignment(),
block->getPrevBlock(), block->getNextBlock());
block->size, block->getGroupId(), block->getAlignment(), block->mPrev,
block->mNext);
freeCount++;
}
float percent = ((float)usedBytes / (float)getSize()) * 100.0f;
JUTReportConsole_f("%d / %d bytes (%6.2f%%) used (U:%d F:%d)\n", usedBytes, getSize(), percent,
float percent = ((float)usedBytes / (float)mSize) * 100.0f;
JUTReportConsole_f("%d / %d bytes (%6.2f%%) used (U:%d F:%d)\n", usedBytes, mSize, percent,
usedCount, freeCount);
unlock();
return result;
@ -1212,6 +1140,7 @@ void JKRExpHeap::state_register(JKRHeap::TState* p, u32 param_1) const {
s32 freeSize = const_cast<JKRExpHeap*>(this)->getTotalFreeSize();
p->mUsedSize = getSize() - freeSize;
}
u32 checkCode = 0;
for (CMemBlock* block = mHeadUsedList; block; block = block->getNextBlock()) {
if (param_1 <= 0xff) {
@ -1233,9 +1162,11 @@ bool JKRExpHeap::state_compare(JKRHeap::TState const& r1, JKRHeap::TState const&
if (r1.mCheckCode != r2.mCheckCode) {
result = false;
}
if (r1.mUsedSize != r2.mUsedSize) {
result = false;
}
return result;
}
@ -1304,5 +1235,3 @@ SECTION_DEAD static char const* const stringBase_8039CE2A = "| ---- UsedLast\n";
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039CE3B = "+---------------End\n";
#pragma pop
/* 8039CAF0-8039CAF0 029150 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */

View File

@ -4,14 +4,8 @@
//
#include "JSystem/JKernel/JKRFile.h"
#include "dol2asm.h"
#include "dolphin/types.h"
#include "dolphin/vi/vi.h"
//
// Declarations:
//
/* 802D9518-802D9584 2D3E58 006C+00 0/0 2/2 0/0 .text read__7JKRFileFPvll */
s32 JKRFile::read(void* data, s32 size, long offset) {
while (true) {

View File

@ -9,80 +9,8 @@
#include "JSystem/JKernel/JKRHeap.h"
#include "MSL_C/MSL_Common/Src/ctype.h"
#include "MSL_C/MSL_Common/Src/string.h"
#include "dol2asm.h"
#include "global.h"
//
// Forward References:
//
extern "C" void mount__12JKRFileCacheFPCcP7JKRHeapPCc();
extern "C" void __ct__12JKRFileCacheFPCcPCc();
extern "C" void __dt__12JKRFileCacheFv();
extern "C" void becomeCurrent__12JKRFileCacheFPCc();
extern "C" void getResource__12JKRFileCacheFPCc();
extern "C" void getResource__12JKRFileCacheFUlPCc();
extern "C" void readResource__12JKRFileCacheFPvUlPCc();
extern "C" void readResource__12JKRFileCacheFPvUlUlPCc();
extern "C" void removeResourceAll__12JKRFileCacheFv();
extern "C" void removeResource__12JKRFileCacheFPv();
extern "C" void detachResource__12JKRFileCacheFPv();
extern "C" void getResSize__12JKRFileCacheCFPCv();
extern "C" void countFile__12JKRFileCacheCFPCc();
extern "C" void getFirstFile__12JKRFileCacheCFPCc();
extern "C" void findCacheBlock__12JKRFileCacheCFPCv();
extern "C" void findCacheBlock__12JKRFileCacheCFUl();
extern "C" void findFile__12JKRFileCacheCFPcPCc();
extern "C" void getDvdPathName__12JKRFileCacheCFPCc();
extern "C" void convStrLower__12JKRFileCacheCFPc();
extern "C" void __ct__Q212JKRFileCache11CCacheBlockFUlUlPCv();
extern "C" void getFsResource__12JKRFileCacheFPCc();
extern "C" void getNameResource__12JKRFileCacheFUlPCc();
extern "C" void readFsResource__12JKRFileCacheFPvUlPCc();
extern "C" void readNameResource__12JKRFileCacheFPvUlUlPCc();
extern "C" extern char const* const JKRFileCache__stringBase0;
//
// External References:
//
extern "C" void alloc__7JKRHeapFUliP7JKRHeap();
extern "C" void alloc__7JKRHeapFUli();
extern "C" void free__7JKRHeapFPvP7JKRHeap();
extern "C" void free__7JKRHeapFPv();
extern "C" void findFromRoot__7JKRHeapFPv();
extern "C" void* __nw__FUlP7JKRHeapi();
extern "C" void __dl__FPv();
extern "C" void __ct__13JKRFileLoaderFv();
extern "C" void __dt__13JKRFileLoaderFv();
extern "C" void unmount__13JKRFileLoaderFv();
extern "C" void __ct__12JKRDvdFinderFPCc();
extern "C" void read__7JKRFileFPvll();
extern "C" void __ct__10JKRDvdFileFPCc();
extern "C" void __dt__10JKRDvdFileFv();
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 prepend__10JSUPtrListFP10JSUPtrLink();
extern "C" void remove__10JSUPtrListFP10JSUPtrLink();
extern "C" void _savegpr_26();
extern "C" void _savegpr_27();
extern "C" void _savegpr_28();
extern "C" void _savegpr_29();
extern "C" void _restgpr_26();
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 sCurrentVolume__13JKRFileLoader[4 + 4 /* padding */];
//
// Declarations:
//
/* 802D49B4-802D4AB4 2CF2F4 0100+00 0/0 2/2 0/0 .text mount__12JKRFileCacheFPCcP7JKRHeapPCc */
JKRFileCache* JKRFileCache::mount(const char* path, JKRHeap* heap, const char* param_3) {
if (!path || *path != '/') {
@ -111,16 +39,6 @@ JKRFileCache* JKRFileCache::mount(const char* path, JKRHeap* heap, const char* p
return new (heap, 0) JKRFileCache(path, param_3);
}
/* ############################################################################################## */
/* 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
/* 802D4AB4-802D4C70 2CF3F4 01BC+00 1/1 0/0 0/0 .text __ct__12JKRFileCacheFPCcPCc */
JKRFileCache::JKRFileCache(const char* path, const char* volume) : mCacheBlockList() {
mParentHeap = JKRHeap::findFromRoot(this);
@ -181,35 +99,23 @@ JKRFileCache::~JKRFileCache() {
/* 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);
char* dvdPathName = getDvdPathName(path);
mCurrentPath = name;
if (mCurrentPath[1]) {
bool result = DVDChangeDir(dvdPathName);
if (result) {
sCurrentVolume = this;
JKRHeap::sSystemHeap->free(mCurrentPath);
mCurrentPath = dvdPathName;
if (mCurrentPath[1] != '\0') {
strcat(mCurrentPath, "/");
}
} else {
JKRFreeToSysHeap(name);
JKRHeap::sSystemHeap->free(dvdPathName);
}
return didChangeDir;
return result;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
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 */
void* JKRFileCache::getResource(const char* path) {
@ -217,11 +123,11 @@ void* JKRFileCache::getResource(const char* path) {
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);
@ -272,7 +178,6 @@ u32 JKRFileCache::readResource(void* dst, u32 dstLength, const char* path) {
// 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);
@ -531,5 +436,3 @@ u32 JKRFileCache::readFsResource(void* dst, u32 dstLength, const char* path) {
u32 JKRFileCache::readNameResource(void* dst, u32 dstLength, u32 type, const char* path) {
return readResource(dst, dstLength, type, path);
}
/* 8039D158-8039D158 0297B8 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */

View File

@ -6,7 +6,6 @@
#include "JSystem/JKernel/JKRFileFinder.h"
#include "JSystem/JKernel/JKRArchive.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Forward References:

View File

@ -180,14 +180,9 @@ SECTION_DEAD static char const* const pad_8039D152 = "\0\0\0\0\0";
SECTION_SDATA static char rootPath[2] = "/";
/* 802D44C4-802D45A0 2CEE04 00DC+00 1/1 0/0 0/0 .text fetchVolumeName__13JKRFileLoaderFPclPCc */
// matches, but lbl_804508C0 is accessed through r13
// matches, but rootPath is accessed through r13
#ifdef NONMATCHING
const char* JKRFileLoader::fetchVolumeName(char* buffer, long bufferSize, const char* path) {
// lbl_803D2D18 = MSL_C::__lower_map
// lbl_8039D150 = JKernel::@stringBase0 "/"
// lbl_804508C0 = JKernel::rootPath$2498 "/"
// lbl_803D2D18 = MSL_C::__lower_map
if (strcmp(path, "/") == 0) {
strcpy(buffer, rootPath);
return rootPath;
@ -228,5 +223,3 @@ asm const char* JKRFileLoader::fetchVolumeName(char* param_0, s32 param_1, char
}
#pragma pop
#endif
/* 8039D150-8039D150 0297B0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */

View File

@ -1,99 +1,25 @@
//
// Generated By: dol2asm
// Translation Unit: JKRHeap
//
/**
* JKRHeap.cpp
* JSystem Heap Framework
*/
#include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/JUtility/JUTAssert.h"
#include "JSystem/JUtility/JUTException.h"
#include "dol2asm.h"
#include "global.h"
//
// Forward References:
//
extern "C" void __ct__7JKRHeapFPvUlP7JKRHeapb();
extern "C" void __dt__7JKRHeapFv();
extern "C" void initArena__7JKRHeapFPPcPUli();
extern "C" void becomeSystemHeap__7JKRHeapFv();
extern "C" void becomeCurrentHeap__7JKRHeapFv();
extern "C" void destroy__7JKRHeapFv();
extern "C" void alloc__7JKRHeapFUliP7JKRHeap();
extern "C" void alloc__7JKRHeapFUli();
extern "C" void free__7JKRHeapFPvP7JKRHeap();
extern "C" void free__7JKRHeapFPv();
extern "C" void callAllDisposer__7JKRHeapFv();
extern "C" void freeAll__7JKRHeapFv();
extern "C" void freeTail__7JKRHeapFv();
extern "C" void resize__7JKRHeapFPvUlP7JKRHeap();
extern "C" void resize__7JKRHeapFPvUl();
extern "C" void getSize__7JKRHeapFPvP7JKRHeap();
extern "C" void getSize__7JKRHeapFPv();
extern "C" void getFreeSize__7JKRHeapFv();
extern "C" void getMaxFreeBlock__7JKRHeapFv();
extern "C" void getTotalFreeSize__7JKRHeapFv();
extern "C" void changeGroupID__7JKRHeapFUc();
extern "C" void getMaxAllocatableSize__7JKRHeapFi();
extern "C" void findFromRoot__7JKRHeapFPv();
extern "C" void find__7JKRHeapCFPv();
extern "C" void findAllHeap__7JKRHeapCFPv();
extern "C" void dispose_subroutine__7JKRHeapFUlUl();
extern "C" void dispose__7JKRHeapFPvUl();
extern "C" void dispose__7JKRHeapFPvPv();
extern "C" void dispose__7JKRHeapFv();
extern "C" void copyMemory__7JKRHeapFPvPvUl();
extern "C" void JKRDefaultMemoryErrorRoutine__FPvUli();
extern "C" void setErrorFlag__7JKRHeapFb();
extern "C" void setErrorHandler__7JKRHeapFPFPvUli_v();
extern "C" void isSubHeap__7JKRHeapCFP7JKRHeap();
extern "C" void* __nw__FUl();
extern "C" void* __nw__FUli();
extern "C" void* __nw__FUlP7JKRHeapi();
extern "C" void* __nwa__FUl();
extern "C" void* __nwa__FUli();
extern "C" void* __nwa__FUlP7JKRHeapi();
extern "C" void __dl__FPv();
extern "C" void __dla__FPv();
extern "C" void state_register__7JKRHeapCFPQ27JKRHeap6TStateUl();
extern "C" void state_compare__7JKRHeapCFRCQ27JKRHeap6TStateRCQ27JKRHeap6TState();
extern "C" void state_dump__7JKRHeapCFRCQ27JKRHeap6TState();
extern "C" bool do_changeGroupID__7JKRHeapFUc();
extern "C" bool do_getCurrentGroupId__7JKRHeapFv();
extern "C" extern char const* const JKRHeap__stringBase0;
extern "C" u8 sSystemHeap__7JKRHeap[4];
extern "C" u8 sCurrentHeap__7JKRHeap[4];
extern "C" u8 sRootHeap__7JKRHeap[4];
extern "C" u8 mErrorHandler__7JKRHeap[4];
extern "C" u8 mCodeStart__7JKRHeap[4];
extern "C" u8 mCodeEnd__7JKRHeap[4];
extern "C" u8 mUserRamStart__7JKRHeap[4];
extern "C" u8 mUserRamEnd__7JKRHeap[4];
extern "C" u8 mMemorySize__7JKRHeap[4];
//
// External References:
//
extern "C" bool dump_sort__7JKRHeapFv();
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 _savegpr_26();
extern "C" void _savegpr_27();
extern "C" void _savegpr_28();
extern "C" void _savegpr_29();
extern "C" void _restgpr_26();
extern "C" void _restgpr_27();
extern "C" void _restgpr_28();
extern "C" void _restgpr_29();
extern "C" void* __vt__7JKRHeap;
//
// Declarations:
@ -131,13 +57,14 @@ JKRHeap::JKRHeap(void* data, u32 size, JKRHeap* parent, bool errorFlag)
if (getSystemHeap() == getRootHeap()) {
becomeSystemHeap();
}
if (getCurrentHeap() == getRootHeap()) {
becomeCurrentHeap();
}
}
mErrorFlag = errorFlag;
if ((mErrorFlag == true) && (mErrorHandler == NULL)) {
if (mErrorFlag == true && mErrorHandler == NULL) {
mErrorHandler = JKRDefaultMemoryErrorRoutine;
}
@ -147,45 +74,16 @@ JKRHeap::JKRHeap(void* data, u32 size, JKRHeap* parent, bool errorFlag)
}
/* 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);
mChildTree.getParent()->removeChild(&mChildTree);
JSUTree<JKRHeap>* nextRootHeap = sRootHeap->mChildTree.getFirstChild();
JSUTree<JKRHeap>* nextRootHeap = getRootHeap()->mChildTree.getFirstChild();
if (sCurrentHeap == this)
sCurrentHeap = !nextRootHeap ? sRootHeap : nextRootHeap->getObject();
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);
if (sSystemHeap == this)
sSystemHeap = !nextRootHeap ? sRootHeap : nextRootHeap->getObject();
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRHeap::~JKRHeap() {
nofralloc
#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 */
@ -205,42 +103,46 @@ u32 JKRHeap::mMemorySize;
/* 802CE378-802CE428 2C8CB8 00B0+00 0/0 1/1 0/0 .text initArena__7JKRHeapFPPcPUli */
bool JKRHeap::initArena(char** memory, u32* size, int maxHeaps) {
u32 ram_start;
u32 ram_end;
void* ram;
void* ram_start;
void* ram_end;
void* arenaStart;
void* low = OSGetArenaLo();
void* high = OSGetArenaHi();
if (low == high)
void* arenaLo = OSGetArenaLo();
void* arenaHi = OSGetArenaHi();
if (arenaLo == arenaHi)
return false;
ram = OSInitAlloc(low, high, maxHeaps);
ram_start = ALIGN_NEXT((u32)ram, 0x20);
ram_end = ALIGN_PREV((u32)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((void*)ram_end);
OSSetArenaHi((void*)ram_end);
arenaStart = OSInitAlloc(arenaLo, arenaHi, maxHeaps);
ram_start = (void*)ALIGN_NEXT((u32)arenaStart, 0x20);
ram_end = (void*)ALIGN_PREV((u32)arenaHi, 0x20);
GLOBAL_MEMORY* codeStart = (GLOBAL_MEMORY*)OSPhysicalToCached(0);
mCodeStart = codeStart;
mCodeEnd = ram_start;
mUserRamStart = ram_start;
mUserRamEnd = ram_end;
mMemorySize = codeStart->memory_size;
OSSetArenaLo(ram_end);
OSSetArenaHi(ram_end);
*memory = (char*)ram_start;
*size = ram_end - ram_start;
*size = (u32)ram_end - (u32)ram_start;
return true;
}
/* 802CE428-802CE438 2C8D68 0010+00 1/1 0/0 0/0 .text becomeSystemHeap__7JKRHeapFv */
JKRHeap* JKRHeap::becomeSystemHeap() {
JKRHeap* prev = JKRHeap::getSystemHeap();
setSystemHeap(this);
JKRHeap* prev = sSystemHeap;
sSystemHeap = this;
return prev;
}
/* 802CE438-802CE448 2C8D78 0010+00 1/1 22/22 1/1 .text becomeCurrentHeap__7JKRHeapFv */
JKRHeap* JKRHeap::becomeCurrentHeap() {
JKRHeap* prev = getCurrentHeap();
setCurrentHeap(this);
JKRHeap* prev = sCurrentHeap;
sCurrentHeap = this;
return prev;
}
@ -255,8 +157,8 @@ void* JKRHeap::alloc(u32 size, int alignment, JKRHeap* heap) {
return heap->alloc(size, alignment);
}
if (getCurrentHeap() != NULL) {
return getCurrentHeap()->alloc(size, alignment);
if (sCurrentHeap != NULL) {
return sCurrentHeap->alloc(size, alignment);
}
return NULL;
@ -284,6 +186,16 @@ void JKRHeap::free(void* ptr) {
}
/* 802CE574-802CE5CC 2C8EB4 0058+00 1/0 5/2 0/0 .text callAllDisposer__7JKRHeapFv */
// missing stack var
#ifdef NONMATCHING
void JKRHeap::callAllDisposer() {
JSUListIterator<JKRDisposer> iterator;
while (iterator = mDisposerList.getFirst(), iterator != mDisposerList.getEnd()) {
iterator->~JKRDisposer();
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@ -292,6 +204,7 @@ asm void JKRHeap::callAllDisposer() {
#include "asm/JSystem/JKernel/JKRHeap/callAllDisposer__7JKRHeapFv.s"
}
#pragma pop
#endif
/* 802CE5CC-802CE5F8 2C8F0C 002C+00 0/0 12/12 0/0 .text freeAll__7JKRHeapFv */
void JKRHeap::freeAll() {
@ -351,8 +264,8 @@ s32 JKRHeap::getTotalFreeSize() {
}
/* 802CE7B0-802CE7DC 2C90F0 002C+00 0/0 1/1 0/0 .text changeGroupID__7JKRHeapFUc */
s32 JKRHeap::changeGroupID(u8 param_1) {
return do_changeGroupID(param_1);
s32 JKRHeap::changeGroupID(u8 groupID) {
return do_changeGroupID(groupID);
}
/* 802CE7DC-802CE83C 2C911C 0060+00 0/0 2/2 0/0 .text getMaxAllocatableSize__7JKRHeapFi
@ -381,16 +294,15 @@ asm u32 JKRHeap::getMaxAllocatableSize(int param_0) {
/* 802CE83C-802CE894 2C917C 0058+00 3/3 8/8 0/0 .text findFromRoot__7JKRHeapFPv */
JKRHeap* JKRHeap::findFromRoot(void* ptr) {
JKRHeap* rootHeap = getRootHeap();
if (rootHeap == NULL) {
if (sRootHeap == NULL) {
return NULL;
}
if (rootHeap->getStartAddr() <= ptr && ptr < rootHeap->getEndAddr()) {
return rootHeap->find(ptr);
if (sRootHeap->mStart <= ptr && ptr < sRootHeap->mEnd) {
return sRootHeap->find(ptr);
}
return rootHeap->findAllHeap(ptr);
return sRootHeap->findAllHeap(ptr);
}
/* 802CE894-802CE93C 2C91D4 00A8+00 1/1 1/1 0/0 .text find__7JKRHeapCFPv */
@ -415,21 +327,20 @@ JKRHeap* JKRHeap::find(void* memory) const {
/* 802CE93C-802CE9E4 2C927C 00A8+00 1/1 0/0 0/0 .text findAllHeap__7JKRHeapCFPv */
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 (mChildTree.getNumChildren() != 0) {
for (JSUTreeIterator<JKRHeap> iterator(mChildTree.getFirstChild());
iterator != mChildTree.getEndChild(); ++iterator)
{
JKRHeap* result = iterator->findAllHeap(ptr);
if (result) {
return result;
}
}
}
if (getStartAddr() <= ptr && ptr < getEndAddr()) {
// todo: not sure about this... casting away const for now.
return (JKRHeap*)this;
if (mStart <= ptr && ptr < mEnd) {
return const_cast<JKRHeap*>(this);
}
return NULL;
@ -441,6 +352,7 @@ 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)
{
@ -448,6 +360,7 @@ void JKRHeap::dispose_subroutine(u32 begin, u32 end) {
if ((void*)begin <= disposer && disposer < (void*)end) {
disposer->~JKRDisposer();
if (last_iterator == NULL) {
next_iterator = mDisposerList.getFirst();
} else {
@ -513,7 +426,7 @@ void JKRHeap::copyMemory(void* dst, void* src, u32 size) {
/* 802CEB40-802CEB78 2C9480 0038+00 2/2 0/0 0/0 .text JKRDefaultMemoryErrorRoutine__FPvUli */
void JKRDefaultMemoryErrorRoutine(void* heap, u32 size, int alignment) {
JUTException::panic_f("JKRHeap.cpp", 0x33f, "%s", "abort\n");
JUTException::panic_f(__FILE__, 831, "%s", "abort\n");
}
/* 802CEB78-802CEB88 2C94B8 0010+00 0/0 2/2 0/0 .text setErrorFlag__7JKRHeapFb */
@ -541,17 +454,16 @@ bool JKRHeap::isSubHeap(JKRHeap* heap) const {
if (!heap)
return false;
const JSUTree<JKRHeap>& tree = mChildTree;
if (tree.getNumChildren() != 0) {
if (mChildTree.getNumChildren() != 0) {
JSUTreeIterator<JKRHeap> iterator;
for (iterator = tree.getFirstChild(); iterator != tree.getEndChild(); ++iterator) {
JKRHeap* child = iterator.getObject();
if (child == heap) {
for (iterator = mChildTree.getFirstChild(); iterator != mChildTree.getEndChild();
++iterator)
{
if (iterator.getObject() == heap) {
return true;
}
bool is_sub_heap = child->isSubHeap(heap);
if (is_sub_heap) {
if (iterator.getObject()->isSubHeap(heap)) {
return true;
}
}
@ -603,14 +515,14 @@ void operator delete[](void* ptr) {
/* 802CED84-802CED88 2C96C4 0004+00 1/0 1/0 0/0 .text
* state_register__7JKRHeapCFPQ27JKRHeap6TStateUl */
void JKRHeap::state_register(JKRHeap::TState* p, u32 id) const {
JUT_ASSERT("JKRHeap.cpp", 0x4bd, p != 0);
JUT_ASSERT("JKRHeap.cpp", 0x4be, p->getHeap() == this);
JUT_ASSERT(__FILE__, 1213, p != 0);
JUT_ASSERT(__FILE__, 1214, p->getHeap() == this);
}
/* 802CED88-802CEDA0 2C96C8 0018+00 1/0 1/0 0/0 .text
* state_compare__7JKRHeapCFRCQ27JKRHeap6TStateRCQ27JKRHeap6TState */
bool JKRHeap::state_compare(JKRHeap::TState const& r1, JKRHeap::TState const& r2) const {
JUT_ASSERT("JKRHeap.cpp", 0x4c6, r1.getHeap() == r2.getHeap());
JUT_ASSERT(__FILE__, 1222, r1.getHeap() == r2.getHeap());
return r1.getCheckCode() == r2.getCheckCode();
}
@ -630,5 +542,3 @@ s32 JKRHeap::do_changeGroupID(u8 param_0) {
u8 JKRHeap::do_getCurrentGroupId() {
return 0;
}
/* 8039CAD8-8039CAD8 029138 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */

View File

@ -9,85 +9,6 @@
#include "JSystem/JUtility/JUTException.h"
#include "MSL_C/MSL_Common/Src/string.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 JKRMemBreakFlag {};
// 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*);
// /* 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 JKRHeap {
// /* 802CE500 */ void free(void*, JKRHeap*);
// /* 802CE83C */ void findFromRoot(void*);
// };
// 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 JKRDecomp {
// /* 802DB988 */ void orderSync(u8*, u8*, u32, u32);
// };
//
// Forward References:
@ -209,16 +130,16 @@ bool JKRMemArchive::open(long entryNum, JKRArchive::EMountDirection mountDirecti
if (mMountDirection == JKRArchive::MOUNT_DIRECTION_HEAD) {
u32 loadedSize;
mArcHeader = (SArcHeader*)JKRDvdRipper::loadToMainRAM(
entryNum, NULL, EXPAND_SWITCH_UNKNOWN1, 0, mHeap, JKRDvdRipper::ALLOC_DIRECTION_FORWARD, 0,
&mCompression, &loadedSize);
entryNum, NULL, EXPAND_SWITCH_UNKNOWN1, 0, mHeap, JKRDvdRipper::ALLOC_DIRECTION_FORWARD,
0, &mCompression, &loadedSize);
if (mArcHeader) {
DCInvalidateRange(mArcHeader, loadedSize);
}
} else {
u32 loadedSize;
mArcHeader = (SArcHeader*)JKRDvdRipper::loadToMainRAM(
entryNum, NULL, EXPAND_SWITCH_UNKNOWN1, 0, mHeap, JKRDvdRipper::ALLOC_DIRECTION_BACKWARD, 0,
&mCompression, &loadedSize);
entryNum, NULL, EXPAND_SWITCH_UNKNOWN1, 0, mHeap,
JKRDvdRipper::ALLOC_DIRECTION_BACKWARD, 0, &mCompression, &loadedSize);
if (mArcHeader) {
DCInvalidateRange(mArcHeader, loadedSize);
}
@ -354,17 +275,6 @@ bool JKRMemArchive::removeResource(void* resource) {
return true;
}
/* ############################################################################################## */
/* 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
/* 802D6F5C-802D7030 2D189C 00D4+00 1/1 1/1 0/0 .text
* fetchResource_subroutine__13JKRMemArchiveFPUcUlPUcUli */
u32 JKRMemArchive::fetchResource_subroutine(u8* src, u32 srcLength, u8* dst, u32 dstLength,
@ -390,7 +300,7 @@ u32 JKRMemArchive::fetchResource_subroutine(u8* src, u32 srcLength, u8* dst, u32
return srcLength;
default: {
JUTException::panic_f("JKRMemArchive.cpp", 0x2d3, "%s", "??? bad sequence\n");
JUTException::panic_f(__FILE__, 723, "%s", "??? bad sequence\n");
} break;
}
@ -409,5 +319,3 @@ u32 JKRMemArchive::getExpandedResSize(const void* resource) const {
return JKRDecompExpandSize((SArcHeader*)resource);
}
}
/* 8039D160-8039D160 0297C0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */

View File

@ -149,8 +149,8 @@ void* JKRSolidHeap::do_alloc(u32 size, int alignment) {
// TODO(Julgodis): JUTAssertion::setConfirmMessage
if (alignment != 0) {
int u = abs(alignment);
JUT_ASSERT("JKRSolidHeap.cpp", 0xdb, u < 0x80);
JUT_ASSERT("JKRSolidHeap.cpp", 0xdc, JGadget::binary::isPower2(u));
JUT_ASSERT(__FILE__, 0xdb, u < 0x80);
JUT_ASSERT(__FILE__, 0xdc, JGadget::binary::isPower2(u));
}
#endif
@ -318,8 +318,8 @@ bool JKRSolidHeap::dump(void) {
// full match expect using the wrong register
#ifdef NONMATCHING
void JKRSolidHeap::state_register(JKRHeap::TState* p, u32 id) const {
JUT_ASSERT("JKRSolidHeap.cpp", 0x25c, p != 0);
JUT_ASSERT("JKRSolidHeap.cpp", 0x25d, p->getHeap() == this);
JUT_ASSERT(__FILE__, 0x25c, p != 0);
JUT_ASSERT(__FILE__, 0x25d, p->getHeap() == this);
getState_(p);
setState_u32ID_(p, id);
@ -340,7 +340,7 @@ asm void JKRSolidHeap::state_register(JKRHeap::TState* param_0, u32 param_1) con
/* 802D1258-802D1288 2CBB98 0030+00 1/0 0/0 0/0 .text
* state_compare__12JKRSolidHeapCFRCQ27JKRHeap6TStateRCQ27JKRHeap6TState */
bool JKRSolidHeap::state_compare(JKRHeap::TState const& r1, JKRHeap::TState const& r2) const {
JUT_ASSERT("JKRSolidHeap.cpp", 0x278, r1.getHeap() == r2.getHeap());
JUT_ASSERT(__FILE__, 632, r1.getHeap() == r2.getHeap());
bool result = true;
if (r1.getCheckCode() != r2.getCheckCode()) {
@ -373,5 +373,3 @@ void* JKRSolidHeap::do_getMaxFreeBlock(void) {
s32 JKRSolidHeap::do_getTotalFreeSize(void) {
return getFreeSize();
}
/* 8039CE50-8039CE50 0294B0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */

View File

@ -6,29 +6,9 @@
#include "JSystem/JKernel/JKRThread.h"
#include "JSystem/JKernel/JKRExpHeap.h"
#include "JSystem/JUtility/JUTAssert.h"
#include "JSystem/JUtility/JUTConsole.h"
#include "MSL_C/MSL_Common/Src/printf.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JUTConsole {
/* 802E75EC */ void clear();
/* 802E7BB8 */ void print_f(char const*, ...);
/* 802E7C38 */ void print(char const*);
};
//
// External References:
//
extern "C" void JUTWarningConsole(const char*);
//
// Declarations:
//
/* 8043428C-80434298 060FAC 000C+00 5/6 0/0 0/0 .bss sThreadList__9JKRThread */
JSUList<JKRThread> JKRThread::sThreadList(0);
@ -164,7 +144,7 @@ JKRThreadSwitch::JKRThreadSwitch(JKRHeap* param_0) {
/* 802D1A14-802D1A70 2CC354 005C+00 0/0 1/1 0/0 .text createManager__15JKRThreadSwitchFP7JKRHeap
*/
JKRThreadSwitch* JKRThreadSwitch::createManager(JKRHeap* heap) {
JUT_ASSERT("JKRThread.cpp", 0x157, sManager == 0);
JUT_ASSERT(__FILE__, 343, sManager == 0);
if (!heap) {
heap = JKRGetCurrentHeap();
@ -245,8 +225,7 @@ void JKRThreadSwitch::callback(OSThread* current, OSThread* next) {
} else {
switch (thread->getCurrentHeapError()) {
case 0:
JUT_PANIC("JKRThread.cpp", 0x1fc,
"JKRThreadSwitch: currentHeap destroyed.");
JUT_PANIC(__FILE__, 508, "JKRThreadSwitch: currentHeap destroyed.");
break;
case 1:
JUTWarningConsole("JKRThreadSwitch: currentHeap destroyed.\n");
@ -345,13 +324,6 @@ void JKRThreadSwitch::draw(JKRThreadName_* thread_name_list) {
/* 802D1E4C-802D1E94 2CC78C 0048+00 1/0 0/0 0/0 .text __dt__15JKRThreadSwitchFv */
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
/* 804342A4-804342B0 060FC4 000C+00 0/1 0/0 0/0 .bss sTaskList__7JKRTask */
#pragma push
#pragma force_active on
@ -364,5 +336,3 @@ JSUList<JKRTask> JKRTask::sTaskList;
#pragma force_active on
u8 JKRTask::sEndMesgQueue[32];
#pragma pop
/* 8039CFA8-8039CFA8 029608 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */

View File

@ -501,5 +501,3 @@ void JUTWarningConsole_f(const char* fmt, ...) {
void JUTWarningConsole(const char* message) {
JUTReportConsole_f("%s", message);
}
/* 8039D9A8-8039D9A8 02A008 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */