Importing more JKernel code

This commit is contained in:
Tal Hayon
2023-07-21 19:30:25 +03:00
parent 5ec69e491a
commit db806cda16
89 changed files with 421 additions and 3369 deletions
+72 -79
View File
@@ -154,107 +154,100 @@ inline u32 alignNext(u32 var, u32 align) {
}
/* 802D72A8-802D75E0 2D1BE8 0338+00 1/1 0/0 0/0 .text open__14JKRAramArchiveFl */
#ifdef NONMATCHING
// r30 <-> r29
bool JKRAramArchive::open(s32 entryNum) {
mArcInfoBlock = NULL;
mNodes = NULL;
mFiles = NULL;
mStringTable = NULL;
mBlock = NULL;
// int align;
// int align = -4;
// if (mMountDirection == MOUNT_DIRECTION_HEAD) {
// align = 4;
// }
int align;
align = mMountDirection == MOUNT_DIRECTION_HEAD ? 4 : -4;
mDvdFile = new (JKRGetSystemHeap(), align) JKRDvdFile(entryNum);
if (mDvdFile == NULL) {
mMountMode = UNKNOWN_MOUNT_MODE;
return false;
mDvdFile = new (JKRGetSystemHeap(), mMountDirection == MOUNT_DIRECTION_HEAD ? 4 : -4) JKRDvdFile(entryNum);
if (mDvdFile == NULL)
{
mMountMode = 0;
return 0;
}
SArcHeader* header = static_cast<SArcHeader*>(JKRAllocFromSysHeap(0x20, -0x20));
if (header == NULL) {
mMountMode = UNKNOWN_MOUNT_MODE;
} else {
JKRDvdToMainRam(entryNum, (u8*)header, EXPAND_SWITCH_UNKNOWN1, 0x20, NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD, 0, &mCompression, NULL);
DCInvalidateRange(header, 0x20);
align = mMountDirection == MOUNT_DIRECTION_HEAD ? 0x20 : -0x20;
u32 blockSize = alignNext(header->file_data_offset, 0x20);
mArcInfoBlock = static_cast<SArcDataInfo*>(JKRAllocFromHeap(mHeap, blockSize, align));
// NOTE: a different struct is used here for sure, unfortunately i can't get any hits on this address, so gonna leave it like this for now
SArcHeader *mem = (SArcHeader *)JKRAllocFromSysHeap(32, -32);
if (mem == NULL) {
mMountMode = 0;
}
else {
JKRDvdToMainRam(entryNum, (u8 *)mem, EXPAND_SWITCH_UNKNOWN1, 32, NULL, JKRDvdRipper::ALLOC_DIRECTION_FORWARD, 0, &mCompression, NULL);
DCInvalidateRange(mem, 32);
int alignment = mMountDirection == MOUNT_DIRECTION_HEAD ? 32 : -32;
u32 alignedSize = ALIGN_NEXT(mem->file_data_offset, 32);
mArcInfoBlock = (SArcDataInfo *)JKRAllocFromHeap(mHeap, alignedSize, alignment);
if (mArcInfoBlock == NULL) {
mMountMode = UNKNOWN_MOUNT_MODE;
} else {
JKRDvdToMainRam(entryNum, (u8*)mArcInfoBlock, EXPAND_SWITCH_UNKNOWN1, blockSize, NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD, 0x20, NULL, NULL);
DCInvalidateRange(mArcInfoBlock, blockSize);
mNodes = (SDIDirEntry*)((s32)mArcInfoBlock + mArcInfoBlock->node_offset);
mFiles = (SDIFileEntry*)((s32)mArcInfoBlock + mArcInfoBlock->file_entry_offset);
mStringTable = (char*)((s32)mArcInfoBlock + mArcInfoBlock->string_table_offset);
mMountMode = 0;
}
else {
JKRDvdToMainRam(entryNum, (u8 *)mArcInfoBlock, EXPAND_SWITCH_UNKNOWN1, alignedSize, NULL, JKRDvdRipper::ALLOC_DIRECTION_FORWARD, 32, NULL, NULL);
DCInvalidateRange(mArcInfoBlock, alignedSize);
mNodes = (SDIDirEntry *)((u8 *)mArcInfoBlock + mArcInfoBlock->node_offset);
mFiles = (SDIFileEntry *)((u8 *)mArcInfoBlock + mArcInfoBlock->file_entry_offset);
mStringTable = (char *)((u8 *)mArcInfoBlock + mArcInfoBlock->string_table_offset);
mExpandedSize = NULL;
u8 isAnyFileCompressed = 0;
SDIFileEntry* file = mFiles;
for (int i = 0; i < mArcInfoBlock->num_file_entries; file++, i++) {
if (file->isUnknownFlag1()) {
isAnyFileCompressed |= file->getCompressFlag();
u8 compressedFiles = 0; // maybe a check for if the last file is compressed?
SDIFileEntry *fileEntry = mFiles;
for (int i = 0; i < mArcInfoBlock->num_file_entries; i++)
{
u8 flag = fileEntry->type_flags_and_name_offset >> 24;
if ((flag & 1))
{
compressedFiles |= (flag & JKRARCHIVE_ATTR_COMPRESSION);
}
fileEntry++;
}
if (isAnyFileCompressed != 0) {
mExpandedSize =
(s32*)JKRAllocFromHeap(mHeap, mArcInfoBlock->num_file_entries * 4, abs(align));
if (mExpandedSize == NULL) {
if (compressedFiles != 0)
{
mExpandedSize = (s32 *)JKRAllocFromHeap(mHeap, mArcInfoBlock->num_file_entries << 2, abs(alignment));
if (mExpandedSize == NULL)
{
i_JKRFree(mArcInfoBlock);
mMountMode = UNKNOWN_MOUNT_MODE;
goto end;
} else {
memset(mExpandedSize, 0, mArcInfoBlock->num_file_entries * 4);
mMountMode = 0;
goto cleanup;
}
memset(mExpandedSize, 0, mArcInfoBlock->num_file_entries << 2);
}
u32 fileDataLength = alignNext(header->file_data_length, 0x20);
mBlock = static_cast<JKRAramBlock*>(JKRAllocFromAram(
fileDataLength,
mMountDirection == MOUNT_DIRECTION_HEAD ? JKRAramHeap::HEAD : JKRAramHeap::TAIL));
if (mBlock == NULL) {
if (mArcInfoBlock != NULL) {
u32 aramSize = ALIGN_NEXT(mem->file_data_length, 32);
mBlock = (JKRAramBlock*) JKRAllocFromAram(aramSize, mMountDirection == MOUNT_DIRECTION_HEAD ? JKRAramHeap::HEAD : JKRAramHeap::TAIL);
if(mBlock == NULL) {
if (mArcInfoBlock) {
i_JKRFree(mArcInfoBlock);
}
if (mExpandedSize != NULL) {
if(mExpandedSize) {
i_JKRFree(mExpandedSize);
}
mMountMode = UNKNOWN_MOUNT_MODE;
} else {
JKRDvdAramRipper::loadToAram(entryNum, mBlock->getAddress(), EXPAND_SWITCH_UNKNOWN1,
header->header_length + header->file_data_offset, 0,
NULL);
mMountMode = 0;
}
else {
JKRDvdToAram(entryNum, mBlock->getAddress(), EXPAND_SWITCH_UNKNOWN1, mem->header_length + mem->file_data_offset, 0, NULL);
}
}
}
end:
if (header != NULL) {
JKRFreeToSysHeap(header);
cleanup:
if (mem != NULL)
{
JKRFreeToSysHeap(mem);
}
if (mMountMode == UNKNOWN_MOUNT_MODE) {
if (mDvdFile != NULL) {
if (mMountMode == 0)
{
if (mDvdFile != NULL)
{
delete mDvdFile;
}
return false;
} else {
return true;
}
return true;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm bool JKRAramArchive::open(s32 param_0) {
nofralloc
#include "asm/JSystem/JKernel/JKRAramArchive/open__14JKRAramArchiveFl.s"
}
#pragma pop
#endif
/* 802D75E0-802D76F4 2D1F20 0114+00 1/0 0/0 0/0 .text
* fetchResource__14JKRAramArchiveFPQ210JKRArchive12SDIFileEntryPUl */
@@ -396,10 +389,10 @@ u32 JKRAramArchive::fetchResource_subroutine(u32 entryNum, u32 length, JKRHeap*
case COMPRESSION_YAY0:
case COMPRESSION_YAZ0:
u8 tmpBuf[0x40];
SArcHeader* buf = (SArcHeader*)ALIGN_PREV((s32)&tmpBuf[0x1F], 0x20);
JKRAramToMainRam(entryNum, (u8*)buf, 0x20, EXPAND_SWITCH_UNKNOWN0, 0, NULL, -1, NULL);
length = alignNext(JKRDecompExpandSize(buf), 0x20);
tmpBufAligned = static_cast<u8*>(JKRAllocFromHeap(pHeap, length, 0x20));
u8* buf = (u8*)ALIGN_PREV((s32)&tmpBuf[0x1F], sizeof(SArcHeader));
JKRAramToMainRam(entryNum, buf, sizeof(SArcHeader), EXPAND_SWITCH_UNKNOWN0, 0, NULL, -1, NULL);
length = alignNext(JKRDecompExpandSize(buf), sizeof(SArcHeader));
tmpBufAligned = static_cast<u8*>(JKRAllocFromHeap(pHeap, length, sizeof(SArcHeader)));
JKRAramToMainRam(entryNum, tmpBufAligned, alignedLen, EXPAND_SWITCH_UNKNOWN1, length, pHeap,
-1, &readLen);
@@ -443,8 +436,8 @@ u32 JKRAramArchive::getExpandedResSize(void const* ptr) const {
}
u8 tmpBuf[0x40];
SArcHeader* buf = (SArcHeader*)ALIGN_PREV((s32)&tmpBuf[0x1F], 0x20);
JKRAramToMainRam(entry->data_offset + mBlock->getAddress(), (u8*)buf, 0x20,
u8* buf = (u8*)ALIGN_PREV((s32)&tmpBuf[0x1F], 0x20);
JKRAramToMainRam(entry->data_offset + mBlock->getAddress(), buf, 0x20,
EXPAND_SWITCH_UNKNOWN0, 0, NULL, -1, NULL);
expandSize = JKRDecompExpandSize(buf);
// ??? casting away const?
+4 -27
View File
@@ -11,18 +11,10 @@
// Forward References:
//
extern "C" u8 sAramList__11JKRAramHeap[12];
extern "C" void* __vt__11JKRAramHeap;
//
// External References:
//
extern "C" void __dl__FPv();
extern "C" void __dt__11JKRDisposerFv();
extern "C" void _savegpr_29();
extern "C" void _restgpr_29();
//
// Declarations:
//
@@ -45,28 +37,13 @@ JKRAramHeap::JKRAramHeap(u32 startAddress, u32 size) {
}
/* 802D2F14-802D2FBC 2CD854 00A8+00 1/0 0/0 0/0 .text __dt__11JKRAramHeapFv */
// close match, regalloc problem in the beginning of the while loop
#ifdef NONMATCHING
JKRAramHeap::~JKRAramHeap() {
JSUList<JKRAramBlock>* list = &sAramList;
JSUListIterator<JKRAramBlock> iterator = list;
while (iterator != list->getEnd()) {
JSUListIterator<JKRAramBlock> prev = iterator;
JKRAramBlock* block = prev.getObject();
delete block;
JSUListIterator<JKRAramBlock> iterator(sAramList.getFirst());
while (iterator != sAramList.getEnd())
{
delete (iterator++).getObject();
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JKRAramHeap::~JKRAramHeap() {
nofralloc
#include "asm/JSystem/JKernel/JKRAramHeap/__dt__11JKRAramHeapFv.s"
}
#pragma pop
#endif
/* 802D2FBC-802D3034 2CD8FC 0078+00 0/0 5/5 0/0 .text
* alloc__11JKRAramHeapFUlQ211JKRAramHeap10EAllocMode */
+38 -39
View File
@@ -171,20 +171,18 @@ 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 */
// 2 extra mr instructions
#ifdef NONMATCHING
void JKRDecomp::decodeSZP(u8* src, u8* dst, u32 srcLength, u32 dstLength) {
// s32 decodedSize;
s32 srcChunkOffset;
u32 count;
s32 dstOffset;
u32 length;
s32 linkInfo;
s32 offset;
s32 i;
s32 decodedSize = read_big_endian_u32(src + 4);
s32 linkTableOffset = read_big_endian_u32(src + 8);
s32 srcDataOffset = read_big_endian_u32(src + 12);
int srcChunkOffset;
int count;
int dstOffset;
u32 length = srcLength;
int linkInfo;
int offset;
int i;
int decodedSize = READU32_BE(src, 4);
int linkTableOffset = READU32_BE(src, 8);
int srcDataOffset = READU32_BE(src, 12);
dstOffset = 0;
u32 counter = 0;
@@ -196,47 +194,58 @@ void JKRDecomp::decodeSZP(u8* src, u8* dst, u32 srcLength, u32 dstLength) {
if (dstLength > decodedSize)
return;
length = srcLength;
do {
if (counter == 0) {
chunkBits = read_big_endian_u32(src + srcChunkOffset);
do
{
if (counter == 0)
{
chunkBits = READU32_BE(src, srcChunkOffset);
srcChunkOffset += sizeof(u32);
counter = sizeof(u32) * 8;
}
if (chunkBits & 0x80000000) {
if (dstLength == 0) {
if (chunkBits & 0x80000000)
{
if (dstLength == 0)
{
dst[dstOffset] = src[srcDataOffset];
length--;
if (length == 0)
return;
} else {
}
else
{
dstLength--;
}
dstOffset++;
srcDataOffset++;
} else {
}
else
{
linkInfo = src[linkTableOffset] << 8 | src[linkTableOffset + 1];
linkTableOffset += sizeof(u16);
offset = dstOffset - (linkInfo & 0xFFF);
count = (linkInfo >> 12);
if (count == 0) {
count = (u32)src[srcDataOffset] + 0x12;
srcDataOffset++;
} else
if (count == 0)
{
count = (u32)src[srcDataOffset++] + 0x12;
}
else
count += 2;
if ((s32)count > decodedSize - dstOffset)
if (count > decodedSize - dstOffset)
count = decodedSize - dstOffset;
for (i = 0; i < (s32)count; i++, dstOffset++, offset++) {
if (dstLength == 0) {
for (i = 0; i < count; i++, dstOffset++, offset++)
{
if (dstLength == 0)
{
dst[dstOffset] = dst[offset - 1];
length--;
if (length == 0)
return;
} else
}
else
dstLength--;
}
}
@@ -245,16 +254,6 @@ void JKRDecomp::decodeSZP(u8* src, u8* dst, u32 srcLength, u32 dstLength) {
counter--;
} while (dstOffset < decodedSize);
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JKRDecomp::decodeSZP(u8* param_0, u8* param_1, u32 param_2, u32 param_3) {
nofralloc
#include "asm/JSystem/JKernel/JKRDecomp/decodeSZP__9JKRDecompFPUcPUcUlUl.s"
}
#pragma pop
#endif
/* 802DBC14-802DBCF8 2D6554 00E4+00 1/1 0/0 0/0 .text decodeSZS__9JKRDecompFPUcPUcUlUl */
#ifdef NONMATCHING
+7 -7
View File
@@ -313,8 +313,8 @@ u32 JKRDvdArchive::fetchResource_subroutine(s32 entryNum, u32 offset, u32 size,
// 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),
u8* arcHeader = (u8*)ALIGN_NEXT((u32)arcHeaderBuffer, 0x20);
JKRDvdToMainRam(entryNum, arcHeader, EXPAND_SWITCH_UNKNOWN2, sizeof(SArcHeader),
NULL, JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(arcHeader, sizeof(SArcHeader));
@@ -380,8 +380,8 @@ u32 JKRDvdArchive::fetchResource_subroutine(s32 entryNum, u32 offset, u32 size,
// 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),
u8* arcHeader = (u8*)ALIGN_NEXT((u32)arcHeaderBuffer, 0x20);
JKRDvdToMainRam(entryNum, arcHeader, EXPAND_SWITCH_UNKNOWN2, sizeof(SArcHeader),
NULL, JKRDvdRipper::ALLOC_DIRECTION_FORWARD, offset, NULL, NULL);
DCInvalidateRange(arcHeader, sizeof(SArcHeader));
@@ -444,11 +444,11 @@ u32 JKRDvdArchive::getExpandedResSize(const void* resource) const {
// 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,
u8* arcHeader = (u8*)ALIGN_NEXT((u32)buffer, 0x20);
JKRDvdToMainRam(mEntryNum, arcHeader, EXPAND_SWITCH_UNKNOWN2, sizeof(SArcHeader), NULL,
JKRDvdRipper::ALLOC_DIRECTION_FORWARD,
this->field_0x64 + fileEntry->data_offset, NULL, NULL);
DCInvalidateRange(arcHeader, sizeof(*arcHeader));
DCInvalidateRange(arcHeader, sizeof(SArcHeader));
resourceSize = JKRDecompExpandSize(arcHeader);
// ???
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -293,7 +293,7 @@ u32 JKRMemArchive::fetchResource_subroutine(u8* src, u32 srcLength, u8* dst, u32
case COMPRESSION_YAY0:
case COMPRESSION_YAZ0:
u32 expendedSize = JKRDecompExpandSize((SArcHeader*)src);
u32 expendedSize = JKRDecompExpandSize(src);
srcLength = expendedSize;
if (expendedSize > dstLength) {
srcLength = dstLength;
@@ -319,6 +319,6 @@ u32 JKRMemArchive::getExpandedResSize(const void* resource) const {
if (fileEntry->isCompressed() == false) {
return getResSize(resource);
} else {
return JKRDecompExpandSize((SArcHeader*)resource);
return JKRDecompExpandSize((u8*)resource);
}
}