mirror of
https://github.com/zeldaret/tp
synced 2026-08-09 10:54:11 -04:00
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user