Merge pull request #529 from Jcw87/JAudio

JAudio
This commit is contained in:
Jasper St. Pierre
2023-10-20 17:29:53 -07:00
committed by GitHub
27 changed files with 1832 additions and 195 deletions
+9 -9
View File
@@ -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"),
+16
View File
@@ -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 */
+22
View File
@@ -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 */
+139
View File
@@ -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 */
+59
View File
@@ -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<THeap> 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 */
+27
View File
@@ -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 */
@@ -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 */
+21
View File
@@ -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 */
+15
View File
@@ -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 */
+13
View File
@@ -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 */
+8
View File
@@ -0,0 +1,8 @@
#ifndef OSDSP_H
#define OSDSP_H
#include "dolphin/dsp.h"
void DSPAddPriorTask(STRUCT_DSP_TASK*);
#endif /* OSDSP_H */
+17
View File
@@ -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 */
+2 -1
View File
@@ -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 */
#endif /* JKRSTDHEAP_H */
+1 -1
View File
@@ -212,7 +212,7 @@ public:
return *this;
}
T& operator*() { return *this->getObject(); }
T* operator*() { return this->getObject(); }
T* operator->() { return this->getObject(); }
+1
View File
@@ -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
+16 -6
View File
@@ -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
#endif // _DOLPHIN_DSP
+12 -5
View File
@@ -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;
}
+129 -15
View File
@@ -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<u32>(src) & 0x03) == 0);
JUT_ASSERT(281, (reinterpret_cast<u32>(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<u32>(bsrc) & 0x03);
u8 enbitsDst = (reinterpret_cast<u32>(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<u32>(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<u32>(dest) & 0x1f) == 0) {
DCZeroRange(dest, size);
return;
}
u8 alignedbitsDst = reinterpret_cast<u32>(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;
}
}
}
+235 -51
View File
@@ -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<u32>(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;
}
+198 -31
View File
@@ -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<THeap> 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<THeap> stack_20;
for (JSUTreeIterator<THeap> it(mTree.getFirstChild()); it != mTree.getEndChild(); it = stack_20) {
stack_20 = it;
stack_20++;
it->free();
}
JSUTree<THeap>* parentTree = mTree.getParent();
if (parentTree) {
THeap* parentHeap = parentTree->getObject();
if (parentHeap->field_0x44 == this) {
JSUTreeIterator<THeap> 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<THeap> 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<THeap> 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 */
}
+40 -14
View File
@@ -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 */
}
+49 -12
View File
@@ -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;
}
}
+25 -11
View File
@@ -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;
}
+52 -18
View File
@@ -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) {}
}
+560 -8
View File
@@ -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;
}
}
+24 -4
View File
@@ -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);
}
+116 -9
View File
@@ -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;
}