diff --git a/configure.py b/configure.py index ef311b58a..a01541b95 100644 --- a/configure.py +++ b/configure.py @@ -649,7 +649,7 @@ config.libs = [ JSystemLib( "JAudio", [ - Object(NonMatching, "JSystem/JAudio/JASCalc.cpp"), + Object(Matching, "JSystem/JAudio/JASCalc.cpp"), Object(NonMatching, "JSystem/JAudio/JASAiCtrl.cpp"), Object(NonMatching, "JSystem/JAudio/JASDvdThread.cpp"), Object(NonMatching, "JSystem/JAudio/JASCallback.cpp"), @@ -660,7 +660,7 @@ config.libs = [ Object(NonMatching, "JSystem/JAudio/JASProbe.cpp"), Object(NonMatching, "JSystem/JAudio/JASKernelDebug.cpp"), Object(NonMatching, "JSystem/JAudio/JASCmdStack.cpp"), - Object(NonMatching, "JSystem/JAudio/JASSystemHeap.cpp"), + Object(Matching, "JSystem/JAudio/JASSystemHeap.cpp"), Object(NonMatching, "JSystem/JAudio/JASNoteMgr.cpp"), Object(NonMatching, "JSystem/JAudio/JASOuterParam.cpp"), Object(NonMatching, "JSystem/JAudio/JASPlayer_impl.cpp"), @@ -668,9 +668,9 @@ config.libs = [ Object(NonMatching, "JSystem/JAudio/JASSeqCtrl.cpp"), Object(NonMatching, "JSystem/JAudio/JASSeqParser.cpp"), Object(NonMatching, "JSystem/JAudio/JASTrack.cpp"), - Object(NonMatching, "JSystem/JAudio/JASTrackInterrupt.cpp"), - Object(NonMatching, "JSystem/JAudio/JASTrackPort.cpp"), - Object(NonMatching, "JSystem/JAudio/JASBank.cpp"), + Object(Matching, "JSystem/JAudio/JASTrackInterrupt.cpp"), + Object(Matching, "JSystem/JAudio/JASTrackPort.cpp"), + Object(Matching, "JSystem/JAudio/JASBank.cpp"), Object(NonMatching, "JSystem/JAudio/JASWaveBank.cpp"), Object(NonMatching, "JSystem/JAudio/JASBasicBank.cpp"), Object(NonMatching, "JSystem/JAudio/JASBasicInst.cpp"), @@ -696,10 +696,10 @@ config.libs = [ Object(NonMatching, "JSystem/JAudio/JASChannelMgr.cpp"), Object(NonMatching, "JSystem/JAudio/JASOscillator.cpp"), Object(NonMatching, "JSystem/JAudio/JASDriverTables.cpp"), - Object(NonMatching, "JSystem/JAudio/dspproc.c"), - Object(NonMatching, "JSystem/JAudio/dsptask.c"), - Object(NonMatching, "JSystem/JAudio/osdsp.c"), - Object(NonMatching, "JSystem/JAudio/osdsp_task.c"), + Object(Matching, "JSystem/JAudio/dspproc.c", extra_cflags="-lang c++ -O4 -func_align 32"), + Object(NonMatching, "JSystem/JAudio/dsptask.c", extra_cflags="-lang c++ -O4 -func_align 32"), + Object(Matching, "JSystem/JAudio/osdsp.c", extra_cflags="-lang c++ -O4 -func_align 32 -str nopool"), + Object(Matching, "JSystem/JAudio/osdsp_task.c", extra_cflags="-lang c++ -O4 -func_align 32"), Object(NonMatching, "JSystem/JAudio/JAIAnimation.cpp"), Object(NonMatching, "JSystem/JAudio/JAIBasic.cpp"), Object(NonMatching, "JSystem/JAudio/JAIBankWave.cpp"), diff --git a/include/JSystem/JAudio/JASBank.h b/include/JSystem/JAudio/JASBank.h new file mode 100644 index 000000000..7763ef23e --- /dev/null +++ b/include/JSystem/JAudio/JASBank.h @@ -0,0 +1,16 @@ +#ifndef JASBANK_H +#define JASBANK_H + +#include "dolphin/types.h" + +class JKRHeap; + +namespace JASystem { + namespace TBank { + JKRHeap* getCurrentHeap(); + + extern JKRHeap* sCurrentHeap; + }; +} + +#endif /* JASBANK_H */ diff --git a/include/JSystem/JAudio/JASCalc.h b/include/JSystem/JAudio/JASCalc.h new file mode 100644 index 000000000..8d9c42a42 --- /dev/null +++ b/include/JSystem/JAudio/JASCalc.h @@ -0,0 +1,22 @@ +#ifndef JASCALC_H +#define JASCALC_H + +#include "dolphin/types.h" + +namespace JASystem { + namespace Calc { + void initSinfT(); + f32 sinfT(f32); + f32 sinfDolby2(f32); + void imixcopy(const s16*, const s16*, s16*, s32); + void bcopyfast(const u32*, u32*, u32); + void bcopy(const void*, void*, u32); + void bzerofast(void*, u32); + void bzero(void*, u32); + + extern f32* JASC_SINTABLE; + extern f32* JASC_DOL2TABLE; + } +} + +#endif /* JASCALC_H */ diff --git a/include/JSystem/JAudio/JASDSPInterface.h b/include/JSystem/JAudio/JASDSPInterface.h new file mode 100644 index 000000000..a8f8d0a3b --- /dev/null +++ b/include/JSystem/JAudio/JASDSPInterface.h @@ -0,0 +1,139 @@ +#ifndef JASDSPINTERFACE_H +#define JASDSPINTERFACE_H + +#include "dolphin/types.h" + +namespace JASystem { + namespace Driver { + struct Wave_ { + /* 0x00 */ u8 field_0x0; + /* 0x01 */ u8 field_0x1; + /* 0x02 */ u8 field_0x2[0x10 - 0x2]; + /* 0x10 */ int field_0x10; + /* 0x14 */ int field_0x14; + /* 0x18 */ int field_0x18; + /* 0x1C */ int field_0x1c; + /* 0x20 */ short field_0x20; + /* 0x22 */ short field_0x22; + }; + } + namespace DSPInterface { + struct FxlineConfig_ { + /* 0x00 */ u8 field_0x0; + /* 0x02 */ u16 field_0x2; + /* 0x04 */ short field_0x4; + /* 0x06 */ u16 field_0x6; + /* 0x08 */ short field_0x8; + /* 0x0C */ int field_0xc; + /* 0x10 */ short field_0x10[8]; + }; + + class FXBuffer { + public: + bool setFXLine(s16* param_1, FxlineConfig_* param_2); + + /* 0x00 */ short field_0x0; + /* 0x02 */ short field_0x2; + /* 0x04 */ s16* field_0x4; + /* 0x08 */ short field_0x8; + /* 0x0A */ short field_0xa; + /* 0x0C */ short field_0xc; + /* 0x0E */ short field_0xe; + /* 0x10 */ short field_0x10[8]; + }; + + class DSPBuffer { + public: + void allocInit(); + void playStart(); + void setWaveInfo(Driver::Wave_* param_1, u32 param_2, u32 param_3); + void setOscInfo(u32 param_1); + void initAutoMixer(); + void setAutoMixer(u16 param_1, u8 param_2, u8 param_3, u8 param_4, u8 param_5); + void setPitch(u16 param_1); + void setMixerInitDelayMax(u8 param_1); + void setMixerInitVolume(u8 param_1, s16 param_2, u8 param_3); + void setMixerVolume(u8 param_1, s16 param_2, u8 param_3); + void setMixerVolumeOnly(u8 param_1, short param_2); + void setPauseFlag(u8 param_1); + void flushChannel(); + void initFilter(); + void setFilterMode(u16 param_1); + void setIIRFilterParam(s16* param_1); + void setFIR8FilterParam(s16* param_1); + void setDistFilter(s16 param_1); + void setBusConnect(u8 param_1, u8 param_2); + + /* 0x00 */ u16 field_0x0; + /* 0x02 */ u16 field_0x2; + /* 0x04 */ u16 field_0x4; + /* 0x06 */ u8 field0x6[0x8 - 0x6]; + /* 0x08 */ u16 field_0x8; + /* 0x0A */ u8 field_0xa[0xc - 0xa]; + /* 0x0C */ u16 field_0xc; + /* 0x0E */ u16 field_0xe; + /* 0x10 */ u16 field_0x10[1][4]; + /* 0x18 */ u8 field_0x18[0x50 - 0x18]; + /* 0x50 */ u16 field_0x50; + /* 0x52 */ u16 field_0x52; + /* 0x54 */ short field_0x54; + /* 0x56 */ u16 field_0x56; + /* 0x58 */ u16 field_0x58; + /* 0x5A */ u8 field_0x5a[0x60 - 0x5a]; + /* 0x60 */ short field_0x60; + /* 0x62 */ u8 field_0x62[0x64 - 0x62]; + /* 0x64 */ short field_0x64; + /* 0x66 */ short field_0x66; + /* 0x68 */ int field_0x68; + /* 0x6C */ int field_0x6c; + /* 0x70 */ u8 field_0x70[0x74 - 0x70]; + /* 0x74 */ int field_0x74; + /* 0x78 */ short field_0x78[4]; + /* 0x80 */ short field_0x80[20]; + /* 0xA8 */ short field_0xa8[4]; + /* 0xB8 */ short field_0xb0[16]; + /* 0xD0 */ u8 field_0xd0[0x100 - 0xd0]; + /* 0x100 */ u16 field_0x100; + /* 0x102 */ u16 field_0x102; + /* 0x104 */ short field_0x104; + /* 0x106 */ short field_0x106; + /* 0x108 */ short field_0x108; + /* 0x10A */ u16 field_0x10a; + /* 0x10C */ int field_0x10c; + /* 0x110 */ int field_0x110; + /* 0x114 */ int field_0x114; + /* 0x118 */ int field_0x118; + /* 0x11C */ int field_0x11c; + /* 0x120 */ short field_0x120[8]; + /* 0x130 */ u8 field_0x130[0x148 - 0x130]; + /* 0x148 */ short field_0x148[4]; + /* 0x150 */ short field_0x150; + /* 0x152 */ u8 field_0x152[0x180 - 0x152]; + }; + + + void setDSPMixerLevel(float param_1); + DSPBuffer* getDSPHandle(u8 param_1); + void setFilterTable(short* param_1, short* param_2, u32 param_3); + void flushBuffer(); + void invalChannelAll(); + void clearBuffer(); + void setupBuffer(); + void initBuffer(); + FXBuffer* getFXHandle(u8 param_1); + + extern u16 SEND_TABLE[12]; + extern u32 DOLBY2_DELAY_BUF[]; + extern u16 JAS_DSP_PREFIX; + extern DSPBuffer* CH_BUF; + extern FXBuffer* FX_BUF; + extern float sDSPVolume; + + extern u32 DSPADPCM_FILTER[]; + extern u32 DSPRES_FILTER[]; + }; +} + +u16 DSP_CreateMap2(u32 param_1); + +#endif /* JASDSPINTERFACE_H */ diff --git a/include/JSystem/JAudio/JASHeapCtrl.h b/include/JSystem/JAudio/JASHeapCtrl.h new file mode 100644 index 000000000..27f9fc805 --- /dev/null +++ b/include/JSystem/JAudio/JASHeapCtrl.h @@ -0,0 +1,59 @@ +#ifndef JASHEAPCTRL_H +#define JASHEAPCTRL_H + +#include "JSystem/JSupport/JSUList.h" +#include "dolphin/os/OSMutex.h" + +namespace JASystem { + namespace Kernel { + class TDisposer { + public: + virtual void onDispose() {} + }; + + class THeap { + public: + enum Type { + Type0, + Type1, + }; + + THeap(TDisposer*); + void initRootHeap(void*, u32, Type); + bool alloc(THeap*, u32); + bool free(); + void insertChild(THeap* param_1, THeap* param_2, void* param_3, u32 param_4, bool param_5); + JASystem::Kernel::THeap* getTailHeap(); + u32 getTailOffset(); + u32 getCurOffset(); + + bool isAllocated() { return mBase; } + + /* 0x00 */ JSUTree mTree; + /* 0x1C */ OSMutex mMutex; + /* 0x34 */ TDisposer* mDisposer; + /* 0x38 */ Type mType; + /* 0x3C */ u8* mBase; + /* 0x40 */ u32 mSize; + /* 0x44 */ THeap* field_0x44; + }; + + class TSolidHeap { + public: + TSolidHeap(); + ~TSolidHeap() {} + int alloc(long param_1); + void freeAll(); + void init(u8* param_1, long param_2); + int getRemain(); + + /* 0x00 */ u32 field_0x0; + /* 0x04 */ int field_0x4; + /* 0x08 */ int field_0x8; + /* 0x0C */ int field_0xc; + /* 0x10 */ int field_0x10; + }; + } +} + +#endif /* JASHEAPCTRL_H */ diff --git a/include/JSystem/JAudio/JASSystemHeap.h b/include/JSystem/JAudio/JASSystemHeap.h new file mode 100644 index 000000000..e42bfc34a --- /dev/null +++ b/include/JSystem/JAudio/JASSystemHeap.h @@ -0,0 +1,27 @@ +#ifndef JASSYSTEMHEAP_H +#define JASSYSTEMHEAP_H + +#include "dolphin/types.h" + +class JKRSolidHeap; + +extern JKRSolidHeap* JASDram; + +namespace JASystem { + namespace Kernel { + class TSolidHeap; + + void sysDramSetup(JKRSolidHeap*); + void* allocFromSysDram(u32); + void sysAramSetup(u32); + void allocFromSysAramFull(u32*); + + extern TSolidHeap audioAramHeap; + extern u32 audioDramSize; + extern u32 audioAramSize; + extern int audioAramTop; + extern int CARD_SECURITY_BUFFER; + } +} + +#endif /* JASSYSTEMHEAP_H */ diff --git a/include/JSystem/JAudio/JASTrackInterrupt.h b/include/JSystem/JAudio/JASTrackInterrupt.h new file mode 100644 index 000000000..d32844a46 --- /dev/null +++ b/include/JSystem/JAudio/JASTrackInterrupt.h @@ -0,0 +1,26 @@ +#ifndef JASTRACKINTERRUPT_H +#define JASTRACKINTERRUPT_H + +#include "dolphin/types.h" + +namespace JASystem { + class TIntrMgr { + public: + void init(); + void request(u32); + void setIntr(u32, void*); + void resetInter(u32); + void* checkIntr(); + void timerProcess(); + + /* 0x00 */ u8 field_0x0; + /* 0x01 */ u8 field_0x1; + /* 0x02 */ u8 field_0x2; + /* 0x03 */ u8 field_0x3; + /* 0x04 */ u32 field_0x4; + /* 0x08 */ u32 field_0x8; + /* 0x0C */ void* field_0xc[8]; + }; +} + +#endif /* JASTRACKINTERRUPT_H */ diff --git a/include/JSystem/JAudio/JASTrackPort.h b/include/JSystem/JAudio/JASTrackPort.h new file mode 100644 index 000000000..dfb990a14 --- /dev/null +++ b/include/JSystem/JAudio/JASTrackPort.h @@ -0,0 +1,21 @@ +#ifndef JASTRACKPORT_H +#define JASTRACKPORT_H + +#include "dolphin/types.h" + +namespace JASystem { + class TTrackPort { + public: + void init(); + u16 readImport(int); + u16 readExport(int); + void writeImport(int, u16); + void writeExport(int, u16); + + /* 0x00 */ u8 field_0x0[16]; + /* 0x10 */ u8 field_0x10[16]; + /* 0x20 */ u16 field_0x20[16]; + }; +} + +#endif /* JASTRACKPORT_H */ diff --git a/include/JSystem/JAudio/dspproc.h b/include/JSystem/JAudio/dspproc.h new file mode 100644 index 000000000..f17884a12 --- /dev/null +++ b/include/JSystem/JAudio/dspproc.h @@ -0,0 +1,15 @@ +#ifndef DSPPROC_H +#define DSPPROC_H + +#include "dolphin/types.h" + +void DSPReleaseHalt2(u32); +void DSPReleaseHalt(); +void setup_callback(u16); +void DsetupTable(u32, u32, u32, u32, u32); +void DsetMixerLevel(f32); +void DsyncFrame(u32, u32, u32); +void dummy_callback(u16); +void DsetDolbyDelay(u32, u16); + +#endif /* DSPPROC_H */ diff --git a/include/JSystem/JAudio/dsptask.h b/include/JSystem/JAudio/dsptask.h new file mode 100644 index 000000000..12ad7fcb1 --- /dev/null +++ b/include/JSystem/JAudio/dsptask.h @@ -0,0 +1,13 @@ +#ifndef DSPTASK_H +#define DSPTASK_H + +#include "dolphin/dsp.h" + +void DspHandShake(void*); +void DspBoot(DSPCallback); +int DSPSendCommands2(u32*, u32, void (*)(u16)); +void DspInitWork(); +int DspStartWork(u32, void (*)(u16)); +void DspFinishWork(u16); + +#endif /* DSPTASK_H */ diff --git a/include/JSystem/JAudio/osdsp.h b/include/JSystem/JAudio/osdsp.h new file mode 100644 index 000000000..7cc4d6a1c --- /dev/null +++ b/include/JSystem/JAudio/osdsp.h @@ -0,0 +1,8 @@ +#ifndef OSDSP_H +#define OSDSP_H + +#include "dolphin/dsp.h" + +void DSPAddPriorTask(STRUCT_DSP_TASK*); + +#endif /* OSDSP_H */ diff --git a/include/JSystem/JAudio/osdsp_task.h b/include/JSystem/JAudio/osdsp_task.h new file mode 100644 index 000000000..116d51e73 --- /dev/null +++ b/include/JSystem/JAudio/osdsp_task.h @@ -0,0 +1,17 @@ +#ifndef OSDSP_TASK_H +#define OSDSP_TASK_H + +#include "dolphin/types.h" + +typedef struct STRUCT_DSP_TASK DSPTaskInfo; +typedef struct OSContext OSContext; + +extern DSPTaskInfo* DSP_prior_task; + +extern "C" void __DSPHandler(int, OSContext*); +void DsyncFrame2(u32, u32, u32); +void Dsp_Update_Request(); +bool Dsp_Running_Check(); +void Dsp_Running_Start(); + +#endif /* OSDSP_TASK_H */ diff --git a/include/JSystem/JKernel/JKRStdHeap.h b/include/JSystem/JKernel/JKRStdHeap.h index c52c875bb..677e24c5e 100644 --- a/include/JSystem/JKernel/JKRStdHeap.h +++ b/include/JSystem/JKernel/JKRStdHeap.h @@ -5,6 +5,7 @@ #include "dolphin/os/OSAlloc.h" class JKRStdHeap : public JKRHeap { +public: static JKRStdHeap* create(u32, JKRHeap*, bool); void do_destroy(); JKRStdHeap(void*, u32, JKRHeap*, bool); @@ -31,4 +32,4 @@ class JKRStdHeap : public JKRHeap { OSHeapHandle mHeapHandle; }; -#endif /* JKRSTDHEAP_H */ \ No newline at end of file +#endif /* JKRSTDHEAP_H */ diff --git a/include/JSystem/JSupport/JSUList.h b/include/JSystem/JSupport/JSUList.h index 6adb0bc74..e117824b0 100644 --- a/include/JSystem/JSupport/JSUList.h +++ b/include/JSystem/JSupport/JSUList.h @@ -212,7 +212,7 @@ public: return *this; } - T& operator*() { return *this->getObject(); } + T* operator*() { return this->getObject(); } T* operator->() { return this->getObject(); } diff --git a/include/dolphin/ar/ar.h b/include/dolphin/ar/ar.h index c04e41f1d..a7c4f9242 100644 --- a/include/dolphin/ar/ar.h +++ b/include/dolphin/ar/ar.h @@ -14,6 +14,7 @@ u32 ARGetDMAStatus(void); void ARStartDMA(u32 type, u32 mainmem_addr, u32 aram_addr, u32 length); u32 ARInit(u32* stack_index_addr, u32 num_entries); u32 ARAlloc(u32 length); +u32 ARGetBaseAddress(); u32 ARGetSize(void); #ifdef __cplusplus diff --git a/include/dolphin/dsp.h b/include/dolphin/dsp.h index 534ab88cd..f408874f6 100644 --- a/include/dolphin/dsp.h +++ b/include/dolphin/dsp.h @@ -4,6 +4,9 @@ #include "dolphin/os/OS.h" #include "dolphin/types.h" +volatile u16 __DSPRegs[32] : 0xCC005000; +volatile u32 __AIRegs[8] : 0xCC006C00; + #ifdef __cplusplus extern "C" { #endif @@ -47,24 +50,31 @@ typedef struct STRUCT_DSP_TASK { } DSPTaskInfo; +extern DSPTaskInfo* __DSP_tmp_task; +extern DSPTaskInfo* __DSP_last_task; +extern DSPTaskInfo* __DSP_first_task; +extern DSPTaskInfo* __DSP_curr_task; + +u32 DSPCheckMailToDSP(); +u32 DSPCheckMailFromDSP(); +u32 DSPReadMailFromDSP(); +void DSPSendMailToDSP(u32 mail); +void DSPAssertInt(); void DSPInit(); void DSPReset(); void DSPHalt(); -void DSPSendMailToDSP(u32 mail); -u32 DSPCheckMailToDSP(); -u32 DSPCheckMailFromDSP(); u32 DSPGetDMAStatus(); - DSPTaskInfo* DSPAddTask(DSPTaskInfo* task); void __DSP_exec_task(DSPTaskInfo* curr, DSPTaskInfo* next); void __DSP_boot_task(DSPTaskInfo* task); -void __DSP_remove_task(DSPTaskInfo* task); +void __DSP_insert_task(DSPTaskInfo* task); void __DSP_add_task(DSPTaskInfo* task); +void __DSP_remove_task(DSPTaskInfo* task); void __DSP_debug_printf(const char* fmt, ...); #ifdef __cplusplus } #endif -#endif // _DOLPHIN_DSP \ No newline at end of file +#endif // _DOLPHIN_DSP diff --git a/src/JSystem/JAudio/JASBank.cpp b/src/JSystem/JAudio/JASBank.cpp index f44677f02..e1ee502ff 100644 --- a/src/JSystem/JAudio/JASBank.cpp +++ b/src/JSystem/JAudio/JASBank.cpp @@ -3,11 +3,18 @@ // Translation Unit: JASBank.cpp // -#include "JASBank.h" +#include "JSystem/JAudio/JASBank.h" +#include "JSystem/JAudio/JASSystemHeap.h" +#include "JSystem/JKernel/JKRSolidHeap.h" #include "dolphin/types.h" -/* 80284548-8028455C .text getCurrentHeap__Q28JASystem5TBankFv */ -void JASystem::TBank::getCurrentHeap() { - /* Nonmatching */ -} +JKRHeap* JASystem::TBank::sCurrentHeap; +/* 80284548-8028455C .text getCurrentHeap__Q28JASystem5TBankFv */ +JKRHeap* JASystem::TBank::getCurrentHeap() { + /* Nonmatching */ + if (sCurrentHeap) { + return sCurrentHeap; + } + return JASDram; +} diff --git a/src/JSystem/JAudio/JASCalc.cpp b/src/JSystem/JAudio/JASCalc.cpp index 9c0d3fe20..ce10627d6 100644 --- a/src/JSystem/JAudio/JASCalc.cpp +++ b/src/JSystem/JAudio/JASCalc.cpp @@ -3,46 +3,160 @@ // Translation Unit: JASCalc.cpp // -#include "JASCalc.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASCalc.h" +#include "JSystem/JAudio/JASSystemHeap.h" +#include "JSystem/JKernel/JKRSolidHeap.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "MSL_C/math.h" + +f32* JASystem::Calc::JASC_SINTABLE; +f32* JASystem::Calc::JASC_DOL2TABLE; /* 8027A804-8027A9C8 .text initSinfT__Q28JASystem4CalcFv */ void JASystem::Calc::initSinfT() { - /* Nonmatching */ + JASC_SINTABLE = new (JASDram, 0) f32[257]; + JUT_ASSERT(49, JASC_SINTABLE != 0); + JASC_DOL2TABLE = new (JASDram, 0) f32[257]; + JUT_ASSERT(51, JASC_DOL2TABLE != 0); + for (u32 i = 0; i < 257; i++) { + JASC_SINTABLE[i] = sin((M_PI / 2) * i / 256.0f); + } + for (u32 i = 0; i < 257; i++) { + JASC_DOL2TABLE[i] = sin((M_PI / 2) * (0.32612f + 0.34776f * i / 256.0f)); + } } /* 8027A9C8-8027A9F4 .text sinfT__Q28JASystem4CalcFf */ -void JASystem::Calc::sinfT(float) { - /* Nonmatching */ +f32 JASystem::Calc::sinfT(f32 param_1) { + return JASC_SINTABLE[s32(param_1 * 256.0f)]; } /* 8027A9F4-8027AA20 .text sinfDolby2__Q28JASystem4CalcFf */ -void JASystem::Calc::sinfDolby2(float) { - /* Nonmatching */ +f32 JASystem::Calc::sinfDolby2(f32 param_1) { + return JASC_DOL2TABLE[s32(param_1 * 256.0f)]; } /* 8027AA20-8027AA50 .text imixcopy__Q28JASystem4CalcFPCsPCsPsl */ -void JASystem::Calc::imixcopy(const short*, const short*, short*, long) { - /* Nonmatching */ +void JASystem::Calc::imixcopy(const s16* s1, const s16* s2, s16* dst, s32 n) { + for (; n > 0; n--) { + *dst++ = *s1++; + *dst++ = *s2++; + } } /* 8027AA50-8027AB68 .text bcopyfast__Q28JASystem4CalcFPCUlPUlUl */ -void JASystem::Calc::bcopyfast(const unsigned long*, unsigned long*, unsigned long) { - /* Nonmatching */ +void JASystem::Calc::bcopyfast(const u32* src, u32* dest, u32 size) { + JUT_ASSERT(280, (reinterpret_cast(src) & 0x03) == 0); + JUT_ASSERT(281, (reinterpret_cast(dest) & 0x03) == 0); + JUT_ASSERT(282, (size & 0x0f) == 0); + for (size /= 16; size; size--) { + u32 val1 = *src++; + u32 val2 = *src++; + u32 val3 = *src++; + u32 val4 = *src++; + *dest++ = val1; + *dest++ = val2; + *dest++ = val3; + *dest++ = val4; + } } /* 8027AB68-8027AC68 .text bcopy__Q28JASystem4CalcFPCvPvUl */ -void JASystem::Calc::bcopy(const void*, void*, unsigned long) { +void JASystem::Calc::bcopy(const void* src, void* dest, u32 size) { /* Nonmatching */ + u32 *usrc; + u32 *udest; + + u8 *bsrc = (u8 *)src; + u8 *bdest = (u8 *)dest; + + u8 endbitsSrc = (reinterpret_cast(bsrc) & 0x03); + u8 enbitsDst = (reinterpret_cast(bdest) & 0x03); + if ((endbitsSrc) == (enbitsDst) && (size & 0x0f) == 0) { + bcopyfast((u32*)src, (u32*)dest, size); + } else if ((endbitsSrc == enbitsDst) && (size >= 16)) { + if (endbitsSrc != 0) { + for (endbitsSrc = 4 - endbitsSrc; endbitsSrc != 0; endbitsSrc--) { + *bdest++ = (u32)*bsrc++; + size--; + } + } + + udest = (u32 *)bdest; + usrc = (u32 *)bsrc; + + for (; size >= 4; size -= 4) { + *udest++ = *usrc++; + } + + if (size != 0) { + bdest = (u8 *)udest; + bsrc = (u8 *)usrc; + + for (; size != 0; size--) { + *bdest++ = (u32)*bsrc++; + } + } + } else { + for (; size != 0; size--) { + *bdest++ = (u32)*bsrc++; + } + } } /* 8027AC68-8027AD38 .text bzerofast__Q28JASystem4CalcFPvUl */ -void JASystem::Calc::bzerofast(void*, unsigned long) { +void JASystem::Calc::bzerofast(void* dest, u32 size) { /* Nonmatching */ + JUT_ASSERT(387, (reinterpret_cast(dest) & 0x03) == 0); + JUT_ASSERT(388, (size & 0x0f) == 0); + u32* udest = (u32*)dest; + for (size = size / 16; size != 0; size--) { + *udest++ = 0; + *udest++ = 0; + *udest++ = 0; + *udest++ = 0; + } } /* 8027AD38-8027AE30 .text bzero__Q28JASystem4CalcFPvUl */ -void JASystem::Calc::bzero(void*, unsigned long) { +void JASystem::Calc::bzero(void* dest, u32 size) { /* Nonmatching */ -} + u32 *udest; + u8 *bdest = (u8 *)dest; + if ((size & 0x1f) == 0 && (reinterpret_cast(dest) & 0x1f) == 0) { + DCZeroRange(dest, size); + return; + } + u8 alignedbitsDst = reinterpret_cast(bdest) & 0x3; + + if ((size & 0xf) == 0 && alignedbitsDst == 0) { + bzerofast(dest, size); + return; + } + + if (size >= 16) { + if (alignedbitsDst != 0) { + for (alignedbitsDst = 4 - alignedbitsDst; alignedbitsDst != 0; alignedbitsDst--) { + *bdest++ = 0; + size--; + } + } + + udest = (u32 *)bdest; + for (; size >= 4; size -= 4) { + *udest++ = 0; + } + + if (size != 0) { + bdest = (u8 *)udest; + for (; size != 0; size--) { + *bdest++ = 0; + } + } + } else { + for (; size != 0; size--) { + *bdest++ = 0; + } + } +} diff --git a/src/JSystem/JAudio/JASDSPInterface.cpp b/src/JSystem/JAudio/JASDSPInterface.cpp index 0ab7755f1..82c2e4b9e 100644 --- a/src/JSystem/JAudio/JASDSPInterface.cpp +++ b/src/JSystem/JAudio/JASDSPInterface.cpp @@ -3,156 +3,340 @@ // Translation Unit: JASDSPInterface.cpp // -#include "JASDSPInterface.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASDSPInterface.h" +#include "JSystem/JAudio/JASCalc.h" +#include "JSystem/JAudio/JASSystemHeap.h" +#include "JSystem/JAudio/dspproc.h" +#include "JSystem/JKernel/JKRSolidHeap.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "dolphin/os/OSCache.h" + +JASystem::DSPInterface::DSPBuffer* JASystem::DSPInterface::CH_BUF; +JASystem::DSPInterface::FXBuffer* JASystem::DSPInterface::FX_BUF; +f32 JASystem::DSPInterface::sDSPVolume; /* 8028A10C-8028A130 .text setDSPMixerLevel__Q28JASystem12DSPInterfaceFf */ -void JASystem::DSPInterface::setDSPMixerLevel(float) { - /* Nonmatching */ +void JASystem::DSPInterface::setDSPMixerLevel(f32 param_1) { + sDSPVolume = param_1; + DsetMixerLevel(param_1); } /* 8028A130-8028A144 .text getDSPHandle__Q28JASystem12DSPInterfaceFUc */ -void JASystem::DSPInterface::getDSPHandle(unsigned char) { - /* Nonmatching */ +JASystem::DSPInterface::DSPBuffer* JASystem::DSPInterface::getDSPHandle(u8 param_1) { + return CH_BUF + param_1; } /* 8028A144-8028A168 .text setFilterTable__Q28JASystem12DSPInterfaceFPsPsUl */ -void JASystem::DSPInterface::setFilterTable(short*, short*, unsigned long) { - /* Nonmatching */ +void JASystem::DSPInterface::setFilterTable(s16* dest, s16* src, u32 size) { + for (int i = 0; i < size; i++) { + *dest++ = *src++; + } } /* 8028A168-8028A19C .text flushBuffer__Q28JASystem12DSPInterfaceFv */ void JASystem::DSPInterface::flushBuffer() { - /* Nonmatching */ + DCFlushRange(CH_BUF, sizeof(DSPBuffer) * 64); + DCFlushRange(FX_BUF, sizeof(FXBuffer) * 4); } /* 8028A19C-8028A1C4 .text invalChannelAll__Q28JASystem12DSPInterfaceFv */ void JASystem::DSPInterface::invalChannelAll() { - /* Nonmatching */ + DCInvalidateRange(CH_BUF, sizeof(DSPBuffer) * 64); } /* 8028A1C4-8028A240 .text clearBuffer__Q28JASystem12DSPInterfaceFv */ void JASystem::DSPInterface::clearBuffer() { - /* Nonmatching */ + for (u32 i = 0; i < 64; i++) { + Calc::bzero(CH_BUF + i, sizeof(DSPBuffer)); + } + for (u32 i = 0; i < 4; i++) { + Calc::bzero(FX_BUF + i, sizeof(FXBuffer)); + } } +u32 JASystem::DSPInterface::DOLBY2_DELAY_BUF[600]; + /* 8028A240-8028A28C .text setupBuffer__Q28JASystem12DSPInterfaceFv */ void JASystem::DSPInterface::setupBuffer() { - /* Nonmatching */ + DsetupTable(64, (u32)CH_BUF, (u32)&DSPRES_FILTER, (u32)&DSPADPCM_FILTER, (u32)FX_BUF); + DsetDolbyDelay((u32)&DOLBY2_DELAY_BUF, 10); } /* 8028A28C-8028A368 .text initBuffer__Q28JASystem12DSPInterfaceFv */ void JASystem::DSPInterface::initBuffer() { - /* Nonmatching */ + CH_BUF = new(JASDram, 0x20) DSPBuffer[64]; + FX_BUF = new(JASDram, 0x20) FXBuffer[4]; + JUT_ASSERT(163, (CH_BUF != 0) && (FX_BUF != 0)); + for (u8 i = 0; i < 4; i++) { + FX_BUF[i].setFXLine(NULL, NULL); + } + clearBuffer(); + setupBuffer(); + flushBuffer(); } /* 8028A368-8028A378 .text getFXHandle__Q28JASystem12DSPInterfaceFUc */ -void JASystem::DSPInterface::getFXHandle(unsigned char) { - /* Nonmatching */ +JASystem::DSPInterface::FXBuffer* JASystem::DSPInterface::getFXHandle(u8 param_1) { + return FX_BUF + param_1; } +u16 JASystem::DSPInterface::SEND_TABLE[] = { + 0x0D00, 0x0D60, 0x0DC0, 0x0E20, + 0x0E80, 0x0EE0, 0x0CA0, 0x0F40, + 0x0FA0, 0x0B00, 0x09A0, 0x0000, +}; + /* 8028A378-8028A528 .text setFXLine__Q38JASystem12DSPInterface8FXBufferFPsPQ38JASystem12DSPInterface13FxlineConfig_ */ -void JASystem::DSPInterface::FXBuffer::setFXLine(short*, JASystem::DSPInterface::FxlineConfig_*) { - /* Nonmatching */ +bool JASystem::DSPInterface::FXBuffer::setFXLine(s16* buffer, JASystem::DSPInterface::FxlineConfig_* config) { + BOOL enable = OSDisableInterrupts(); + field_0x0 = 0; + if (config) { + field_0xa = config->field_0x4; + field_0x8 = SEND_TABLE[config->field_0x2]; + field_0xe = config->field_0x8; + field_0xc = SEND_TABLE[config->field_0x6]; + field_0x2 = config->field_0xc; + OSReport("FX LINE Buffer %x/ SIZE %d\n", buffer, config->field_0xc); + setFilterTable(field_0x10, config->field_0x10, 8); + } + if (buffer && config) { + u32 bufsize = config->field_0xc * 0xa0; + field_0x4 = buffer; + Calc::bzero(buffer, bufsize); + JUT_ASSERT(219, (reinterpret_cast(buffer) & 0x1f) == 0); + JUT_ASSERT(220, (bufsize & 0x1f) == 0); + DCFlushRange(buffer, bufsize); + } else if (!config || buffer) { + field_0x4 = buffer; + } + if (field_0x4) { + field_0x0 = config->field_0x0; + } else { + field_0x0 = 0; + } + DCFlushRange(this, 0x20); + OSRestoreInterrupts(enable); + return true; } /* 8028A528-8028A574 .text allocInit__Q38JASystem12DSPInterface9DSPBufferFv */ void JASystem::DSPInterface::DSPBuffer::allocInit() { - /* Nonmatching */ + field_0xc = 0; + field_0x2 = 0; + field_0x10a = 0; + field_0x0 = 0; + field_0x58 = 0; + initFilter(); + flushChannel(); } /* 8028A574-8028A5D8 .text playStart__Q38JASystem12DSPInterface9DSPBufferFv */ void JASystem::DSPInterface::DSPBuffer::playStart() { /* Nonmatching */ + field_0x10c = 0; + field_0x60 = 0; + field_0x8 = 1; + field_0x66 = 1; + for (int i = 0; i < 4; i++) { + field_0x78[i] = 0; + field_0xa8[i] = 0; + } + for (int i = 0; i < 20; i++) { + field_0x80[i] = 0; + } + field_0x0 = 1; } +u16 JASystem::DSPInterface::JAS_DSP_PREFIX = 0xF355; + /* 8028A5D8-8028A6FC .text setWaveInfo__Q38JASystem12DSPInterface9DSPBufferFPQ38JASystem6Driver5Wave_UlUl */ -void JASystem::DSPInterface::DSPBuffer::setWaveInfo(JASystem::Driver::Wave_*, unsigned long, unsigned long) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setWaveInfo(JASystem::Driver::Wave_* param_1, u32 param_2, u32 param_3) { + static u8 COMP_BLOCKSAMPLES[8] = { + 0x10, 0x10, 0x01, 0x01, 0x01, 0x10, 0x10, 0x01, + }; + static u8 COMP_BLOCKBYTES[8] = { + 0x09, 0x05, 0x08, 0x10, 0x01, 0x01, 0x01, 0x01, + }; + + field_0x118 = param_2; + field_0x64 = COMP_BLOCKSAMPLES[param_1->field_0x1]; + field_0x100 = COMP_BLOCKBYTES[param_1->field_0x1]; + field_0x68 = 0; + if (field_0x100 < 4) { + return; + } + field_0x11c = param_1->field_0x1c; + field_0x102 = param_1->field_0x10; + if (field_0x102) { + if (param_3 == 1) { + param_3 = param_1->field_0x14; + } + field_0x110 = param_1->field_0x14; + field_0x114 = param_1->field_0x18; + field_0x104 = param_1->field_0x20; + field_0x106 = param_1->field_0x22; + } else { + field_0x114 = field_0x11c; + } + if (param_3 && field_0x114 > param_3) { + switch (param_1->field_0x1) { + case 0: + case 1: + field_0x68 = param_3; + field_0x118 += (param_3 * field_0x100 >> 4); + field_0x110 -= param_3; + field_0x114 -= param_3; + break; + case 2: + case 3: + field_0x68 = param_3; + break; + } + } + for (int i = 0; i < 16; i++) { + field_0xb0[i] = 0; + } } /* 8028A6FC-8028A714 .text setOscInfo__Q38JASystem12DSPInterface9DSPBufferFUl */ -void JASystem::DSPInterface::DSPBuffer::setOscInfo(unsigned long) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setOscInfo(u32 param_1) { + field_0x118 = 0; + field_0x64 = 16; + field_0x100 = param_1; } /* 8028A714-8028A740 .text initAutoMixer__Q38JASystem12DSPInterface9DSPBufferFv */ void JASystem::DSPInterface::DSPBuffer::initAutoMixer() { - /* Nonmatching */ + if (field_0x58) { + field_0x54 = field_0x56; + return; + } + field_0x54 = 0; + field_0x58 = 1; } /* 8028A740-8028A764 .text setAutoMixer__Q38JASystem12DSPInterface9DSPBufferFUsUcUcUcUc */ -void JASystem::DSPInterface::DSPBuffer::setAutoMixer(unsigned short, unsigned char, unsigned char, unsigned char, unsigned char) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setAutoMixer(u16 param_1, u8 param_2, u8 param_3, u8 param_4, u8 param_5) { + field_0x50 = param_2 << 8 | param_3; + field_0x52 = param_4 << 8; + field_0x56 = param_1; + field_0x58 = 1; } /* 8028A764-8028A77C .text setPitch__Q38JASystem12DSPInterface9DSPBufferFUs */ -void JASystem::DSPInterface::DSPBuffer::setPitch(unsigned short) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setPitch(u16 param_1) { + if (param_1 >= 0x7fff) { + param_1 = 0x7fff; + } + field_0x4 = param_1; } /* 8028A77C-8028A788 .text setMixerInitDelayMax__Q38JASystem12DSPInterface9DSPBufferFUc */ -void JASystem::DSPInterface::DSPBuffer::setMixerInitDelayMax(unsigned char) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setMixerInitDelayMax(u8 param_1) { + field_0xe = param_1; } /* 8028A788-8028A7AC .text setMixerInitVolume__Q38JASystem12DSPInterface9DSPBufferFUcsUc */ -void JASystem::DSPInterface::DSPBuffer::setMixerInitVolume(unsigned char, short, unsigned char) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setMixerInitVolume(u8 param_1, s16 param_2, u8 param_3) { + u16* tmp = field_0x10[param_1]; + tmp[2] = param_2; + tmp[1] = param_2; + tmp[3] = param_3 << 8 | param_3; } /* 8028A7AC-8028A7DC .text setMixerVolume__Q38JASystem12DSPInterface9DSPBufferFUcsUc */ -void JASystem::DSPInterface::DSPBuffer::setMixerVolume(unsigned char, short, unsigned char) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setMixerVolume(u8 param_1, s16 param_2, u8 param_3) { + if (field_0x10a) { + return; + } + u16* tmp = field_0x10[param_1]; + tmp[1] = param_2; + tmp[3] = param_3 << 8 | tmp[3] & 0xff; } /* 8028A7DC-8028A7F8 .text setMixerVolumeOnly__Q38JASystem12DSPInterface9DSPBufferFUcs */ -void JASystem::DSPInterface::DSPBuffer::setMixerVolumeOnly(unsigned char, short) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setMixerVolumeOnly(u8 param_1, s16 param_2) { + if (field_0x10a) { + return; + } + field_0x10[param_1][1] = param_2; } /* 8028A7F8-8028A804 .text setPauseFlag__Q38JASystem12DSPInterface9DSPBufferFUc */ -void JASystem::DSPInterface::DSPBuffer::setPauseFlag(unsigned char) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setPauseFlag(u8 param_1) { + field_0xc = param_1; } /* 8028A804-8028A828 .text flushChannel__Q38JASystem12DSPInterface9DSPBufferFv */ void JASystem::DSPInterface::DSPBuffer::flushChannel() { - /* Nonmatching */ + DCFlushRange(this, sizeof(*this)); } /* 8028A828-8028A884 .text initFilter__Q38JASystem12DSPInterface9DSPBufferFv */ void JASystem::DSPInterface::DSPBuffer::initFilter() { /* Nonmatching */ + for (int i = 0; i < 8; i++) { + field_0x120[i] = 0; + } + field_0x120[0] = 0x7fff; + for (int i = 0; i < 4; i++) { + field_0x148[i] = 0; + } + field_0x148[0] = 0x7fff; + field_0x150 = 0; } /* 8028A884-8028A8BC .text setFilterMode__Q38JASystem12DSPInterface9DSPBufferFUs */ -void JASystem::DSPInterface::DSPBuffer::setFilterMode(unsigned short) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setFilterMode(u16 param_1) { + u8 r30 = param_1 & 0x20; + u8 r31 = param_1 & 0x1f; + if (r30) { + if (r31 > 0x14) { + r31 = 0x14; + } + } else { + if (r31 > 0x18) { + r31 = 0x18; + } + } + field_0x108 = r30 + r31; } /* 8028A8BC-8028A8E4 .text setIIRFilterParam__Q38JASystem12DSPInterface9DSPBufferFPs */ -void JASystem::DSPInterface::DSPBuffer::setIIRFilterParam(short*) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setIIRFilterParam(s16* param_1) { + setFilterTable(field_0x148, param_1, 4); } /* 8028A8E4-8028A90C .text setFIR8FilterParam__Q38JASystem12DSPInterface9DSPBufferFPs */ -void JASystem::DSPInterface::DSPBuffer::setFIR8FilterParam(short*) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setFIR8FilterParam(s16* param_1) { + setFilterTable(field_0x120, param_1, 8); } /* 8028A90C-8028A914 .text setDistFilter__Q38JASystem12DSPInterface9DSPBufferFs */ -void JASystem::DSPInterface::DSPBuffer::setDistFilter(short) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setDistFilter(s16 param_1) { + field_0x150 = param_1; } /* 8028A914-8028A934 .text setBusConnect__Q38JASystem12DSPInterface9DSPBufferFUcUc */ -void JASystem::DSPInterface::DSPBuffer::setBusConnect(unsigned char, unsigned char) { - /* Nonmatching */ +void JASystem::DSPInterface::DSPBuffer::setBusConnect(u8 param_1, u8 param_2) { + static const u16 connect_table[12] = { + 0x0000, 0x0D00, 0x0D60, 0x0DC0, 0x0E20, 0x0E80, + 0x0EE0, 0x0CA0, 0x0F40, 0x0FA0, 0x0B00, 0x09A0, + }; + u16* tmp = field_0x10[param_1]; + tmp[0] = connect_table[param_2]; } /* 8028A934-8028A978 .text DSP_CreateMap2__FUl */ -void DSP_CreateMap2(unsigned long) { - /* Nonmatching */ +u16 DSP_CreateMap2(u32 param_1) { + u16 var1 = 0; + JASystem::DSPInterface::DSPBuffer* buffer = &JASystem::DSPInterface::CH_BUF[param_1 << 4]; + for (int i = 0; i < 16; i++) { + var1 <<= 1; + if (buffer->field_0x0) { + var1 |= 1; + } + buffer++; + } + return var1; } - diff --git a/src/JSystem/JAudio/JASHeapCtrl.cpp b/src/JSystem/JAudio/JASHeapCtrl.cpp index 5eabaaf13..0682a2ad9 100644 --- a/src/JSystem/JAudio/JASHeapCtrl.cpp +++ b/src/JSystem/JAudio/JASHeapCtrl.cpp @@ -3,76 +3,243 @@ // Translation Unit: JASHeapCtrl.cpp // -#include "JASHeapCtrl.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASHeapCtrl.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "dolphin/os/OS.h" /* 8027CC14-8027CC88 .text __ct__Q38JASystem6Kernel5THeapFPQ38JASystem6Kernel9TDisposer */ -JASystem::Kernel::THeap::THeap(JASystem::Kernel::TDisposer*) { - /* Nonmatching */ +JASystem::Kernel::THeap::THeap(TDisposer* disposer) : mTree(this) { + mDisposer = disposer; + mType = Type1; + mBase = NULL; + mSize = 0; + field_0x44 = NULL; + OSInitMutex(&mMutex); } /* 8027CC88-8027CD38 .text initRootHeap__Q38JASystem6Kernel5THeapFPvUlQ48JASystem6Kernel5THeap4Type */ -void JASystem::Kernel::THeap::initRootHeap(void*, unsigned long, JASystem::Kernel::THeap::Type) { - /* Nonmatching */ +void JASystem::Kernel::THeap::initRootHeap(void* ptr, u32 size, Type type) { + JUT_ASSERT(92, ! isAllocated()); + OSLockMutex(&mMutex); + mBase = (u8*)OSRoundUpPtr(ptr, 0x20); + field_0x44 = NULL; + mSize = size - (u32(mBase) - u32(ptr)); + mType = type; + OSUnlockMutex(&mMutex); } /* 8027CD38-8027CF68 .text alloc__Q38JASystem6Kernel5THeapFPQ38JASystem6Kernel5THeapUl */ -void JASystem::Kernel::THeap::alloc(JASystem::Kernel::THeap*, unsigned long) { - /* Nonmatching */ +bool JASystem::Kernel::THeap::alloc(THeap* mother, u32 param_2) { + JUT_ASSERT(118, mother != 0); + OSLockMutex(&mMutex); + if (isAllocated()) { + OSReport("[JASHeap::alloc] すでにヒープは確保されています。初期化してからにしてください。\n"); + OSUnlockMutex(&mMutex); + return false; + } + if (!mother->isAllocated()) { + OSUnlockMutex(&mMutex); + return false; + } + param_2 = OSRoundUp32B(param_2); + u32 local_28 = mother->getCurOffset(); + u32 local_2c = mother->getTailOffset(); + if (local_28 + param_2 <= local_2c) { + mother->insertChild(this, mother->getTailHeap(), mother->mBase + local_28, param_2, false); + OSUnlockMutex(&mMutex); + return true; + } + s32 r27 = -1; + u8* r29 = mother->mBase; + bool local_43 = false; + THeap* local_30 = NULL; + void* local_34; + for (JSUTreeIterator it = mother->mTree.getFirstChild(); it != mother->mTree.getEndChild(); it++) { + if (r29 >= mother->mBase + local_2c) { + break; + } + u32 local_3c = u32(it->mBase) - u32(r29); + if (local_3c >= param_2 && local_3c < r27) { + local_30 = *it; + local_34 = r29; + r27 = local_3c; + local_43 = true; + } + u32 r25 = it->mSize; + r29 = (u8*)it->mBase + r25; + } + if (r29 != mother->mBase && r29 < mother->mBase + local_2c) { + u32 local_40 = mother->mBase + mother->mSize - r29; + if (local_40 >= param_2 && local_40 < r27) { + local_30 = NULL; + local_34 = r29; + r27 = local_40; + local_43 = true; + } + } + if (!local_43) { + OSReport("[JASHeap::alloc] マザーメモリが足りないので確保できません。\n"); + OSUnlockMutex(&mMutex); + return false; + } + mother->insertChild(this, local_30, local_34, param_2, false); + OSUnlockMutex(&mMutex); + return true; } /* 8027CF68-8027D088 .text free__Q38JASystem6Kernel5THeapFv */ -void JASystem::Kernel::THeap::free() { - /* Nonmatching */ +bool JASystem::Kernel::THeap::free() { + OSLockMutex(&mMutex); + if (!isAllocated()) { + OSUnlockMutex(&mMutex); + return false; + } + JSUTreeIterator stack_20; + for (JSUTreeIterator it(mTree.getFirstChild()); it != mTree.getEndChild(); it = stack_20) { + stack_20 = it; + stack_20++; + it->free(); + } + JSUTree* parentTree = mTree.getParent(); + if (parentTree) { + THeap* parentHeap = parentTree->getObject(); + if (parentHeap->field_0x44 == this) { + JSUTreeIterator stack_28(mTree.getPrevChild()); + if (stack_28 != mTree.getEndChild()) { + parentHeap->field_0x44 = *stack_28; + } else { + parentHeap->field_0x44 = NULL; + } + } + parentTree->removeChild(&mTree); + } + mBase = NULL; + field_0x44 = NULL; + mSize = 0; + if (mDisposer) { + mDisposer->onDispose(); + } + OSUnlockMutex(&mMutex); + return true; +} + +static void dummy(JASystem::Kernel::TDisposer* disposer) { + OSReport("------------------------------------\n"); + OSReport("level >= 0 && level < 7"); + OSReport("%s Heap %08x [Addr %8x , Max %8x] %c\n"); } /* 8027D088-8027D1FC .text insertChild__Q38JASystem6Kernel5THeapFPQ38JASystem6Kernel5THeapPQ38JASystem6Kernel5THeapPvUlb */ -void JASystem::Kernel::THeap::insertChild(JASystem::Kernel::THeap*, JASystem::Kernel::THeap*, void*, unsigned long, bool) { - /* Nonmatching */ +void JASystem::Kernel::THeap::insertChild(THeap* heap, THeap* next, void* param_3, u32 param_4, bool param_5) { + JUT_ASSERT(537, heap != 0); + JUT_ASSERT(538, next == 0 || &mTree == next->mTree.getParent()); + OSLockMutex(&mMutex); + if (!param_5) { + JSUTreeIterator it; + if (!next) { + it = mTree.getLastChild(); + } else { + it = next->mTree.getPrevChild(); + } + THeap* r24 = it != mTree.getEndChild() ? it.getObject() : NULL; + if (field_0x44 == r24) { + field_0x44 = heap; + } + } + heap->mBase = (u8*)param_3; + heap->mSize = param_4; + heap->field_0x44 = NULL; + heap->mType = mType; + mTree.insertChild(&next->mTree, &heap->mTree); + OSUnlockMutex(&mMutex); } /* 8027D1FC-8027D280 .text getTailHeap__Q38JASystem6Kernel5THeapFv */ -void JASystem::Kernel::THeap::getTailHeap() { - /* Nonmatching */ +JASystem::Kernel::THeap* JASystem::Kernel::THeap::getTailHeap() { + JSUTreeIterator it; + OSLockMutex(&mMutex); + if (!field_0x44) { + it = mTree.getFirstChild(); + } else { + it = field_0x44->mTree.getNextChild(); + } + OSUnlockMutex(&mMutex); + if (it == mTree.getEndChild()) { + return NULL; + } + return it.getObject(); } /* 8027D280-8027D2E8 .text getTailOffset__Q38JASystem6Kernel5THeapFv */ -void JASystem::Kernel::THeap::getTailOffset() { - /* Nonmatching */ +u32 JASystem::Kernel::THeap::getTailOffset() { + OSLockMutex(&mMutex); + THeap* heap = getTailHeap(); + u32 offset = !heap ? mSize : heap->mBase - mBase; + OSUnlockMutex(&mMutex); + return offset; } /* 8027D2E8-8027D354 .text getCurOffset__Q38JASystem6Kernel5THeapFv */ -void JASystem::Kernel::THeap::getCurOffset() { - /* Nonmatching */ +u32 JASystem::Kernel::THeap::getCurOffset() { + OSLockMutex(&mMutex); + u32 offset = !field_0x44 ? 0 : field_0x44->mBase + field_0x44->mSize - mBase; + OSUnlockMutex(&mMutex); + return offset; } /* 8027D354-8027D370 .text __ct__Q38JASystem6Kernel10TSolidHeapFv */ JASystem::Kernel::TSolidHeap::TSolidHeap() { - /* Nonmatching */ + field_0x0 = 0; + field_0x4 = 0; + field_0x8 = 0; + field_0xc = 0; + field_0x10 = 0; } /* 8027D370-8027D40C .text alloc__Q38JASystem6Kernel10TSolidHeapFl */ -void JASystem::Kernel::TSolidHeap::alloc(long) { +int JASystem::Kernel::TSolidHeap::alloc(s32 size) { /* Nonmatching */ + u32 tmp1 = OSRoundUp32B(size); + if (field_0x0 == 0) { + OSReport("[Nas_HeapAlloc] ヒープが取得できません(ヒープ取得元存在せず)。\n"); + return 0; + } + u32 tmp2 = field_0x4; + if (tmp2 + tmp1 <= field_0x0 + field_0x8) { + field_0x4 = tmp2 + tmp1; + } else { + OSReport("[Nas_HeapAlloc] ヒープが取得できません(ヒープの取得元の残りサイズ不足)。\n"); + return 0; + } + field_0xc++; + field_0x10 = tmp2; + return tmp2; } /* 8027D40C-8027D424 .text freeAll__Q38JASystem6Kernel10TSolidHeapFv */ void JASystem::Kernel::TSolidHeap::freeAll() { - /* Nonmatching */ + field_0x4 = field_0x0; + field_0xc = 0; + field_0x10 = 0; } /* 8027D424-8027D4AC .text init__Q38JASystem6Kernel10TSolidHeapFPUcl */ -void JASystem::Kernel::TSolidHeap::init(unsigned char*, long) { - /* Nonmatching */ +void JASystem::Kernel::TSolidHeap::init(u8* param_1, s32 param_2) { + field_0xc = 0; + if (!param_1) { + OSReport("[Nas_HeapInit] アドレス0からヒープを初期化しようとしています。\n"); + field_0x8 = 0; + field_0x4 = 0; + field_0x10 = 0; + } else { + field_0x0 = OSRoundUp32B(param_1); + field_0x4 = field_0x0; + field_0x8 = param_2 - (field_0x0 - u32(param_1)); + field_0x10 = 0; + } } /* 8027D4AC-8027D4C4 .text getRemain__Q38JASystem6Kernel10TSolidHeapFv */ -void JASystem::Kernel::TSolidHeap::getRemain() { - /* Nonmatching */ +int JASystem::Kernel::TSolidHeap::getRemain() { + return field_0x8 - (field_0x4 - field_0x0); } - -/* 8027D4C4-8027D4C8 .text onDispose__Q38JASystem6Kernel9TDisposerFv */ -void JASystem::Kernel::TDisposer::onDispose() { - /* Nonmatching */ -} - diff --git a/src/JSystem/JAudio/JASSystemHeap.cpp b/src/JSystem/JAudio/JASSystemHeap.cpp index 53b46dd98..6f6daf828 100644 --- a/src/JSystem/JAudio/JASSystemHeap.cpp +++ b/src/JSystem/JAudio/JASSystemHeap.cpp @@ -3,31 +3,57 @@ // Translation Unit: JASSystemHeap.cpp // -#include "JASSystemHeap.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASSystemHeap.h" +#include "JSystem/JAudio/JASHeapCtrl.h" +#include "JSystem/JKernel/JKRSolidHeap.h" +#include "JSystem/JKernel/JKRStdHeap.h" +#include "JSystem/JUtility/JUTAssert.h" +#include "dolphin/ar/ar.h" +#include "dolphin/os/OS.h" + +u32 JASystem::Kernel::audioDramSize = 0x000C8000; +JKRSolidHeap* JASDram; /* 8027DB38-8027DB9C .text sysDramSetup__Q28JASystem6KernelFP12JKRSolidHeap */ -void JASystem::Kernel::sysDramSetup(JKRSolidHeap*) { +void JASystem::Kernel::sysDramSetup(JKRSolidHeap* heap) { /* Nonmatching */ + if (heap) { + JASDram = heap; + return; + } + OSReport("[JASKernel::sysDramSetup] メモリ指定がありませんので、システムからオーディオヒープを取得します。\n"); + JASDram = JKRSolidHeap::create(audioDramSize, JKRStdHeap::create(audioDramSize + 0x100, NULL, false), false); } /* 8027DB9C-8027DC30 .text allocFromSysDram__Q28JASystem6KernelFUl */ -void JASystem::Kernel::allocFromSysDram(unsigned long) { - /* Nonmatching */ +void* JASystem::Kernel::allocFromSysDram(u32 size) { + void* ptr; + BOOL enable = OSDisableInterrupts(); + ptr = new (JASDram, 0x20) u8[size]; + JUT_ASSERT(79, ptr != 0); + OSRestoreInterrupts(enable); + return ptr; } +JASystem::Kernel::TSolidHeap JASystem::Kernel::audioAramHeap; +u32 JASystem::Kernel::audioAramSize = 0x00400000; +int JASystem::Kernel::audioAramTop; +int JASystem::Kernel::CARD_SECURITY_BUFFER; + /* 8027DC30-8027DC84 .text sysAramSetup__Q28JASystem6KernelFUl */ -void JASystem::Kernel::sysAramSetup(unsigned long) { +void JASystem::Kernel::sysAramSetup(u32 param_1) { /* Nonmatching */ + if (!param_1) { + param_1 = audioAramSize; + } + audioAramTop = ARGetBaseAddress(); + CARD_SECURITY_BUFFER = 0x40; + audioAramHeap.init((u8*)audioAramTop, param_1 - audioAramTop); } /* 8027DC84-8027DCDC .text allocFromSysAramFull__Q28JASystem6KernelFPUl */ -void JASystem::Kernel::allocFromSysAramFull(unsigned long*) { - /* Nonmatching */ +void JASystem::Kernel::allocFromSysAramFull(u32* param_1) { + u32 size = audioAramHeap.getRemain(); + audioAramHeap.alloc(size - 0x20); + *param_1 = size - 0x20; } - -/* 8027DD18-8027DD54 .text __dt__Q38JASystem6Kernel10TSolidHeapFv */ -JASystem::Kernel::TSolidHeap::~TSolidHeap() { - /* Nonmatching */ -} - diff --git a/src/JSystem/JAudio/JASTrackInterrupt.cpp b/src/JSystem/JAudio/JASTrackInterrupt.cpp index e3840b195..7ed8ea7c0 100644 --- a/src/JSystem/JAudio/JASTrackInterrupt.cpp +++ b/src/JSystem/JAudio/JASTrackInterrupt.cpp @@ -3,36 +3,73 @@ // Translation Unit: JASTrackInterrupt.cpp // -#include "JASTrackInterrupt.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASTrackInterrupt.h" /* 80284118-80284158 .text init__Q28JASystem8TIntrMgrFv */ void JASystem::TIntrMgr::init() { - /* Nonmatching */ + field_0x0 = 1; + field_0x1 = 0; + field_0x2 = 0; + field_0x3 = 0; + field_0x4 = 0; + field_0x8 = 0; + for (int i = 0; i < 8; i++) { + field_0xc[i] = NULL; + } } /* 80284158-8028417C .text request__Q28JASystem8TIntrMgrFUl */ -void JASystem::TIntrMgr::request(unsigned long) { - /* Nonmatching */ +void JASystem::TIntrMgr::request(u32 param_1) { + if ((field_0x2 & 1 << param_1) == 0) { + return; + } + field_0x1 |= 1 << param_1; } /* 8028417C-802841A0 .text setIntr__Q28JASystem8TIntrMgrFUlPv */ -void JASystem::TIntrMgr::setIntr(unsigned long, void*) { - /* Nonmatching */ +void JASystem::TIntrMgr::setIntr(u32 param_1, void* param_2) { + field_0x2 |= 1 << param_1; + field_0xc[param_1] = param_2; } /* 802841A0-802841B8 .text resetInter__Q28JASystem8TIntrMgrFUl */ -void JASystem::TIntrMgr::resetInter(unsigned long) { +void JASystem::TIntrMgr::resetInter(u32 param_1) { /* Nonmatching */ + field_0x2 &= ~(1 << param_1); } /* 802841B8-80284224 .text checkIntr__Q28JASystem8TIntrMgrFv */ -void JASystem::TIntrMgr::checkIntr() { - /* Nonmatching */ +void* JASystem::TIntrMgr::checkIntr() { + if (field_0x0 == 0) { + return NULL; + } + u32 r4 = field_0x2 & field_0x1; + for (u32 i = 0; r4; i++) { + if (r4 & 1) { + field_0x1 &= ~(1 << i); + return field_0xc[i]; + } + r4 >>= 1; + } + return NULL; } /* 80284224-802842A8 .text timerProcess__Q28JASystem8TIntrMgrFv */ void JASystem::TIntrMgr::timerProcess() { - /* Nonmatching */ + if (field_0x4 == 0) { + return; + } + field_0x4--; + if (field_0x4 != 0) { + return; + } + request(6); + if (field_0x3) { + field_0x3--; + if (field_0x3) { + field_0x4 = field_0x8; + } + } else { + field_0x4 = field_0x8; + } } - diff --git a/src/JSystem/JAudio/JASTrackPort.cpp b/src/JSystem/JAudio/JASTrackPort.cpp index 38a7151c8..b55e5341f 100644 --- a/src/JSystem/JAudio/JASTrackPort.cpp +++ b/src/JSystem/JAudio/JASTrackPort.cpp @@ -3,31 +3,45 @@ // Translation Unit: JASTrackPort.cpp // -#include "JASTrackPort.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/JASTrackPort.h" +#include "JSystem/JUtility/JUTAssert.h" + +const u32 MAX_PORTS = 16; /* 802842A8-802842E8 .text init__Q28JASystem10TTrackPortFv */ void JASystem::TTrackPort::init() { /* Nonmatching */ + for (int i = 0; i < 16; i++) { + field_0x0[i] = 0; + field_0x10[i] = 0; + field_0x20[i] = 0; + } } /* 802842E8-8028437C .text readImport__Q28JASystem10TTrackPortFi */ -void JASystem::TTrackPort::readImport(int) { - /* Nonmatching */ +u16 JASystem::TTrackPort::readImport(int port_num) { + JUT_ASSERT(31, port_num >= 0 && port_num < MAX_PORTS); + field_0x0[port_num] = 0; + return field_0x20[port_num]; } /* 8028437C-80284414 .text readExport__Q28JASystem10TTrackPortFi */ -void JASystem::TTrackPort::readExport(int) { - /* Nonmatching */ +u16 JASystem::TTrackPort::readExport(int port_num) { + JUT_ASSERT(38, port_num >= 0 && port_num < MAX_PORTS); + field_0x10[port_num] = 0; + return field_0x20[port_num]; } /* 80284414-802844AC .text writeImport__Q28JASystem10TTrackPortFiUs */ -void JASystem::TTrackPort::writeImport(int, unsigned short) { - /* Nonmatching */ +void JASystem::TTrackPort::writeImport(int port_num, u16 value) { + JUT_ASSERT(45, port_num >= 0 && port_num < MAX_PORTS); + field_0x0[port_num] = 1; + field_0x20[port_num] = value; } /* 802844AC-80284548 .text writeExport__Q28JASystem10TTrackPortFiUs */ -void JASystem::TTrackPort::writeExport(int, unsigned short) { - /* Nonmatching */ +void JASystem::TTrackPort::writeExport(int port_num, u16 value) { + JUT_ASSERT(51, port_num >= 0 && port_num < MAX_PORTS); + field_0x10[port_num] = 1; + field_0x20[port_num] = value; } - diff --git a/src/JSystem/JAudio/dspproc.c b/src/JSystem/JAudio/dspproc.c index 514aafecc..f24ed73ea 100644 --- a/src/JSystem/JAudio/dspproc.c +++ b/src/JSystem/JAudio/dspproc.c @@ -3,46 +3,80 @@ // Translation Unit: dspproc.c // -#include "dspproc.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/dspproc.h" +#include "JSystem/JAudio/JASDSPInterface.h" +#include "JSystem/JAudio/dsptask.h" +#include "dolphin/dsp.h" /* 8028E600-8028E648 .text DSPReleaseHalt2__FUl */ -void DSPReleaseHalt2(unsigned long) { - /* Nonmatching */ +void DSPReleaseHalt2(u32 msg) { + u32 msgs[2]; + u16 dspMap = DSP_CreateMap2(msg); + msgs[0] = (msg << 16) | dspMap; + + DSPSendCommands2(msgs, 0, NULL); } /* 8028E660-8028E694 .text DSPReleaseHalt__Fv */ void DSPReleaseHalt() { - /* Nonmatching */ + u32 msgs[2]; + msgs[0] = 0x30000; + DSPSendCommands2(msgs, 0, NULL); } +static volatile BOOL flag; + /* 8028E6A0-8028E6AC .text setup_callback__FUs */ -void setup_callback(unsigned short) { - /* Nonmatching */ +void setup_callback(u16) { + flag = 0; } /* 8028E6C0-8028E724 .text DsetupTable__FUlUlUlUlUl */ -void DsetupTable(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long) { - /* Nonmatching */ +void DsetupTable(u32 param_1, u32 param_2, u32 param_3, u32 param_4, u32 param_5) { + u32 table[5]; + table[0] = (param_1 & 0xFFFF) | 0x81000000; + table[1] = param_2; + table[2] = param_3; + table[3] = param_4; + table[4] = param_5; + flag = 1; + DSPSendCommands2(table,5,setup_callback); + while (true) { + if (flag == 0) { + return; + } + } } +static u16 DSP_MIXERLEVEL = 0x4000; + /* 8028E740-8028E764 .text DsetMixerLevel__Ff */ -void DsetMixerLevel(float) { - /* Nonmatching */ +void DsetMixerLevel(f32 level) { + DSP_MIXERLEVEL = 4096.0f * level; } /* 8028E780-8028E7C8 .text DsyncFrame__FUlUlUl */ -void DsyncFrame(unsigned long, unsigned long, unsigned long) { - /* Nonmatching */ +void DsyncFrame(u32 param_1, u32 param_2, u32 param_3) { + u32 msgs[3]; + msgs[0] = (param_1 & 0xff) << 0x10 | 0x82000000 | DSP_MIXERLEVEL; + msgs[1] = param_2; + msgs[2] = param_3; + DSPSendCommands2(msgs, 3, 0); } +static volatile BOOL d_waitflag; + /* 8028E7E0-8028E7EC .text dummy_callback__FUs */ -void dummy_callback(unsigned short) { - /* Nonmatching */ +void dummy_callback(u16) { + d_waitflag = 0; } /* 8028E800-8028E854 .text DsetDolbyDelay__FUlUs */ -void DsetDolbyDelay(unsigned long, unsigned short) { - /* Nonmatching */ +void DsetDolbyDelay(u32 param_1, u16 param_2) { + u32 msgs[2]; + msgs[0] = param_2 | 0x8D000000; + msgs[1] = param_1; + d_waitflag = 1; + DSPSendCommands2(msgs, 2, dummy_callback); + while (d_waitflag) {} } - diff --git a/src/JSystem/JAudio/dsptask.c b/src/JSystem/JAudio/dsptask.c index 4f91e78a1..fa9bd5c97 100644 --- a/src/JSystem/JAudio/dsptask.c +++ b/src/JSystem/JAudio/dsptask.c @@ -3,36 +3,588 @@ // Translation Unit: dsptask.c // -#include "dsptask.h" +#include "JSystem/JAudio/dsptask.h" +#include "JSystem/JAudio/osdsp.h" +#include "JSystem/JAudio/osdsp_task.h" +#include "dolphin/dsp.h" #include "dolphin/types.h" /* 8028E860-8028E898 .text DspHandShake__FPv */ void DspHandShake(void*) { /* Nonmatching */ + while (DSPCheckMailFromDSP() == 0) {} + DSPReadMailFromDSP(); + DSPCheckMailFromDSP(); + Dsp_Running_Start(); } +static u8 jdsp[] = { + 0x02, 0x9F, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, + 0x02, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02, 0xFF, 0x00, 0x00, 0x02, 0x9F, 0x05, 0xB8, + 0x02, 0x9F, 0x00, 0x4E, 0x12, 0x05, 0x02, 0xBF, 0x00, 0x57, 0x81, 0x00, 0x00, 0x9F, 0x10, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x5F, 0x1B, 0x1E, 0x02, 0xBF, 0x06, 0x88, 0x02, 0xBF, 0x04, 0xC0, + 0x02, 0xBF, 0x0E, 0x14, 0x0E, 0x00, 0x02, 0xBF, 0x06, 0x6A, 0x00, 0x9E, 0x11, 0x11, 0x02, 0xBF, + 0x06, 0x74, 0x0E, 0x00, 0x00, 0xFE, 0x03, 0x4E, 0x13, 0x05, 0x02, 0x9F, 0x06, 0xC5, 0x00, 0xDF, + 0x03, 0x57, 0x00, 0xFF, 0x03, 0x45, 0x00, 0xDE, 0x03, 0x56, 0x1F, 0xFE, 0x03, 0x40, 0x00, 0xFF, + 0x00, 0xFF, 0x03, 0x44, 0x14, 0x79, 0x02, 0x40, 0x00, 0x7E, 0x00, 0xFE, 0x03, 0x43, 0x02, 0x00, + 0x00, 0x75, 0x1C, 0x1E, 0x17, 0x0F, 0x00, 0x92, 0x00, 0xFF, 0x0E, 0x04, 0x02, 0xBF, 0x06, 0x6A, + 0x00, 0xDE, 0x03, 0x56, 0x02, 0xBF, 0x06, 0x74, 0x02, 0x9F, 0x00, 0x2D, 0x12, 0x05, 0x02, 0xBF, + 0x00, 0x57, 0x0E, 0x01, 0x02, 0xBF, 0x06, 0x6A, 0x13, 0x05, 0x02, 0x9F, 0x00, 0x2D, 0x12, 0x02, + 0x12, 0x03, 0x12, 0x04, 0x13, 0x06, 0x8E, 0x00, 0x8C, 0x00, 0x8B, 0x00, 0x00, 0x9E, 0xFF, 0xFF, + 0x1D, 0x1E, 0x1D, 0x3E, 0x1D, 0x5E, 0x1D, 0x7E, 0x00, 0x92, 0x00, 0xFF, 0x02, 0xDF, 0x00, 0x90, + 0x00, 0x00, 0x0C, 0x00, 0x00, 0x81, 0x03, 0x58, 0x00, 0x7E, 0x00, 0x71, 0x19, 0x3E, 0x1B, 0x1E, + 0x19, 0x3E, 0x1B, 0x1E, 0x02, 0xDF, 0x02, 0x9F, 0x00, 0x43, 0x02, 0x9F, 0x00, 0x43, 0x02, 0x9F, + 0x00, 0x95, 0x02, 0x9F, 0x02, 0x43, 0x02, 0x9F, 0x00, 0x73, 0x02, 0x9F, 0x05, 0x80, 0x02, 0x9F, + 0x05, 0x92, 0x02, 0x9F, 0x04, 0x69, 0x02, 0x9F, 0x04, 0x1D, 0x02, 0x9F, 0x04, 0x85, 0x02, 0x9F, + 0x04, 0x4D, 0x02, 0x9F, 0x00, 0x43, 0x02, 0x9F, 0x00, 0x43, 0x02, 0x9F, 0x00, 0x43, 0x02, 0x9F, + 0x00, 0xB2, 0x02, 0x9F, 0x00, 0x43, 0x02, 0x9F, 0x00, 0x43, 0x00, 0x80, 0x03, 0x80, 0x0E, 0x04, + 0x02, 0xBF, 0x00, 0x67, 0x00, 0x81, 0x03, 0x82, 0x00, 0x9F, 0x00, 0x00, 0x00, 0x80, 0x02, 0x80, + 0x02, 0xBF, 0x05, 0x23, 0x00, 0x81, 0x03, 0x84, 0x00, 0x9F, 0x03, 0x00, 0x00, 0x80, 0x00, 0x20, + 0x02, 0xBF, 0x05, 0x23, 0x00, 0xDE, 0x03, 0x45, 0x00, 0xFE, 0x03, 0x42, 0x02, 0xBF, 0x0B, 0xEC, + 0x02, 0x9F, 0x00, 0x43, 0x00, 0x80, 0x03, 0x74, 0x0E, 0x01, 0x00, 0xFE, 0x03, 0x77, 0x00, 0xFE, + 0x03, 0x7C, 0x02, 0xBF, 0x00, 0x67, 0x00, 0xDE, 0x03, 0x45, 0x00, 0xFE, 0x03, 0x76, 0x02, 0x9F, + 0x00, 0x43, 0x00, 0x81, 0x03, 0x4C, 0x00, 0x9F, 0x04, 0x00, 0x00, 0x80, 0x00, 0xC0, 0x02, 0xBF, + 0x05, 0x23, 0x02, 0xDF, 0x00, 0x81, 0x03, 0x4C, 0x00, 0x9F, 0x04, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x81, 0x03, 0x4C, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x98, 0x00, 0x00, 0x70, 0x00, 0x02, 0xBF, + 0x05, 0x32, 0x02, 0xDF, 0x19, 0x1E, 0x19, 0x1A, 0x00, 0x5F, 0x64, 0xA0, 0x1B, 0x7E, 0x1B, 0x7A, + 0x02, 0xDF, 0x19, 0x1E, 0x19, 0x1A, 0x00, 0x7F, 0x00, 0xE8, 0x32, 0xB2, 0x65, 0xA0, 0x33, 0xBA, + 0x64, 0xA1, 0x00, 0x00, 0x02, 0xDF, 0x8A, 0x00, 0x15, 0x7F, 0x1C, 0x20, 0x1C, 0x03, 0x19, 0x3A, + 0x90, 0x51, 0x92, 0x5B, 0x00, 0x7F, 0x00, 0xF7, 0x46, 0x51, 0x92, 0xB2, 0x46, 0x51, 0x92, 0xB2, + 0x8B, 0x00, 0x02, 0xDF, 0x8A, 0x00, 0x19, 0x1A, 0x90, 0x50, 0x92, 0x50, 0x00, 0x5F, 0x92, 0xA0, + 0x8B, 0x00, 0x02, 0xDF, 0x81, 0x00, 0x89, 0x00, 0x0E, 0x50, 0x00, 0x80, 0x0D, 0x00, 0x00, 0x5E, + 0x1B, 0x1F, 0x00, 0x80, 0x0D, 0x60, 0x00, 0x5E, 0x1B, 0x1F, 0x02, 0xBF, 0x0E, 0x3F, 0x81, 0x00, + 0x89, 0x00, 0x0E, 0x50, 0x00, 0x80, 0x0C, 0xA0, 0x00, 0x5E, 0x1B, 0x1F, 0x00, 0x80, 0x0F, 0x40, + 0x00, 0x5E, 0x1B, 0x1F, 0x00, 0x80, 0x0F, 0xA0, 0x00, 0x5E, 0x1B, 0x1F, 0x00, 0x80, 0x0A, 0x00, + 0x00, 0x5E, 0x1B, 0x1F, 0x00, 0x80, 0x09, 0xA0, 0x00, 0x5E, 0x1B, 0x1F, 0x02, 0xDF, 0x00, 0xC0, + 0x03, 0xA0, 0x19, 0x1A, 0x00, 0xDF, 0x03, 0xA1, 0x00, 0x9B, 0x00, 0xA0, 0x00, 0x81, 0x03, 0x93, + 0x18, 0xBC, 0xB8, 0x71, 0xBC, 0x00, 0x00, 0x80, 0x00, 0x50, 0x05, 0x08, 0x02, 0xBF, 0x05, 0x25, + 0x00, 0xDE, 0x03, 0x90, 0x02, 0xA0, 0x00, 0x01, 0x02, 0x9D, 0x01, 0x45, 0x00, 0x80, 0x03, 0x98, + 0x0E, 0x08, 0x00, 0xC1, 0x03, 0xA1, 0x02, 0xBF, 0x0B, 0x2E, 0x0F, 0x50, 0x00, 0xC0, 0x03, 0xA1, + 0x00, 0xDA, 0x03, 0x94, 0x86, 0x00, 0x02, 0x95, 0x01, 0x52, 0x1C, 0x7A, 0x00, 0xD8, 0x03, 0x95, + 0x02, 0xBF, 0x00, 0xEB, 0x0F, 0x50, 0x00, 0xC0, 0x03, 0xA1, 0x00, 0xDA, 0x03, 0x96, 0x86, 0x00, + 0x02, 0x95, 0x01, 0x5F, 0x1C, 0x7A, 0x00, 0xD8, 0x03, 0x97, 0x02, 0xBF, 0x00, 0xEB, 0x00, 0xDE, + 0x03, 0x90, 0x02, 0xA0, 0x00, 0x02, 0x02, 0xDD, 0x00, 0x80, 0x03, 0x98, 0x0E, 0x08, 0x00, 0xC1, + 0x03, 0xA1, 0x02, 0xBF, 0x0B, 0x2E, 0x02, 0xDF, 0x89, 0x00, 0x00, 0x9F, 0x0D, 0xC0, 0x00, 0xFF, + 0x03, 0xA1, 0x00, 0x9F, 0x03, 0xA8, 0x00, 0xFF, 0x03, 0xA2, 0x00, 0x9F, 0x03, 0xA4, 0x00, 0xFF, + 0x03, 0xA0, 0x11, 0x04, 0x01, 0x9F, 0x00, 0xC0, 0x03, 0xA2, 0x00, 0x83, 0x03, 0x90, 0x0F, 0x0E, + 0x02, 0xBF, 0x00, 0xDA, 0x00, 0xDA, 0x03, 0x90, 0x86, 0x00, 0x02, 0x95, 0x01, 0x91, 0x00, 0xDF, + 0x03, 0xA1, 0x1C, 0x7F, 0x05, 0x50, 0x1C, 0x1F, 0x0F, 0x06, 0x02, 0xBF, 0x00, 0xDA, 0x02, 0xBF, + 0x01, 0x27, 0x00, 0xDE, 0x03, 0xA2, 0x04, 0x10, 0x00, 0xFE, 0x03, 0xA2, 0x00, 0xDE, 0x03, 0xA1, + 0x04, 0x60, 0x00, 0xFE, 0x03, 0xA1, 0x00, 0xDE, 0x03, 0xA0, 0x74, 0x00, 0x00, 0xFE, 0x03, 0xA0, + 0x0F, 0x50, 0x00, 0x80, 0x0C, 0x00, 0x00, 0x83, 0x0E, 0x80, 0x00, 0x98, 0x7F, 0xFF, 0x02, 0xBF, + 0x00, 0xEB, 0x0F, 0x50, 0x00, 0x80, 0x0C, 0x00, 0x00, 0x83, 0x0E, 0xE0, 0x00, 0x98, 0xB8, 0x20, + 0x02, 0xBF, 0x00, 0xEB, 0x0F, 0x28, 0x00, 0x80, 0x0C, 0x78, 0x00, 0x83, 0x0E, 0x80, 0x00, 0x98, + 0xB8, 0x20, 0x02, 0xBF, 0x00, 0xEB, 0x0F, 0x28, 0x00, 0x80, 0x0C, 0x78, 0x00, 0x83, 0x0E, 0xE0, + 0x00, 0x98, 0x7F, 0xFF, 0x02, 0xBF, 0x00, 0xEB, 0x81, 0x00, 0x89, 0x00, 0x0E, 0x50, 0x00, 0x80, + 0x0C, 0x00, 0x00, 0x5E, 0x1B, 0x1F, 0x00, 0x80, 0x0C, 0x50, 0x00, 0x5E, 0x1B, 0x1F, 0x02, 0xDF, + 0x00, 0xC0, 0x03, 0xA0, 0x18, 0x1A, 0x81, 0x00, 0x18, 0x1E, 0x00, 0xDB, 0x03, 0x91, 0x74, 0x00, + 0xD1, 0x00, 0x02, 0x70, 0x81, 0x00, 0x1B, 0x1E, 0x00, 0xDF, 0x03, 0xA1, 0x00, 0x9B, 0x00, 0xA0, + 0x00, 0x81, 0x03, 0x93, 0x18, 0xBC, 0xB8, 0x71, 0xBC, 0x00, 0x00, 0x80, 0x00, 0x50, 0x02, 0xBF, + 0x05, 0x32, 0x02, 0xDF, 0x89, 0x00, 0x0F, 0x28, 0x00, 0x80, 0x0C, 0x50, 0x00, 0x83, 0x0E, 0xA8, + 0x00, 0x98, 0xB8, 0x20, 0x02, 0xBF, 0x00, 0xEB, 0x89, 0x00, 0x0F, 0x28, 0x00, 0x80, 0x0C, 0x50, + 0x00, 0x83, 0x0F, 0x08, 0x00, 0x98, 0x7F, 0xFF, 0x02, 0xBF, 0x00, 0xEB, 0x00, 0x9F, 0x0D, 0xC0, + 0x00, 0xFF, 0x03, 0xA1, 0x00, 0x9F, 0x03, 0xA8, 0x00, 0xFF, 0x03, 0xA2, 0x00, 0x9F, 0x03, 0xA4, + 0x00, 0xFF, 0x03, 0xA0, 0x11, 0x04, 0x02, 0x28, 0x00, 0xC0, 0x03, 0xA2, 0x00, 0x83, 0x03, 0x90, + 0x0F, 0x0E, 0x02, 0xBF, 0x00, 0xDA, 0x00, 0xDA, 0x03, 0x90, 0x86, 0x00, 0x02, 0x95, 0x02, 0x1A, + 0x02, 0xBF, 0x01, 0xD0, 0x00, 0xDE, 0x03, 0xA2, 0x04, 0x10, 0x00, 0xFE, 0x03, 0xA2, 0x00, 0xDE, + 0x03, 0xA1, 0x04, 0x60, 0x00, 0xFE, 0x03, 0xA1, 0x00, 0xDE, 0x03, 0xA0, 0x74, 0x00, 0x00, 0xFE, + 0x03, 0xA0, 0x02, 0xDF, 0x00, 0x81, 0x03, 0x86, 0x00, 0x9F, 0x03, 0xA8, 0x00, 0x80, 0x00, 0x40, + 0x02, 0xBF, 0x05, 0x23, 0x02, 0xDF, 0x19, 0x1E, 0x18, 0x9C, 0x48, 0x00, 0x1B, 0x1E, 0x1B, 0x1C, + 0x02, 0xDF, 0x81, 0x00, 0x89, 0x00, 0x00, 0xDF, 0x03, 0x54, 0x00, 0xDE, 0x03, 0x4E, 0x82, 0x00, + 0x02, 0x93, 0x02, 0x39, 0x02, 0xDF, 0x00, 0x80, 0x03, 0x88, 0x00, 0x81, 0x00, 0x67, 0x0E, 0x02, + 0x17, 0x3F, 0x00, 0xDE, 0x03, 0x44, 0x00, 0xFE, 0x03, 0x41, 0x00, 0xDE, 0x03, 0x45, 0x00, 0xFE, + 0x03, 0x8E, 0x81, 0x00, 0x00, 0xFE, 0x03, 0x55, 0x02, 0xBF, 0x02, 0x2A, 0x02, 0xBF, 0x05, 0xA4, + 0x00, 0xDE, 0x03, 0x41, 0x00, 0x7E, 0x04, 0x18, 0x02, 0xBF, 0x01, 0x02, 0x02, 0xBF, 0x01, 0x6C, + 0x02, 0xBF, 0x09, 0x5F, 0x00, 0xDE, 0x03, 0x55, 0x74, 0x00, 0x00, 0xFE, 0x03, 0x55, 0x81, 0x00, + 0x00, 0xFE, 0x03, 0x54, 0x00, 0xDE, 0x03, 0x42, 0x00, 0x7E, 0x03, 0xC0, 0x02, 0xBF, 0x02, 0x39, + 0x81, 0x00, 0x89, 0x00, 0x00, 0xDE, 0x03, 0x54, 0x14, 0x7C, 0x02, 0x00, 0x04, 0xFC, 0x1C, 0x1E, + 0x18, 0x1F, 0x00, 0xDE, 0x03, 0x54, 0x02, 0x40, 0x00, 0x0F, 0x3D, 0x80, 0x03, 0xC0, 0x80, 0x00, + 0x02, 0x9C, 0x03, 0xBC, 0x00, 0xD8, 0x03, 0x54, 0x00, 0x9A, 0x01, 0x80, 0x81, 0x00, 0x00, 0xDE, + 0x03, 0x80, 0x00, 0xDC, 0x03, 0x81, 0x90, 0x00, 0x94, 0x00, 0x00, 0xFE, 0x03, 0x4C, 0x00, 0xFC, + 0x03, 0x4D, 0x02, 0xBF, 0x00, 0xC1, 0x00, 0xDA, 0x04, 0x00, 0x86, 0x00, 0x02, 0x95, 0x03, 0xBC, + 0x00, 0xDA, 0x04, 0x01, 0x86, 0x00, 0x02, 0x94, 0x03, 0xBC, 0x00, 0xDA, 0x04, 0x33, 0x00, 0xFA, + 0x03, 0xF8, 0x00, 0xDA, 0x04, 0x06, 0x86, 0x00, 0x02, 0x94, 0x0D, 0xFF, 0x81, 0x00, 0x00, 0xDE, + 0x04, 0x80, 0x06, 0x09, 0x02, 0x95, 0x02, 0xBD, 0x06, 0x05, 0x02, 0x95, 0x02, 0xBD, 0x06, 0x08, + 0x02, 0x95, 0x09, 0x8F, 0x06, 0x10, 0x02, 0x95, 0x0A, 0x14, 0x06, 0x20, 0x02, 0x95, 0x0A, 0x9A, + 0x06, 0x21, 0x02, 0x95, 0x0A, 0xA2, 0x02, 0x9F, 0x08, 0x7C, 0x00, 0xD8, 0x04, 0x02, 0x81, 0x00, + 0x89, 0x00, 0x00, 0xDC, 0x04, 0x30, 0x8D, 0x00, 0x09, 0x50, 0xA0, 0x00, 0xA4, 0x00, 0x14, 0x04, + 0x8C, 0x00, 0x1F, 0xFE, 0x00, 0x83, 0x05, 0x80, 0x02, 0xBF, 0x07, 0x3D, 0x02, 0x9F, 0x02, 0xD0, + 0x00, 0x80, 0x05, 0x80, 0x00, 0x81, 0x05, 0x20, 0x00, 0x99, 0x00, 0x00, 0x02, 0xBF, 0x0D, 0x7F, + 0x00, 0xDA, 0x04, 0xA8, 0x86, 0x00, 0x02, 0x95, 0x02, 0xE1, 0x00, 0x80, 0x05, 0x20, 0x02, 0xBF, + 0x0C, 0x84, 0x00, 0x9E, 0x05, 0x20, 0x00, 0xFE, 0x03, 0x8F, 0x89, 0x00, 0x00, 0xDF, 0x04, 0x84, + 0x03, 0x40, 0x00, 0x1F, 0xB9, 0x00, 0x02, 0x95, 0x03, 0x11, 0x00, 0xDE, 0x03, 0x8F, 0x5C, 0x00, + 0x00, 0xFE, 0x03, 0x8F, 0x1C, 0x7E, 0x00, 0x80, 0x04, 0x40, 0x05, 0xFE, 0x02, 0xBF, 0x00, 0xDA, + 0x00, 0x80, 0x04, 0x90, 0x00, 0xC1, 0x03, 0x8F, 0x89, 0x00, 0x00, 0xDF, 0x04, 0x84, 0x03, 0x40, + 0x00, 0x1F, 0x02, 0xBF, 0x0B, 0x4D, 0x00, 0xDE, 0x03, 0x8F, 0x04, 0x50, 0x1C, 0x1E, 0x00, 0x83, + 0x04, 0x40, 0x89, 0x00, 0x00, 0xDF, 0x04, 0x84, 0x03, 0x40, 0x00, 0x1F, 0x05, 0xFE, 0x02, 0xBF, + 0x00, 0xDA, 0x00, 0xDE, 0x04, 0x84, 0x02, 0x40, 0x00, 0x20, 0x02, 0x95, 0x03, 0x33, 0x00, 0x80, + 0x04, 0xA4, 0x00, 0xC1, 0x03, 0x8F, 0x00, 0x82, 0x04, 0x54, 0x00, 0x83, 0x04, 0xA7, 0x18, 0xFA, + 0x86, 0x00, 0x02, 0x94, 0x03, 0x31, 0x18, 0xFA, 0x86, 0x00, 0x02, 0x94, 0x03, 0x31, 0x18, 0xFA, + 0x86, 0x00, 0x02, 0x94, 0x03, 0x31, 0x81, 0x00, 0x18, 0xFE, 0x02, 0x80, 0x7F, 0xFF, 0x02, 0x95, + 0x03, 0x33, 0x02, 0xBF, 0x0B, 0x68, 0x81, 0x00, 0x00, 0xDE, 0x04, 0x2C, 0xB1, 0x00, 0x02, 0x95, + 0x03, 0x3D, 0x02, 0xBF, 0x0C, 0xD3, 0x02, 0x9F, 0x03, 0xB2, 0x81, 0x00, 0x1C, 0x9E, 0x1C, 0xDE, + 0x74, 0x00, 0x1C, 0xFE, 0x81, 0x00, 0x00, 0xDE, 0x04, 0x07, 0xB1, 0x00, 0x02, 0x95, 0x03, 0x55, + 0x00, 0xC3, 0x03, 0x8F, 0x00, 0x07, 0x00, 0x80, 0x04, 0x77, 0x00, 0x84, 0xFF, 0xFF, 0x00, 0x87, + 0xFF, 0xFF, 0x19, 0x9A, 0x65, 0x54, 0x00, 0x5E, 0x65, 0xAD, 0x00, 0xDA, 0x04, 0x85, 0x86, 0x00, + 0x02, 0x95, 0x03, 0x6B, 0x89, 0x00, 0x00, 0x86, 0x00, 0x05, 0x00, 0x82, 0x04, 0x0A, 0x11, 0x06, + 0x03, 0x63, 0x18, 0xDE, 0x14, 0x7F, 0x4D, 0x36, 0xB9, 0x00, 0x02, 0x94, 0x03, 0x6B, 0x00, 0x9A, + 0x00, 0x01, 0x00, 0xFA, 0x04, 0x01, 0x8F, 0x00, 0x00, 0x86, 0x00, 0x02, 0x00, 0x82, 0x04, 0x08, + 0x11, 0x06, 0x03, 0x9B, 0x81, 0x00, 0x19, 0x5E, 0x12, 0x00, 0xB1, 0x00, 0x02, 0x75, 0x13, 0x00, + 0x1C, 0x7E, 0x19, 0x5E, 0x19, 0x5F, 0x5C, 0x00, 0x14, 0xFB, 0x1F, 0x5E, 0x1F, 0x1C, 0x18, 0x5E, + 0x02, 0x40, 0x00, 0xFF, 0x1F, 0x7E, 0x18, 0x5E, 0x14, 0x78, 0x00, 0x9C, 0x00, 0x00, 0xD1, 0x00, + 0x02, 0x95, 0x03, 0x90, 0x18, 0x5E, 0x02, 0x72, 0x74, 0x00, 0x02, 0x71, 0x78, 0x00, 0x1A, 0x5E, + 0x00, 0x06, 0x00, 0xDE, 0x03, 0x8F, 0x56, 0x00, 0x02, 0x9D, 0x03, 0x99, 0x1C, 0x1E, 0x02, 0xBF, + 0x0C, 0xA9, 0x00, 0x00, 0x1B, 0x5F, 0x00, 0x0A, 0x8E, 0x00, 0x81, 0x00, 0x00, 0xDE, 0x04, 0x07, + 0xB1, 0x00, 0x02, 0x95, 0x03, 0xB2, 0x00, 0xC3, 0x03, 0x8F, 0x00, 0x87, 0x00, 0x4F, 0x00, 0x1F, + 0x00, 0x80, 0x04, 0x77, 0x00, 0x84, 0xFF, 0xFF, 0x00, 0x87, 0xFF, 0xFF, 0x19, 0xFA, 0x65, 0x57, + 0x00, 0x5E, 0x65, 0xAF, 0x00, 0xDA, 0x04, 0x06, 0x86, 0x00, 0x02, 0x94, 0x03, 0xBA, 0x81, 0x00, + 0x00, 0xFE, 0x04, 0x04, 0x02, 0xBF, 0x00, 0xCA, 0x00, 0xDE, 0x03, 0x54, 0x74, 0x00, 0x00, 0xFE, + 0x03, 0x54, 0x0E, 0x00, 0x00, 0xFE, 0x03, 0x4E, 0x0E, 0x04, 0x02, 0xBF, 0x06, 0x6A, 0x00, 0xDE, + 0x03, 0x55, 0x02, 0x60, 0xFF, 0x00, 0x02, 0xBF, 0x06, 0x74, 0x02, 0xBF, 0x0C, 0x0A, 0x02, 0xBF, + 0x0C, 0x1C, 0x02, 0xBF, 0x0C, 0x71, 0x00, 0xDE, 0x03, 0x41, 0x78, 0x00, 0x00, 0xFE, 0x03, 0x41, + 0x00, 0x80, 0x09, 0xA0, 0x00, 0x83, 0x0D, 0x00, 0x0F, 0x50, 0x00, 0x98, 0x5A, 0x82, 0x02, 0xBF, + 0x00, 0xEB, 0x00, 0x80, 0x09, 0xA0, 0x00, 0x83, 0x0D, 0x60, 0x0F, 0x50, 0x02, 0xBF, 0x00, 0xEB, + 0x00, 0x83, 0x0D, 0x00, 0x02, 0xBF, 0x0C, 0xC1, 0x00, 0x81, 0x03, 0x88, 0x00, 0x9F, 0x0D, 0x00, + 0x00, 0x80, 0x00, 0x50, 0x02, 0xBF, 0x05, 0x30, 0x00, 0x80, 0x0F, 0xA0, 0x00, 0x83, 0x0D, 0x60, + 0x0F, 0x50, 0x00, 0x98, 0x80, 0x00, 0x02, 0xBF, 0x00, 0xEB, 0x00, 0x83, 0x0D, 0x60, 0x02, 0xBF, + 0x0C, 0xC1, 0x00, 0x81, 0x03, 0x8A, 0x00, 0x9F, 0x0D, 0x60, 0x00, 0x80, 0x00, 0x50, 0x02, 0xBF, + 0x05, 0x30, 0x00, 0x9A, 0x00, 0x00, 0x00, 0x98, 0x00, 0xA0, 0x00, 0x80, 0x03, 0x88, 0x02, 0xBF, + 0x02, 0x33, 0x00, 0x80, 0x03, 0x8A, 0x02, 0xBF, 0x02, 0x33, 0x02, 0xBF, 0x01, 0xEA, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x2D, 0x02, 0x9F, 0x06, 0x03, 0x00, 0x80, 0x03, 0x46, 0x02, 0xBF, + 0x00, 0x67, 0x02, 0xBF, 0x00, 0x67, 0x00, 0x81, 0x03, 0x46, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x9F, + 0x04, 0x00, 0x00, 0xC0, 0x03, 0x45, 0x02, 0xBF, 0x05, 0x25, 0x00, 0x81, 0x03, 0x48, 0x19, 0x3E, + 0x19, 0x3C, 0x00, 0x9F, 0x08, 0x00, 0x00, 0xC0, 0x03, 0x45, 0x02, 0xBF, 0x05, 0x25, 0x00, 0x81, + 0x03, 0x46, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x9F, 0x08, 0x00, 0x00, 0xC0, 0x03, 0x45, 0x02, 0xBF, + 0x05, 0x32, 0x00, 0x81, 0x03, 0x48, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x9F, 0x04, 0x00, 0x00, 0xC0, + 0x03, 0x45, 0x02, 0xBF, 0x05, 0x32, 0x02, 0x9F, 0x00, 0x43, 0x00, 0x80, 0x03, 0x46, 0x02, 0xBF, + 0x00, 0x67, 0x02, 0xBF, 0x00, 0x67, 0x00, 0x81, 0x03, 0x46, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x9F, + 0x04, 0x00, 0x00, 0xC0, 0x03, 0x45, 0x02, 0xBF, 0x05, 0x25, 0x00, 0x81, 0x03, 0x48, 0x19, 0x3E, + 0x19, 0x3C, 0x00, 0x9F, 0x04, 0x00, 0x00, 0xC0, 0x03, 0x45, 0x02, 0xBF, 0x05, 0x32, 0x02, 0x9F, + 0x00, 0x43, 0x00, 0x80, 0x03, 0x46, 0x02, 0xBF, 0x00, 0x67, 0x02, 0xBF, 0x00, 0x67, 0x00, 0x81, + 0x03, 0x46, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x9F, 0x04, 0x00, 0x00, 0xC0, 0x03, 0x45, 0x02, 0xBF, + 0x05, 0x55, 0x00, 0x81, 0x03, 0x48, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x9F, 0x04, 0x00, 0x00, 0xC0, + 0x03, 0x45, 0x02, 0xBF, 0x05, 0x32, 0x02, 0x9F, 0x00, 0x43, 0x00, 0x80, 0x03, 0x46, 0x02, 0xBF, + 0x00, 0x67, 0x02, 0xBF, 0x00, 0x67, 0x00, 0x81, 0x03, 0x46, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x9F, + 0x04, 0x00, 0x00, 0xC0, 0x03, 0x44, 0x02, 0xBF, 0x05, 0x25, 0x00, 0x81, 0x03, 0x48, 0x19, 0x3E, + 0x19, 0x3C, 0x00, 0x9F, 0x08, 0x00, 0x00, 0xC0, 0x03, 0x44, 0x02, 0xBF, 0x05, 0x25, 0x00, 0x80, + 0x04, 0x00, 0x00, 0x83, 0x08, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, 0xDA, 0x03, 0x45, 0x00, 0xDF, + 0x03, 0x44, 0x8F, 0x00, 0x19, 0x7B, 0xB8, 0x00, 0x19, 0x7B, 0x00, 0x7F, 0x04, 0xB2, 0x19, 0x9E, + 0xBC, 0x00, 0x80, 0xB2, 0x00, 0x00, 0x8E, 0x00, 0x00, 0x81, 0x03, 0x46, 0x19, 0x3E, 0x19, 0x3C, + 0x00, 0x9F, 0x04, 0x00, 0x00, 0xC0, 0x03, 0x44, 0x02, 0xBF, 0x05, 0x32, 0x02, 0x9F, 0x00, 0x43, + 0x00, 0x92, 0x00, 0xFF, 0x81, 0x00, 0x00, 0x80, 0x0B, 0x00, 0x10, 0xFF, 0x1B, 0x1E, 0x1B, 0x1E, + 0x81, 0x00, 0x00, 0x9F, 0x0B, 0x00, 0x00, 0x80, 0x01, 0x00, 0x02, 0xBF, 0x05, 0x73, 0x02, 0xDF, + 0x02, 0xBF, 0x04, 0xE1, 0x00, 0xDF, 0x04, 0xFB, 0x00, 0x9E, 0x0B, 0x00, 0x4C, 0x00, 0x1C, 0x1E, + 0x18, 0x1E, 0x74, 0x00, 0x1A, 0x1E, 0x02, 0xBF, 0x04, 0xEA, 0x81, 0x00, 0x00, 0xFE, 0x04, 0xFB, + 0x02, 0xDF, 0x00, 0x92, 0x00, 0xFF, 0x81, 0x00, 0x00, 0x9F, 0x0B, 0x00, 0x00, 0x80, 0x00, 0x40, + 0x02, 0x9F, 0x05, 0x55, 0x81, 0x00, 0x00, 0x9F, 0x0B, 0x00, 0x00, 0x80, 0x00, 0x50, 0x02, 0x9F, + 0x05, 0x73, 0x02, 0xBF, 0x04, 0xE1, 0x89, 0x00, 0x00, 0x80, 0x04, 0xFC, 0x81, 0x00, 0x11, 0x04, + 0x05, 0x05, 0x00, 0x00, 0x19, 0x1E, 0x00, 0x00, 0x11, 0x10, 0x05, 0x03, 0x02, 0xC0, 0x00, 0x01, + 0x02, 0x7D, 0x75, 0x00, 0x14, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0x04, 0xFC, + 0x00, 0xFE, 0x0B, 0x48, 0x00, 0xDE, 0x04, 0xFD, 0x00, 0xFE, 0x0B, 0x49, 0x00, 0xDE, 0x04, 0xFE, + 0x00, 0xFE, 0x0B, 0x4A, 0x00, 0xDE, 0x04, 0xFF, 0x00, 0xFE, 0x0B, 0x4B, 0x00, 0x9E, 0x0B, 0x00, + 0x4C, 0x00, 0x1C, 0x1E, 0x18, 0x1E, 0x74, 0x00, 0x1A, 0x1E, 0x02, 0xBF, 0x04, 0xEA, 0x02, 0xDF, + 0x02, 0xBF, 0x04, 0xEA, 0x02, 0xDF, 0x19, 0x3E, 0x19, 0x3C, 0x2F, 0xCD, 0x0F, 0x00, 0x2F, 0xC9, + 0x2E, 0xCE, 0x2C, 0xCF, 0x1F, 0xE0, 0x15, 0x01, 0x2F, 0xCB, 0x02, 0xBF, 0x05, 0x36, 0x02, 0xDF, + 0x19, 0x3E, 0x19, 0x3C, 0x2F, 0xCD, 0x0F, 0x01, 0x02, 0x9F, 0x05, 0x27, 0x26, 0xC9, 0x02, 0xA0, + 0x00, 0x04, 0x02, 0x9C, 0x05, 0x36, 0x02, 0xDF, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0xFF, 0xFF, 0xCD, + 0x0F, 0x00, 0x00, 0xFF, 0xFF, 0xC9, 0x00, 0xFE, 0xFF, 0xCE, 0x00, 0xFC, 0xFF, 0xCF, 0x1F, 0xE0, + 0x15, 0x01, 0x00, 0xFF, 0xFF, 0xCB, 0x02, 0xDF, 0x00, 0xDE, 0xFF, 0xC9, 0x02, 0xA0, 0x00, 0x04, + 0x02, 0x9C, 0x05, 0x4C, 0x02, 0xDF, 0x19, 0x3E, 0x19, 0x3C, 0x02, 0x40, 0x7F, 0xFF, 0x02, 0xBF, + 0x05, 0x61, 0x00, 0x7A, 0x05, 0x5F, 0x26, 0xD3, 0x1B, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0xDF, 0x1C, 0x3F, 0x0F, 0x0A, 0x2F, 0xD1, 0x1F, 0x5E, 0x1F, 0x1C, 0x00, 0x9E, 0xFF, 0xFF, + 0x2E, 0xD6, 0x2E, 0xD7, 0x1F, 0xDA, 0x1F, 0x98, 0x14, 0x7F, 0x2E, 0xD8, 0x2C, 0xD9, 0x1F, 0x40, + 0x02, 0xDF, 0x19, 0x3E, 0x19, 0x3C, 0x00, 0x90, 0x00, 0x01, 0x02, 0xBF, 0x05, 0x61, 0x00, 0x7A, + 0x05, 0x7E, 0x19, 0x3E, 0x2E, 0xD3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xDF, + 0x00, 0x80, 0x03, 0x46, 0x02, 0xBF, 0x00, 0x67, 0x02, 0xBF, 0x00, 0x67, 0x00, 0x81, 0x03, 0x46, + 0x00, 0xDF, 0x03, 0x49, 0x03, 0x40, 0xFF, 0xFF, 0x00, 0xC0, 0x03, 0x45, 0x02, 0xBF, 0x05, 0x23, + 0x02, 0x9F, 0x00, 0x43, 0x00, 0x80, 0x03, 0x46, 0x02, 0xBF, 0x00, 0x67, 0x02, 0xBF, 0x00, 0x67, + 0x00, 0x81, 0x03, 0x46, 0x00, 0xDF, 0x03, 0x49, 0x03, 0x40, 0xFF, 0xFF, 0x00, 0xC0, 0x03, 0x45, + 0x02, 0xBF, 0x05, 0x30, 0x02, 0x9F, 0x00, 0x43, 0x00, 0x92, 0x00, 0xFF, 0x00, 0x9E, 0xFF, 0xFF, + 0x2E, 0xD4, 0x2E, 0xD5, 0x2E, 0xD6, 0x2E, 0xD7, 0x02, 0xDF, 0x00, 0xFF, 0xFF, 0xD1, 0x03, 0x40, + 0x00, 0x03, 0x79, 0x00, 0x02, 0xCA, 0x00, 0xFE, 0xFF, 0xD8, 0x00, 0xFC, 0xFF, 0xD9, 0x02, 0xDF, + 0x12, 0x05, 0x8E, 0x00, 0x00, 0xF0, 0x03, 0xFD, 0x00, 0xFC, 0x03, 0xFF, 0xF4, 0x00, 0x00, 0xFC, + 0x03, 0xFE, 0x00, 0xFA, 0x03, 0xFA, 0x81, 0x00, 0x00, 0xDE, 0xFF, 0xFE, 0x02, 0xC0, 0x80, 0x00, + 0x02, 0x9C, 0x06, 0xB9, 0x00, 0xDA, 0xFF, 0xFF, 0x86, 0x00, 0x02, 0x94, 0x06, 0x92, 0x00, 0xDE, + 0xFF, 0xFE, 0x02, 0xC0, 0x80, 0x00, 0x02, 0x9C, 0x05, 0xCF, 0x02, 0x40, 0x00, 0x0F, 0x1F, 0x5E, + 0x74, 0x00, 0x0C, 0x00, 0x14, 0x04, 0x00, 0xFE, 0x03, 0x4E, 0x1F, 0xDA, 0x1F, 0x40, 0x02, 0x00, + 0x04, 0xFC, 0x1C, 0x1E, 0x00, 0xDE, 0xFF, 0xFF, 0x1A, 0x1E, 0x1C, 0x1A, 0x00, 0xDE, 0x03, 0xFE, + 0x00, 0xDC, 0x03, 0xFF, 0x00, 0xD0, 0x03, 0xFD, 0x00, 0xDA, 0x03, 0xFA, 0x13, 0x05, 0x02, 0xFF, + 0x00, 0x9A, 0x00, 0x02, 0x00, 0xFA, 0x03, 0xA3, 0x00, 0xE0, 0x03, 0xF9, 0x02, 0xBF, 0x06, 0x7C, + 0x16, 0xFC, 0xDC, 0xD1, 0x16, 0xFD, 0x00, 0x02, 0x16, 0xFB, 0x00, 0x01, 0x00, 0x21, 0x06, 0x17, + 0x06, 0x18, 0x06, 0x58, 0x06, 0x5B, 0x00, 0xE0, 0x03, 0xF9, 0x00, 0x9E, 0x00, 0x05, 0x02, 0xBF, + 0x06, 0x6A, 0x8E, 0x00, 0x81, 0x00, 0x89, 0x00, 0x02, 0xBF, 0x06, 0x5E, 0x27, 0xFF, 0x00, 0x9E, + 0x05, 0xFF, 0x4C, 0x00, 0x1C, 0x7E, 0x03, 0x13, 0x1C, 0x7F, 0x17, 0x6F, 0x00, 0x21, 0x00, 0x21, + 0x00, 0x9A, 0x00, 0x02, 0x00, 0xFA, 0x03, 0xA3, 0x81, 0x00, 0x89, 0x00, 0x02, 0xBF, 0x06, 0x5E, + 0x24, 0xFF, 0x02, 0xBF, 0x06, 0x64, 0x25, 0xFF, 0x02, 0xBF, 0x06, 0x64, 0x27, 0xFF, 0x2E, 0xCE, + 0x2C, 0xCF, 0x16, 0xC9, 0x00, 0x01, 0x2F, 0xCD, 0x2D, 0xCB, 0x81, 0x00, 0x89, 0x00, 0x02, 0xBF, + 0x06, 0x5E, 0x24, 0xFF, 0x1C, 0x9E, 0x1C, 0xBC, 0x02, 0xBF, 0x06, 0x64, 0x25, 0xFF, 0x02, 0xBF, + 0x06, 0x64, 0x27, 0xFF, 0x1C, 0xDF, 0x1C, 0xFD, 0x81, 0x00, 0x02, 0xBF, 0x06, 0x5E, 0x26, 0xFF, + 0x1C, 0x1E, 0x89, 0x00, 0x02, 0xBF, 0x06, 0x64, 0x20, 0xFF, 0x1F, 0x5F, 0x02, 0xBF, 0x06, 0x5E, + 0x21, 0xFF, 0x02, 0xBF, 0x06, 0x5E, 0x23, 0xFF, 0x26, 0xC9, 0x02, 0xA0, 0x00, 0x04, 0x02, 0x9C, + 0x06, 0x4C, 0x12, 0x06, 0x12, 0x03, 0x12, 0x04, 0x12, 0x05, 0x02, 0x9F, 0x80, 0xB5, 0x00, 0x21, + 0x02, 0x9F, 0x80, 0x00, 0x00, 0x21, 0x00, 0xC0, 0x03, 0xF9, 0x17, 0x0F, 0x26, 0xFE, 0x02, 0xC0, + 0x80, 0x00, 0x02, 0x9C, 0x06, 0x5E, 0x02, 0xDF, 0x27, 0xFE, 0x03, 0xC0, 0x80, 0x00, 0x02, 0x9C, + 0x06, 0x64, 0x02, 0xDF, 0x02, 0xBF, 0x06, 0x82, 0x16, 0xFC, 0xDC, 0xD1, 0x2E, 0xFD, 0x16, 0xFB, + 0x00, 0x01, 0x02, 0xBF, 0x06, 0x82, 0x02, 0xDF, 0x02, 0xBF, 0x06, 0x82, 0x16, 0xFC, 0xF3, 0x55, + 0x2E, 0xFD, 0x02, 0xBF, 0x06, 0x82, 0x02, 0xDF, 0x26, 0xFC, 0x02, 0xC0, 0x80, 0x00, 0x02, 0x9D, + 0x06, 0x7C, 0x02, 0xDF, 0x27, 0xFC, 0x03, 0xC0, 0x80, 0x00, 0x02, 0x9D, 0x06, 0x82, 0x02, 0xDF, + 0x00, 0x9A, 0x02, 0x80, 0x00, 0xFA, 0x03, 0x50, 0x00, 0xFA, 0x03, 0x51, 0x0A, 0x00, 0x00, 0xFA, + 0x03, 0x52, 0x02, 0xDF, 0x00, 0xE0, 0x03, 0xFB, 0x00, 0xE8, 0x03, 0xFC, 0x00, 0xC0, 0x03, 0x50, + 0x00, 0x88, 0x00, 0x2F, 0x1B, 0x1A, 0x00, 0xDE, 0xFF, 0xFE, 0x02, 0xC0, 0x80, 0x00, 0x02, 0x9C, + 0x06, 0x9B, 0x00, 0xDC, 0xFF, 0xFF, 0x1B, 0x1E, 0x1B, 0x1C, 0x1F, 0xDA, 0x78, 0x00, 0x1F, 0x5E, + 0x86, 0x00, 0x02, 0x94, 0x06, 0x9B, 0x81, 0x00, 0x00, 0xDE, 0x03, 0x52, 0x74, 0x00, 0x00, 0xFE, + 0x03, 0x52, 0x00, 0xE0, 0x03, 0x50, 0x00, 0xC0, 0x03, 0xFB, 0x00, 0xC8, 0x03, 0xFC, 0x02, 0x9F, + 0x05, 0xE6, 0x00, 0xE0, 0x03, 0xFB, 0x00, 0xE8, 0x03, 0xFC, 0x00, 0xC0, 0x03, 0x50, 0x00, 0x88, + 0x00, 0x2F, 0x0A, 0x00, 0x1B, 0x1A, 0x02, 0x9F, 0x06, 0xAB, 0x00, 0xC0, 0x03, 0x51, 0x00, 0x88, + 0x00, 0x2F, 0x00, 0xDA, 0x03, 0x52, 0x86, 0x00, 0x02, 0x95, 0x06, 0xED, 0x12, 0x05, 0x00, 0xDA, + 0x03, 0x52, 0x1F, 0xDA, 0x78, 0x00, 0x00, 0xFE, 0x03, 0x52, 0x13, 0x05, 0x00, 0x81, 0x03, 0x56, + 0x19, 0x1E, 0x02, 0xC0, 0x80, 0x00, 0x02, 0x9D, 0x06, 0xF1, 0x1F, 0x5E, 0x86, 0x00, 0x02, 0x95, + 0x06, 0xF5, 0x00, 0x7A, 0x06, 0xE6, 0x19, 0x1E, 0x1B, 0x3E, 0x19, 0x1E, 0x1B, 0x3E, 0x00, 0xE0, + 0x03, 0x51, 0x00, 0x88, 0xFF, 0xFF, 0x02, 0x9F, 0x00, 0x2F, 0x00, 0x88, 0xFF, 0xFF, 0x02, 0x9F, + 0x00, 0x2D, 0x00, 0xE0, 0x03, 0x51, 0x02, 0x9F, 0x06, 0xC9, 0x00, 0x80, 0x06, 0xC5, 0x02, 0x9F, + 0x05, 0xF0, 0x81, 0x00, 0x0E, 0x10, 0x22, 0x32, 0x86, 0x00, 0x02, 0xD5, 0x54, 0x00, 0x02, 0x00, + 0x04, 0x58, 0x1C, 0x1E, 0x1F, 0xDA, 0x04, 0xFE, 0x1F, 0x1E, 0x19, 0x1E, 0x02, 0x91, 0x07, 0x0C, + 0x19, 0x1A, 0x00, 0x58, 0x64, 0xA0, 0x64, 0x33, 0x1B, 0x7E, 0x02, 0xDF, 0x02, 0xBF, 0x06, 0xF9, + 0x81, 0x00, 0x26, 0x32, 0x5C, 0x00, 0x2E, 0x32, 0x00, 0x92, 0x00, 0xFF, 0x02, 0xDF, 0x00, 0xDE, + 0x04, 0xFB, 0x74, 0x00, 0x00, 0xFE, 0x04, 0xFB, 0x81, 0x00, 0x2E, 0x32, 0x2E, 0x66, 0x2E, 0x67, + 0x26, 0x8A, 0x24, 0x8B, 0x2E, 0x3A, 0x2C, 0x3B, 0x26, 0x8C, 0x24, 0x8D, 0x2E, 0x38, 0x2C, 0x39, + 0x02, 0xDF, 0x81, 0x00, 0x26, 0x89, 0x02, 0x40, 0x00, 0x0F, 0x1F, 0x5E, 0x81, 0x00, 0x0E, 0x10, + 0x54, 0x00, 0x2E, 0x32, 0x26, 0x8A, 0x24, 0x8B, 0x22, 0x88, 0x20, 0x89, 0x58, 0x00, 0x0A, 0x00, + 0x20, 0x32, 0x58, 0x00, 0x2E, 0x3A, 0x2C, 0x3B, 0x02, 0xDF, 0x00, 0x92, 0x00, 0x04, 0x81, 0x00, + 0x26, 0x04, 0xB1, 0x00, 0x02, 0xB4, 0x07, 0x17, 0x81, 0x00, 0x26, 0x01, 0xB1, 0x00, 0x02, 0x94, + 0x07, 0xE5, 0x22, 0x32, 0xC9, 0x00, 0x02, 0x93, 0x07, 0x0E, 0x55, 0x00, 0x02, 0xBF, 0x06, 0xF9, + 0x22, 0x3A, 0x86, 0x00, 0x02, 0x94, 0x07, 0x59, 0x81, 0x00, 0x26, 0x3B, 0x82, 0x00, 0x02, 0x91, + 0x07, 0xAB, 0x81, 0x00, 0x1F, 0xDF, 0x04, 0x0F, 0x14, 0x7C, 0x1F, 0x7E, 0x0C, 0x00, 0x14, 0x04, + 0x1F, 0x1E, 0x0A, 0x00, 0x81, 0x00, 0x26, 0x3A, 0x24, 0x3B, 0x58, 0x00, 0x02, 0x90, 0x07, 0x71, + 0x81, 0x00, 0x26, 0x3B, 0x5C, 0x00, 0x2E, 0x32, 0x81, 0x00, 0x2E, 0x3A, 0x2E, 0x3B, 0x02, 0x9F, + 0x07, 0x77, 0x2E, 0x3A, 0x2C, 0x3B, 0x0C, 0x00, 0x1F, 0xD8, 0x5C, 0x00, 0x2E, 0x32, 0x81, 0x00, + 0x1F, 0xDB, 0x02, 0xBF, 0x07, 0xEB, 0x22, 0x32, 0x86, 0x00, 0x02, 0x95, 0x07, 0xA8, 0x0A, 0x10, + 0x81, 0x00, 0x1F, 0xC3, 0x54, 0x00, 0x1C, 0x7E, 0x00, 0x80, 0x04, 0x58, 0x19, 0x7E, 0x19, 0x7A, + 0x10, 0x0E, 0x64, 0xA2, 0x1B, 0x1E, 0x1B, 0x1A, 0x81, 0x00, 0x26, 0x3A, 0x24, 0x3B, 0xB1, 0x00, + 0x02, 0x94, 0x07, 0xA8, 0x22, 0x32, 0x86, 0x00, 0x02, 0x95, 0x07, 0xA8, 0x00, 0x80, 0x04, 0x67, + 0x81, 0x00, 0x26, 0x8B, 0xB1, 0x00, 0x02, 0x95, 0x07, 0xA8, 0x02, 0x00, 0x00, 0x0F, 0x02, 0x40, + 0x00, 0x0F, 0x02, 0x00, 0x04, 0x58, 0x1C, 0x7E, 0x00, 0x7A, 0x07, 0xA7, 0x18, 0xFE, 0x1A, 0x9E, + 0x00, 0x92, 0x00, 0xFF, 0x02, 0xDF, 0xB1, 0x00, 0x02, 0x95, 0x07, 0xBB, 0x5D, 0x00, 0x04, 0x0F, + 0x14, 0x7C, 0x0C, 0x00, 0x00, 0xE3, 0x03, 0x63, 0x02, 0xBF, 0x07, 0xEB, 0x00, 0xDE, 0x03, 0x63, + 0x22, 0x3B, 0x44, 0x00, 0x1C, 0x7E, 0x81, 0x00, 0x26, 0x81, 0xB1, 0x00, 0x02, 0x95, 0x07, 0xE3, + 0x23, 0x80, 0x26, 0x88, 0x24, 0x89, 0x14, 0x08, 0x14, 0xF4, 0x23, 0x80, 0x8D, 0x00, 0xC8, 0x10, + 0xAE, 0x00, 0x8C, 0x00, 0xF0, 0x00, 0x4E, 0x00, 0x23, 0x8C, 0x21, 0x8D, 0x4A, 0x00, 0x2E, 0x38, + 0x2C, 0x39, 0x26, 0x82, 0x2E, 0x67, 0x26, 0x83, 0x2E, 0x66, 0x00, 0xE3, 0x03, 0x63, 0x00, 0x83, + 0x04, 0x58, 0x81, 0x00, 0x0E, 0x01, 0x02, 0xBF, 0x07, 0xEB, 0x00, 0xC3, 0x03, 0x63, 0x02, 0xBF, + 0x07, 0x29, 0x02, 0x9F, 0x07, 0x49, 0x0E, 0x01, 0x2E, 0x01, 0x81, 0x00, 0x00, 0x5F, 0x1B, 0x7E, + 0x00, 0x92, 0x00, 0xFF, 0x02, 0xDF, 0x00, 0xFF, 0x03, 0x60, 0x00, 0xFE, 0x03, 0x61, 0x26, 0x38, + 0x24, 0x39, 0x0F, 0x05, 0x02, 0xBF, 0x05, 0xAD, 0x26, 0x38, 0x24, 0x39, 0x89, 0x00, 0x00, 0xDF, + 0x03, 0x61, 0x22, 0x80, 0xD0, 0x00, 0x6F, 0x00, 0x4C, 0x00, 0x2E, 0x38, 0x2C, 0x39, 0x81, 0x00, + 0x00, 0xDE, 0x03, 0x61, 0x00, 0x7E, 0x08, 0x6B, 0x00, 0x80, 0xFF, 0xD3, 0x00, 0x84, 0x00, 0x00, + 0x19, 0x9E, 0x89, 0x00, 0x1F, 0xFE, 0x14, 0x01, 0x02, 0x40, 0x00, 0x1E, 0x02, 0x00, 0x03, 0x00, + 0x1C, 0x3E, 0x15, 0x7C, 0x03, 0x40, 0x00, 0x0F, 0x0A, 0x11, 0x55, 0x00, 0x81, 0x00, 0x26, 0x80, + 0x06, 0x05, 0x02, 0x95, 0x08, 0x32, 0x00, 0x9A, 0x00, 0xF0, 0x0B, 0x0F, 0x00, 0x82, 0x03, 0x64, + 0x19, 0x98, 0x60, 0x00, 0x11, 0x07, 0x08, 0x29, 0x34, 0x00, 0x14, 0x08, 0x60, 0x32, 0x36, 0x44, + 0x14, 0x0C, 0x60, 0x32, 0x34, 0x00, 0x14, 0x08, 0x60, 0x32, 0x36, 0x00, 0x14, 0x0C, 0x1B, 0x5E, + 0x02, 0x9F, 0x08, 0x52, 0x00, 0x9A, 0xC0, 0x00, 0x00, 0x82, 0x03, 0x64, 0x19, 0x98, 0x60, 0x00, + 0x11, 0x03, 0x08, 0x45, 0x14, 0x08, 0x34, 0x00, 0x60, 0x32, 0x14, 0x0A, 0x34, 0x00, 0x60, 0x32, + 0x14, 0x0C, 0x34, 0x00, 0x60, 0x32, 0x14, 0x0E, 0x34, 0x44, 0x60, 0x32, 0x14, 0x08, 0x34, 0x00, + 0x60, 0x32, 0x14, 0x0A, 0x34, 0x00, 0x60, 0x32, 0x14, 0x0C, 0x34, 0x00, 0x60, 0x32, 0x14, 0x0E, + 0x34, 0x00, 0x1B, 0x5E, 0x8F, 0x00, 0x1F, 0x7F, 0x20, 0x66, 0x27, 0x67, 0x19, 0x3A, 0x19, 0x39, + 0x00, 0x80, 0x03, 0x64, 0x1C, 0x80, 0xA0, 0x00, 0xEA, 0x70, 0x11, 0x08, 0x08, 0x66, 0x3A, 0x93, + 0xA4, 0x78, 0x14, 0x85, 0xE8, 0x33, 0x3B, 0x92, 0xA5, 0x70, 0x15, 0x85, 0xEA, 0x3B, 0x2F, 0x67, + 0x8E, 0x00, 0x1F, 0xF8, 0x2F, 0x66, 0x89, 0x00, 0x00, 0xDF, 0x03, 0x60, 0x02, 0xDF, 0xB1, 0x00, + 0x02, 0xD5, 0x04, 0xFE, 0x1F, 0x1E, 0x19, 0x1E, 0x02, 0x91, 0x08, 0x7A, 0x19, 0x1A, 0x00, 0x58, + 0x64, 0xA0, 0x64, 0x33, 0x1B, 0x7E, 0x02, 0xDF, 0x81, 0x00, 0x1F, 0x5E, 0x00, 0xD8, 0x04, 0x02, + 0x00, 0xDC, 0x04, 0x30, 0x00, 0x80, 0x05, 0x20, 0x00, 0xDF, 0x04, 0x80, 0x15, 0x01, 0x03, 0x40, + 0x00, 0x7E, 0x03, 0x00, 0x08, 0x91, 0x1C, 0x5F, 0x17, 0x5F, 0x00, 0xFC, 0x04, 0x30, 0x02, 0x9F, + 0x02, 0xD8, 0x02, 0x9F, 0x08, 0xB2, 0x02, 0x9F, 0x08, 0xED, 0x02, 0x9F, 0x08, 0xD5, 0x02, 0x9F, + 0x08, 0xC2, 0x02, 0x9F, 0x08, 0xFB, 0x02, 0x9F, 0x08, 0xB1, 0x02, 0x9F, 0x09, 0x19, 0x02, 0x9F, + 0x09, 0x1C, 0x02, 0x9F, 0x08, 0xB1, 0x02, 0x9F, 0x08, 0xB1, 0x02, 0x9F, 0x09, 0x3A, 0x02, 0x9F, + 0x08, 0xF3, 0x02, 0x9F, 0x08, 0xF7, 0x02, 0x9F, 0x08, 0xB1, 0x02, 0x9F, 0x08, 0xB1, 0x02, 0x9F, + 0x08, 0xB1, 0x02, 0xDF, 0x14, 0x01, 0x00, 0x9B, 0xC0, 0x00, 0x00, 0x99, 0x40, 0x00, 0x11, 0x50, + 0x08, 0xBF, 0x02, 0xC0, 0x00, 0x01, 0x02, 0x7C, 0x1B, 0x1B, 0x02, 0x7D, 0x1B, 0x19, 0x48, 0x00, + 0x14, 0x7F, 0x02, 0xDF, 0x14, 0x02, 0x89, 0x00, 0x1F, 0xB8, 0x15, 0x01, 0x00, 0x9B, 0xC0, 0x00, + 0x00, 0x99, 0x40, 0x00, 0x11, 0x50, 0x08, 0xD2, 0x02, 0xC0, 0x00, 0x03, 0x02, 0x7C, 0x1B, 0x1B, + 0x02, 0x7D, 0x1B, 0x19, 0x4C, 0x00, 0x14, 0x7E, 0x02, 0xDF, 0x14, 0x01, 0x00, 0x81, 0x0C, 0xA0, + 0x00, 0x9B, 0xC0, 0x00, 0x00, 0x99, 0x40, 0x00, 0x89, 0x00, 0x00, 0x82, 0x00, 0x00, 0x11, 0x50, + 0x08, 0xEA, 0x02, 0xC0, 0x00, 0x01, 0x02, 0x7C, 0x1B, 0x1B, 0x02, 0x7D, 0x1B, 0x19, 0x18, 0x3D, + 0x49, 0x00, 0x1F, 0xE2, 0x4C, 0x39, 0x14, 0x7F, 0x02, 0xDF, 0x89, 0x00, 0x1F, 0xB8, 0x15, 0x7F, + 0x10, 0x50, 0x4C, 0x20, 0x02, 0xDF, 0x00, 0x82, 0x01, 0x80, 0x02, 0x9F, 0x08, 0xFD, 0x00, 0x82, + 0x01, 0xC0, 0x02, 0x9F, 0x08, 0xFD, 0x00, 0x82, 0x01, 0x40, 0x00, 0x8A, 0x00, 0x3F, 0x00, 0x86, + 0x00, 0x00, 0x14, 0x06, 0x89, 0x00, 0x1F, 0xB8, 0x15, 0x05, 0x00, 0x9B, 0x00, 0x3F, 0x00, 0x9A, + 0x00, 0x00, 0x36, 0x00, 0x1C, 0xDE, 0x00, 0x1A, 0x34, 0x00, 0x11, 0x50, 0x09, 0x13, 0x4C, 0x4A, + 0x36, 0x06, 0x1C, 0xDE, 0x34, 0x0E, 0x1B, 0x19, 0x1F, 0xC2, 0x14, 0x7A, 0x00, 0x8A, 0xFF, 0xFF, + 0x02, 0xDF, 0x10, 0x50, 0x1B, 0x18, 0x02, 0xDF, 0x00, 0x82, 0x01, 0x00, 0x00, 0x8A, 0x00, 0x3F, + 0x00, 0x86, 0x00, 0x00, 0x14, 0x06, 0x89, 0x00, 0x1F, 0xB8, 0x15, 0x05, 0x00, 0x9B, 0x00, 0x3F, + 0x00, 0x9A, 0x00, 0x00, 0x36, 0x00, 0x1C, 0xDE, 0x00, 0x1A, 0x34, 0x00, 0x11, 0x50, 0x09, 0x34, + 0x4C, 0x4A, 0x36, 0x06, 0x1C, 0xDE, 0x34, 0x0E, 0x1B, 0x19, 0x1F, 0xC2, 0x14, 0x7A, 0x00, 0x8A, + 0xFF, 0xFF, 0x02, 0xDF, 0x00, 0x82, 0x01, 0x00, 0x00, 0x8A, 0x00, 0x3F, 0x00, 0x86, 0x00, 0x00, + 0x00, 0x81, 0x0C, 0xA0, 0x14, 0x06, 0x89, 0x00, 0x1F, 0xB8, 0x15, 0x05, 0x00, 0x9B, 0x00, 0x3F, + 0x00, 0x9A, 0x00, 0x00, 0x36, 0x00, 0x1C, 0xDE, 0x00, 0x1A, 0x34, 0x00, 0x11, 0x50, 0x09, 0x59, + 0x19, 0x39, 0xA0, 0x00, 0x14, 0x0A, 0x4E, 0x00, 0x14, 0x76, 0x4C, 0x4A, 0x36, 0x06, 0x1C, 0xDE, + 0x34, 0x0E, 0x1B, 0x19, 0x1F, 0xC2, 0x14, 0x7A, 0x00, 0x8A, 0xFF, 0xFF, 0x02, 0xDF, 0x00, 0x80, + 0x01, 0xBE, 0x19, 0x18, 0x19, 0x1A, 0x00, 0x80, 0x01, 0x80, 0x00, 0x83, 0x01, 0x80, 0x90, 0x70, + 0x1F, 0xFE, 0x11, 0x20, 0x09, 0x70, 0x7C, 0x00, 0xD4, 0x50, 0x65, 0x33, 0xC5, 0x50, 0x15, 0x01, + 0x64, 0x3B, 0x00, 0x80, 0x01, 0xFE, 0x19, 0x1A, 0x19, 0x18, 0x00, 0x80, 0x01, 0xC0, 0x00, 0x83, + 0x01, 0xC0, 0x1F, 0xF8, 0x90, 0x70, 0xF8, 0x00, 0x02, 0x40, 0x01, 0xFF, 0x02, 0x60, 0x20, 0x00, + 0x02, 0xBF, 0x09, 0x83, 0x02, 0xDF, 0xB9, 0x00, 0x02, 0x72, 0x7C, 0x00, 0x1F, 0x7E, 0x47, 0x00, + 0x11, 0x10, 0x09, 0x8D, 0x47, 0x3B, 0x47, 0x3B, 0x47, 0x3B, 0x47, 0x3B, 0x02, 0xDF, 0x00, 0x92, + 0x00, 0x04, 0x20, 0x02, 0x81, 0x00, 0x89, 0x00, 0x24, 0x30, 0x8D, 0x00, 0x09, 0x50, 0xA0, 0x00, + 0xA4, 0x00, 0x14, 0x04, 0x8C, 0x00, 0x1F, 0xFE, 0x00, 0x83, 0x05, 0x80, 0x22, 0x01, 0x86, 0x00, + 0x02, 0x94, 0x09, 0xB1, 0x22, 0x04, 0x86, 0x00, 0x02, 0xB4, 0x09, 0xF9, 0x81, 0x00, 0x26, 0x05, + 0xB1, 0x00, 0x02, 0x95, 0x09, 0xBE, 0x81, 0x00, 0x2E, 0x05, 0x22, 0x81, 0x86, 0x00, 0x02, 0x94, + 0x09, 0xB8, 0x81, 0x00, 0x00, 0x5F, 0x1B, 0x7E, 0x74, 0x00, 0x2E, 0x01, 0x02, 0x9F, 0x09, 0xF2, + 0x26, 0x88, 0x24, 0x89, 0x2E, 0x34, 0x2C, 0x35, 0x02, 0xBF, 0x09, 0xF9, 0x00, 0xFF, 0x03, 0x60, + 0x26, 0x38, 0x24, 0x39, 0x0F, 0x05, 0x02, 0xBF, 0x05, 0xAD, 0x00, 0xDF, 0x03, 0x60, 0x81, 0x00, + 0x26, 0x3A, 0xB1, 0x00, 0x02, 0x94, 0x09, 0xD9, 0x26, 0x3B, 0x5C, 0x00, 0x02, 0x90, 0x09, 0xD9, + 0x22, 0x3B, 0x02, 0xBF, 0x0A, 0x0A, 0x55, 0x00, 0x0A, 0x01, 0x00, 0xFA, 0x04, 0x05, 0x02, 0x9F, + 0x09, 0xAB, 0x1F, 0x5F, 0x02, 0xBF, 0x0A, 0x0A, 0x00, 0xFA, 0x03, 0x62, 0x81, 0x00, 0x26, 0x3A, + 0x24, 0x3B, 0x15, 0x70, 0x0A, 0x01, 0x00, 0x81, 0x04, 0x05, 0x5C, 0x00, 0xB1, 0x00, 0x02, 0x75, + 0x1A, 0x3A, 0x2E, 0x3A, 0x2C, 0x3B, 0x26, 0x38, 0x24, 0x39, 0x00, 0xD8, 0x03, 0x62, 0x70, 0x00, + 0x2C, 0x39, 0x2E, 0x38, 0x00, 0x92, 0x00, 0xFF, 0x02, 0x9F, 0x02, 0xD0, 0x81, 0x00, 0x2E, 0x34, + 0x2E, 0x35, 0x23, 0x34, 0x21, 0x35, 0x26, 0x8A, 0x24, 0x8B, 0x5A, 0x00, 0x2E, 0x3A, 0x2C, 0x3B, + 0x26, 0x34, 0x24, 0x35, 0x23, 0x8C, 0x21, 0x8D, 0x4A, 0x00, 0x2E, 0x38, 0x2C, 0x39, 0x81, 0x00, + 0x2E, 0x05, 0x02, 0xDF, 0x00, 0x80, 0xFF, 0xD3, 0x00, 0x84, 0x00, 0x00, 0x00, 0x7A, 0x0A, 0x12, + 0x19, 0x9E, 0x14, 0x88, 0x1B, 0x7E, 0x02, 0xDF, 0x00, 0x92, 0x00, 0x04, 0x20, 0x02, 0x81, 0x00, + 0x89, 0x00, 0x24, 0x30, 0x8D, 0x00, 0x09, 0x50, 0xA0, 0x00, 0xA4, 0x00, 0x14, 0x04, 0x8C, 0x00, + 0x1F, 0xFE, 0x00, 0x83, 0x05, 0x80, 0x22, 0x01, 0x86, 0x00, 0x02, 0x94, 0x0A, 0x36, 0x22, 0x04, + 0x86, 0x00, 0x02, 0xB4, 0x0A, 0x7F, 0x81, 0x00, 0x26, 0x05, 0xB1, 0x00, 0x02, 0x95, 0x0A, 0x43, + 0x81, 0x00, 0x2E, 0x05, 0x22, 0x81, 0x86, 0x00, 0x02, 0x94, 0x0A, 0x3D, 0x81, 0x00, 0x00, 0x5F, + 0x1B, 0x7E, 0x74, 0x00, 0x2E, 0x01, 0x02, 0x9F, 0x0A, 0x78, 0x26, 0x88, 0x24, 0x89, 0x2E, 0x34, + 0x2C, 0x35, 0x02, 0xBF, 0x0A, 0x7F, 0x00, 0xFF, 0x03, 0x60, 0x26, 0x38, 0x24, 0x39, 0x0F, 0x06, + 0x02, 0xBF, 0x05, 0xAD, 0x00, 0xDF, 0x03, 0x60, 0x81, 0x00, 0x26, 0x3A, 0xB1, 0x00, 0x02, 0x94, + 0x0A, 0x5E, 0x26, 0x3B, 0x5C, 0x00, 0x02, 0x90, 0x0A, 0x5E, 0x22, 0x3B, 0x02, 0xBF, 0x0A, 0x91, + 0x55, 0x00, 0x0A, 0x01, 0x00, 0xFA, 0x04, 0x05, 0x02, 0x9F, 0x0A, 0x30, 0x1F, 0x5F, 0x02, 0xBF, + 0x0A, 0x91, 0x00, 0xFA, 0x03, 0x62, 0x81, 0x00, 0x26, 0x3A, 0x24, 0x3B, 0x15, 0x70, 0x0A, 0x01, + 0x00, 0x81, 0x04, 0x05, 0x5C, 0x00, 0xB1, 0x00, 0x02, 0x75, 0x1A, 0x3A, 0x2E, 0x3A, 0x2C, 0x3B, + 0x26, 0x38, 0x24, 0x39, 0x00, 0xD8, 0x03, 0x62, 0x70, 0x00, 0x70, 0x00, 0x2C, 0x39, 0x2E, 0x38, + 0x00, 0x92, 0x00, 0xFF, 0x02, 0x9F, 0x02, 0xD0, 0x81, 0x00, 0x2E, 0x34, 0x2E, 0x35, 0x23, 0x34, + 0x21, 0x35, 0x26, 0x8A, 0x24, 0x8B, 0x5A, 0x00, 0x2E, 0x3A, 0x2C, 0x3B, 0x26, 0x34, 0x24, 0x35, + 0x14, 0x01, 0x23, 0x8C, 0x21, 0x8D, 0x4A, 0x00, 0x2E, 0x38, 0x2C, 0x39, 0x81, 0x00, 0x2E, 0x05, + 0x02, 0xDF, 0x00, 0x80, 0xFF, 0xD3, 0x00, 0x84, 0x00, 0x00, 0x00, 0x7A, 0x0A, 0x98, 0x19, 0x9E, + 0x1B, 0x7E, 0x02, 0xDF, 0x89, 0x00, 0x0F, 0x50, 0x00, 0x83, 0x05, 0x20, 0x02, 0xBF, 0x0A, 0xB3, + 0x02, 0x9F, 0x02, 0xD8, 0x00, 0xD8, 0x04, 0x02, 0x81, 0x00, 0x89, 0x00, 0x00, 0xDC, 0x04, 0x30, + 0x0A, 0x50, 0x90, 0x00, 0x94, 0x00, 0x14, 0x04, 0x1F, 0xFE, 0x00, 0x83, 0x05, 0x80, 0x02, 0xBF, + 0x0A, 0xB3, 0x02, 0x9F, 0x02, 0xD0, 0x00, 0x92, 0x00, 0x04, 0x81, 0x00, 0x26, 0x3A, 0x24, 0x3B, + 0x1F, 0x1F, 0x0A, 0x00, 0x58, 0x00, 0x02, 0x92, 0x0A, 0xD1, 0x89, 0x00, 0x00, 0xC0, 0x04, 0x3B, + 0x02, 0xBF, 0x0A, 0xF6, 0x81, 0x00, 0x1F, 0xD8, 0x22, 0x3B, 0x54, 0x00, 0x00, 0x07, 0x19, 0x79, + 0x00, 0x5E, 0x1B, 0x79, 0x0F, 0x01, 0x2F, 0x01, 0x89, 0x00, 0x2F, 0x3B, 0x00, 0x92, 0x00, 0xFF, + 0x02, 0xDF, 0x2E, 0x3A, 0x2C, 0x3B, 0x81, 0x00, 0x89, 0x00, 0x26, 0x8A, 0x27, 0x34, 0x5C, 0x00, + 0x2E, 0x36, 0x50, 0x00, 0x02, 0x90, 0x0A, 0xF0, 0x00, 0xC0, 0x04, 0x36, 0x02, 0xBF, 0x0A, 0xF6, + 0x81, 0x00, 0x1F, 0xD8, 0x22, 0x36, 0x54, 0x00, 0x1C, 0x1E, 0x81, 0x00, 0x2E, 0x34, 0x26, 0x88, + 0x24, 0x89, 0x2E, 0x8C, 0x2C, 0x8D, 0x02, 0xBF, 0x0A, 0xF6, 0x00, 0x92, 0x00, 0xFF, 0x02, 0xDF, + 0x1C, 0x18, 0x02, 0xBF, 0x0A, 0xF6, 0x00, 0x92, 0x00, 0xFF, 0x02, 0xDF, 0x81, 0x00, 0x1F, 0xC0, + 0xB1, 0x00, 0x02, 0xD5, 0x89, 0x00, 0x27, 0x34, 0x03, 0x40, 0x00, 0x01, 0x0B, 0x00, 0x1F, 0x3F, + 0x26, 0x8C, 0x24, 0x8D, 0x89, 0x00, 0x25, 0x34, 0x15, 0x01, 0x4C, 0x00, 0x5A, 0x00, 0x5A, 0x00, + 0x1C, 0x20, 0x1F, 0xE0, 0x05, 0x02, 0x1C, 0x1F, 0x00, 0x9F, 0x0B, 0x00, 0x00, 0x92, 0x00, 0xFF, + 0x02, 0xBF, 0x05, 0x25, 0x00, 0x92, 0x00, 0x04, 0x27, 0x34, 0x1F, 0x61, 0x47, 0x00, 0x2F, 0x34, + 0x00, 0x80, 0x0B, 0x00, 0x89, 0x00, 0x1F, 0xF9, 0xB9, 0x00, 0x02, 0x74, 0x00, 0x08, 0x89, 0x00, + 0x1F, 0xE1, 0x19, 0x1E, 0x07, 0x01, 0x02, 0x93, 0x0B, 0x2C, 0x19, 0x1A, 0x05, 0xFE, 0x00, 0x5F, + 0x64, 0xA0, 0x1B, 0x7E, 0x1B, 0x7A, 0x02, 0xDF, 0x1B, 0x7E, 0x02, 0xDF, 0x8A, 0x00, 0x00, 0x83, + 0x03, 0xE8, 0x19, 0x1E, 0x19, 0x1A, 0x10, 0x06, 0x64, 0xA0, 0x1B, 0x7E, 0x1B, 0x7A, 0x00, 0x80, + 0x03, 0xE8, 0x00, 0x88, 0x00, 0x07, 0x11, 0x50, 0x0B, 0x48, 0x1C, 0x61, 0x84, 0xC3, 0xF2, 0xC3, + 0xF2, 0xC3, 0xF2, 0xC3, 0xF2, 0xC3, 0xF2, 0xC3, 0xF2, 0xC3, 0xF2, 0xC3, 0xF2, 0x00, 0xFE, 0x00, + 0x1B, 0x3E, 0x00, 0x88, 0xFF, 0xFF, 0x8B, 0x00, 0x02, 0xDF, 0x8A, 0x00, 0x05, 0xFE, 0x00, 0x83, + 0x03, 0xE8, 0x19, 0x1E, 0x19, 0x1A, 0x00, 0x5F, 0x64, 0xA0, 0x1B, 0x7E, 0x1B, 0x7A, 0x00, 0x80, + 0x03, 0xE8, 0x05, 0x01, 0x1D, 0x1F, 0x11, 0x50, 0x0B, 0x63, 0x1C, 0x61, 0x84, 0xC3, 0x00, 0x5F, + 0xF2, 0xC3, 0xF2, 0x00, 0xFE, 0x00, 0x1B, 0x3E, 0x00, 0x88, 0xFF, 0xFF, 0x8B, 0x00, 0x02, 0xDF, + 0x00, 0x83, 0x03, 0xE8, 0x19, 0x1E, 0x19, 0x1A, 0x64, 0xA0, 0x64, 0xA0, 0x1B, 0x7E, 0x1B, 0x7A, + 0x00, 0x80, 0x03, 0xE8, 0x00, 0x88, 0x00, 0x03, 0x00, 0x85, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, + 0x1F, 0xC2, 0x19, 0x5B, 0x19, 0x59, 0x19, 0x5F, 0x19, 0x5A, 0x1C, 0x5E, 0x1F, 0xDA, 0x1C, 0x61, + 0x8A, 0x00, 0x8F, 0x00, 0x19, 0x1A, 0xB8, 0x50, 0xE2, 0x50, 0xEA, 0x50, 0xE8, 0xE8, 0xB6, 0x50, + 0x11, 0x27, 0x0B, 0x93, 0xE3, 0xA8, 0x19, 0x7E, 0xE8, 0x50, 0xEA, 0xF8, 0xBF, 0x50, 0xE2, 0xA9, + 0x19, 0x7F, 0xEA, 0x50, 0xE8, 0xE8, 0xB6, 0x50, 0xE3, 0xA8, 0x19, 0x7E, 0xE8, 0x50, 0xEA, 0xF8, + 0xBF, 0x00, 0x1B, 0xFF, 0x19, 0x7F, 0x8E, 0x00, 0x8B, 0x00, 0x00, 0x88, 0xFF, 0xFF, 0x1B, 0x5B, + 0x1B, 0x59, 0x1B, 0x5F, 0x1B, 0x5E, 0x02, 0xDF, 0x00, 0x83, 0x03, 0xE8, 0x19, 0x1E, 0x19, 0x1A, + 0x64, 0xA0, 0x64, 0xA0, 0x1B, 0x7E, 0x1B, 0x7A, 0x00, 0x80, 0x03, 0xE8, 0x00, 0x88, 0x00, 0x03, + 0x00, 0x85, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x1F, 0xC2, 0x19, 0x5B, 0x19, 0x59, 0x19, 0x5F, + 0x19, 0x5A, 0x1C, 0x5E, 0x1F, 0xDA, 0x1C, 0x61, 0x8A, 0x00, 0x8F, 0x00, 0x19, 0x1A, 0xB8, 0x00, + 0xE3, 0x50, 0xE2, 0x50, 0xEA, 0x00, 0xEA, 0x50, 0xE8, 0x77, 0xEC, 0xE8, 0xB2, 0x00, 0x11, 0x27, + 0x0B, 0xD8, 0xE2, 0x50, 0xE3, 0xA8, 0x19, 0x7E, 0xE8, 0x00, 0xE8, 0x50, 0xEA, 0x7F, 0xEE, 0xF8, + 0xBB, 0x00, 0xE3, 0x50, 0xE2, 0xA9, 0x19, 0x7F, 0xEA, 0x00, 0xEA, 0x50, 0xE8, 0x77, 0xEC, 0xE8, + 0xB2, 0x00, 0xE2, 0x50, 0xE3, 0xA8, 0x19, 0x7E, 0xE8, 0x00, 0xE8, 0x50, 0xEA, 0x7F, 0xEE, 0xF8, + 0xBB, 0x00, 0x1B, 0xFF, 0x19, 0x7F, 0x8E, 0x00, 0x8B, 0x00, 0x00, 0x88, 0xFF, 0xFF, 0x1B, 0x5B, + 0x1B, 0x59, 0x1B, 0x5F, 0x1B, 0x5E, 0x02, 0xDF, 0x0E, 0xFF, 0x00, 0xFE, 0x03, 0xF2, 0x81, 0x00, + 0x00, 0xFE, 0x03, 0xF0, 0x00, 0xFE, 0x03, 0xF6, 0x00, 0x9E, 0x01, 0x00, 0x00, 0xFE, 0x03, 0xF7, + 0x00, 0xDA, 0x03, 0xF7, 0x00, 0x9E, 0x80, 0x00, 0x54, 0x00, 0x00, 0xFE, 0x03, 0xF5, 0x0E, 0x30, + 0x00, 0xFE, 0x03, 0xF3, 0x0E, 0x10, 0x00, 0xFE, 0x03, 0xF4, 0x00, 0x9E, 0x00, 0x96, 0x00, 0xFE, + 0x03, 0xF1, 0x02, 0xDF, 0x00, 0x80, 0x0A, 0x00, 0x81, 0x00, 0x00, 0xDE, 0x03, 0xF0, 0x89, 0x00, + 0xB1, 0x00, 0x02, 0x75, 0x05, 0x50, 0x00, 0xFF, 0x03, 0xF0, 0x02, 0x00, 0x0A, 0x60, 0x1C, 0x7E, + 0x0F, 0x4E, 0x02, 0xBF, 0x00, 0xDA, 0x02, 0xDF, 0x00, 0xDE, 0x03, 0xF1, 0x02, 0x00, 0x0A, 0x60, + 0x1C, 0x7E, 0x81, 0x00, 0x89, 0x00, 0x00, 0x9F, 0x00, 0xA0, 0x00, 0xDE, 0x03, 0xF1, 0x5D, 0x00, + 0x0E, 0x50, 0x07, 0x50, 0x02, 0x70, 0x5D, 0x00, 0x00, 0xDA, 0x03, 0xF2, 0x86, 0x00, 0x02, 0x90, + 0x0C, 0x4D, 0x00, 0xDE, 0x03, 0xF3, 0x5C, 0x00, 0x02, 0x93, 0x0C, 0x38, 0x02, 0x9F, 0x0C, 0x52, + 0x00, 0xDB, 0x03, 0xF7, 0x00, 0x9E, 0x80, 0x00, 0x46, 0x00, 0x02, 0x9F, 0x0C, 0x44, 0x00, 0xDB, + 0x03, 0xF7, 0x00, 0x9E, 0x80, 0x00, 0x56, 0x00, 0x00, 0xFE, 0x03, 0xF5, 0x1F, 0xDA, 0x7C, 0x00, + 0x1F, 0x5E, 0x00, 0xFE, 0x03, 0xF2, 0x02, 0x9F, 0x0C, 0x52, 0x00, 0xDE, 0x03, 0xF4, 0x5D, 0x00, + 0x02, 0x93, 0x0C, 0x3F, 0x89, 0x00, 0x00, 0xDD, 0x03, 0xF5, 0x15, 0x01, 0x81, 0x00, 0x00, 0xDC, + 0x03, 0xF6, 0x00, 0x8B, 0x00, 0x9F, 0x00, 0x80, 0x0A, 0x00, 0x09, 0x00, 0x11, 0x50, 0x0C, 0x65, + 0x18, 0x78, 0x4C, 0x00, 0x1C, 0xFE, 0x00, 0x1F, 0x1F, 0xD9, 0x1B, 0x18, 0x00, 0x9F, 0x0A, 0x60, + 0x1F, 0xC3, 0x5C, 0x00, 0x00, 0xFE, 0x03, 0xF1, 0x00, 0xFC, 0x03, 0xF6, 0x00, 0x8B, 0xFF, 0xFF, + 0x02, 0xDF, 0x0F, 0x50, 0x00, 0x80, 0x0A, 0x00, 0x00, 0x83, 0x0D, 0x60, 0x00, 0x98, 0x3F, 0xFF, + 0x02, 0xBF, 0x00, 0xEB, 0x0F, 0x50, 0x00, 0x80, 0x0A, 0x00, 0x00, 0x83, 0x0D, 0x00, 0x00, 0x98, + 0x3F, 0xFF, 0x02, 0xBF, 0x00, 0xEB, 0x02, 0xDF, 0x8A, 0x00, 0x8F, 0x00, 0x81, 0x00, 0x00, 0xDE, + 0x04, 0x04, 0xB1, 0x00, 0x02, 0x95, 0x0C, 0x91, 0x81, 0x00, 0x00, 0xFE, 0x04, 0x78, 0x00, 0xFE, + 0x04, 0x79, 0x00, 0xDF, 0x04, 0x79, 0x00, 0xDB, 0x04, 0x78, 0x09, 0x00, 0x00, 0x84, 0x00, 0x00, + 0x11, 0x50, 0x0C, 0xA1, 0x19, 0x9E, 0x5C, 0x7C, 0xC0, 0x00, 0x6E, 0x00, 0x14, 0x88, 0x4A, 0x00, + 0x1B, 0x1E, 0x1F, 0x7E, 0x00, 0xFB, 0x04, 0x78, 0x00, 0xFF, 0x04, 0x79, 0x8B, 0x00, 0x8E, 0x00, + 0x02, 0xDF, 0xB9, 0x00, 0x02, 0x94, 0x0C, 0xAF, 0x68, 0x00, 0xB1, 0x00, 0x02, 0xD5, 0x1C, 0x23, + 0x19, 0x7E, 0x19, 0x1B, 0xD8, 0x58, 0x11, 0x20, 0x0C, 0xB9, 0xDC, 0xD3, 0x62, 0x31, 0xDC, 0xD3, + 0x62, 0x31, 0x49, 0x00, 0x11, 0x08, 0x0C, 0xBF, 0xDC, 0xD3, 0x62, 0x31, 0xDC, 0xD3, 0x62, 0x31, + 0x02, 0xDF, 0x8F, 0x00, 0x8D, 0x00, 0x1C, 0x03, 0x00, 0xD9, 0x03, 0x8E, 0x0B, 0x04, 0x19, 0x7A, + 0xB0, 0x53, 0xB6, 0x00, 0x11, 0x28, 0x0C, 0xCF, 0x3A, 0xD3, 0xB6, 0x30, 0x3A, 0xD3, 0xB6, 0x30, + 0x8C, 0x00, 0x8E, 0x00, 0x02, 0xDF, 0x00, 0xDA, 0x04, 0x85, 0x86, 0x00, 0x02, 0x95, 0x0C, 0xE5, + 0x81, 0x00, 0x00, 0xDE, 0x04, 0x2A, 0x14, 0x7F, 0x00, 0xFE, 0x04, 0x2B, 0xB1, 0x00, 0x02, 0x94, + 0x0C, 0xE5, 0x00, 0x9A, 0x00, 0x01, 0x00, 0xFA, 0x04, 0x01, 0x8F, 0x00, 0x81, 0x00, 0x00, 0xDE, + 0x04, 0x28, 0x14, 0x78, 0x00, 0xDF, 0x04, 0x28, 0x03, 0x40, 0x00, 0x7F, 0x1F, 0x1E, 0x1F, 0x5F, + 0x02, 0x20, 0x00, 0x7F, 0x1F, 0x3E, 0x03, 0x20, 0x00, 0x7F, 0x1F, 0x7F, 0x81, 0x00, 0x89, 0x00, + 0x00, 0x9F, 0x02, 0x00, 0x1F, 0xD8, 0x4C, 0x00, 0x1C, 0x1E, 0x18, 0x18, 0x1F, 0xDA, 0x4C, 0x00, + 0x1C, 0x1E, 0x18, 0x1A, 0x1F, 0xD9, 0x4C, 0x00, 0x1C, 0x1E, 0x18, 0x19, 0x1F, 0xDB, 0x4C, 0x00, + 0x1C, 0x1E, 0x18, 0x1B, 0x00, 0x80, 0x0B, 0x00, 0x98, 0x00, 0xAE, 0x00, 0xB6, 0x30, 0x96, 0x30, + 0x6E, 0x30, 0x1B, 0x1E, 0x00, 0x80, 0x0B, 0x00, 0x00, 0x81, 0x0B, 0x04, 0x00, 0xDA, 0x04, 0x2A, + 0x02, 0xBF, 0x0D, 0x62, 0x00, 0x81, 0x0B, 0x08, 0x00, 0x80, 0x0B, 0x04, 0x00, 0xDA, 0x04, 0x2A, + 0x00, 0xDE, 0x04, 0x29, 0xC0, 0x00, 0x6E, 0x00, 0x14, 0x81, 0x1F, 0x5E, 0x02, 0xBF, 0x0D, 0x62, + 0x00, 0x80, 0x0B, 0x00, 0x00, 0x81, 0x0B, 0x0C, 0x81, 0x00, 0x89, 0x00, 0x00, 0xDE, 0x04, 0x2B, + 0x00, 0xDF, 0x04, 0x2A, 0x00, 0xFE, 0x04, 0x2A, 0x5C, 0x00, 0x1F, 0x5E, 0x02, 0xBF, 0x0D, 0x6B, + 0x00, 0x80, 0x0B, 0x0C, 0x00, 0x81, 0x0B, 0x10, 0x00, 0xDA, 0x04, 0x29, 0x02, 0xBF, 0x0D, 0x62, + 0x00, 0x81, 0x0B, 0x04, 0x00, 0x82, 0x0B, 0x0C, 0x00, 0x83, 0x0D, 0x77, 0x11, 0x08, 0x0D, 0x5F, + 0x19, 0x5F, 0x15, 0xFB, 0x1F, 0x1D, 0x1F, 0x5F, 0x19, 0x3F, 0x00, 0xE1, 0x0B, 0x24, 0x00, 0xE2, + 0x0B, 0x25, 0x02, 0x1B, 0x00, 0xE3, 0x0B, 0x26, 0x1C, 0x7E, 0x00, 0xC0, 0x03, 0x8F, 0x02, 0xBF, + 0x0C, 0xA9, 0x00, 0xC1, 0x0B, 0x24, 0x00, 0xC2, 0x0B, 0x25, 0x00, 0xC3, 0x0B, 0x26, 0x00, 0x00, + 0x8E, 0x00, 0x02, 0xDF, 0x19, 0x1F, 0xD0, 0x78, 0xD6, 0x78, 0xD6, 0x31, 0x19, 0x1F, 0xD6, 0x31, + 0x6E, 0x31, 0x1B, 0x3E, 0x02, 0xDF, 0x8D, 0x00, 0x1F, 0x7E, 0x19, 0x18, 0xA8, 0x40, 0xAE, 0x40, + 0xAE, 0x31, 0x19, 0x18, 0xAE, 0x31, 0x6E, 0x31, 0x1B, 0x3E, 0x8C, 0x00, 0x02, 0xDF, 0x0D, 0x00, + 0x0D, 0x60, 0x0F, 0x40, 0x0C, 0xA0, 0x0E, 0x80, 0x0E, 0xE0, 0x0C, 0x00, 0x0C, 0x50, 0x00, 0xF9, + 0x03, 0x61, 0x1F, 0xC0, 0x02, 0x00, 0xFF, 0xFC, 0x1C, 0x1E, 0x1C, 0x5E, 0x00, 0x83, 0x04, 0x3C, + 0x19, 0x7E, 0x19, 0x7F, 0x80, 0xA2, 0x64, 0xA3, 0x65, 0x30, 0x1B, 0x1F, 0x1C, 0x02, 0x81, 0x00, + 0x00, 0xDE, 0x04, 0x02, 0x00, 0xFE, 0x03, 0x62, 0x14, 0x74, 0x1F, 0x7E, 0x1F, 0x3C, 0x89, 0x00, + 0x00, 0xDD, 0x04, 0x30, 0x15, 0x04, 0x06, 0x04, 0x02, 0x90, 0x0D, 0xF3, 0x1F, 0xDD, 0x00, 0x82, + 0x02, 0xB0, 0x10, 0x50, 0x4B, 0x2A, 0x1F, 0xBE, 0x00, 0xFE, 0x03, 0x60, 0x89, 0x00, 0x1F, 0xBE, + 0x0A, 0xF8, 0x00, 0x9B, 0x00, 0xFC, 0x00, 0xD8, 0x03, 0x61, 0x00, 0x82, 0x02, 0xB0, 0x00, 0x83, + 0x02, 0xB0, 0x19, 0x5E, 0x34, 0x80, 0x11, 0x28, 0x0D, 0xB8, 0x36, 0x7A, 0x35, 0xB3, 0x37, 0x72, + 0x34, 0xBB, 0x8A, 0x00, 0x00, 0x82, 0x02, 0xB0, 0x00, 0xDD, 0x04, 0x30, 0x15, 0x04, 0x1F, 0xE0, + 0x81, 0x00, 0x00, 0xDE, 0x03, 0x62, 0x14, 0x74, 0x1F, 0x7E, 0x1F, 0x3C, 0x8F, 0x00, 0x19, 0x43, + 0x4B, 0xC3, 0x90, 0xC3, 0xF2, 0xC3, 0xF2, 0xC3, 0xF2, 0x00, 0xFE, 0x00, 0x1C, 0x1F, 0x19, 0x43, + 0x4B, 0xC3, 0x90, 0xC3, 0x11, 0x4E, 0x0D, 0xDA, 0xF2, 0xC3, 0xF2, 0xC3, 0xF2, 0x31, 0x1C, 0x1F, + 0x19, 0x43, 0x4B, 0xC3, 0x92, 0xC3, 0xF2, 0xC3, 0xF2, 0xC3, 0xF2, 0x31, 0xFE, 0x00, 0x1B, 0x3E, + 0x8B, 0x00, 0x8E, 0x00, 0x00, 0xFE, 0x04, 0x33, 0x1C, 0x1F, 0x15, 0x0C, 0x03, 0x40, 0x0F, 0xFF, + 0x00, 0xFF, 0x04, 0x30, 0x00, 0x83, 0x04, 0x3C, 0x19, 0x1E, 0x19, 0x1F, 0x80, 0xA0, 0x64, 0xA1, + 0x65, 0x33, 0x1B, 0x7F, 0x02, 0xDF, 0x1F, 0xE0, 0x1C, 0x1F, 0x11, 0x28, 0x0D, 0xFC, 0x4B, 0x70, + 0x1B, 0x3E, 0x1C, 0x1F, 0x4B, 0x70, 0x1B, 0x3E, 0x1C, 0x1F, 0x02, 0x9F, 0x0D, 0xE2, 0x00, 0x83, + 0x05, 0x20, 0x00, 0xDE, 0x04, 0x33, 0x10, 0x50, 0x1B, 0x7E, 0x02, 0x9F, 0x02, 0xD8, 0x1C, 0x20, + 0x18, 0x5F, 0x1F, 0x7F, 0x19, 0x3A, 0x64, 0x00, 0x00, 0x78, 0x0E, 0x11, 0x56, 0x59, 0x67, 0x30, + 0x55, 0x51, 0x64, 0x38, 0x1A, 0x5B, 0x02, 0xDF, 0x00, 0x98, 0x82, 0x40, 0x00, 0xF8, 0x04, 0xE8, + 0x00, 0x98, 0x7F, 0xFF, 0x00, 0xF8, 0x04, 0xE9, 0x00, 0x98, 0x7D, 0xBF, 0x00, 0xF8, 0x04, 0xEA, + 0x00, 0x98, 0x84, 0x3F, 0x00, 0xF8, 0x04, 0xEB, 0x00, 0x98, 0xB2, 0x3B, 0x00, 0xF8, 0x04, 0xF0, + 0x00, 0x98, 0x7F, 0xFF, 0x00, 0xF8, 0x04, 0xF1, 0x00, 0x98, 0x4D, 0xC4, 0x00, 0xF8, 0x04, 0xF2, + 0x00, 0x98, 0xD8, 0x08, 0x00, 0xF8, 0x04, 0xF3, 0x00, 0x98, 0x00, 0x00, 0x00, 0x80, 0x04, 0xEC, + 0x10, 0x04, 0x1B, 0x18, 0x00, 0x80, 0x04, 0xF4, 0x10, 0x04, 0x1B, 0x18, 0x02, 0xDF, 0x00, 0x80, + 0x0F, 0x40, 0x00, 0x83, 0x0B, 0x00, 0x89, 0x00, 0x0F, 0x50, 0x00, 0x98, 0x67, 0x84, 0x02, 0xBF, + 0x00, 0xFA, 0x00, 0x80, 0x04, 0xE8, 0x00, 0x82, 0x04, 0xEC, 0x00, 0x81, 0x0B, 0x00, 0x02, 0xBF, + 0x0B, 0xA4, 0x89, 0x00, 0x0F, 0x50, 0x00, 0x80, 0x0B, 0x00, 0x00, 0x83, 0x0D, 0x00, 0x00, 0x98, + 0x7F, 0xFF, 0x02, 0xBF, 0x00, 0xEB, 0x89, 0x00, 0x0F, 0x50, 0x00, 0x80, 0x0B, 0x00, 0x00, 0x83, + 0x0D, 0x60, 0x00, 0x98, 0xB8, 0x20, 0x02, 0xBF, 0x00, 0xEB, 0x00, 0x80, 0x0C, 0xA0, 0x00, 0x83, + 0x0B, 0x00, 0x89, 0x00, 0x0F, 0x50, 0x00, 0x98, 0x67, 0x84, 0x02, 0xBF, 0x00, 0xFA, 0x00, 0x80, + 0x04, 0xE8, 0x00, 0x82, 0x04, 0xF4, 0x00, 0x81, 0x0B, 0x00, 0x02, 0xBF, 0x0B, 0xA4, 0x89, 0x00, + 0x0F, 0x50, 0x00, 0x80, 0x0B, 0x00, 0x00, 0x83, 0x0D, 0x00, 0x00, 0x98, 0x47, 0xE0, 0x02, 0xBF, + 0x00, 0xEB, 0x89, 0x00, 0x0F, 0x50, 0x00, 0x80, 0x0B, 0x00, 0x00, 0x83, 0x0D, 0x60, 0x00, 0x98, + 0x80, 0x01, 0x02, 0xBF, 0x00, 0xEB, 0x02, 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +static STRUCT_DSP_TASK audio_task; + +static u8 AUDIO_YIELD_BUFFER[8192]; + /* 8028E8A0-8028E94C .text DspBoot__FPFPv_v */ -void DspBoot(void (*)(void*)) { +void DspBoot(void (*param_1)(void*)) { /* Nonmatching */ + DspInitWork(); + audio_task.priority = 0xf0; + audio_task.iram_mmem_addr = (u16*)(jdsp + 0x80000000); + audio_task.iram_length = sizeof(jdsp); + audio_task.iram_addr = 0; + audio_task.dram_mmem_addr = (u16*)(AUDIO_YIELD_BUFFER + 0x80000000); + audio_task.dram_length = sizeof(AUDIO_YIELD_BUFFER); + audio_task.dram_addr = 0; + audio_task.dsp_init_vector = 0; + audio_task.dsp_resume_vector = 0x10; + audio_task.init_cb = DspHandShake; + audio_task.res_cb = NULL; + audio_task.done_cb = NULL; + audio_task.req_cb = param_1; + DSPInit(); + DSPAddPriorTask(&audio_task); } /* 8028E960-8028EA48 .text DSPSendCommands2__FPUlUlPFUs_v */ -void DSPSendCommands2(unsigned long*, unsigned long, void (*)(unsigned short)) { +int DSPSendCommands2(u32* param_1, u32 param_2, void (*param_3)(u16)) { /* Nonmatching */ + while (Dsp_Running_Check() == 0); + + BOOL status = OSDisableInterrupts(); + if (DSPCheckMailToDSP()) { + OSRestoreInterrupts(status); + return -1; + } + + DSPSendMailToDSP(param_2); + DSPAssertInt(); + while(DSPCheckMailToDSP() != 0); + + if (param_1 == 0) { + param_2 = 1; + } + + int startWorkStatus; + if (param_3 != NULL) { + startWorkStatus = DspStartWork(param_1[0], param_3); + } + + for (int i = 0; i < param_2; i++) { + DSPSendMailToDSP(param_1[i]); + while (DSPCheckMailToDSP() != 0); + } + + OSRestoreInterrupts(status); + return startWorkStatus; } +typedef struct { + u16 field_0x0; + u16 field_0x2; + void (*field_0x4)(u16); +} TaskWorkStruct; + +static TaskWorkStruct taskwork[16]; + /* 8028EA60-8028EA8C .text DspInitWork__Fv */ void DspInitWork() { /* Nonmatching */ + for (int i = 0; i < 16; i++) { + taskwork[i].field_0x4 = NULL; + } } +static u32 taskreadp; +static u32 taskwritep; + /* 8028EAA0-8028EAE8 .text DspStartWork__FUlPFUs_v */ -void DspStartWork(unsigned long, void (*)(unsigned short)) { - /* Nonmatching */ +int DspStartWork(u32 param_1, void (*param_2)(u16)) { + u32 taskWritePrev = taskwritep; + u32 writeVal = ((taskWritePrev + 1) & 0xf); + if (writeVal == taskreadp) { + return 0; + } + + taskwritep = writeVal; + taskwork[taskWritePrev].field_0x0 = param_1 >> 0x10; + taskwork[taskWritePrev].field_0x4 = param_2; + return taskWritePrev + 1; } /* 8028EB00-8028EB68 .text DspFinishWork__FUs */ -void DspFinishWork(unsigned short) { - /* Nonmatching */ -} +void DspFinishWork(u16 param_1) { + if (param_1 == taskwork[taskreadp].field_0x0) { + if (taskwork[taskreadp].field_0x4) { + taskwork[taskreadp].field_0x4(taskreadp); + } + taskreadp = (taskreadp + 1) & 0xf; + } +} diff --git a/src/JSystem/JAudio/osdsp.c b/src/JSystem/JAudio/osdsp.c index 6fda16b87..3eaf3db10 100644 --- a/src/JSystem/JAudio/osdsp.c +++ b/src/JSystem/JAudio/osdsp.c @@ -3,16 +3,36 @@ // Translation Unit: osdsp.c // -#include "osdsp.h" +#include "JSystem/JAudio/osdsp.h" +#include "JSystem/JAudio/osdsp_task.h" #include "dolphin/types.h" /* 8028EB80-8028EC04 .text DSPAddTask */ -void DSPAddTask { +DSPTaskInfo* DSPAddTask(DSPTaskInfo* task) { /* Nonmatching */ + if (DSP_prior_task == NULL) { + OSReport("Prior Task is not inited\n"); + return NULL; + } + BOOL status = OSDisableInterrupts(); + __DSP_insert_task(task); + task->state = 0; + task->flags = 1; + OSRestoreInterrupts(status); + return task; } /* 8028EC20-8028EC9C .text DSPAddPriorTask__FP15STRUCT_DSP_TASK */ -void DSPAddPriorTask(STRUCT_DSP_TASK*) { +void DSPAddPriorTask(STRUCT_DSP_TASK* task) { /* Nonmatching */ + if (DSP_prior_task != NULL) { + OSReport("Already inited prior DSP task\n"); + return; + } + BOOL status = OSDisableInterrupts(); + DSP_prior_task = (DSPTaskInfo*)task; + task->state = 0; + task->flags = 1; + __DSP_boot_task((DSPTaskInfo*)task); + OSRestoreInterrupts(status); } - diff --git a/src/JSystem/JAudio/osdsp_task.c b/src/JSystem/JAudio/osdsp_task.c index 2124a44a4..595388bd4 100644 --- a/src/JSystem/JAudio/osdsp_task.c +++ b/src/JSystem/JAudio/osdsp_task.c @@ -3,31 +3,138 @@ // Translation Unit: osdsp_task.c // -#include "osdsp_task.h" -#include "dolphin/types.h" +#include "JSystem/JAudio/osdsp_task.h" +#include "JSystem/JAudio/dspproc.h" +#include "dolphin/dsp.h" +#include "dolphin/os/OSContext.h" + +u32 sync_stack[3]; +vu8 DSP_prior_yield; +s32 AUDIO_UPDATE_REQUEST; +DSPTaskInfo* DSP_prior_task; /* 8028ECA0-8028EFA4 .text __DSPHandler */ -void __DSPHandler { +void __DSPHandler(int interrupt, OSContext* context) { /* Nonmatching */ + OSContext funcContext; + __DSPRegs[5] = ((u16)(__DSPRegs[5]) & ~0x28) | 0x80; + OSClearContext(&funcContext); + OSSetCurrentContext(&funcContext); + + if (DSP_prior_yield == 1 || DSP_prior_yield == 0) { + __DSP_curr_task = DSP_prior_task; + } + + while (DSPCheckMailFromDSP() == 0); + u32 mail = DSPReadMailFromDSP(); + + if ((__DSP_curr_task->flags & 2) && mail == 0xDCD10002) { + mail = 0xDCD10003; + } + + switch (mail) { + case 0xDCD10000: + __DSP_curr_task->state = 1; + if (__DSP_curr_task == DSP_prior_task) { + DSP_prior_yield = 1; + } + if (__DSP_curr_task->init_cb != NULL) { + __DSP_curr_task->init_cb(__DSP_curr_task); + } + break; + case 0xDCD10001: + __DSP_curr_task->state = 1; + if (__DSP_curr_task == DSP_prior_task) { + DSP_prior_yield = 1; + Dsp_Update_Request(); + } + if (__DSP_curr_task->res_cb != NULL) { + __DSP_curr_task->res_cb(__DSP_curr_task); + } + break; + case 0xDCD10002: + DSPSendMailToDSP(0xCDD10001); + while (DSPCheckMailToDSP() != 0); + __DSP_curr_task->state = 2; + if (__DSP_curr_task->next == NULL && AUDIO_UPDATE_REQUEST) { + __DSP_exec_task(__DSP_curr_task, DSP_prior_task); + AUDIO_UPDATE_REQUEST = 0; + __DSP_curr_task = DSP_prior_task; + } else { + __DSP_exec_task(__DSP_curr_task, __DSP_curr_task->next); + __DSP_curr_task = __DSP_curr_task->next; + } + break; + case 0xDCD10003: + if (__DSP_curr_task->done_cb != NULL) { + __DSP_curr_task->done_cb(__DSP_curr_task); + } + DSPSendMailToDSP(0xCDD10001); + while (DSPCheckMailToDSP() != 0); + __DSP_curr_task->state = 3; + if (__DSP_curr_task->next == NULL) { + __DSP_exec_task(NULL, DSP_prior_task); + __DSP_remove_task(__DSP_curr_task); + __DSP_curr_task = DSP_prior_task; + } else { + __DSP_exec_task(NULL, __DSP_curr_task->next); + __DSP_curr_task = __DSP_curr_task->next; + __DSP_remove_task(__DSP_curr_task->prev); + } + break; + case 0xDCD10004: + if (__DSP_curr_task->req_cb != NULL) { + __DSP_curr_task->req_cb(__DSP_curr_task); + } + break; + case 0xDCD10005: + if (__DSP_first_task == NULL || AUDIO_UPDATE_REQUEST) { + DSPSendMailToDSP(0xCDD10003); + while (DSPCheckMailToDSP() != 0); + AUDIO_UPDATE_REQUEST = 0; + __DSP_curr_task = DSP_prior_task; + Dsp_Update_Request(); + } else { + DSP_prior_yield = 3; + DSPSendMailToDSP(0xCDD10001); + while (DSPCheckMailToDSP() != 0); + __DSP_exec_task(DSP_prior_task, __DSP_first_task); + __DSP_curr_task = __DSP_first_task; + } + break; + } + + OSClearContext(&funcContext); + OSSetCurrentContext(context); } /* 8028EFC0-8028F010 .text DsyncFrame2__FUlUlUl */ -void DsyncFrame2(unsigned long, unsigned long, unsigned long) { - /* Nonmatching */ +void DsyncFrame2(u32 param_1, u32 param_2, u32 param_3) { + if (DSP_prior_yield != 1) { + sync_stack[0] = param_1; + sync_stack[1] = param_2; + sync_stack[2] = param_3; + AUDIO_UPDATE_REQUEST = 1; + return; + } + DsyncFrame(param_1, param_2, param_3); + AUDIO_UPDATE_REQUEST = 0; } /* 8028F020-8028F060 .text Dsp_Update_Request__Fv */ void Dsp_Update_Request() { - /* Nonmatching */ + if (AUDIO_UPDATE_REQUEST) { + DsyncFrame2(sync_stack[0], sync_stack[1], sync_stack[2]); + } } /* 8028F060-8028F074 .text Dsp_Running_Check__Fv */ -void Dsp_Running_Check() { +bool Dsp_Running_Check() { /* Nonmatching */ + return DSP_prior_yield == 1; } /* 8028F080-8028F08C .text Dsp_Running_Start__Fv */ void Dsp_Running_Start() { - /* Nonmatching */ + DSP_prior_yield = 1; } -