Jsupport stream and JKRAramArchive (#143)

* JSupport streams

* JKRAramArchive
This commit is contained in:
lepelog
2021-08-28 16:32:14 +02:00
committed by GitHub
parent daf45f768d
commit f25c24699b
38 changed files with 511 additions and 1270 deletions
File diff suppressed because it is too large Load Diff
+5 -3
View File
@@ -23,7 +23,7 @@ extern "C" void write_StreamToAram_Async__13JKRAramStreamFP18JSUFileInputStreamU
extern "C" void sync__13JKRAramStreamFP20JKRAramStreamCommandi();
extern "C" void setTransBuffer__13JKRAramStreamFPUcUlP7JKRHeap();
extern "C" void __ct__20JKRAramStreamCommandFv();
extern "C" void getAvailable__20JSURandomInputStreamCFv();
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];
@@ -317,8 +317,10 @@ JKRAramStreamCommand::JKRAramStreamCommand() {
}
/* 802D4094-802D40F0 2CE9D4 005C+00 0/0 3/0 0/0 .text getAvailable__20JSURandomInputStreamCFv */
s32 JSURandomInputStream::getAvailable() const {
return getLength() - getPosition();
// s32 JSURandomInputStream::getAvailable() const {
// should be an inline function
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 */
+45 -76
View File
@@ -7,100 +7,69 @@
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Forward References:
//
extern "C" void __ct__18JSUFileInputStreamFP7JKRFile();
extern "C" void readData__18JSUFileInputStreamFPvl();
extern "C" void seekPos__18JSUFileInputStreamFl17JSUStreamSeekFrom();
extern "C" void getLength__18JSUFileInputStreamCFv();
extern "C" void getPosition__18JSUFileInputStreamCFv();
//
// External References:
//
extern "C" void getAvailable__20JSURandomInputStreamCFv();
extern "C" void __dt__18JSUFileInputStreamFv();
extern "C" void skip__20JSURandomInputStreamFl();
extern "C" void _savegpr_28();
extern "C" void _savegpr_29();
extern "C" void _restgpr_28();
extern "C" void _restgpr_29();
extern "C" extern void* __vt__10JSUIosBase[3];
extern "C" extern void* __vt__20JSURandomInputStream[9];
extern "C" extern void* __vt__14JSUInputStream[6 + 1 /* padding */];
//
// Declarations:
//
/* ############################################################################################## */
/* 803CC518-803CC540 029638 0024+04 1/1 1/1 0/0 .data __vt__18JSUFileInputStream */
SECTION_DATA extern void* __vt__18JSUFileInputStream[9 + 1 /* padding */] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__18JSUFileInputStreamFv,
(void*)getAvailable__20JSURandomInputStreamCFv,
(void*)skip__20JSURandomInputStreamFl,
(void*)readData__18JSUFileInputStreamFPvl,
(void*)getLength__18JSUFileInputStreamCFv,
(void*)getPosition__18JSUFileInputStreamCFv,
(void*)seekPos__18JSUFileInputStreamFl17JSUStreamSeekFrom,
/* padding */
NULL,
};
/* 802DC638-802DC67C 2D6F78 0044+00 0/0 1/1 0/0 .text __ct__18JSUFileInputStreamFP7JKRFile */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JSUFileInputStream::JSUFileInputStream(JKRFile* param_0) {
nofralloc
#include "asm/JSystem/JSupport/JSUFileStream/__ct__18JSUFileInputStreamFP7JKRFile.s"
JSUFileInputStream::JSUFileInputStream(JKRFile* pFile) {
mFile = pFile;
mPosition = 0;
}
#pragma pop
/* 802DC67C-802DC74C 2D6FBC 00D0+00 1/0 0/0 0/0 .text readData__18JSUFileInputStreamFPvl
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm s32 JSUFileInputStream::readData(void* param_0, s32 param_1) {
nofralloc
#include "asm/JSystem/JSupport/JSUFileStream/readData__18JSUFileInputStreamFPvl.s"
u32 JSUFileInputStream::readData(void* pBuffer, s32 length) {
s32 lenRead = 0;
if (mFile->isAvailable()) {
// TODO: the function probably returns u32
// there are probably more functions that return u32 instead of s32
if (mPosition + length > (u32)mFile->getFileSize()) {
length = mFile->getFileSize() - mPosition;
}
if (length > 0) {
lenRead = mFile->readData(pBuffer, length, mPosition);
if (lenRead < 0) {
return 0;
} else {
mPosition += lenRead;
}
}
}
return lenRead;
}
#pragma pop
/* 802DC74C-802DC82C 2D708C 00E0+00 1/0 0/0 0/0 .text
* seekPos__18JSUFileInputStreamFl17JSUStreamSeekFrom */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUFileInputStream::seekPos(s32 param_0, JSUStreamSeekFrom param_1) {
nofralloc
#include "asm/JSystem/JSupport/JSUFileStream/seekPos__18JSUFileInputStreamFl17JSUStreamSeekFrom.s"
s32 JSUFileInputStream::seekPos(s32 pos, JSUStreamSeekFrom seekFrom) {
s32 oldPos = mPosition;
switch (seekFrom) {
case JSUStreamSeekFrom_SET:
mPosition = pos;
break;
case JSUStreamSeekFrom_END:
mPosition = mFile->getFileSize() - pos;
break;
case JSUStreamSeekFrom_CUR:
mPosition += pos;
break;
}
if (mPosition < 0) {
mPosition = 0;
}
if (mPosition > mFile->getFileSize()) {
mPosition = mFile->getFileSize();
}
return mPosition - oldPos;
}
#pragma pop
/* 802DC82C-802DC85C 2D716C 0030+00 1/0 0/0 0/0 .text getLength__18JSUFileInputStreamCFv
*/
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm s32 JSUFileInputStream::getLength() const {
nofralloc
#include "asm/JSystem/JSupport/JSUFileStream/getLength__18JSUFileInputStreamCFv.s"
s32 JSUFileInputStream::getLength() const {
return mFile->getFileSize();
}
#pragma pop
/* 802DC85C-802DC864 2D719C 0008+00 1/0 0/0 0/0 .text getPosition__18JSUFileInputStreamCFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm s32 JSUFileInputStream::getPosition() const {
nofralloc
#include "asm/JSystem/JSupport/JSUFileStream/getPosition__18JSUFileInputStreamCFv.s"
s32 JSUFileInputStream::getPosition() const {
return mPosition;
}
#pragma pop
+49 -51
View File
@@ -6,7 +6,7 @@
#include "JSystem/JSupport/JSUInputStream.h"
#include "JSystem/JSupport/JSURandomInputStream.h"
#include "dol2asm.h"
#include "dolphin/types.h"
#include "global.h"
//
// Types:
@@ -68,72 +68,70 @@ SECTION_DATA extern void* __vt__14JSUInputStream[6 + 1 /* padding */] = {
};
/* 802DC23C-802DC298 2D6B7C 005C+00 1/0 6/6 0/0 .text __dt__14JSUInputStreamFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JSUInputStream::~JSUInputStream() {
nofralloc
#include "asm/JSystem/JSupport/JSUInputStream/__dt__14JSUInputStreamFv.s"
}
#pragma pop
JSUInputStream::~JSUInputStream() {}
/* 802DC298-802DC2F0 2D6BD8 0058+00 1/1 20/20 0/0 .text read__14JSUInputStreamFPvl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUInputStream::read(void* param_0, s32 param_1) {
nofralloc
#include "asm/JSystem/JSupport/JSUInputStream/read__14JSUInputStreamFPvl.s"
s32 JSUInputStream::read(void* buffer, s32 numBytes) {
s32 bytesRead = this->readData(buffer, numBytes);
if (bytesRead != numBytes) {
this->setState(IOS_STATE_1);
}
return bytesRead;
}
#pragma pop
/* 802DC2F0-802DC370 2D6C30 0080+00 1/0 0/0 0/0 .text skip__14JSUInputStreamFl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm s32 JSUInputStream::skip(s32 param_0) {
nofralloc
#include "asm/JSystem/JSupport/JSUInputStream/skip__14JSUInputStreamFl.s"
s32 JSUInputStream::skip(s32 count) {
s32 skipCount = 0;
u8 buffer[1];
while (count > skipCount) {
if (this->readData(&buffer, 1) != 1) {
setState(IOS_STATE_1);
break;
}
skipCount++;
}
return skipCount;
}
#pragma pop
/* 802DC370-802DC3FC 2D6CB0 008C+00 0/0 1/1 0/0 .text align__20JSURandomInputStreamFl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSURandomInputStream::align(s32 param_0) {
nofralloc
#include "asm/JSystem/JSupport/JSUInputStream/align__20JSURandomInputStreamFl.s"
s32 JSURandomInputStream::align(s32 alignment) {
s32 currentPos = this->getPosition();
s32 offset = (alignment + currentPos);
offset -= 1;
offset &= ~(alignment - 1);
s32 alignmentOffset = offset - currentPos;
if (alignmentOffset != 0) {
s32 seekLen = this->seekPos(offset, JSUStreamSeekFrom_SET);
if (seekLen != alignmentOffset) {
this->setState(IOS_STATE_1);
}
}
return alignmentOffset;
}
#pragma pop
/* 802DC3FC-802DC458 2D6D3C 005C+00 1/0 2/0 0/0 .text skip__20JSURandomInputStreamFl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm s32 JSURandomInputStream::skip(s32 param_0) {
nofralloc
#include "asm/JSystem/JSupport/JSUInputStream/skip__20JSURandomInputStreamFl.s"
s32 JSURandomInputStream::skip(s32 param_0) {
s32 val = this->seekPos(param_0, JSUStreamSeekFrom_CUR);
if (val != param_0) {
this->setState(IOS_STATE_1);
}
return val;
}
#pragma pop
/* 802DC458-802DC4DC 2D6D98 0084+00 0/0 8/8 0/0 .text peek__20JSURandomInputStreamFPvl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSURandomInputStream::peek(void* param_0, s32 param_1) {
nofralloc
#include "asm/JSystem/JSupport/JSUInputStream/peek__20JSURandomInputStreamFPvl.s"
s32 JSURandomInputStream::peek(void* buffer, s32 numBytes) {
s32 oldPos = this->getPosition();
s32 bytesRead = this->read(buffer, numBytes);
if (bytesRead != 0) {
this->seekPos(oldPos, JSUStreamSeekFrom_SET);
}
return bytesRead;
}
#pragma pop
/* 802DC4DC-802DC520 2D6E1C 0044+00 0/0 16/16 0/0 .text
* seek__20JSURandomInputStreamFl17JSUStreamSeekFrom */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSURandomInputStream::seek(s32 param_0, JSUStreamSeekFrom param_1) {
nofralloc
#include "asm/JSystem/JSupport/JSUInputStream/seek__20JSURandomInputStreamFl17JSUStreamSeekFrom.s"
s32 JSURandomInputStream::seek(s32 param_0, JSUStreamSeekFrom param_1) {
s32 seekResult = this->seekPos(param_0, param_1);
this->clrState(IOS_STATE_1);
return seekResult;
}
#pragma pop
+38 -91
View File
@@ -6,114 +6,61 @@
#include "JSystem/JSupport/JSUMemoryStream.h"
#include "dol2asm.h"
#include "dolphin/types.h"
//
// Types:
//
struct JSUStreamSeekFrom {};
struct JSURandomInputStream {
/* 802D4094 */ void getAvailable() const;
/* 802DC3FC */ void skip(s32);
};
struct JSUMemoryInputStream {
/* 802552B8 */ ~JSUMemoryInputStream();
/* 802DC520 */ void setBuffer(void const*, s32);
/* 802DC534 */ void readData(void*, s32);
/* 802DC5AC */ void seekPos(s32, JSUStreamSeekFrom);
/* 802DC628 */ void getLength() const;
/* 802DC630 */ void getPosition() const;
};
//
// Forward References:
//
extern "C" void setBuffer__20JSUMemoryInputStreamFPCvl();
extern "C" void readData__20JSUMemoryInputStreamFPvl();
extern "C" void seekPos__20JSUMemoryInputStreamFl17JSUStreamSeekFrom();
extern "C" void getLength__20JSUMemoryInputStreamCFv();
extern "C" void getPosition__20JSUMemoryInputStreamCFv();
extern "C" extern void* __vt__20JSUMemoryInputStream[9 + 1 /* padding */];
//
// External References:
//
SECTION_INIT void memcpy();
extern "C" void __dt__20JSUMemoryInputStreamFv();
extern "C" void getAvailable__20JSURandomInputStreamCFv();
extern "C" void skip__20JSURandomInputStreamFl();
#include "msl_c/string.h"
//
// Declarations:
//
/* 802DC520-802DC534 2D6E60 0014+00 0/0 3/3 0/0 .text setBuffer__20JSUMemoryInputStreamFPCvl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUMemoryInputStream::setBuffer(void const* param_0, s32 param_1) {
nofralloc
#include "asm/JSystem/JSupport/JSUMemoryStream/setBuffer__20JSUMemoryInputStreamFPCvl.s"
void JSUMemoryInputStream::setBuffer(void const* pBuffer, s32 length) {
mBuffer = pBuffer;
mLength = length;
mPosition = 0;
}
#pragma pop
/* 802DC534-802DC5AC 2D6E74 0078+00 1/0 0/0 0/0 .text readData__20JSUMemoryInputStreamFPvl */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUMemoryInputStream::readData(void* param_0, s32 param_1) {
nofralloc
#include "asm/JSystem/JSupport/JSUMemoryStream/readData__20JSUMemoryInputStreamFPvl.s"
u32 JSUMemoryInputStream::readData(void* pData, s32 length) {
if (mPosition + length > mLength) {
length = mLength - mPosition;
}
if (length > 0) {
memcpy(pData, (void*)((s32)mBuffer + mPosition), length);
mPosition += length;
}
return length;
}
#pragma pop
/* 802DC5AC-802DC628 2D6EEC 007C+00 1/0 0/0 0/0 .text
* seekPos__20JSUMemoryInputStreamFl17JSUStreamSeekFrom */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUMemoryInputStream::seekPos(s32 param_0, JSUStreamSeekFrom param_1) {
nofralloc
#include "asm/JSystem/JSupport/JSUMemoryStream/seekPos__20JSUMemoryInputStreamFl17JSUStreamSeekFrom.s"
s32 JSUMemoryInputStream::seekPos(s32 pos, JSUStreamSeekFrom seekFrom) {
s32 oldPos = mPosition;
switch (seekFrom) {
case JSUStreamSeekFrom_SET:
mPosition = pos;
break;
case JSUStreamSeekFrom_END:
mPosition = mLength - pos;
break;
case JSUStreamSeekFrom_CUR:
mPosition += pos;
break;
}
if (mPosition < 0) {
mPosition = 0;
}
if (mPosition > mLength) {
mPosition = mLength;
}
return mPosition - oldPos;
}
#pragma pop
/* 802DC628-802DC630 2D6F68 0008+00 1/0 0/0 0/0 .text getLength__20JSUMemoryInputStreamCFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUMemoryInputStream::getLength() const {
nofralloc
#include "asm/JSystem/JSupport/JSUMemoryStream/getLength__20JSUMemoryInputStreamCFv.s"
s32 JSUMemoryInputStream::getLength() const {
return mLength;
}
#pragma pop
/* 802DC630-802DC638 2D6F70 0008+00 1/0 0/0 0/0 .text getPosition__20JSUMemoryInputStreamCFv */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm void JSUMemoryInputStream::getPosition() const {
nofralloc
#include "asm/JSystem/JSupport/JSUMemoryStream/getPosition__20JSUMemoryInputStreamCFv.s"
s32 JSUMemoryInputStream::getPosition() const {
return mPosition;
}
#pragma pop
/* ############################################################################################## */
/* 803CC4F0-803CC518 029610 0024+04 0/0 4/4 0/0 .data __vt__20JSUMemoryInputStream */
SECTION_DATA extern void* __vt__20JSUMemoryInputStream[9 + 1 /* padding */] = {
(void*)NULL /* RTTI */,
(void*)NULL,
(void*)__dt__20JSUMemoryInputStreamFv,
(void*)getAvailable__20JSURandomInputStreamCFv,
(void*)skip__20JSURandomInputStreamFl,
(void*)readData__20JSUMemoryInputStreamFPvl,
(void*)getLength__20JSUMemoryInputStreamCFv,
(void*)getPosition__20JSUMemoryInputStreamCFv,
(void*)seekPos__20JSUMemoryInputStreamFl17JSUStreamSeekFrom,
/* padding */
NULL,
};