Work on J2DMaterialFactory (#394)

* Work on J2DMaterialFactory

* J3DUClipper OK

* Work on JAISoundStarter

* JAISoundHandles OK

* JAISoundInfo OK

* Fix JAISound::isStopping

* Work on J2DTextBoxEx

* dspproc OK

* osdsp OK

* osdsp_task OK

* Work on dsptask

* Import some JASCalc code

* JASCallback OK

* JASOscillator OK

* JASLfo OK
This commit is contained in:
hatal175
2023-08-01 10:17:21 +03:00
committed by GitHub
parent 396449b597
commit 2275eb710b
122 changed files with 1901 additions and 4402 deletions
+99 -36
View File
@@ -4,8 +4,11 @@
//
#include "JSystem/JAudio2/dsptask.h"
#include "JSystem/JAudio2/osdsp.h"
#include "dol2asm.h"
#include "dolphin/types.h"
#include "dolphin/dsp/dsp.h"
#include "dolphin/os/OS.h"
//
// Types:
@@ -24,6 +27,10 @@ extern "C" static void DspInitWork__Fv();
extern "C" static void DspStartWork__FUlPFUs_v();
extern "C" void DspFinishWork__FUs();
static void DspInitWork();
static void DspHandShake(void* param_0);
static int DspStartWork(u32 param_0, void (*param_1)(u16));
//
// External References:
//
@@ -31,17 +38,11 @@ extern "C" void DspFinishWork__FUs();
extern "C" void DSPAddPriorTask__FP15STRUCT_DSP_TASK();
extern "C" void Dsp_Running_Check__Fv();
extern "C" void Dsp_Running_Start__Fv();
extern "C" void OSDisableInterrupts();
extern "C" void OSRestoreInterrupts();
extern "C" void DSPCheckMailToDSP();
extern "C" void DSPCheckMailFromDSP();
extern "C" void DSPReadMailFromDSP();
extern "C" void DSPSendMailToDSP();
extern "C" void DSPAssertInt();
extern "C" void DSPInit();
extern "C" void _savegpr_26();
extern "C" void _restgpr_26();
extern int Dsp_Running_Check();
//
// Declarations:
//
@@ -565,32 +566,90 @@ static u8 audio_task[80 + 16 /* padding */];
static u8 AUDIO_YIELD_BUFFER[8192];
/* 8029E720-8029E7CC 299060 00AC+00 0/0 1/1 0/0 .text DspBoot__FPFPv_v */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
#pragma function_align 32
asm void DspBoot(void (*param_0)(void*)) {
nofralloc
#include "asm/JSystem/JAudio2/dsptask/DspBoot__FPFPv_v.s"
void DspBoot(void (*param_0)(void*)) {
DspInitWork();
((DSPTaskInfo*)audio_task)->priority = 0xf0;
((DSPTaskInfo*)audio_task)->iram_mmem_addr = (u16*)(jdsp + 0x80000000);
((DSPTaskInfo*)audio_task)->iram_length = sizeof(jdsp);
((DSPTaskInfo*)audio_task)->iram_addr = 0;
((DSPTaskInfo*)audio_task)->dram_mmem_addr = (u16*)(AUDIO_YIELD_BUFFER + 0x80000000);
((DSPTaskInfo*)audio_task)->dram_length = sizeof(AUDIO_YIELD_BUFFER);
((DSPTaskInfo*)audio_task)->dram_addr = 0;
((DSPTaskInfo*)audio_task)->dsp_init_vector = 0;
((DSPTaskInfo*)audio_task)->dsp_resume_vector = 0x10;
((DSPTaskInfo*)audio_task)->init_cb = DspHandShake;
((DSPTaskInfo*)audio_task)->res_cb = NULL;
((DSPTaskInfo*)audio_task)->done_cb = NULL;
((DSPTaskInfo*)audio_task)->req_cb = param_0;
DSPInit();
DSPAddPriorTask((STRUCT_DSP_TASK*)audio_task);
}
#pragma pop
/* 8029E7E0-8029E8C8 299120 00E8+00 0/0 4/4 0/0 .text DSPSendCommands2__FPUlUlPFUs_v */
// lwz instead of lwzx in loop
#ifdef NONMATCHING
int DSPSendCommands2(u32* param_0, u32 param_1, void (*param_2)(u16)) {
while (Dsp_Running_Check() == 0);
BOOL status = OSDisableInterrupts();
if (DSPCheckMailToDSP()) {
OSRestoreInterrupts(status);
return -1;
}
DSPSendMailToDSP(param_1);
DSPAssertInt();
while(DSPCheckMailToDSP() != 0);
if (param_1 == 0) {
param_1 = 1;
}
int startWorkStatus;
if (param_2 != NULL) {
startWorkStatus = DspStartWork(param_0[0], param_2);
}
for (int i = 0; i < param_1; i++) {
DSPSendMailToDSP(param_0[i]);
while (DSPCheckMailToDSP() != 0);
}
OSRestoreInterrupts(status);
return startWorkStatus;
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
#pragma function_align 32
asm void DSPSendCommands2(u32* param_0, u32 param_1, void (*param_2)(u16)) {
asm int DSPSendCommands2(u32* param_0, u32 param_1, void (*param_2)(u16)) {
nofralloc
#include "asm/JSystem/JAudio2/dsptask/DSPSendCommands2__FPUlUlPFUs_v.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 80433FE0-80434060 060D00 0080+00 3/3 0/0 0/0 .bss taskwork */
static u8 taskwork[128];
typedef struct {
u16 field_0x0;
u16 field_0x2;
void (*field_0x4)(u16);
} TaskWorkStruct;
static TaskWorkStruct taskwork[16];
/* 8029E8E0-8029E90C 299220 002C+00 1/1 0/0 0/0 .text DspInitWork__Fv */
// Loop is unrolled but should not be
#ifdef NONMATCHING
static void DspInitWork() {
for (int i = 0; i < 16; i++) {
taskwork[i].field_0x4 = NULL;
}
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
@@ -600,32 +659,36 @@ static asm void DspInitWork() {
#include "asm/JSystem/JAudio2/dsptask/DspInitWork__Fv.s"
}
#pragma pop
#endif
/* ############################################################################################## */
/* 80451300-80451304 000800 0004+00 2/2 0/0 0/0 .sbss taskreadp */
static u8 taskreadp[4];
static u32 taskreadp;
/* 80451304-80451308 000804 0004+00 1/1 0/0 0/0 .sbss taskwritep */
static u8 taskwritep[4];
static u32 taskwritep;
/* 8029E920-8029E968 299260 0048+00 1/1 0/0 0/0 .text DspStartWork__FUlPFUs_v */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
#pragma function_align 32
static asm void DspStartWork(u32 param_0, void (*param_1)(u16)) {
nofralloc
#include "asm/JSystem/JAudio2/dsptask/DspStartWork__FUlPFUs_v.s"
static int DspStartWork(u32 param_0, void (*param_1)(u16)) {
u32 taskWritePrev = taskwritep;
u32 writeVal = ((taskWritePrev + 1) & 0xf);
if (writeVal == taskreadp) {
return 0;
}
taskwritep = writeVal;
taskwork[taskWritePrev].field_0x0 = param_0 >> 0x10;
taskwork[taskWritePrev].field_0x4 = param_1;
return taskWritePrev + 1;
}
#pragma pop
/* 8029E980-8029E9E8 2992C0 0068+00 0/0 1/1 0/0 .text DspFinishWork__FUs */
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
#pragma function_align 32
asm void DspFinishWork(u16 param_0) {
nofralloc
#include "asm/JSystem/JAudio2/dsptask/DspFinishWork__FUs.s"
void DspFinishWork(u16 param_0) {
if (param_0 == taskwork[taskreadp].field_0x0) {
if (taskwork[taskreadp].field_0x4) {
taskwork[taskreadp].field_0x4(taskreadp);
}
taskreadp = (taskreadp + 1) & 0xf;
}
}
#pragma pop