JKRAram and JKRAramStream (#80)

* before __register_global_object

* JKRThread::sThreadList, JKRHeap::sSystemHeap, etc.

* cleanup and started on JKRDvdArchive

* before changing JKRCompression

* more JKRDvdArchive, abs, and memset

* fixed JKRArchive::setExpandSize split

* JKRArchive::sCurrentDirID, JKRDvdFile::sDvdList, and matching JKRDvdFile constructors

* problems

* merge fixes and formatting

* updated clang version in clang-format-all to version 10

* Added OSPhysicalToCached and struct for global memory

* remove useless __attribute__

* changed from defines and macros to const variable and function

* changed FLAG_HAS to FLAG_ON

* JKRAram, linking problems

* fix JKRAram

* remove nonmatching stuff

* renamed static data

* more static class members

* JKRAramStream OK

* formatting

Co-authored-by: Julgodis <>
Co-authored-by: Pheenoh <pheenoh@gmail.com>
This commit is contained in:
Jonathan Wase
2021-01-09 20:15:52 -05:00
committed by GitHub
co-authored by Julgodis <> Pheenoh
parent 8bd3d07e23
commit 82d5e0f796
255 changed files with 2048 additions and 3354 deletions
+240 -22
View File
@@ -1,34 +1,132 @@
#include "JSystem/JKernel/JKRAram/JKRAram.h"
#include "JSystem/JKernel/JKRAramBlock/JKRAramBlock.h"
#include "JSystem/JKernel/JKRAramHeap/JKRAramHeap.h"
#include "JSystem/JKernel/JKRAramPiece/JKRAramPiece.h"
#include "JSystem/JKernel/JKRAramStream/JKRAramStream.h"
#include "JSystem/JKernel/JKRDecomp/JKRDecomp.h"
#include "JSystem/JKernel/JKRExpHeap/JKRExpHeap.h"
#include "JSystem/JKernel/JKRHeap/JKRHeap.h"
#include "global.h"
asm void JKRAram::create(u32, u32, long, long, long) {
nofralloc
#include "JSystem/JKernel/JKRAram/asm/func_802D1FA4.s"
// Uncomment when static initialization is working
// JKRAram* JKRAram::sAramObject = NULL;
// u32 JKRAram::sSZSBufferSize = 0x400;
static void decompSZS_subroutine(u8*, u8*);
static u8* firstSrcData(void);
static u8* nextSrcData(u8*);
// The prefix JKRAram__ is for now used to skip name collision in 'sbss.s'. All of these variables
// are probably defined as static and only visible in this translation unit.
extern u8* JKRAram__szpBuf;
extern u8* JKRAram__szpEnd;
extern u8* JKRAram__refBuf;
extern u8* JKRAram__refEnd;
extern u8* JKRAram__refCurrent;
extern u32 JKRAram__srcOffset;
extern u32 JKRAram__transLeft;
extern u32 JKRAram__srcLimit;
extern u32 JKRAram__srcAddress;
extern u32 JKRAram__fileOffset;
extern u32 JKRAram__readCount;
extern u32 JKRAram__maxDest;
extern u32* JKRAram__tsPtr;
extern u32 JKRAram__tsArea;
JKRAram* JKRAram::create(u32 aram_audio_buffer_size, u32 aram_audio_graph_size,
long stream_priority, long decomp_priority, long piece_priority) {
if (!sAramObject) {
sAramObject = new (JKRHeap::getSystemHeap(), 0)
JKRAram(aram_audio_buffer_size, aram_audio_graph_size, piece_priority);
}
JKRCreateAramStreamManager(stream_priority);
JKRCreateDecompManager(decomp_priority);
sAramObject->resume();
return sAramObject;
}
asm JKRAram::JKRAram(u32, u32, long) {
nofralloc
#include "JSystem/JKernel/JKRAram/asm/func_802D2040.s"
JKRAram::JKRAram(u32 audio_buffer_size, u32 audio_graph_size, long priority)
: JKRThread(0xC00, 0x10, priority) {
u32 aramBase = ARInit(mStackArray, ARRAY_SIZE(mStackArray));
ARQInit();
u32 aramSize = ARGetSize();
mAudioMemorySize = audio_buffer_size;
if (audio_graph_size == 0xffffffff) {
mGraphMemorySize = (aramSize - audio_buffer_size) - aramBase;
mAramMemorySize = 0;
} else {
mGraphMemorySize = audio_graph_size;
mAramMemorySize = (aramSize - (audio_buffer_size + audio_graph_size)) - aramBase;
}
mAudioMemoryPtr = ARAlloc(mAudioMemorySize);
mGraphMemoryPtr = ARAlloc(mGraphMemorySize);
if (mAramMemorySize) {
mAramMemoryPtr = ARAlloc(mAramMemorySize);
} else {
mAramMemoryPtr = NULL;
}
mAramHeap = new (JKRHeap::getSystemHeap(), 0) JKRAramHeap(mGraphMemoryPtr, mGraphMemorySize);
}
asm JKRAram::~JKRAram() {
nofralloc
#include "JSystem/JKernel/JKRAram/asm/func_802D214C.s"
JKRAram::~JKRAram() {
sAramObject = NULL;
if (mAramHeap)
delete mAramHeap;
}
// almost full match
#ifdef NONMATCHING
void* JKRAram::run(void) {
int result;
JKRAMCommand* command;
JKRAMCommand::Message* message;
OSInitMessageQueue(&sMessageQueue, sMessageBuffer, 4);
do {
OSReceiveMessage(&sMessageQueue, &message, OS_MESSAGE_BLOCKING);
result = message->field_0x0;
command = message->command;
delete message;
if (result == 1) {
JKRAramPiece::startDMA(command);
}
} while (true);
}
#else
asm void* JKRAram::run(void) {
nofralloc
#include "JSystem/JKernel/JKRAram/asm/func_802D21DC.s"
}
#endif
asm void JKRAram::checkOkAddress(u8*, u32, JKRAramBlock*, u32) {
nofralloc
#include "JSystem/JKernel/JKRAram/asm/func_802D2248.s"
void JKRAram::checkOkAddress(u8* addr, u32 size, JKRAramBlock* block, u32 param_4) {
if (!IS_ALIGNED((u32)addr, 0x20) && !IS_ALIGNED(size, 0x20)) {
const char* file = lbl_8039D078;
const char* format = lbl_8039D078 + 0xc;
const char* arg1 = lbl_8039D078 + 0xc + 0x3;
JUTException_NS_panic_f(file, 0xdb, format, arg1);
}
if (block && !IS_ALIGNED((u32)block->getAddress() + param_4, 0x20)) {
const char* file = lbl_8039D078;
const char* format = lbl_8039D078 + 0xc;
const char* arg1 = lbl_8039D078 + 0xc + 0x3;
JUTException_NS_panic_f(file, 0xe3, format, arg1);
}
}
asm void JKRAram::changeGroupIdIfNeed(u8*, int) {
nofralloc
#include "JSystem/JKernel/JKRAram/asm/func_802D22DC.s"
void JKRAram::changeGroupIdIfNeed(u8* data, int groupId) {
JKRHeap* currentHeap = JKRHeap::getCurrentHeap();
if (currentHeap->getHeapType() == 'EXPH' && groupId >= 0) {
JKRExpHeap::CMemBlock* block = JKRExpHeap::CMemBlock::getBlock(data);
block->newGroupId(groupId);
}
}
asm void JKRAram::mainRamToAram(u8*, u32, u32, JKRExpandSwitch, u32, JKRHeap*, int, u32*) {
@@ -41,25 +139,145 @@ asm void JKRAram::aramToMainRam(u32, u8*, u32, JKRExpandSwitch, u32, JKRHeap*, i
#include "JSystem/JKernel/JKRAram/asm/func_802D25B4.s"
}
asm void JKRDecompressFromAramToMainRam(u32, void*, u32, u32, u32, u32*) {
#ifdef NONMATCHING
// full match, except:
// tsPtr = &tsArea;
// doesn't use r13
void JKRDecompressFromAramToMainRam(u32 src, void* dst, u32 srcLength, u32 dstLength, u32 offset,
u32* resourceSize) {
#define s_is_decompress_mutex_initialized lbl_804513FC
#define decompMutex lbl_804343C0
// STATIC BEGIN
// This code is probably generated by the compiler for a static variable
BOOL enable = OSDisableInterrupts();
if (s_is_decompress_mutex_initialized == false) {
OSInitMutex(&decompMutex);
s_is_decompress_mutex_initialized = true;
}
OSRestoreInterrupts(enable);
// STATIC END
OSLockMutex(&decompMutex);
u32 szpSize = getSZSBufferSize();
szpBuf = (u8*)JKRAllocFromSysHeap(szpSize, 0x20);
ASSERT(szpBuf != 0);
szpEnd = szpBuf + szpSize;
if (offset != 0) {
refBuf = (u8*)JKRAllocFromSysHeap(0x1120, 0);
ASSERT(refBuf != 0);
refEnd = refBuf + 0x1120;
refCurrent = refBuf;
} else {
refBuf = NULL;
}
srcAddress = src;
srcOffset = 0;
if (srcLength == 0) {
transLeft = -1;
} else {
transLeft = srcLength;
}
fileOffset = offset;
readCount = 0;
maxDest = dstLength;
if (!resourceSize) {
tsPtr = &tsArea;
} else {
tsPtr = resourceSize;
}
*tsPtr = 0;
decompSZS_subroutine(firstSrcData(), (u8*)dst);
JKRFreeToSysHeap(szpBuf);
if (refBuf) {
JKRFreeToSysHeap(refBuf);
}
DCStoreRangeNoSync(dst, *tsPtr);
OSUnlockMutex(&decompMutex);
#undef s_is_decompress_mutex_initialized
#undef decompMutex
}
#else
asm void JKRDecompressFromAramToMainRam(u32 src, void* dst, u32 srcLength, u32 dstLength,
u32 offset, u32* resourceSize) {
nofralloc
#include "JSystem/JKernel/JKRAram/asm/func_802D2830.s"
}
#endif
asm void decompSZS_subroutine(u8*, u8*) {
nofralloc
asm void decompSZS_subroutine(u8*, u8*){nofralloc
#include "JSystem/JKernel/JKRAram/asm/func_802D29A0.s"
}
asm void firstSrcData(void) {
nofralloc
#include "JSystem/JKernel/JKRAram/asm/func_802D2C40.s"
u8* firstSrcData(void) {
JKRAram__srcLimit = (u32)(JKRAram__szpEnd - 0x19);
u8* buffer = JKRAram__szpBuf;
u32 length;
u32 size = JKRAram__szpEnd - JKRAram__szpBuf;
if (JKRAram__transLeft < size) {
length = JKRAram__transLeft;
} else {
length = size;
}
u32 src = (u32)(JKRAram__srcAddress + JKRAram__srcOffset);
u32 dst = (u32)buffer;
u32 alignedLength = ALIGN_NEXT(length, 0x20);
JKRAramPcs(1, src, dst, alignedLength, NULL);
JKRAram__srcOffset += length;
JKRAram__transLeft -= length;
if (!JKRAram__transLeft) {
JKRAram__srcLimit = (u32)(buffer + length);
}
return buffer;
}
asm void nextSrcData(u8*) {
// missing one add instruction
#ifdef NONMATCHING
inline u32 nextSrcData_MIN(u32 A, u32 B) {
if (A > B)
return B;
return A;
}
static u8* nextSrcData(u8* current) {
u8* dest;
u32 left = (u32)(szpEnd - current);
if (!IS_NOT_ALIGNED(left, 0x20)) {
dest = szpBuf;
} else {
dest = szpBuf + 0x20 - (left & 0x1f);
}
memcpy(dest, current, left);
u32 transSize = nextSrcData_MIN(transLeft, szpEnd - (dest + left));
ASSERT(transSize > 0);
JKRAramPcs(1, (u32)(srcAddress + srcOffset), (u32)(dest + left), ALIGN_NEXT(transSize, 0x20),
NULL);
srcOffset += transSize;
transLeft -= transSize;
if (transLeft == 0) {
srcLimit = (u32)(dest + left) + transSize;
}
return dest;
}
#else
asm u8* nextSrcData(u8* current) {
nofralloc
#include "JSystem/JKernel/JKRAram/asm/func_802D2CE4.s"
}
#endif
#if 0
asm void __sinit_JKRAram_cpp {
+1 -1
View File
@@ -48,7 +48,7 @@ asm void JKRAramArchive::fetchResource_subroutine(u32, u32, JKRHeap*, int, u8**)
#include "JSystem/JKernel/JKRAramArchive/asm/func_802D7914.s"
}
asm u32 JKRAramArchive::getExpandedResSize(void const*) const {
asm u32 JKRAramArchive::getExpandedResSize(void const*) {
nofralloc
#include "JSystem/JKernel/JKRAramArchive/asm/func_802D7A64.s"
}
+4 -4
View File
@@ -1,7 +1,7 @@
#include "JSystem/JKernel/JKRAramPiece/JKRAramPiece.h"
#include "global.h"
#include "JSystem/JKernel/JKRAram/JKRAram.h"
#include "JSystem/JKernel/JKRDecomp/JKRDecomp.h"
#include "global.h"
JKRAMCommand* JKRAramPiece::prepareCommand(int direction, u32 src, u32 dst, u32 length,
JKRAramBlock* block,
@@ -41,7 +41,7 @@ JKRAMCommand* JKRAramPiece::orderAsync(int direction, u32 source, u32 destinatio
message->field_0x00 = 1;
message->command = command;
OSSendMessage(&lbl_803CC138, message, OS_MESSAGE_BLOCKING);
OSSendMessage(&JKRAram::sMessageQueue, message, OS_MESSAGE_BLOCKING);
if (command->mCallback != NULL) {
lbl_80434324.append(&command->mPieceLink);
}
@@ -51,7 +51,7 @@ JKRAMCommand* JKRAramPiece::orderAsync(int direction, u32 source, u32 destinatio
}
BOOL JKRAramPiece::sync(JKRAMCommand* command, int is_non_blocking) {
OSMessage* message;
OSMessage message;
lock();
if (is_non_blocking == 0) {
+185 -32
View File
@@ -1,57 +1,210 @@
#include "JSystem/JKernel/JKRAramStream/JKRAramStream.h"
#include "JSystem/JKernel/JKRAramPiece/JKRAramPiece.h"
#include "global.h"
asm void JKRAramStream::create(long) {
nofralloc
#include "JSystem/JKernel/JKRAramStream/asm/func_802D3B48.s"
JKRAramStream* JKRAramStream::create(long priority) {
if (!sAramStreamObject) {
sAramStreamObject = new (JKRGetSystemHeap(), 0) JKRAramStream(priority);
setTransBuffer(NULL, 0, NULL);
}
return sAramStreamObject;
}
asm JKRAramStream::JKRAramStream(long) {
nofralloc
#include "JSystem/JKernel/JKRAramStream/asm/func_802D3BB8.s"
JKRAramStream::JKRAramStream(long priority) : JKRThread(0xc00, 0x10, priority) {
resume();
}
asm JKRAramStream::~JKRAramStream() {
nofralloc
#include "JSystem/JKernel/JKRAramStream/asm/func_802D3C08.s"
JKRAramStream::~JKRAramStream() {}
void* JKRAramStream::run(void) {
OSInitMessageQueue(&sMessageQueue, sMessageBuffer, ARRAY_SIZE(sMessageBuffer));
for (;;) {
OSMessage message;
OSReceiveMessage(&sMessageQueue, &message, OS_MESSAGE_BLOCKING);
JKRAramStreamCommand* command = (JKRAramStreamCommand*)message;
switch (command->mType) {
case JKRAramStreamCommand::READ:
readFromAram();
break;
case JKRAramStreamCommand::WRITE:
writeToAram(command);
break;
}
}
}
asm void* JKRAramStream::run(void) {
nofralloc
#include "JSystem/JKernel/JKRAramStream/asm/func_802D3C68.s"
s32 JKRAramStream::readFromAram(void) {
return 1;
}
asm void JKRAramStream::readFromAram(void) {
nofralloc
#include "JSystem/JKernel/JKRAramStream/asm/func_802D3CD8.s"
}
// regalloc problems
#ifdef NONMATCHING
s32 JKRAramStream::writeToAram(JKRAramStreamCommand* command) {
u32 size;
u32 dstSize = command->mDstLength;
u32 offset = command->mOffset;
u32 writtenLength = 0;
u32 destination = command->mDst;
u8* buffer = command->mTransferBuffer;
u32 bufferSize = command->mTransferBufferSize;
JKRHeap* heap = command->mHeap;
if (buffer) {
if (bufferSize) {
size = bufferSize;
} else {
size = 0x8000;
}
asm void JKRAramStream::writeToAram(JKRAramStreamCommand*) {
command->mTransferBufferSize = size;
command->mAllocatedTransferBuffer = false;
} else {
if (bufferSize) {
size = bufferSize;
} else {
size = 0x8000;
}
if (heap) {
buffer = (u8*)JKRAllocFromHeap(heap, size, -0x20);
command->mTransferBuffer = buffer;
} else {
buffer = (u8*)JKRAllocFromSysHeap(size, -0x20);
command->mTransferBuffer = buffer;
}
command->mTransferBufferSize = size;
command->mAllocatedTransferBuffer = true;
}
if (!buffer) {
if (!heap) {
JKRGetCurrentHeap()->dump();
} else {
heap->dump();
}
const char* file = lbl_8039D120; // "JKRAramStream.cpp";
const char* format = lbl_8039D120 + 0x12; // "%s";
const char* arg1 = lbl_8039D120 + 0x15; // ":::Cannot alloc memory\n";
JUTException_NS_panic_f(file, 0xac, format, arg1);
}
if (buffer) {
JSURandomInputStream_NS_seek((JSURandomInputStream*)command->mStream, offset, 0);
while (dstSize != 0) {
u32 length;
if (dstSize > size) {
length = size;
} else {
length = dstSize;
}
s32 readLength =
JSUInputStream_NS_read((JSUInputStream*)command->mStream, buffer, length);
if (readLength == 0) {
writtenLength = 0;
break;
}
JKRAramPcs(0, (u32)buffer, destination, length, NULL);
dstSize -= length;
writtenLength += writtenLength;
destination += length;
if (command->mReturnSize) {
*command->mReturnSize += length;
}
}
if (command->mAllocatedTransferBuffer) {
JKRFree(buffer);
command->mAllocatedTransferBuffer = false;
}
}
OSSendMessage(&command->mMessageQueue, (OSMessage)writtenLength, OS_MESSAGE_NON_BLOCKING);
return writtenLength;
}
#else
asm s32 JKRAramStream::writeToAram(JKRAramStreamCommand* command) {
nofralloc
#include "JSystem/JKernel/JKRAramStream/asm/func_802D3CE0.s"
}
#endif
asm void JKRAramStream::write_StreamToAram_Async(JSUFileInputStream*, u32, u32, u32, u32*) {
nofralloc
#include "JSystem/JKernel/JKRAramStream/asm/func_802D3ED0.s"
JKRAramStreamCommand* JKRAramStream::write_StreamToAram_Async(JSUFileInputStream* stream, u32 addr,
u32 size, u32 offset,
u32* returnSize) {
JKRAramStreamCommand* command = new (JKRGetSystemHeap(), -4) JKRAramStreamCommand();
command->mType = JKRAramStreamCommand::WRITE;
command->mAddress = addr;
command->mSize = size;
command->mStream = stream;
command->field_0x2c = 0;
command->mOffset = offset;
command->mTransferBuffer = transBuffer;
command->mHeap = transHeap;
command->mTransferBufferSize = transSize;
command->mReturnSize = returnSize;
if (returnSize) {
*returnSize = 0;
}
OSInitMessageQueue(&command->mMessageQueue, &command->mMessage, 1);
OSSendMessage(&sMessageQueue, command, OS_MESSAGE_BLOCKING);
return command;
}
asm void JKRAramStream::sync(JKRAramStreamCommand*, int) {
nofralloc
#include "JSystem/JKernel/JKRAramStream/asm/func_802D3FA0.s"
JKRAramStreamCommand* JKRAramStream::sync(JKRAramStreamCommand* command, BOOL isNonBlocking) {
OSMessage message;
if (isNonBlocking == 0) {
OSReceiveMessage(&command->mMessageQueue, &message, OS_MESSAGE_BLOCKING);
if (message == NULL) {
command = NULL;
return command;
} else {
return command;
}
} else {
BOOL receiveResult =
OSReceiveMessage(&command->mMessageQueue, &message, OS_MESSAGE_NON_BLOCKING);
if (receiveResult == FALSE) {
command = NULL;
return command;
} else if (message == NULL) {
command = NULL;
return command;
} else {
return command;
}
}
}
asm void JKRAramStream::setTransBuffer(u8*, u32, JKRHeap*) {
nofralloc
#include "JSystem/JKernel/JKRAramStream/asm/func_802D4034.s"
void JKRAramStream::setTransBuffer(u8* buffer, u32 bufferSize, JKRHeap* heap) {
transBuffer = NULL;
transSize = 0x8000;
transHeap = NULL;
if (buffer) {
transBuffer = (u8*)ALIGN_NEXT((u32)buffer, 0x20);
}
if (bufferSize) {
transSize = ALIGN_PREV(bufferSize, 0x20);
}
if (heap && !buffer) {
transHeap = heap;
}
}
asm JKRAramStreamCommand::JKRAramStreamCommand(void) {
nofralloc
#include "JSystem/JKernel/JKRAramStream/asm/func_802D4088.s"
JKRAramStreamCommand::JKRAramStreamCommand() {
mAllocatedTransferBuffer = false;
}
asm void JSURandomInputStream::getAvailable(void) const {
nofralloc
#include "JSystem/JKernel/JKRAramStream/asm/func_802D4094.s"
s32 JSURandomInputStream::getAvailable() const {
return getLength() - getPosition();
}
+7 -18
View File
@@ -194,29 +194,18 @@ const char* JKRArchive::CArcName::store(const char* name, char endChar) {
return name + 1;
}
// using include vs the JKRArchivePri.s file yields different code
// super weird...
#if 0
#if NONMATCHING
void JKRArchive::setExpandSize(SDIFileEntry* fileEntry, u32 expandSize) {
int index = fileEntry - mFiles;
if (!mExpandedSize)
return;
if (index <= mArcInfoBlock->num_file_entries)
if (!mExpandedSize || index >= mArcInfoBlock->num_file_entries)
return;
mExpandedSize[index] = expandSize;
}
#else
asm void JKRArchive::setExpandSize(SDIFileEntry* fileEntry, u32 expandSize) {
nofralloc
#include "JSystem/JKernel/JKRArchive/asm/func_802D693C.s"
}
#endif
asm void JKRArchive::getExpandSize(SDIFileEntry*) const {
nofralloc
#include "JSystem/JKernel/JKRArchive/asm/func_802D6978.s"
u32 JKRArchive::getExpandSize(SDIFileEntry* fileEntry) const {
int index = fileEntry - mFiles;
if (!mExpandedSize || index >= mArcInfoBlock->num_file_entries)
return 0;
return mExpandedSize[index];
}
#endif
+2 -2
View File
@@ -44,7 +44,7 @@ JKRArchive* JKRArchive::mount(void* ptr, JKRHeap* heap,
return archive;
int alignment;
if (mountDirection == JKRArchive::HEAD) {
if (mountDirection == JKRArchive::MOUNT_DIRECTION_HEAD) {
alignment = 4;
} else {
alignment = -4;
@@ -61,7 +61,7 @@ JKRArchive* JKRArchive::mount(s32 entryNum, JKRArchive::EMountMode mountMode, JK
return archive;
} else {
int alignment;
if (mountDirection == JKRArchive::HEAD) {
if (mountDirection == JKRArchive::MOUNT_DIRECTION_HEAD) {
alignment = 4;
} else {
alignment = -4;
+1 -1
View File
@@ -36,7 +36,7 @@ asm bool JKRCompArchive::removeResource(void*) {
#include "JSystem/JKernel/JKRCompArchive/asm/func_802D92F4.s"
}
asm u32 JKRCompArchive::getExpandedResSize(void const*) const {
asm u32 JKRCompArchive::getExpandedResSize(void const*) {
nofralloc
#include "JSystem/JKernel/JKRCompArchive/asm/func_802D9360.s"
}
+6 -7
View File
@@ -1,7 +1,6 @@
#include "JSystem/JKernel/JKRDecomp/JKRDecomp.h"
#include "global.h"
#include "JSystem/JKernel/JKRAramPiece/JKRAramPiece.h"
#include "global.h"
JKRDecomp* JKRDecomp::create(long priority) {
if (!lbl_804514B0) {
@@ -114,9 +113,9 @@ void JKRDecomp::decodeSZP(u8* src, u8* dst, u32 srcLength, u32 dstLength) {
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);
decodedSize = read_big_endian_u32(src + 4);
linkTableOffset = read_big_endian_u32(src + 8);
srcDataOffset = read_big_endian_u32(src + 12);
dstOffset = 0;
counter = 0;
@@ -131,7 +130,7 @@ void JKRDecomp::decodeSZP(u8* src, u8* dst, u32 srcLength, u32 dstLength) {
length = srcLength;
do {
if (counter == 0) {
chunkBits = READ_BIG_ENDIAN_U32(src + srcChunkOffset);
chunkBits = read_big_endian_u32(src + srcChunkOffset);
srcChunkOffset += 4;
counter = 32;
}
@@ -149,7 +148,7 @@ void JKRDecomp::decodeSZP(u8* src, u8* dst, u32 srcLength, u32 dstLength) {
dstOffset++;
srcDataOffset++;
} else {
u32 linkInfo = READ_BIG_ENDIAN_U16(src + linkTableOffset);
u32 linkInfo = read_big_endian_u16(src + linkTableOffset);
linkTableOffset += 2;
offset = dstOffset - (linkInfo & 0xFFF);
+6 -2
View File
@@ -2,6 +2,10 @@
#include "dvd/dvd.h"
#include "global.h"
static void decompSZS_subroutine(u8*, u32);
static u8* firstSrcData(void);
static u8* nextSrcData(u8*);
asm void JKRDvdAramRipper::loadToAram(long, u32, JKRExpandSwitch, u32, u32, u32*) {
nofralloc
#include "JSystem/JKernel/JKRDvdAramRipper/asm/func_802DA874.s"
@@ -53,12 +57,12 @@ asm void decompSZS_subroutine(u8*, u32) {
#include "JSystem/JKernel/JKRDvdAramRipper/asm/func_802DB160.s"
}
asm void firstSrcData(void) {
asm u8* firstSrcData(void) {
nofralloc
#include "JSystem/JKernel/JKRDvdAramRipper/asm/func_802DB3E8.s"
}
asm void nextSrcData(u8*) {
asm u8* nextSrcData(u8*) {
nofralloc
#include "JSystem/JKernel/JKRDvdAramRipper/asm/func_802DB49C.s"
}
+365 -20
View File
@@ -1,42 +1,387 @@
#include "JSystem/JKernel/JKRDvdArchive/JKRDvdArchive.h"
#include "JSystem/JKernel/JKRDvdFile/JKRDvdFile.h"
#include "JSystem/JKernel/JKRDvdRipper/JKRDvdRipper.h"
#include "global.h"
asm JKRDvdArchive::JKRDvdArchive(long, JKRArchive::EMountDirection) {
nofralloc
#include "JSystem/JKernel/JKRDvdArchive/asm/func_802D7BF0.s"
JKRDvdArchive::JKRDvdArchive(s32 entryNum, JKRArchive::EMountDirection mountDirection)
: JKRArchive(entryNum, MOUNT_DVD), mMountDirection(mountDirection) {
if (!open(entryNum))
return;
mVolumeType = 'RARC';
mVolumeName = mStringTable + (u32)mNodes->name;
getVolumeList().prepend(&mFileLoaderLink);
mIsMounted = true;
}
asm JKRDvdArchive::~JKRDvdArchive() {
nofralloc
#include "JSystem/JKernel/JKRDvdArchive/asm/func_802D7C98.s"
JKRDvdArchive::~JKRDvdArchive() {
if (mIsMounted == true) {
if (mArcInfoBlock) {
SDIFileEntry* fileEntry = mFiles;
int i = 0;
for (; i < mArcInfoBlock->num_file_entries; fileEntry++, i++) {
if (fileEntry->data) {
JKRFreeToHeap(mHeap, fileEntry->data);
}
}
JKRFreeToHeap(mHeap, mArcInfoBlock);
mArcInfoBlock = NULL;
}
if (mExpandedSize) {
JKRFree(mExpandedSize);
mExpandedSize = NULL;
}
if (mDvdFile) {
delete mDvdFile;
}
getVolumeList().remove(&mFileLoaderLink);
mIsMounted = false;
}
}
asm void JKRDvdArchive::open(long) {
#ifdef NONMATCHING
bool JKRDvdArchive::open(s32 entryNum) {
mArcInfoBlock = NULL;
field_0x64 = NULL;
mNodes = NULL;
mFiles = NULL;
mStringTable = NULL;
mDvdFile = new (JKRHeap::getSystemHeap(), 0) JKRDvdFile(entryNum);
if (!mDvdFile) {
mMountMode = UNKNOWN_MOUNT_MODE;
return false;
}
SArcHeader* arcHeader = (SArcHeader*)JKRAllocFromSysHeap(sizeof(SArcHeader), 0x20);
if (!arcHeader) {
mMountMode = UNKNOWN_MOUNT_MODE;
goto cleanup;
}
JKRDvdToMainRam(entryNum, (u8*)arcHeader, EXPAND_SWITCH_UNKNOWN1, sizeof(SArcHeader), NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD, 0, &mCompression, NULL);
DCInvalidateRange(arcHeader, sizeof(SArcHeader));
int alignment;
if (mMountDirection == MOUNT_DIRECTION_HEAD) {
alignment = 0x20;
} else {
alignment = -0x20;
}
mArcInfoBlock = (SArcDataInfo*)JKRAllocFromHeap(mHeap, arcHeader->file_data_offset, alignment);
if (!mArcInfoBlock) {
mMountMode = UNKNOWN_MOUNT_MODE;
goto cleanup;
}
JKRDvdToMainRam(entryNum, (u8*)mArcInfoBlock, EXPAND_SWITCH_UNKNOWN1,
arcHeader->file_data_offset, NULL, JKRDvdRipper::ALLOC_DIRECTION_FORWARD,
sizeof(SArcHeader), NULL, NULL);
DCInvalidateRange(mArcInfoBlock, arcHeader->file_data_offset);
mNodes = (SDirEntry*)((int)&mArcInfoBlock->num_nodes + mArcInfoBlock->node_offset);
mFiles = (SDIFileEntry*)((int)&mArcInfoBlock->num_nodes + mArcInfoBlock->file_entry_offset);
mStringTable = (char*)((int)&mArcInfoBlock->num_nodes + mArcInfoBlock->string_table_offset);
mExpandedSize = NULL;
bool useCompression = false;
SDIFileEntry* fileEntry = mFiles;
for (u32 i = 0; i < mArcInfoBlock->num_file_entries; fileEntry++, i++) {
if (!fileEntry->isUnknownFlag1()) {
useCompression |= fileEntry->isCompressed();
}
}
if (useCompression) {
mExpandedSize = (s32*)JKRAllocFromHeap(mHeap, sizeof(s32) * mArcInfoBlock->num_file_entries,
abs(alignment));
if (mExpandedSize) {
// !@bug: mArcInfoBlock is allocated from mHeap but free'd to sSystemHeap. I don't know
// what will happen if mHeap != sSystemHeap, but it's still a bug to free to the wrong
// allocator.
JKRFreeToSysHeap(mArcInfoBlock);
mMountMode = UNKNOWN_MOUNT_MODE;
goto cleanup;
}
memset(mExpandedSize, 0, sizeof(s32) * mArcInfoBlock->num_file_entries);
}
field_0x64 = arcHeader->header_length + arcHeader->file_data_offset;
cleanup:
if (arcHeader) {
JKRFreeToSysHeap(arcHeader);
}
if (mMountMode == UNKNOWN_MOUNT_MODE) {
if (mDvdFile) {
delete mDvdFile;
}
return false;
}
return true;
}
#else
asm bool JKRDvdArchive::open(s32 entryNum) {
nofralloc
#include "JSystem/JKernel/JKRDvdArchive/asm/func_802D7DB4.s"
}
#endif
asm void* JKRDvdArchive::fetchResource(SDIFileEntry*, u32*) {
nofralloc
#include "JSystem/JKernel/JKRDvdArchive/asm/func_802D8050.s"
void* JKRDvdArchive::fetchResource(SDIFileEntry* fileEntry, u32* returnSize) {
u32 tempReturnSize;
if (returnSize == NULL) {
returnSize = &tempReturnSize;
}
JKRCompression fileCompression = JKRConvertAttrToCompressionType(fileEntry->getAttr());
if (!fileEntry->data) {
u8* resourcePtr;
u32 resourceSize = fetchResource_subroutine(
mEntryNum, this->field_0x64 + fileEntry->data_offset, fileEntry->data_size, mHeap,
fileCompression, mCompression, &resourcePtr);
*returnSize = resourceSize;
if (resourceSize == 0) {
return NULL;
}
fileEntry->data = resourcePtr;
if (fileCompression == COMPRESSION_YAZ0) {
setExpandSize(fileEntry, *returnSize);
}
} else {
if (fileCompression == COMPRESSION_YAZ0) {
u32 resourceSize = getExpandSize(fileEntry);
*returnSize = resourceSize;
} else {
*returnSize = fileEntry->data_size;
}
}
return fileEntry->data;
}
asm void* JKRDvdArchive::fetchResource(void*, u32, SDIFileEntry*, u32*) {
// ALIGN_PREV(bufferSize, 0x20) is "inlined" in the function parameter.
#ifdef NONMATCHING
void* JKRDvdArchive::fetchResource(void* buffer, u32 bufferSize, SDIFileEntry* fileEntry,
u32* returnSize) {
ASSERT(isMounted());
u32 otherSize;
u32 size = fileEntry->data_size;
u32 dstSize = bufferSize;
JKRCompression fileCompression = JKRConvertAttrToCompressionType(fileEntry->getAttr());
if (!fileEntry->data) {
dstSize = ALIGN_PREV(bufferSize, 0x20);
size = fetchResource_subroutine(mEntryNum, field_0x64 + fileEntry->data_offset,
fileEntry->data_size, (u8*)buffer, dstSize, fileCompression,
mCompression);
} else {
if (fileCompression == COMPRESSION_YAZ0) {
otherSize = getExpandSize(fileEntry);
if (otherSize) {
size = otherSize;
}
}
if (size > bufferSize) {
size = bufferSize;
}
JKRHeap::copyMemory(buffer, fileEntry->data, size);
}
if (returnSize) {
*returnSize = size;
}
return buffer;
}
#else
asm void* JKRDvdArchive::fetchResource(void* buffer, u32 bufferSize, SDIFileEntry* fileEntry,
u32* returnSize) {
nofralloc
#include "JSystem/JKernel/JKRDvdArchive/asm/func_802D8168.s"
}
#endif
asm void JKRDvdArchive::fetchResource_subroutine(long, u32, u32, u8*, u32, int, int) {
nofralloc
#include "JSystem/JKernel/JKRDvdArchive/asm/func_802D826C.s"
u32 JKRDvdArchive::fetchResource_subroutine(s32 entryNum, u32 offset, u32 size, u8* dst,
u32 dstLength, JKRCompression fileCompression,
JKRCompression archiveCompression) {
u32 alignedSize = ALIGN_NEXT(size, 0x20);
u32 alignedDstLength = ALIGN_PREV(dstLength, 0x20);
switch (archiveCompression) {
case COMPRESSION_NONE: {
switch (fileCompression) {
case COMPRESSION_NONE:
if (alignedSize > alignedDstLength) {
alignedSize = alignedDstLength;
}
JKRDvdToMainRam(entryNum, dst, EXPAND_SWITCH_UNKNOWN0, alignedSize, NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(dst, alignedSize);
return alignedSize;
case COMPRESSION_YAY0:
case COMPRESSION_YAZ0:
// The dst pointer to JKRDvdToMainRam should be aligned to 32 bytes. This will align
// arcHeader to 32 bytes on the stack.
char arcHeaderBuffer[64];
SArcHeader* arcHeader = (SArcHeader*)ALIGN_NEXT((u32)arcHeaderBuffer, 0x20);
JKRDvdToMainRam(entryNum, (u8*)arcHeader, EXPAND_SWITCH_UNKNOWN2, sizeof(SArcHeader),
NULL, JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(arcHeader, sizeof(SArcHeader));
u32 decompressedSize = JKRDecompExpandSize(arcHeader);
u32 alignedDecompressedSize = ALIGN_NEXT(decompressedSize, 0x20);
if (alignedDecompressedSize > alignedDstLength) {
alignedDecompressedSize = alignedDstLength;
}
JKRDvdToMainRam(entryNum, dst, EXPAND_SWITCH_UNKNOWN1, alignedDecompressedSize, NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(dst, alignedDecompressedSize);
return decompressedSize;
}
}
case COMPRESSION_YAZ0: {
if (size > alignedDstLength) {
size = alignedDstLength;
}
JKRDvdToMainRam(entryNum, dst, EXPAND_SWITCH_UNKNOWN1, size, NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(dst, size);
return size;
}
case COMPRESSION_YAY0: {
const char* file = lbl_8039D1B0; // "JKRDvdArchive.cpp"
const char* format = lbl_8039D1B0 + 0x12; // "%s"
const char* arg1 = lbl_8039D1B0 + 0x15; // "Sorry, not applied for SZP archive.\n"
JUTException_NS_panic_f(file, 0x289, format, arg1);
}
default: {
const char* file = lbl_8039D1B0; // "JKRDvdArchive.cpp"
const char* format = lbl_8039D1B0 + 0x12; // "%s"
const char* arg1 = lbl_8039D1B0 + 0x3A; // "??? bad sequence\n"
JUTException_NS_panic_f(file, 0x28d, format, arg1);
return 0;
}
}
}
asm void JKRDvdArchive::fetchResource_subroutine(long, u32, u32, JKRHeap*, int, int, u8**) {
nofralloc
#include "JSystem/JKernel/JKRDvdArchive/asm/func_802D8474.s"
u32 JKRDvdArchive::fetchResource_subroutine(s32 entryNum, u32 offset, u32 size, JKRHeap* heap,
JKRCompression fileCompression,
JKRCompression archiveCompression,
u8** returnResource) {
u32 alignedSize = ALIGN_NEXT(size, 0x20);
u8* buffer;
switch (archiveCompression) {
case COMPRESSION_NONE: {
switch (fileCompression) {
case COMPRESSION_NONE:
buffer = (u8*)JKRAllocFromHeap(heap, alignedSize, sizeof(SArcHeader));
ASSERT(buffer);
JKRDvdToMainRam(entryNum, buffer, EXPAND_SWITCH_UNKNOWN0, alignedSize, NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(buffer, alignedSize);
*returnResource = buffer;
return alignedSize;
case COMPRESSION_YAY0:
case COMPRESSION_YAZ0:
// The dst pointer to JKRDvdToMainRam should be aligned to 32 bytes. This will align
// arcHeader to 32 bytes on the stack.
char arcHeaderBuffer[64];
SArcHeader* arcHeader = (SArcHeader*)ALIGN_NEXT((u32)arcHeaderBuffer, 0x20);
JKRDvdToMainRam(entryNum, (u8*)arcHeader, EXPAND_SWITCH_UNKNOWN2, sizeof(SArcHeader),
NULL, JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(arcHeader, sizeof(SArcHeader));
alignedSize = JKRDecompExpandSize(arcHeader);
buffer = (u8*)JKRAllocFromHeap(heap, alignedSize, sizeof(SArcHeader));
ASSERT(buffer);
JKRDvdToMainRam(entryNum, buffer, EXPAND_SWITCH_UNKNOWN1, alignedSize, NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(buffer, alignedSize);
*returnResource = buffer;
return alignedSize;
}
}
case COMPRESSION_YAZ0: {
buffer = (u8*)JKRAllocFromHeap(heap, alignedSize, sizeof(SArcHeader));
ASSERT(buffer);
JKRDvdToMainRam(entryNum, buffer, EXPAND_SWITCH_UNKNOWN1, size, NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(buffer, size);
*returnResource = buffer;
return alignedSize;
}
case COMPRESSION_YAY0: {
const char* file = lbl_8039D1B0; // "JKRDvdArchive.cpp"
const char* format = lbl_8039D1B0 + 0x12; // "%s"
const char* arg1 = lbl_8039D1B0 + 0x4c; // "Sorry, not applied SZP archive.\n"
JUTException_NS_panic_f(file, 0x2f2, format, arg1);
}
default: {
const char* file = lbl_8039D1B0; // "JKRDvdArchive.cpp"
const char* format = lbl_8039D1B0 + 0x12; // "%s"
const char* arg1 = lbl_8039D1B0 + 0x3A; // "??? bad sequence\n"
JUTException_NS_panic_f(file, 0x2f6, format, arg1);
return 0;
}
}
}
asm u32 JKRDvdArchive::getExpandedResSize(void const*) const {
nofralloc
#include "JSystem/JKernel/JKRDvdArchive/asm/func_802D8698.s"
u32 JKRDvdArchive::getExpandedResSize(const void* resource) {
u32 resourceSize;
if (!mExpandedSize) {
return getResSize(resource);
}
SDIFileEntry* fileEntry = findPtrResource(resource);
if (!fileEntry) {
return -1;
}
if (!fileEntry->isCompressed()) {
return getResSize(resource);
}
resourceSize = getExpandSize(fileEntry);
if (resourceSize) {
return resourceSize;
}
// The dst pointer to JKRDvdToMainRam should be aligned to 32 bytes. This will align arcHeader
// to 32 bytes on the stack.
char buffer[64];
SArcHeader* arcHeader = (SArcHeader*)ALIGN_NEXT((u32)buffer, 0x20);
JKRDvdToMainRam(mEntryNum, (u8*)arcHeader, EXPAND_SWITCH_UNKNOWN2, sizeof(*arcHeader), NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD,
this->field_0x64 + fileEntry->data_offset, NULL, NULL);
DCInvalidateRange(arcHeader, sizeof(*arcHeader));
resourceSize = JKRDecompExpandSize(arcHeader);
setExpandSize(fileEntry, resourceSize);
return resourceSize;
}
+17 -22
View File
@@ -5,32 +5,27 @@ JKRDvdFile::JKRDvdFile() : JKRFile(), mDvdLink(this) {
initiate();
}
// end of fuctions is weird. instructions which should have been optimized out.
#ifdef NONMATCHING
JKRDvdFile::JKRDvdFile(const char* name) : JKRFile(), mDvdLink(this) {
initiate();
bool result = open(name);
mIsAvailable = result;
// weird code. doesn't match without this, maybe remains from assert or something?
if (mIsAvailable)
return;
else
return;
}
#else
asm JKRDvdFile::JKRDvdFile(char const*) {
nofralloc
#include "JSystem/JKernel/JKRDvdFile/asm/func_802D95F8.s"
}
#endif
#ifdef NONMATHCING
JKRDvdFile::JKRDvdFile(long param_1) : JKRFile(), mDvdLink(this) {
JKRDvdFile::JKRDvdFile(long entryNum) : JKRFile(), mDvdLink(this) {
initiate();
bool result = open(param_1);
bool result = open(entryNum);
mIsAvailable = result;
// weird code. doesn't match without this, maybe remains from assert or something?
if (mIsAvailable)
return;
else
return;
}
#else
asm JKRDvdFile::JKRDvdFile(long) {
nofralloc
#include "JSystem/JKernel/JKRDvdFile/asm/func_802D96A0.s"
}
#endif
JKRDvdFile::~JKRDvdFile() {
close();
@@ -51,18 +46,18 @@ bool JKRDvdFile::open(const char* param_1) {
if (!mIsAvailable) {
mIsAvailable = DVDOpen(param_1, &mFileInfo);
if (mIsAvailable) {
lbl_8043436C.append(&mDvdLink);
getDvdList().append(&mDvdLink);
getStatus();
}
}
return mIsAvailable;
}
bool JKRDvdFile::open(long param_1) {
bool JKRDvdFile::open(long entryNum) {
if (!mIsAvailable) {
mIsAvailable = DVDFastOpen(param_1, &mFileInfo);
mIsAvailable = DVDFastOpen(entryNum, &mFileInfo);
if (mIsAvailable) {
lbl_8043436C.append(&mDvdLink);
getDvdList().append(&mDvdLink);
getStatus();
}
}
@@ -74,7 +69,7 @@ void JKRDvdFile::close() {
s32 result = DVDClose(&mFileInfo);
if (result != 0) {
mIsAvailable = false;
lbl_8043436C.remove(&mDvdLink);
getDvdList().remove(&mDvdLink);
} else {
const char* filename = lbl_8039D260; // "JKRDvdFile.cpp"
const char* format = lbl_8039D260 + 0x0F; // "%s"
+7 -2
View File
@@ -2,6 +2,11 @@
#include "dvd/dvd.h"
#include "global.h"
static void decompSZS_subroutine(u8*, u8*);
static u8* firstSrcData(void);
static u8* nextSrcData(u8*);
extern "C" void firstSrcData__Fv();
asm void* JKRDvdRipper::loadToMainRAM(const char*, u8*, JKRExpandSwitch, u32, JKRHeap*,
JKRDvdRipper::EAllocDirection, u32, JKRCompression*, u32*) {
nofralloc
@@ -30,12 +35,12 @@ asm void decompSZS_subroutine(u8*, u8*) {
#include "JSystem/JKernel/JKRDvdRipper/asm/func_802DA35C.s"
}
asm void firstSrcData(void) {
asm u8* firstSrcData(void) {
nofralloc
#include "JSystem/JKernel/JKRDvdRipper/asm/func_802DA60C.s"
}
asm void nextSrcData(u8*) {
asm u8* nextSrcData(u8*) {
nofralloc
#include "JSystem/JKernel/JKRDvdRipper/asm/func_802DA6D8.s"
}
+16 -21
View File
@@ -1,16 +1,15 @@
#include "JSystem/JKernel/JKRFileLoader/JKRFileLoader.h"
#include "global.h"
JKRFileLoader::JKRFileLoader(void) : mFileLoaderLink(this) {
mVolumeName = NULL;
mVolumeType = 0;
mMountCount = 0;
}
// todo: static initialization is working uncomment this
// JSUList<JKRFileLoader> JKRFileLoader::sVolumeList;
JKRFileLoader::JKRFileLoader(void)
: mFileLoaderLink(this), mVolumeName(NULL), mVolumeType(0), mMountCount(0) {}
JKRFileLoader::~JKRFileLoader() {
// lbl_80451418 = JKRFileLoader::sCurrentVolume
if (lbl_80451418 == this) {
lbl_80451418 = NULL;
if (getCurrentVolume() == this) {
setCurrentVolume(NULL);
}
}
@@ -41,15 +40,14 @@ void* JKRFileLoader::getGlbResource(const char* name) {
}
void* JKRFileLoader::getGlbResource(const char* name, JKRFileLoader* fileLoader) {
// lbl_80434354 = JKRFileLoader::sVolumeList
void* resource = NULL;
if (fileLoader) {
return fileLoader->getResource(0, name);
}
JSUList<JKRFileLoader>& volumeList = getVolumeList();
JSUListIterator<JKRFileLoader> iterator;
for (iterator = lbl_80434354.getFirst(); iterator != lbl_80434354.getEnd(); ++iterator) {
for (iterator = volumeList.getFirst(); iterator != volumeList.getEnd(); ++iterator) {
resource = iterator->getResource(0, name);
if (resource)
break;
@@ -58,14 +56,13 @@ void* JKRFileLoader::getGlbResource(const char* name, JKRFileLoader* fileLoader)
}
bool JKRFileLoader::removeResource(void* resource, JKRFileLoader* fileLoader) {
// lbl_80434354 = JKRFileLoader::sVolumeList
if (fileLoader) {
return fileLoader->removeResource(resource);
}
JSUList<JKRFileLoader>& volumeList = getVolumeList();
JSUListIterator<JKRFileLoader> iterator;
for (iterator = lbl_80434354.getFirst(); iterator != lbl_80434354.getEnd(); ++iterator) {
for (iterator = volumeList.getFirst(); iterator != volumeList.getEnd(); ++iterator) {
if (iterator->removeResource(resource)) {
return true;
}
@@ -75,14 +72,13 @@ bool JKRFileLoader::removeResource(void* resource, JKRFileLoader* fileLoader) {
}
bool JKRFileLoader::detachResource(void* resource, JKRFileLoader* fileLoader) {
// lbl_80434354 = JKRFileLoader::sVolumeList
if (fileLoader) {
return fileLoader->detachResource(resource);
}
JSUList<JKRFileLoader>& volumeList = getVolumeList();
JSUListIterator<JKRFileLoader> iterator;
for (iterator = lbl_80434354.getFirst(); iterator != lbl_80434354.getEnd(); ++iterator) {
for (iterator = volumeList.getFirst(); iterator != volumeList.getEnd(); ++iterator) {
if (iterator->detachResource(resource)) {
return true;
}
@@ -92,17 +88,16 @@ bool JKRFileLoader::detachResource(void* resource, JKRFileLoader* fileLoader) {
}
JKRFileLoader* JKRFileLoader::findVolume(const char** volumeName) {
// lbl_80451418 = JKRFileLoader::sCurrentVolume
if (*volumeName[0] != '/') {
return lbl_80451418;
return getCurrentVolume();
}
char volumeNameBuffer[0x101];
*volumeName = fetchVolumeName(volumeNameBuffer, ARRAY_SIZE(volumeNameBuffer), *volumeName);
JSUList<JKRFileLoader>& volumeList = getVolumeList();
JSUListIterator<JKRFileLoader> iterator;
for (iterator = lbl_80434354.getFirst(); iterator != lbl_80434354.getEnd(); ++iterator) {
for (iterator = volumeList.getFirst(); iterator != volumeList.getEnd(); ++iterator) {
if (strcmp(volumeNameBuffer, iterator->mVolumeName) == 0) {
return iterator.getObject();
}
+33 -33
View File
@@ -14,10 +14,10 @@ JKRHeap::JKRHeap(void* data, u32 size, JKRHeap* parent, bool errorFlag)
} else {
parent->mChildTree.appendChild(&mChildTree);
if (lbl_80451370 == lbl_80451378) {
if (getSystemHeap() == getRootHeap()) {
becomeSystemHeap();
}
if (lbl_80451374 == lbl_80451378) {
if (getCurrentHeap() == getRootHeap()) {
becomeCurrentHeap();
}
}
@@ -33,16 +33,15 @@ JKRHeap::JKRHeap(void* data, u32 size, JKRHeap* parent, bool errorFlag)
}
// using the wrong register for storing the results
// lbl_80451370 = systemHeap;
#ifdef NONMATCHING
JKRHeap::~JKRHeap() {
JSUTree<JKRHeap>* parent = mChildTree.getParent();
parent->removeChild(&mChildTree);
JSUTree<JKRHeap>* nextRootHeap = lbl_80451378->mChildTree.getFirstChild();
JSUTree<JKRHeap>* nextRootHeap = getRootHeap()->mChildTree.getFirstChild();
JKRHeap* rootHeap = lbl_80451378;
JKRHeap* currentHeap = lbl_80451374;
JKRHeap* rootHeap = getRootHeap();
JKRHeap* currentHeap = getCurrentHeap();
if (currentHeap == this) {
if (!nextRootHeap) {
currentHeap = rootHeap;
@@ -50,9 +49,9 @@ JKRHeap::~JKRHeap() {
currentHeap = nextRootHeap->getObject();
}
}
lbl_80451374 = currentHeap;
setCurrentHeap(currentHeap);
JKRHeap* systemHeap = lbl_80451370;
JKRHeap* systemHeap = getSystemHeap();
if (systemHeap == this) {
if (!nextRootHeap) {
systemHeap = rootHeap;
@@ -60,7 +59,7 @@ JKRHeap::~JKRHeap() {
systemHeap = nextRootHeap->getObject();
}
}
lbl_80451370 = systemHeap;
setSystemHeap(systemHeap);
}
#else
asm JKRHeap::~JKRHeap() {
@@ -80,13 +79,14 @@ bool JKRHeap::initArena(char** memory, u32* size, int param_3) {
return false;
ram = OSInitAlloc(low, high, param_3);
ram_start = (ram + 0x1fU & 0xffffffe0);
ram_end = (high & 0xffffffe0);
lbl_80451384 = OS_GLOBAL_ADDR(void, 0x80000000);
lbl_80451388 = (void*)ram_start;
lbl_8045138C = (void*)ram_start;
lbl_80451390 = (void*)ram_end;
lbl_80451394 = OS_GLOBAL(u32, 0x80000028);
ram_start = ALIGN_NEXT(ram, 0x20);
ram_end = ALIGN_PREV(high, 0x20);
GLOBAL_MEMORY* globalMemory = (GLOBAL_MEMORY*)OSPhysicalToCached(0);
mCodeStart = globalMemory;
mCodeEnd = (void*)ram_start;
mUserRamStart = (void*)ram_start;
mUserRamEnd = (void*)ram_end;
mMemorySize = globalMemory->memory_size;
OSSetArenaLo(ram_end);
OSSetArenaHi(ram_end);
*memory = (char*)ram_start;
@@ -95,14 +95,14 @@ bool JKRHeap::initArena(char** memory, u32* size, int param_3) {
}
JKRHeap* JKRHeap::becomeSystemHeap() {
JKRHeap* prev = lbl_80451370;
lbl_80451370 = this;
JKRHeap* prev = JKRHeap::getSystemHeap();
setSystemHeap(this);
return prev;
}
JKRHeap* JKRHeap::becomeCurrentHeap() {
JKRHeap* prev = lbl_80451374;
lbl_80451374 = this;
JKRHeap* prev = getCurrentHeap();
setCurrentHeap(this);
return prev;
}
@@ -115,8 +115,8 @@ void* JKRHeap::alloc(u32 size, int alignment, JKRHeap* heap) {
return heap->alloc(size, alignment);
}
if (lbl_80451374 != NULL) {
return lbl_80451374->alloc(size, alignment);
if (getCurrentHeap() != NULL) {
return getCurrentHeap()->alloc(size, alignment);
}
return NULL;
@@ -216,15 +216,16 @@ asm u32 JKRHeap::getMaxAllocatableSize(int alignment) const {
#endif
JKRHeap* JKRHeap::findFromRoot(void* ptr) {
if (lbl_80451378 == NULL) {
JKRHeap* rootHeap = getRootHeap();
if (rootHeap == NULL) {
return NULL;
}
if (lbl_80451378->getStartAddr() <= ptr && ptr < lbl_80451378->getEndAddr()) {
return lbl_80451378->find(ptr);
if (rootHeap->getStartAddr() <= ptr && ptr < rootHeap->getEndAddr()) {
return rootHeap->find(ptr);
}
return lbl_80451378->findAllHeap(ptr);
return rootHeap->findAllHeap(ptr);
}
JKRHeap* JKRHeap::find(void* ptr) const {
@@ -241,6 +242,7 @@ JKRHeap* JKRHeap::find(void* ptr) const {
}
}
// todo: not sure about this... casting away const for now.
return (JKRHeap*)this;
}
@@ -261,7 +263,7 @@ JKRHeap* JKRHeap::findAllHeap(void* ptr) const {
}
if (getStartAddr() <= ptr && ptr < getEndAddr()) {
// not sure about this... casting away const for now.
// todo: not sure about this... casting away const for now.
return (JKRHeap*)this;
}
@@ -306,13 +308,11 @@ void JKRHeap::dispose(void* begin, void* end) {
// missing stack variable?
#ifdef NONMATCHING
void JKRHeap::dispose() {
JKRDisposer* disposer;
const JSUList<JKRDisposer>& list = mDisposerList;
JSUListIterator<JKRDisposer> iterator;
JSUList<JKRDisposer>* list = &mDisposerList;
while (iterator = list->getFirst(), iterator != list->getEnd()) {
disposer = iterator.getObject();
disposer->~JKRDisposer();
while (list.getFirst() != list.getEnd()) {
iterator = list.getFirst();
iterator->~JKRDisposer();
}
}
#else
+5 -13
View File
@@ -146,15 +146,7 @@ void* JKRMemArchive::fetchResource(void* buffer, u32 bufferSize, SDIFileEntry* f
if (fileEntry->data != NULL) {
memcpy(buffer, fileEntry->data, srcLength);
} else {
JKRCompression compression;
if (!fileEntry->isCompressed()) {
compression = COMPRESSION_NONE;
} else if (fileEntry->isYAZ0Compressed()) {
compression = COMPRESSION_YAZ0;
} else {
compression = COMPRESSION_YAY0;
}
JKRCompression compression = JKRConvertAttrToCompressionType(fileEntry->getAttr());
void* data = mArchiveData + fileEntry->data_offset;
srcLength =
fetchResource_subroutine((u8*)data, srcLength, (u8*)buffer, bufferSize, compression);
@@ -209,7 +201,7 @@ u32 JKRMemArchive::fetchResource_subroutine(u8* src, u32 srcLength, u8* dst, u32
case COMPRESSION_YAY0:
case COMPRESSION_YAZ0:
u32 expendedSize = JKRDecompExpandSize(src);
u32 expendedSize = JKRDecompExpandSize((SArcHeader*)src);
srcLength = expendedSize;
if (expendedSize > dstLength) {
srcLength = dstLength;
@@ -229,14 +221,14 @@ u32 JKRMemArchive::fetchResource_subroutine(u8* src, u32 srcLength, u8* dst, u32
return 0;
}
u32 JKRMemArchive::getExpandedResSize(const void* resource) const {
u32 JKRMemArchive::getExpandedResSize(const void* resource) {
SDIFileEntry* fileEntry = findPtrResource(resource);
if (fileEntry == NULL)
return 0xFFFFFFFF;
return -1;
if (fileEntry->isCompressed() == false) {
return getResSize(resource);
} else {
return JKRDecompExpandSize(resource);
return JKRDecompExpandSize((SArcHeader*)resource);
}
}
+6 -7
View File
@@ -11,7 +11,7 @@ JKRThread::JKRThread(u32 stack_size, int message_count, int param_3) : mThreadLi
JKRHeap* heap = JKRHeap::findFromRoot(this);
if (heap == NULL) {
heap = lbl_80451370;
heap = JKRHeap::getSystemHeap();
}
setCommon_heapSpecified(heap, stack_size, param_3);
@@ -27,7 +27,7 @@ JKRThread::JKRThread(JKRHeap* heap, u32 stack_size, int message_count, int param
field_0x70 = 0;
if (heap == NULL) {
heap = lbl_80451374;
heap = JKRHeap::getCurrentHeap();
}
setCommon_heapSpecified(heap, stack_size, param_4);
@@ -49,8 +49,7 @@ JKRThread::JKRThread(OSThread* thread, int message_count) : mThreadListLink(this
}
JKRThread::~JKRThread() {
// lbl_8043428C = JKRThread::sThreadList
lbl_8043428C.remove(&mThreadListLink);
getList().remove(&mThreadListLink);
if (mHeap) {
BOOL result = OSIsThreadTerminated(mThreadRecord);
@@ -69,7 +68,7 @@ void JKRThread::setCommon_mesgQueue(JKRHeap* heap, int message_count) {
mMessages = (OSMessage*)JKRHeap::alloc(mMessageCount * sizeof(OSMessage), 0, heap);
OSInitMessageQueue(&mMessageQueue, mMessages, mMessageCount);
lbl_8043428C.append(&mThreadListLink);
getList().append(&mThreadListLink);
mCurrentHeap = NULL;
mCurrentHeapError = NULL;
@@ -91,9 +90,9 @@ void* JKRThread::start(void* param) {
}
JKRThread* JKRThread::searchThread(OSThread* thread) {
JSUList<JKRThread>* threadList = JKRThread::getList();
JSUList<JKRThread>& threadList = getList();
JSUListIterator<JKRThread> iterator;
for (iterator = threadList; iterator != threadList->getEnd(); ++iterator) {
for (iterator = threadList.getFirst(); iterator != threadList.getEnd(); ++iterator) {
if (iterator->getThreadRecord() == thread) {
return iterator.getObject();
}
+1 -1
View File
@@ -64,7 +64,7 @@ void JUTXfb::destroyManager() {
void JUTXfb::initiate(u16 width, u16 height, JKRHeap* heap, JUTXfb::EXfbNumber xfb_number) {
if (heap == NULL) {
heap = /* sSystemHeap */ lbl_80451370;
heap = JKRHeap::getSystemHeap();
}
int size = ((u32)width + 0xf & 0xfff0) * (u32)height * 2;