Various JSystem work (#2383)

* JKernel and JStudio cleanup

* JMessage cleanup

* JAudio cleanup

* JASBNKParser work

* functionvalue work

* fvb work

* J2D and J3D cleanup

* steal from tww

* J2DPictureEx mostly done

* fix build
This commit is contained in:
Caroline Madsen
2025-04-09 16:45:30 -04:00
committed by GitHub
parent 6672817e41
commit c6f76e7240
78 changed files with 1793 additions and 2710 deletions
-2
View File
@@ -16,10 +16,8 @@
#include "JSystem/JAudio2/JASReport.h"
#include "JSystem/JAudio2/JASLfo.h"
#include "JSystem/JKernel/JKRSolidHeap.h"
#include "dol2asm.h"
#include "dolphin/ai.h"
#include <dolphin/os.h>
#include <dolphin/os.h>
/* 80431C58-80431C68 05E978 000C+04 2/2 0/0 0/0 .bss sDmaDacBuffer__9JASDriver */
s16* JASDriver::sDmaDacBuffer[3];
+4 -8
View File
@@ -29,8 +29,6 @@ u32 JASAramStream::sChannelMax;
/* 80451260 0001+00 data_80451260 None */
/* 80451261 0001+00 data_80451261 None */
/* 80451262 0006+00 data_80451262 None */
extern bool struct_80451260;
extern bool struct_80451261;
bool struct_80451260;
bool struct_80451261;
@@ -331,7 +329,7 @@ bool JASAramStream::load() {
}
field_0x10c++;
if (field_0x10c >= field_0x108) {
u32 uvar8 = mBlock - 1 + field_0x108;
u32 uvar8 = field_0x108 - 1 + mBlock;
if (mLoop) {
while (uvar8 > loop_end_block) {
uvar8 -= loop_end_block;
@@ -364,7 +362,6 @@ s32 JASAramStream::channelProcCallback(void* i_this) {
/* 80296D94-80296DF0 2916D4 005C+00 2/1 0/0 0/0 .text dvdErrorCheck__13JASAramStreamFPv
*/
// NONMATCHING supposed to use a switch table
s32 JASAramStream::dvdErrorCheck(void* param_0) {
switch (DVDGetDriveStatus()) {
case DVD_STATE_END:
@@ -375,7 +372,6 @@ s32 JASAramStream::dvdErrorCheck(void* param_0) {
case DVD_STATE_WAITING:
case DVD_STATE_COVER_CLOSED:
case DVD_STATE_NO_DISK:
case DVD_STATE_COVER_OPEN:
case DVD_STATE_WRONG_DISK:
case DVD_STATE_MOTOR_STOPPED:
case DVD_STATE_IGNORED:
@@ -436,7 +432,7 @@ void JASAramStream::updateChannel(u32 i_callbackType, JASChannel* i_channel,
i_dspChannel->field_0x110 = 0;
field_0x120 = 0;
field_0x12c |= 2;
if (field_0x0c4 < -1) {
if (field_0x0c4 < 0xffffffff) {
field_0x0c4++;
}
field_0x0c0 = false;
@@ -447,7 +443,7 @@ void JASAramStream::updateChannel(u32 i_callbackType, JASChannel* i_channel,
}
f32 fvar1 = field_0x0c4;
fvar1 *= mLoopEnd - mLoopStart;
if (field_0x0c4 < -1) {
if (field_0x0c4 < 0xffffffff) {
fvar1 += field_0x0b8;
}
fvar1 /= field_0x164;
@@ -579,7 +575,7 @@ void JASAramStream::updateChannel(u32 i_callbackType, JASChannel* i_channel,
}
/* 802974AC-80297658 291DEC 01AC+00 1/1 0/0 0/0 .text channelProc__13JASAramStreamFv */
// NONMATCHING instruction ordering
// NONMATCHING instruction ordering / regalloc
s32 JASAramStream::channelProc() {
OSMessage msg;
while (OSReceiveMessage(&field_0x020, &msg, OS_MESSAGE_NOBLOCK)) {
+152 -30
View File
@@ -59,7 +59,6 @@ JASBNKParser::Ver1::TChunk* JASBNKParser::Ver1::findChunk(void const* stream, u3
/* 8029963C-80299A3C 293F7C 0400+00 1/1 0/0 0/0 .text
* createBasicBank__Q212JASBNKParser4Ver1FPCvP7JKRHeap */
// NONMATCHING instruction ordering, regalloc
JASBasicBank* JASBNKParser::Ver1::createBasicBank(void const* stream, JKRHeap* heap) {
if (heap == NULL) {
heap = JASDram;
@@ -74,44 +73,40 @@ JASBasicBank* JASBNKParser::Ver1::createBasicBank(void const* stream, JKRHeap* h
TOscChunk* osc_chunk = (TOscChunk*)findChunk(stream, 'OSCT');
TListChunk* list_chunk = (TListChunk*)findChunk(stream, 'LIST');
void* envt = new (heap, 2) u8[envt_chunk->mSize];
u8* envt = new (heap, 2) u8[envt_chunk->mSize];
JASCalc::bcopy(envt_chunk->mData, envt, envt_chunk->mSize);
u32 count = osc_chunk->mCount;
TOsc* osc = osc_chunk->mOsc;
u32* ptr = &osc_chunk->mCount;
u32 count = *ptr++;
JASOscillator::Data* osc_data = new (heap, 0) JASOscillator::Data[count];
for (int i = 0; i < count; i++, osc++) {
for (int i = 0; i < count; i++, ptr += sizeof(TOsc) >> 2) {
TOsc* osc = (TOsc*)ptr;
JASOscillator::Data* data = &osc_data[i];
data->mTarget = osc->mTarget;
data->_04 = osc->_08;
data->mScale = osc->mScale;
data->_14 = osc->_18;
data->mTable = (JASOscillator::Point*)((int)envt + osc->mTableOffset);
data->_0C = (JASOscillator::Point*)((int)envt + osc->_10);
data->mTable = (JASOscillator::Point*)(envt + osc->mTableOffset);
data->_0C = (JASOscillator::Point*)(envt + osc->_10);
}
bank->newInstTable(list_chunk->mCount, heap);
for (int i = 0; i < list_chunk->mCount; i++) {
if (list_chunk->mOffsets[i] != 0) {
u32* ptr = (u32*)((int)stream + list_chunk->mOffsets[i]);
u32* data = ptr + 1;
switch (*ptr) {
u32* data = (u32*)((int)stream + list_chunk->mOffsets[i]);
switch (*data++) {
case 'Inst': {
JASBasicInst* inst = new (heap, 0) JASBasicInst();
u32 count = *data;
data++;
u32 count = *data++;
for (int j = 0; j < count; j++) {
u32 index = *data;
data++;
u32 index = *data++;
inst->setOsc(j, &osc_data[index]);
}
count = *data;
data++;
count = *data++;
for (int j = 0; j < count; j++) {
data++;
}
count = *data;
data++;
count = *data++;
inst->setKeyRegionCount(count, heap);
for (int j = 0; j < count; j++) {
JASBasicInst::TKeymap* keymap = inst->getKeyRegion(j);
@@ -133,12 +128,10 @@ JASBasicBank* JASBNKParser::Ver1::createBasicBank(void const* stream, JKRHeap* h
case 'Perc': {
JASDrumSet* drum = new (heap, 0) JASDrumSet();
u32 count = *data;
data++;
u32 count = *data++;
drum->newPercArray(count, heap);
for (int j = 0; j < count; j++) {
u32 offset = *data;
data++;
u32 offset = *data++;
if (offset != 0) {
JASDrumSet::TPerc* perc = new (heap, 0) JASDrumSet::TPerc();
u32* ptr = (u32*)((int)stream + offset);
@@ -148,8 +141,7 @@ JASBasicBank* JASBNKParser::Ver1::createBasicBank(void const* stream, JKRHeap* h
perc->setPan((f32)perc_data->mPan / 127.0f);
perc->setRelease(perc_data->mRelease);
ptr = (u32*)&perc_data->field_0xc;
u32 count2 = *ptr;
ptr++;
u32 count2 = *ptr++;
for (int k = 0; k < count2; k++) {
ptr++;
}
@@ -173,20 +165,150 @@ JASBasicBank* JASBNKParser::Ver1::createBasicBank(void const* stream, JKRHeap* h
/* 80299A3C-80299E68 29437C 042C+00 1/1 0/0 0/0 .text
* createBasicBank__Q212JASBNKParser4Ver0FPCvP7JKRHeap */
// NONMATCHING
JASBasicBank* JASBNKParser::Ver0::createBasicBank(void const* stream, JKRHeap* heap) {
// NONMATCHING
THeader const* header = (THeader*)stream;
if (heap == NULL) {
heap = JASDram;
}
JASBasicBank* bank = new (heap, 0) JASBasicBank();
if (bank == NULL) {
return NULL;
}
bank->newInstTable(0x80, heap);
for (int i = 0; i < 0x80; i++) {
TInst* tinst = header->mOffsets.mInstOffset[i].ptr(stream);
if (tinst != NULL) {
JASBasicInst* inst = new (heap, 0) JASBasicInst();
inst->setVolume(tinst->mVolume);
inst->setPitch(tinst->mPitch);
int osc_idx = 0;
for (int j = 0; j < 2; j++) {
TOsc* tosc = tinst->mOscOffset[j].ptr(stream);
if (tosc != NULL) {
JASOscillator::Data* osc_data = findOscPtr(bank, header, tosc);
if (osc_data != NULL) {
inst->setOsc(osc_idx, osc_data);
} else {
osc_data = new (heap, 0) JASOscillator::Data();
osc_data->mTarget = tosc->mTarget;
osc_data->_04 = tosc->field_0x4;
u32 size;
JASOscillator::Point* points = tosc->mPointOffset.ptr(stream);
if (points != NULL) {
size = getOscTableEndPtr(points) - points;
JASOscillator::Point* table = new (heap, 0) JASOscillator::Point[size];
JASCalc::bcopy(points, table, size * sizeof(JASOscillator::Point));
osc_data->mTable = table;
} else {
osc_data->mTable = NULL;
}
points = tosc->field_0xc.ptr(stream);
if (points != NULL) {
size = getOscTableEndPtr(points) - points;
JASOscillator::Point* table = new (heap, 0) JASOscillator::Point[size];
JASCalc::bcopy(points, table, size * sizeof(JASOscillator::Point));
osc_data->_0C = table;
} else {
osc_data->_0C = NULL;
}
osc_data->mScale = tosc->mScale;
osc_data->_14 = tosc->field_0x14;
inst->setOsc(osc_idx, osc_data);
}
osc_idx++;
}
}
inst->setKeyRegionCount(tinst->mKeyRegionCount, heap);
for (int j = 0; j < tinst->mKeyRegionCount; j++) {
JASBasicInst::TKeymap* keymap = inst->getKeyRegion(j);
TKeymap* tkeymap = tinst->mKeymapOffset[j].ptr(stream);
keymap->setHighKey(tkeymap->mHighKey);
TVmap* tvmap = tkeymap->mVmapOffset.ptr(stream);
keymap->field_0x4 = JSULoHalf(tvmap->field_0x4);
keymap->field_0x8 = tvmap->field_0x8;
keymap->field_0xc = tvmap->field_0xc;
}
bank->setInst(i, inst);
}
}
for (int i = 0; i < 12; i++) {
TPerc* tperc = header->mOffsets.mPercOffset[i].ptr(stream);
if (tperc != NULL) {
JASDrumSet* drumset = new (heap, 0) JASDrumSet();
drumset->newPercArray(0x80, heap);
for (int j = 0; j < 0x80; j++) {
TPmap* tpmap = tperc->mPmapOffset[j].ptr(stream);
if (tpmap != NULL) {
JASDrumSet::TPerc* perc = new (heap, 0) JASDrumSet::TPerc();
perc->setVolume(tpmap->mVolume);
perc->setPitch(tpmap->mPitch);
if (tperc->mMagic == 'PER2') {
perc->setPan(tperc->mPan[j] / 127.0f);
perc->setRelease(tperc->mRelease[j]);
}
TVmap* vmap = tpmap->mVmapOffset.ptr(stream);
perc->field_0xe = JSULoHalf(vmap->field_0x4);
perc->field_0x10 = vmap->field_0x8;
perc->field_0x14 = vmap->field_0xc;
drumset->setPerc(j, perc);
}
}
bank->setInst(i + 0xe4, drumset);
}
}
return bank;
}
/* 80299E68-80299F8C 2947A8 0124+00 1/1 0/0 0/0 .text
* findOscPtr__Q212JASBNKParser4Ver0FP12JASBasicBankPCQ312JASBNKParser4Ver07THeaderPCQ312JASBNKParser4Ver04TOsc
*/
void JASBNKParser::Ver0::findOscPtr(JASBasicBank* param_0, THeader const* param_1,
TOsc const* param_2) {
// NONMATCHING
JASOscillator::Data* JASBNKParser::Ver0::findOscPtr(JASBasicBank* bank, THeader const* header,
TOsc const* osc) {
TOffsetData const* data = &header->mOffsets;
for (int i = 0; i < 0x80; i++) {
TInst* tinst = data->mInstOffset[i].ptr(header);
if (tinst != NULL) {
for (int j = 0; j < 2; j++) {
TOsc* tosc = tinst->mOscOffset[j].ptr(header);
if (tosc == osc) {
JASInst* inst = bank->getInst(i);
if (inst != NULL) {
JASInstParam param;
inst->getParam(0x3c, 0x7f, &param);
if (j < param.field_0x1d) {
return param.field_0x14[j];
}
}
}
}
}
}
return NULL;
}
/* 80299F8C-80299FA0 2948CC 0014+00 1/1 0/0 0/0 .text
* getOscTableEndPtr__Q212JASBNKParser4Ver0FPCQ213JASOscillator5Point */
void JASBNKParser::Ver0::getOscTableEndPtr(JASOscillator::Point const* param_0) {
// NONMATCHING
JASOscillator::Point const* JASBNKParser::Ver0::getOscTableEndPtr(JASOscillator::Point const* points) {
s16 tmp;
do {
tmp = points->_0;
points++;
} while (tmp <= 10);
return points;
}
-59
View File
@@ -8,65 +8,6 @@
#include "JSystem/JKernel/JKRHeap.h"
#include "JSystem/JUtility/JUTAssert.h"
//
// Types:
//
//
// Forward References:
//
extern "C" void __ct__16JASBasicWaveBankFv();
extern "C" void __dt__16JASBasicWaveBankFv();
extern "C" void __dt__Q216JASBasicWaveBank11TWaveHandleFv();
extern "C" void getWaveGroup__16JASBasicWaveBankFUl();
extern "C" void setGroupCount__16JASBasicWaveBankFUlP7JKRHeap();
extern "C" void setWaveTableSize__16JASBasicWaveBankFUlP7JKRHeap();
extern "C" void incWaveTable__16JASBasicWaveBankFPCQ216JASBasicWaveBank10TWaveGroup();
extern "C" void decWaveTable__16JASBasicWaveBankFPCQ216JASBasicWaveBank10TWaveGroup();
extern "C" void getWaveHandle__16JASBasicWaveBankCFUl();
extern "C" void
setWaveInfo__16JASBasicWaveBankFPQ216JASBasicWaveBank10TWaveGroupiUsRC11JASWaveInfo();
extern "C" void __ct__Q216JASBasicWaveBank10TWaveGroupFv();
extern "C" void __dt__Q216JASBasicWaveBank10TWaveGroupFv();
extern "C" void setWaveCount__Q216JASBasicWaveBank10TWaveGroupFUlP7JKRHeap();
extern "C" void onLoadDone__Q216JASBasicWaveBank10TWaveGroupFv();
extern "C" void onEraseDone__Q216JASBasicWaveBank10TWaveGroupFv();
extern "C" void getWaveID__Q216JASBasicWaveBank10TWaveGroupCFi();
extern "C" void getWavePtr__Q216JASBasicWaveBank11TWaveHandleCFv();
extern "C" void __dt__11JASWaveBankFv();
extern "C" void __dt__13JASWaveHandleFv();
extern "C" void __ct__Q216JASBasicWaveBank11TWaveHandleFv();
extern "C" void __ct__Q216JASBasicWaveBank14TGroupWaveInfoFv();
extern "C" void getWaveInfo__Q216JASBasicWaveBank11TWaveHandleCFv();
extern "C" void getWaveArc__16JASBasicWaveBankFUl();
extern "C" void getArcCount__16JASBasicWaveBankCFv();
extern "C" u8 mNoLoad__16JASBasicWaveBank[4 + 4 /* padding */];
//
// External References:
//
extern "C" void __ct__10JASWaveArcFv();
extern "C" void __dt__10JASWaveArcFv();
extern "C" void onDispose__10JASWaveArcFv();
extern "C" void* __nwa__FUlP7JKRHeapi();
extern "C" void __dl__FPv();
extern "C" void __dla__FPv();
extern "C" void __destroy_new_array();
extern "C" void __construct_new_array();
extern "C" void _savegpr_25();
extern "C" void _savegpr_26();
extern "C" void _savegpr_29();
extern "C" void _restgpr_25();
extern "C" void _restgpr_26();
extern "C" void _restgpr_29();
extern "C" u32 one__11JASWaveInfo[1 + 1 /* padding */];
//
// Declarations:
//
/* 802984F8-80298558 292E38 0060+00 0/0 1/1 0/0 .text __ct__16JASBasicWaveBankFv */
JASBasicWaveBank::JASBasicWaveBank() {
mWaveTable = NULL;
+16 -15
View File
@@ -843,15 +843,15 @@ s32 JASSeqParser::cmdDump(JASTrack* param_0, u32* param_1) {
}
/* 8029526C-80295498 28FBAC 022C+00 1/0 0/0 0/0 .text cmdPrintf__12JASSeqParserFP8JASTrackPUl */
// NONMATCHING many things
// NONMATCHING problem with second for loop
s32 JASSeqParser::cmdPrintf(JASTrack* param_0, u32* param_1) {
u8 stack_c[4];
u32 stack_10[4];
char buffer[128];
JASSeqCtrl* seqCtrl = param_0->getSeqCtrl();
int r30 = 0;
for (u8 i = 0; i < 128; i++) {
u32 r30 = 0;
for (u32 i = 0; i < 128; i++) {
buffer[i] = seqCtrl->readByte();
if (buffer[i] == 0) {
break;
@@ -861,15 +861,18 @@ s32 JASSeqParser::cmdPrintf(JASTrack* param_0, u32* param_1) {
if (buffer[i] == 0) {
break;
}
if (buffer[i] == 'n') {
switch (buffer[i]) {
case 'n':
buffer[i] = '\r';
}
} else if (buffer[i] == '%') {
buffer[i + 1] = seqCtrl->readByte();
if (buffer[i + 1] == 0) {
break;
}
switch (buffer[i + 1]) {
} else if (buffer[i] == '%') {
i++;
buffer[i] = seqCtrl->readByte();
if (buffer[i] == 0) {
break;
}
switch (buffer[i]) {
case 'd':
stack_c[r30] = 0;
break;
@@ -881,18 +884,17 @@ s32 JASSeqParser::cmdPrintf(JASTrack* param_0, u32* param_1) {
break;
case 'r':
stack_c[r30] = 3;
buffer[i + 1] = 'd';
buffer[i] = 'd';
break;
case 'R':
stack_c[r30] = 4;
buffer[i + 1] = 'x';
break;
default:
buffer[i] = 'x';
break;
}
r30++;
}
}
for (u32 i = 0; i < r30; i++) {
stack_10[i] = seqCtrl->readByte();
switch (stack_c[i]) {
@@ -903,10 +905,9 @@ s32 JASSeqParser::cmdPrintf(JASTrack* param_0, u32* param_1) {
case 4:
stack_10[i] = readReg(param_0, stack_10[i] & 0xff);
break;
default:
break;
}
}
JASReport(buffer, stack_10[0], stack_10[1], stack_10[2], stack_10[3]);
return 0;
}
-1
View File
@@ -11,7 +11,6 @@
#include "JSystem/JAudio2/JASDSPInterface.h"
/* 80291228-8029131C 28BB68 00F4+00 1/1 3/3 0/0 .text __ct__8JASTrackFv */
// NONMATCHING
JASTrack::JASTrack() : mDefaultChannelMgr(this), mChannelMgrCount(1), mStatus(0) {
mChannelMgrs[0] = &mDefaultChannelMgr;
for (int i = 1; i < 4; i++) {
+6 -18
View File
@@ -18,7 +18,6 @@
#include "JSystem/JAudio2/JAUStreamFileTable.h"
#include "JSystem/JKernel/JKRSolidHeap.h"
#include "stdlib.h"
#include "dol2asm.h"
#include "dolphin/dvd.h"
namespace {
@@ -78,12 +77,6 @@ JAUSection::TSectionData::TSectionData() {
field_0x9c = 0;
}
/* 8039B950-8039B950 027FB0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039B950 = "index out of range of bitset::reset";
#pragma pop
/* 802A4F68-802A4FE4 29F8A8 007C+00 1/1 0/0 0/0 .text
* resetRegisteredBankTables__Q210JAUSection12TSectionDataFv */
void JAUSection::TSectionData::resetRegisteredBankTables() {
@@ -139,7 +132,6 @@ void JAUSection::dispose() {
/* 802A51E4-802A52A0 29FB24 00BC+00 0/0 1/1 0/0 .text newSoundTable__10JAUSectionFPCvUlb
*/
// NONMATCHING regalloc
JAUSoundTable* JAUSection::newSoundTable(void const* bst, u32 param_1, bool param_2) {
JUT_ASSERT(285, isOpen());
JUT_ASSERT(286, isBuilding());
@@ -148,7 +140,7 @@ JAUSoundTable* JAUSection::newSoundTable(void const* bst, u32 param_1, bool para
JUT_ASSERT(289, sectionHeap_->sectionHeapData_.soundTable == 0);
{
TPushCurrentHeap push(getHeap_());
void* bstDst;
void const* bstDst = bst;
if (param_1) {
bstDst = newCopy(bst, param_1, 4);
JUT_ASSERT(296, bstDst);
@@ -163,7 +155,6 @@ JAUSoundTable* JAUSection::newSoundTable(void const* bst, u32 param_1, bool para
}
/* 802A52A0-802A535C 29FBE0 00BC+00 0/0 1/1 0/0 .text newSoundNameTable__10JAUSectionFPCvUlb */
// NONMATCHING regalloc
JAUSoundNameTable* JAUSection::newSoundNameTable(void const* bstn, u32 param_1, bool param_2) {
JUT_ASSERT(315, isOpen());
JUT_ASSERT(316, isBuilding());
@@ -172,7 +163,7 @@ JAUSoundNameTable* JAUSection::newSoundNameTable(void const* bstn, u32 param_1,
JUT_ASSERT(319, sectionHeap_->sectionHeapData_.soundNameTable == 0);
{
TPushCurrentHeap push(getHeap_());
void* bstnDst;
void const* bstnDst = bstn;
if (param_1) {
bstnDst = newCopy(bstn, param_1, 4);
JUT_ASSERT(326, bstnDst);
@@ -304,13 +295,10 @@ void* JAUSection::newCopy(void const* param_0, u32 param_1, s32 param_2) {
return r31;
}
/* ############################################################################################## */
/* 8039B950-8039B950 027FB0 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
#pragma push
#pragma force_active on
SECTION_DEAD static char const* const stringBase_8039B974 = "index out of range of bitset::test";
SECTION_DEAD static char const* const stringBase_8039B997 = "index out of range of bitset::set";
#pragma pop
static bool dummy_string(int i) {
std::bitset<1> x;
return x.test(i);
}
/* 802A5854-802A5948 2A0194 00F4+00 0/0 1/1 0/0 .text newWaveBank__10JAUSectionFUlPCv */
JASWaveBank* JAUSection::newWaveBank(u32 bank_no, void const* param_1) {