From 5d9a146bc3a4466e523b57ad18cf7d5d0f4c61d3 Mon Sep 17 00:00:00 2001 From: Prakxo Date: Wed, 12 Jun 2024 17:34:59 +0200 Subject: [PATCH 1/3] link dvdthread --- common.py | 1 + config/disasm_overrides.yml | 2 + config/dol_slices.yml | 5 + include/jaudio_NES/dvdthread.h | 26 +- src/static/jaudio_NES/internal/dvdthread.c | 464 +++++++++++++++++++++ 5 files changed, 492 insertions(+), 6 deletions(-) create mode 100644 src/static/jaudio_NES/internal/dvdthread.c diff --git a/common.py b/common.py index 91a52029..1cb8c978 100644 --- a/common.py +++ b/common.py @@ -442,6 +442,7 @@ FAMICOM_BASE = CFLAGS + [ ] + DOL_DEFINES JAUDIO_BASE = CFLAGS + [ "-lang=c++", + "-char signed", "-sdata 8", "-sdata2 8", "-enum int", diff --git a/config/disasm_overrides.yml b/config/disasm_overrides.yml index 525ded38..8415cc47 100644 --- a/config/disasm_overrides.yml +++ b/config/disasm_overrides.yml @@ -10,6 +10,8 @@ symbol_aligns: 0x8001a0c0: 32 0x80026400: 32 0x80031d80: 32 + 0x8001ada0: 32 + 0x8018f1a8: 8 0x80207458: 8 # align RunQueue to 0x001251d8 0x800b9140: 32 # align gam_win_moji1_tex to 32 bytes 0x801f71c0: 32 # align texture_buffer_data to 32 bytes diff --git a/config/dol_slices.yml b/config/dol_slices.yml index b19a5dd6..8b2ff1d9 100644 --- a/config/dol_slices.yml +++ b/config/dol_slices.yml @@ -101,6 +101,11 @@ jaudio_NES/internal/cpubuf.c: jaudio_NES/internal/playercall.c: .text: [0x80019dc0, 0x8001a0c0] .bss: [0x801864d0,0x80186590] +jaudio_NES/internal/dvdthread.c: + .text: [0x8001a0c0, 0x8001ada0] + .data: [0x800d0278, 0x800d0298] + .bss: [0x80186590, 0x8018f1a8] + .sbss: [0x80218498, 0x802184e8] jaudio_NES/internal/sub_sys.c: .text: [0x80024ae0, 0x80026120] .rodata: [0x800aa700, 0x800aa720] diff --git a/include/jaudio_NES/dvdthread.h b/include/jaudio_NES/dvdthread.h index d5606c8a..f05e6c8f 100644 --- a/include/jaudio_NES/dvdthread.h +++ b/include/jaudio_NES/dvdthread.h @@ -5,12 +5,26 @@ #include "dolphin/dvd.h" typedef void (*Jac_DVDCallback)(u32); +typedef s32 (*TaskCallback)(void*); +typedef void (*ErrorCallback)(char*, u8* addr); + +extern void DVDT_ExtendPath(char* dst, char* ext); +extern s32 DVDT_AddTaskHigh(TaskCallback callback, void* stackp, size_t len); +extern s32 DVDT_AddTask(TaskCallback callback, void* stackp, size_t len); +extern void jac_dvdproc_init(); +extern void* jac_dvdproc(void*); +extern s32 DVDT_LoadtoARAM_Main(void* arg); +extern s32 DVDT_LoadtoARAM(u32 owner, char* name, u32 dst, u32 src, u32 length, u32* status, Jac_DVDCallback callback); +extern s32 DVDT_ARAMtoDRAM_Main(void* arg); +extern s32 DVDT_DRAMtoARAM_Main(void* arg); +extern s32 DVDT_ARAMtoDRAM(u32 owner, u32 dst, u32 src, u32 length, u32* status, Jac_DVDCallback callback); +extern s32 DVDT_DRAMtoARAM(u32 owner, u32 dst, u32 src, u32 length, u32* status, Jac_DVDCallback callback); +extern s32 DVDT_CheckFile(char* file); +extern void DVDT_CheckPass(u32 owner, u32* status, Jac_DVDCallback callback); +extern s32 Jac_CheckFile(char* file); +extern void Jac_RegisterDVDErrorCallback(ErrorCallback callback); +extern s32 Jac_RegisterFastOpen(char* file); +extern BOOL Jac_DVDOpen(char* name, DVDFileInfo* info); -extern s32 DVDT_LoadtoARAM(u32 owner, char* path, u32 dram, u32 aram, u32 len, u32* outLen, Jac_DVDCallback callback); -extern s32 DVDT_DRAMtoARAM(u32 owner, u32 dram, u32 aram, u32 len, u32* outLen, Jac_DVDCallback callback); -extern s32 DVDT_ARAMtoDRAM(u32 owner, u32 dram, u32 aram, u32 len, u32* outLen, Jac_DVDCallback callback); -extern u32 Jac_CheckFile(char* path); -extern void* jac_dvdproc(void* param); -extern void jac_dvdproc_init(void); #endif diff --git a/src/static/jaudio_NES/internal/dvdthread.c b/src/static/jaudio_NES/internal/dvdthread.c new file mode 100644 index 00000000..6866e7f1 --- /dev/null +++ b/src/static/jaudio_NES/internal/dvdthread.c @@ -0,0 +1,464 @@ +#include "jaudio_NES/dvdthread.h" +#include "jaudio_NES/sample.h" +#include "jaudio_NES/aictrl.h" +#include "dolphin/os.h" +#include "dolphin/dvd.h" +#include "dolphin/ar.h" +#include "dolphin/string.h" +#include "dolphin/os/OSTime.h" + +typedef struct DVDCall_ { + u32 owner; + char fileName[64]; + u32 dst; + u32 src; + u32 length; + u32* callbackStatus; + Jac_DVDCallback callback; +} DVDCall; + +static char audio_root_path[32] = ""; +static OSMessageQueue mq; +static s32 msgbuf[0x80]; +static u8 CALLSTACK[0x8000]; + +static u32 mq_init; +static size_t buffersize; +static u32 buffers; +static size_t next_buffersize; +static u8* next_buffertop; +static u32 next_buffers; +static u32 cur_q; +static OSThreadQueue dvdt_sleep; +static BOOL DVDT_PAUSE_FLAG; + +static ErrorCallback error_callback; +static u8* ADVD_BUFFER[2]; +static u32 buffer_load; + +static void __Alloc_DVDBuffer(); +static void __UpdateBuffer(); +static void __WriteBufferSize(u8* buf, u32 amount, u32 size); + +static void* GetCallStack() { + BOOL enable = OSDisableInterrupts(); + void* ret; + u32 pre = cur_q + 1; + + ret = &CALLSTACK[cur_q * 0x100]; + + cur_q = pre; + + if (pre == 0x80) { + cur_q = 0; + } + + OSRestoreInterrupts(enable); + + return ret; +} + +static s32 DVDReadMutex(DVDFileInfo* fileInfo, void* addr, s32 len, s32 offs, char* arg4) { + if (DVDT_PAUSE_FLAG == true) { + OSSleepThread(&dvdt_sleep); + } + + while (true) { + if (DVDReadPrio(fileInfo, addr, len, offs, 2) != -1 || error_callback == nullptr) { + break; + } + error_callback(arg4, (u8*)addr); + } +} + +extern void DVDT_ExtendPath(char* dst, char* ext) { + if (*audio_root_path != nullptr) { + strcpy(dst, audio_root_path); + if (*ext == '/') { + strcat(dst, ext + 1); + } else { + strcat(dst, ext); + } + } else { + strcpy(dst, ext); + } +} + +extern s32 DVDT_AddTaskHigh(TaskCallback callback, void* stackp, size_t len) { + if (mq_init == false) { + return 0; + } + + TaskCallback* stack = (TaskCallback*)GetCallStack(); + + Jac_bcopy(stackp, stack + 1, len); + + *stack = callback; + OSJamMessage(&mq, (OSMessage)stack, OS_MESSAGE_BLOCK); + + return 1; +} + +extern s32 DVDT_AddTask(TaskCallback callback, void* stackp, size_t len) { + if (mq_init == false) { + return 0; + } + + TaskCallback* stack = (TaskCallback*)GetCallStack(); + + Jac_bcopy(stackp, stack + 1, len); + + *stack = callback; + OSSendMessage(&mq, (OSMessage)stack, OS_MESSAGE_BLOCK); + + return 1; +} + +extern void jac_dvdproc_init() { + OSInitMessageQueue(&mq, (OSMessage*)msgbuf, ARRAY_COUNT(msgbuf)); + mq_init = 1; +} + +extern void* jac_dvdproc(void* arg) { + __Alloc_DVDBuffer(); + TaskCallback* callback; + + u8* buf = (u8*)OSAlloc2(0x10000); + + OSInitThreadQueue(&dvdt_sleep); + OSMessage msg; + while (true) { + while (true) { + OSReceiveMessage(&mq, &msg, OS_MESSAGE_BLOCK); + callback = (TaskCallback*)msg; + __UpdateBuffer(); + + if (buffersize == 0) { + __WriteBufferSize(buf, 2, 0x8000); + } + if (callback != nullptr) { + break; + }; + } + (*callback)(callback + 1); + } +} + +static void __DoError(DVDCall* call, u32 type) { + if (call->callbackStatus != nullptr) { + *call->callbackStatus = -1; + } + + if (call->callback != nullptr) { + call->callback(-1); + } +} + +static void __DoFinish(DVDCall* call, u32 arg) { + if (call->callbackStatus != nullptr) { + *call->callbackStatus = arg; + } + + if (call->callback != nullptr) { + call->callback(call->owner); + } +} +static void __DVDT_CheckBack(void* cb) { + DVDCall* callback = (DVDCall*)cb; + + __DoFinish(callback, callback->owner); +} + +static void __Alloc_DVDBuffer() { + if (buffersize == 0) { + int i; + + for (i = 0; i < buffers; i++) { + ADVD_BUFFER[i] = 0; + } + } +} + +static void __WriteBufferSize(u8* buf, u32 amount, u32 size) { + buffersize = size; + buffers = amount; + + int i; + int j = amount; + + for (i = 0; i < amount; i++, j--) { + ADVD_BUFFER[i] = buf; + buf += size; + } +} + +static void __UpdateBuffer() { + if (next_buffers != 0) { + __WriteBufferSize(next_buffertop, next_buffers, next_buffersize); + next_buffers = 0; + next_buffertop = nullptr; + } +} + +static vu32 buffer_full; + +static void ARAM_DMAfinish(u32 arg0) { + buffer_full -= 1; +} + +extern s32 DVDT_LoadtoARAM_Main(void* arg) { + DVDCall* call = (DVDCall*)arg; + static int arq_index = 0; + static DVDFileInfo finfo; + static ARQRequest req[4]; + + if (!Jac_DVDOpen(call->fileName, &finfo)) { + __DoError(call, 0); + return -1; + } + + u32 len = finfo.length; + if (len == 0) { + __DoError(call, 1); + return -1; + } + + if (call->length == 0) { + call->length = len; + + if (call->src != 0) { + call->length -= call->src; + } + } + + OSGetTick(); + + while (call->length != 0) { + u32 readSize; + u8* buf = ADVD_BUFFER[buffer_load]; + buffer_load = (buffer_load + 1) % buffers; + while (buffer_full == buffers) + ; + + if (call->length < buffersize) { + readSize = ALIGN_NEXT(call->length, 32); + len = DVDReadMutex(&finfo, buf, readSize, call->src, call->fileName); + + call->length = 0; + } else { + readSize = buffersize; + len = DVDReadMutex(&finfo, buf, buffersize, call->src, call->fileName); + + call->src += buffersize; + call->length -= buffersize; + } + + ARQPostRequest(&req[arq_index], 0x12345678, ARQ_TYPE_MRAM_TO_ARAM, ARQ_PRIORITY_HIGH, (u32)buf, call->dst, + readSize, ARAM_DMAfinish); + buffer_full++; + arq_index++; + arq_index &= 3; + call->dst += readSize; + } + + DVDClose(&finfo); + + while (buffer_full != 0) + ; + + OSGetTick(); + + __DoFinish(call, len); + + return 0; +} + +extern s32 DVDT_LoadtoARAM(u32 owner, char* name, u32 dst, u32 src, u32 length, u32* status, Jac_DVDCallback callback) { + DVDCall call; + void* cb = (void*)&call; + + call.owner = owner; + DVDT_ExtendPath(call.fileName, name); + + call.dst = dst; + call.callbackStatus = status; + if (status != 0) { + *status = 0; + } + + call.callback = callback; + call.src = src; + call.length = length; + + DVDT_AddTask(DVDT_LoadtoARAM_Main, cb, 0x58); + + return 0; +} + +static vu32 buffer_full2; + +static void ARAM_DMAfinish2(u32) { + buffer_full2 -= 1; +} + +extern s32 DVDT_ARAMtoDRAM_Main(void* arg) { + static ARQRequest req; + DVDCall* call = (DVDCall*)arg; + + buffer_full2++; + + ARQPostRequest(&req, (u32)call, ARQ_TYPE_ARAM_TO_MRAM, ARQ_PRIORITY_HIGH, call->src, call->dst, call->length, + ARAM_DMAfinish2); + + while (buffer_full2 != 0) + ; + + __DoFinish(call, call->length); + + return 0; +} + +extern s32 DVDT_DRAMtoARAM_Main(void* arg) { + static ARQRequest req; + DVDCall* call = (DVDCall*)arg; + + buffer_full2++; + + ARQPostRequest(&req, (u32)call, ARQ_TYPE_MRAM_TO_ARAM, ARQ_PRIORITY_HIGH, call->dst, call->src, call->length, + ARAM_DMAfinish2); + + while (buffer_full2 != 0) + ; + + __DoFinish(call, call->length); + + return 0; +} + +extern s32 DVDT_ARAMtoDRAM(u32 owner, u32 dst, u32 src, u32 length, u32* status, Jac_DVDCallback callback) { + DVDCall call; + void* cb = (void*)&call; + + call.owner = owner; + call.dst = dst; + call.callbackStatus = status; + + if (status != 0) { + *status = 0; + } + + call.callback = callback; + call.src = src; + call.length = length; + + DVDT_AddTaskHigh(DVDT_ARAMtoDRAM_Main, cb, 0x58); + + return 0; +} + +extern s32 DVDT_DRAMtoARAM(u32 owner, u32 dst, u32 src, u32 length, u32* status, Jac_DVDCallback callback) { + DVDCall call; + void* cb = (void*)&call; + + call.owner = owner; + call.dst = dst; + call.callbackStatus = status; + + if (status != 0) { + *status = 0; + } + + call.callback = callback; + call.src = src; + call.length = length; + + DVDT_AddTaskHigh(DVDT_DRAMtoARAM_Main, cb, 0x58); + + return 0; +} + +extern s32 DVDT_CheckFile(char* file) { + static DVDFileInfo finfo; + + char path[64]; + DVDT_ExtendPath(path, file); + + if (!Jac_DVDOpen(path, &finfo)) { + return 0; + } + u32 len = finfo.length; + + DVDClose(&finfo); + + return len; +} + +extern void DVDT_CheckPass(u32 owner, u32* status, Jac_DVDCallback callback) { + DVDCall call; + void* cb = (void*)&call; + + call.owner = owner; + call.callbackStatus = status; + call.callback = callback; + + DVDT_AddTask((TaskCallback)__DVDT_CheckBack, cb, 0x58); +} + +extern s32 Jac_CheckFile(char* file) { + static DVDFileInfo finfo; + + if (!Jac_DVDOpen(file, &finfo)) { + return 0; + } + u32 len = finfo.length; + + DVDClose(&finfo); + + return len; +} + +extern void Jac_RegisterDVDErrorCallback(ErrorCallback callback) { + error_callback = callback; + +} + +static u32 dvdfile_dics; +static char dvd_file[32][64]; +static u32 dvd_entrynum[32]; + +extern s32 Jac_RegisterFastOpen(char* file) { + int num; + if (strlen(file) > 63) { + return -1; + } + + int i; + + for (i = 0; i < dvdfile_dics; i++) { + if (!strcmp(dvd_file[i], file)) { + return dvd_entrynum[i]; + } + } + if (dvdfile_dics == 32) { + return -1; + } + + num = DVDConvertPathToEntrynum(file); + + if (num != -1) { + strcpy(dvd_file[dvdfile_dics], file); + dvd_entrynum[dvdfile_dics] = num; + dvdfile_dics++; + } + return num; +} + +extern BOOL Jac_DVDOpen(char* name, DVDFileInfo* info) { + int entry = Jac_RegisterFastOpen(name); + + if (entry == -1) { + return DVDOpen(name, info); + } else { + return DVDFastOpen(entry, info); + } +} From 5299baa10b845c9d6b944dcb5f08234cbb7ad5ec Mon Sep 17 00:00:00 2001 From: Prakxo Date: Wed, 12 Jun 2024 21:52:32 +0200 Subject: [PATCH 2/3] link dspboot --- config/disasm_overrides.yml | 1 + config/dol_slices.yml | 5 + include/dolphin/dsp.h | 1 + include/jaudio_NES/dspboot.h | 14 + include/jaudio_NES/dspproc.h | 1 + src/static/jaudio_NES/internal/dspboot.c | 380 +++++++++++++++++++++++ 6 files changed, 402 insertions(+) create mode 100644 src/static/jaudio_NES/internal/dspboot.c diff --git a/config/disasm_overrides.yml b/config/disasm_overrides.yml index 8415cc47..a8a46532 100644 --- a/config/disasm_overrides.yml +++ b/config/disasm_overrides.yml @@ -11,6 +11,7 @@ symbol_aligns: 0x80026400: 32 0x80031d80: 32 0x8001ada0: 32 + 0x8002cd20: 32 0x8018f1a8: 8 0x80207458: 8 # align RunQueue to 0x001251d8 0x800b9140: 32 # align gam_win_moji1_tex to 32 bytes diff --git a/config/dol_slices.yml b/config/dol_slices.yml index 8b2ff1d9..d889bc92 100644 --- a/config/dol_slices.yml +++ b/config/dol_slices.yml @@ -116,6 +116,11 @@ jaudio_NES/internal/os.c: .text: [0x80026120, 0x80026300] jaudio_NES/internal/astest.c: .text: [0x80026300, 0x80026400] +jaudio_NES/internal/dspboot.c: + .text: [0x8002c920, 0x8002cd20] + .rodata: [0x800aa780, 0x800aa7a0] + .data: [0x800d3b00, 0x800d5500] + .sdata2: [0x80218f08, 0x80218f10] jaudio_NES/internal/random.c: .text: [0x80031ce0, 0x80031d80] .sdata: [0x80217c38, 0x80217c40] diff --git a/include/dolphin/dsp.h b/include/dolphin/dsp.h index e3a5d43f..96e62398 100644 --- a/include/dolphin/dsp.h +++ b/include/dolphin/dsp.h @@ -53,6 +53,7 @@ void DSPHalt(); void DSPSendMailToDSP(u32 mail); u32 DSPCheckMailToDSP(); u32 DSPCheckMailFromDSP(); +u32 DSPReadMailFromDSP(); u32 DSPGetDMAStatus(); DSPTaskInfo* DSPAddTask(DSPTaskInfo* task); diff --git a/include/jaudio_NES/dspboot.h b/include/jaudio_NES/dspboot.h index 0839e0d4..326a00af 100644 --- a/include/jaudio_NES/dspboot.h +++ b/include/jaudio_NES/dspboot.h @@ -3,6 +3,20 @@ #include "types.h" +typedef struct STRUCT_DSP_TASK2 { + /* 0x00 */ u16* iram_mmem_addr; + /* 0x04 */ u32 iram_length; + /* 0x08 */ u16 iram_addr; + /* 0x0A */ u16* dram_mmem_addr; + /* 0x0E */ u32 dram_length; + /* 0x12 */ u16 dram_addr; + /* 0x16 */ u16 dsp_init_vector; +}DSPTaskInfo2; + +extern s32 __DSPCheckMXICBoot2(DSPTaskInfo2* task); +extern void DSPInit2(DSPTaskInfo2* task); extern void DspBoot(void); +extern u16 jdsp[]; + #endif diff --git a/include/jaudio_NES/dspproc.h b/include/jaudio_NES/dspproc.h index 018be422..8ab52eb0 100644 --- a/include/jaudio_NES/dspproc.h +++ b/include/jaudio_NES/dspproc.h @@ -5,5 +5,6 @@ extern u32 DSPReleaseHalt(void); extern void DsyncFrame(u32 subframes, u32 dspbuf_start, u32 dspbuf_end); +extern void DwaitFrame(); #endif diff --git a/src/static/jaudio_NES/internal/dspboot.c b/src/static/jaudio_NES/internal/dspboot.c new file mode 100644 index 00000000..bf9f38a8 --- /dev/null +++ b/src/static/jaudio_NES/internal/dspboot.c @@ -0,0 +1,380 @@ +#include "jaudio_NES/dspboot.h" +#include "jaudio_NES/dspproc.h" +#include "dolphin/dsp.h" +#include "dolphin/os.h" +#include "dolphin/hw_regs.h" + +u16 jdsp[] ATTRIBUTE_ALIGN(32) = { + 0x029F, 0x0010, 0x0000, 0x0000, 0x02FF, 0x0000, 0x02FF, 0x0000, 0x02FF, 0x0000, 0x02FF, 0x0000, 0x02FF, 0x0000, + 0x02FF, 0x0000, 0x1302, 0x1303, 0x1204, 0x1305, 0x1306, 0x8E00, 0x8C00, 0x8B00, 0x009E, 0xFFFF, 0x1D1E, 0x1D3E, + 0x1D5E, 0x1D7E, 0x0092, 0x00FF, 0x8100, 0x009F, 0x1000, 0x0080, 0x0000, 0x005F, 0x1B1E, 0x26FF, 0x16FC, 0x8888, + 0x16FD, 0x1111, 0x26FC, 0x02A0, 0x8000, 0x029C, 0x002C, 0x8100, 0x8900, 0x26FE, 0x02C0, 0x8000, 0x029C, 0x0031, + 0x27FF, 0x00FF, 0x0345, 0x1FFE, 0x0340, 0x00FF, 0x00FF, 0x0344, 0x1479, 0x0240, 0x007E, 0x0200, 0x0062, 0x00FE, + 0x0343, 0x1C1E, 0x170F, 0x009E, 0x8000, 0x00DC, 0x0343, 0x02BF, 0x005A, 0x029F, 0x0031, 0x26FE, 0x02C0, 0x8000, + 0x029C, 0x0051, 0x24FF, 0x1B1E, 0x1B1C, 0x02DF, 0x2EFC, 0x2CFD, 0x26FC, 0x02A0, 0x8000, 0x029C, 0x005C, 0x02DF, + 0x029F, 0x0049, 0x029F, 0x031D, 0x029F, 0x04BF, 0x029F, 0x0031, 0x029F, 0x00E1, 0x029F, 0x00F3, 0x029F, 0x06C4, + 0x029F, 0x0678, 0x029F, 0x06E0, 0x029F, 0x06A8, 0x029F, 0x0049, 0x029F, 0x0721, 0x029F, 0x0BA7, 0x029F, 0x0049, + 0x193E, 0x193C, 0x2FCD, 0x0F00, 0x2FC9, 0x2ECE, 0x2CCF, 0x1FE0, 0x1501, 0x2FCB, 0x02BF, 0x0091, 0x02DF, 0x193E, + 0x193C, 0x2FCD, 0x0F01, 0x029F, 0x0082, 0x26C9, 0x02A0, 0x0004, 0x029C, 0x0091, 0x02DF, 0x193E, 0x193C, 0x00FF, + 0xFFCD, 0x0F00, 0x00FF, 0xFFC9, 0x00FE, 0xFFCE, 0x00FC, 0xFFCF, 0x1FE0, 0x1501, 0x00FF, 0xFFCB, 0x02DF, 0x00DE, + 0xFFC9, 0x02A0, 0x0004, 0x029C, 0x00A7, 0x02DF, 0x193E, 0x193C, 0x0240, 0x7FFF, 0x02BF, 0x00BC, 0x007A, 0x00BA, + 0x26D3, 0x1B3E, 0x0000, 0x0000, 0x0000, 0x02DF, 0x1C3F, 0x009F, 0x0005, 0x2FD1, 0x1F5E, 0x1F1C, 0x2ED4, 0x2CD5, + 0x8900, 0x1FA0, 0x4C00, 0x0200, 0x0030, 0x2ED6, 0x2CD7, 0x1FDA, 0x1F98, 0x147F, 0x2ED8, 0x2CD9, 0x1F40, 0x02DF, + 0x193E, 0x193C, 0x0260, 0x8000, 0x02BF, 0x00BC, 0x007A, 0x00DF, 0x193E, 0x2ED3, 0x0000, 0x0000, 0x0000, 0x0000, + 0x02DF, 0x0080, 0x0346, 0x02BF, 0x0051, 0x02BF, 0x0051, 0x0081, 0x0346, 0x00DF, 0x0349, 0x0340, 0xFFFF, 0x00C0, + 0x0345, 0x02BF, 0x007E, 0x029F, 0x0049, 0x0080, 0x0346, 0x02BF, 0x0051, 0x02BF, 0x0051, 0x0081, 0x0346, 0x00DF, + 0x0349, 0x0340, 0xFFFF, 0x00C0, 0x0345, 0x02BF, 0x008B, 0x029F, 0x0049, 0x0092, 0x00FF, 0x2FD1, 0x0340, 0x0003, + 0x1F7F, 0x1F5E, 0x1F1C, 0x0200, 0x0010, 0x2ED4, 0x2CD5, 0x8900, 0x1FA0, 0x4C00, 0x0200, 0x0030, 0x2ED6, 0x2CD7, + 0x1FDA, 0x1F98, 0x1FFB, 0x7900, 0x02CA, 0x2ED8, 0x2CD9, 0x02DF, 0x1C23, 0x197E, 0x191B, 0xD858, 0x1120, 0x012A, + 0xDCD3, 0x6231, 0xDCD3, 0x6231, 0x4900, 0x1108, 0x0130, 0xDCD3, 0x6231, 0xDCD3, 0x6231, 0x02DF, 0x8F00, 0x1C03, + 0x00DB, 0x038E, 0x009A, 0x0004, 0x1978, 0xA843, 0xAE00, 0x1128, 0x0140, 0x38C3, 0xAE30, 0x38C3, 0xAE30, 0x8E00, + 0x02DF, 0x00F9, 0x0361, 0x1FC0, 0x0200, 0xFFFC, 0x1C1E, 0x1C5E, 0x0083, 0x043C, 0x197E, 0x197F, 0x80A2, 0x64A3, + 0x6530, 0x1B1F, 0x1C02, 0x8100, 0x00DE, 0x0402, 0x00FE, 0x0362, 0x1474, 0x1F7E, 0x1F3C, 0x8900, 0x00DD, 0x0430, + 0x1504, 0x0604, 0x0290, 0x01B8, 0x1FDD, 0x0082, 0x0C00, 0x1050, 0x4B2A, 0x1FBE, 0x00FE, 0x0360, 0x8900, 0x1FBE, + 0x009A, 0xFFF8, 0x009B, 0x00FC, 0x00D8, 0x0361, 0x0082, 0x0C00, 0x0083, 0x0C00, 0x195E, 0x3480, 0x1128, 0x017D, + 0x367A, 0x35B3, 0x3772, 0x34BB, 0x8A00, 0x0082, 0x0C00, 0x00DD, 0x0430, 0x1504, 0x1FE0, 0x8100, 0x00DE, 0x0362, + 0x1474, 0x1F7E, 0x1F3C, 0x8F00, 0x1943, 0x4BC3, 0x90C3, 0xF2C3, 0xF2C3, 0xF200, 0xFE00, 0x1C1F, 0x1943, 0x4BC3, + 0x90C3, 0x114E, 0x019F, 0xF2C3, 0xF2C3, 0xF231, 0x1C1F, 0x1943, 0x4BC3, 0x92C3, 0xF2C3, 0xF2C3, 0xF231, 0xFE00, + 0x1B3E, 0x8B00, 0x8E00, 0x00FE, 0x0433, 0x1C1F, 0x150C, 0x0340, 0x0FFF, 0x00FF, 0x0430, 0x0083, 0x043C, 0x191E, + 0x191F, 0x80A0, 0x64A1, 0x6533, 0x1B7F, 0x02DF, 0x1FE0, 0x1C1F, 0x1128, 0x01C1, 0x4B70, 0x1B3E, 0x1C1F, 0x4B70, + 0x1B3E, 0x1C1F, 0x029F, 0x01A7, 0x8A00, 0x0083, 0x03E8, 0x191E, 0x191A, 0x1006, 0x64A0, 0x1B7E, 0x1B7A, 0x0080, + 0x03E8, 0x0088, 0x0007, 0x1150, 0x01DE, 0x1C61, 0x84C3, 0xF2C3, 0xF2C3, 0xF2C3, 0xF2C3, 0xF2C3, 0xF2C3, 0xF2C3, + 0xF200, 0xFE00, 0x1B3E, 0x0088, 0xFFFF, 0x8B00, 0x02DF, 0x8A00, 0x05FE, 0x0083, 0x03E8, 0x191E, 0x191A, 0x005F, + 0x64A0, 0x1B7E, 0x1B7A, 0x0080, 0x03E8, 0x0501, 0x1D1F, 0x1150, 0x01F9, 0x1C61, 0x84C3, 0x005F, 0xF2C3, 0xF200, + 0xFE00, 0x1B3E, 0x0088, 0xFFFF, 0x8B00, 0x02DF, 0x0083, 0x03E8, 0x191E, 0x191A, 0x64A0, 0x64A0, 0x1B7E, 0x1B7A, + 0x0080, 0x03E8, 0x0088, 0x0003, 0x0085, 0x0000, 0x0087, 0x0000, 0x1FC2, 0x195B, 0x1959, 0x195F, 0x195A, 0x1C5E, + 0x1FDA, 0x1C61, 0x8A00, 0x8F00, 0x191A, 0xB850, 0xE250, 0xEA50, 0xE8E8, 0xB650, 0x1127, 0x0229, 0xE3A8, 0x197E, + 0xE850, 0xEAF8, 0xBF50, 0xE2A9, 0x197F, 0xEA50, 0xE8E8, 0xB650, 0xE3A8, 0x197E, 0xE850, 0xEAF8, 0xBF00, 0x1BFF, + 0x197F, 0x8E00, 0x8B00, 0x0088, 0xFFFF, 0x1B5B, 0x1B59, 0x1B5F, 0x1B5E, 0x02DF, 0x8100, 0x1F5E, 0x00D8, 0x0402, + 0x00DC, 0x0430, 0x0080, 0x0520, 0x00DF, 0x0480, 0x1501, 0x0340, 0x007E, 0x0300, 0x024F, 0x1C5F, 0x175F, 0x00FC, + 0x0430, 0x029F, 0x054A, 0x029F, 0x0270, 0x029F, 0x02AB, 0x029F, 0x0293, 0x029F, 0x0280, 0x029F, 0x02B9, 0x029F, + 0x026F, 0x029F, 0x02D7, 0x029F, 0x02DA, 0x029F, 0x026F, 0x029F, 0x026F, 0x029F, 0x02F8, 0x029F, 0x02B1, 0x029F, + 0x02B5, 0x029F, 0x026F, 0x029F, 0x026F, 0x029F, 0x026F, 0x02DF, 0x1401, 0x009B, 0xC000, 0x0099, 0x4000, 0x1150, + 0x027D, 0x02C0, 0x0001, 0x027C, 0x1B1B, 0x027D, 0x1B19, 0x4800, 0x147F, 0x02DF, 0x1402, 0x8900, 0x1FB8, 0x1501, + 0x009B, 0xC000, 0x0099, 0x4000, 0x1150, 0x0290, 0x02C0, 0x0003, 0x027C, 0x1B1B, 0x027D, 0x1B19, 0x4C00, 0x147E, + 0x02DF, 0x1401, 0x0081, 0x0CA0, 0x009B, 0xC000, 0x0099, 0x4000, 0x8900, 0x0082, 0x0000, 0x1150, 0x02A8, 0x02C0, + 0x0001, 0x027C, 0x1B1B, 0x027D, 0x1B19, 0x183D, 0x4900, 0x1FE2, 0x4C39, 0x147F, 0x02DF, 0x8900, 0x1FB8, 0x157F, + 0x1050, 0x4C20, 0x02DF, 0x0082, 0x0180, 0x029F, 0x02BB, 0x0082, 0x01C0, 0x029F, 0x02BB, 0x0082, 0x0140, 0x008A, + 0x003F, 0x0086, 0x0000, 0x1406, 0x8900, 0x1FB8, 0x1505, 0x009B, 0x003F, 0x009A, 0x0000, 0x3600, 0x1CDE, 0x001A, + 0x3400, 0x1150, 0x02D1, 0x4C4A, 0x3606, 0x1CDE, 0x340E, 0x1B19, 0x1FC2, 0x147A, 0x008A, 0xFFFF, 0x02DF, 0x1050, + 0x1B18, 0x02DF, 0x0082, 0x0100, 0x008A, 0x003F, 0x0086, 0x0000, 0x1406, 0x8900, 0x1FB8, 0x1505, 0x009B, 0x003F, + 0x009A, 0x0000, 0x3600, 0x1CDE, 0x001A, 0x3400, 0x1150, 0x02F2, 0x4C4A, 0x3606, 0x1CDE, 0x340E, 0x1B19, 0x1FC2, + 0x147A, 0x008A, 0xFFFF, 0x02DF, 0x0082, 0x0100, 0x008A, 0x003F, 0x0086, 0x0000, 0x0081, 0x0CA0, 0x1406, 0x8900, + 0x1FB8, 0x1505, 0x009B, 0x003F, 0x009A, 0x0000, 0x3600, 0x1CDE, 0x001A, 0x3400, 0x1150, 0x0317, 0x1939, 0xA000, + 0x140A, 0x4E00, 0x1476, 0x4C4A, 0x3606, 0x1CDE, 0x340E, 0x1B19, 0x1FC2, 0x147A, 0x008A, 0xFFFF, 0x02DF, 0x0080, + 0x0380, 0x02BF, 0x0051, 0x02BF, 0x0051, 0x02BF, 0x0051, 0x02BF, 0x0051, 0x0081, 0x0382, 0x009F, 0x0000, 0x0080, + 0x0200, 0x02BF, 0x007E, 0x0081, 0x0384, 0x009F, 0x0300, 0x0080, 0x0020, 0x02BF, 0x007E, 0x02BF, 0x03A0, 0x00DE, + 0x0345, 0x00FE, 0x0342, 0x02BF, 0x0AB1, 0x029F, 0x0049, 0x00DE, 0x0344, 0x1404, 0x0200, 0x03A8, 0x1C1E, 0x02BF, + 0x0051, 0x02BF, 0x0051, 0x02BF, 0x0051, 0x00DE, 0x0345, 0x1B1E, 0x00DE, 0x0344, 0x0200, 0x03A4, 0x1C1E, 0x8100, + 0x1B1E, 0x02DF, 0x00DE, 0x0344, 0x1404, 0x0200, 0x03B0, 0x1C1E, 0x02BF, 0x0051, 0x02BF, 0x0051, 0x02BF, 0x0051, + 0x02BF, 0x0051, 0x02DF, 0x0081, 0x034C, 0x009F, 0x0400, 0x0080, 0x00C0, 0x02BF, 0x007E, 0x02DF, 0x0081, 0x034C, + 0x009F, 0x0400, 0x0080, 0x0080, 0x0081, 0x034C, 0x193E, 0x193C, 0x0098, 0x0000, 0x7000, 0x02BF, 0x008D, 0x02DF, + 0x191E, 0x191A, 0x005F, 0x64A0, 0x1B7E, 0x1B7A, 0x02DF, 0x191E, 0x191A, 0x007F, 0x038E, 0x32B2, 0x65A0, 0x33BA, + 0x64A1, 0x0000, 0x02DF, 0x8A00, 0x157F, 0x1C20, 0x1C03, 0x193A, 0x9051, 0x925B, 0x007F, 0x039D, 0x4651, 0x92B2, + 0x4651, 0x92B2, 0x8B00, 0x02DF, 0x0083, 0xFFA0, 0x0080, 0x0300, 0x009F, 0x000E, 0x1108, 0x03AB, 0x191E, 0x1B7E, + 0x191E, 0x1B7E, 0x02DF, 0x0080, 0x0F40, 0x0082, 0x0D00, 0x0083, 0x0D60, 0x009F, 0x0028, 0x02BF, 0x0387, 0x8900, + 0x009E, 0x0050, 0x0080, 0x0CA0, 0x005E, 0x1B1F, 0x0080, 0x0F40, 0x005E, 0x1B1F, 0x0080, 0x0FA0, 0x005E, 0x1B1F, + 0x0080, 0x0B00, 0x005E, 0x1B1F, 0x0080, 0x09A0, 0x005E, 0x1B1F, 0x02DF, 0x00C0, 0x03A0, 0x191A, 0x00DF, 0x03A1, + 0x009B, 0x00A0, 0x0081, 0x0393, 0x18BC, 0xB871, 0xBC00, 0x0080, 0x0050, 0x0508, 0x02BF, 0x0080, 0x00DE, 0x0390, + 0x02A0, 0x0001, 0x029D, 0x03EE, 0x0080, 0x0398, 0x009E, 0x0008, 0x00C1, 0x03A1, 0x02BF, 0x01C4, 0x009F, 0x0050, + 0x00C0, 0x03A1, 0x8100, 0x00DE, 0x0394, 0xB100, 0x0295, 0x03FD, 0x1C7E, 0x00D8, 0x0395, 0x02BF, 0x0391, 0x009F, + 0x0050, 0x00C0, 0x03A1, 0x8100, 0x00DE, 0x0396, 0xB100, 0x0295, 0x040C, 0x1C7E, 0x00D8, 0x0397, 0x02BF, 0x0391, + 0x00DE, 0x0390, 0x02A0, 0x0002, 0x02DD, 0x0080, 0x0398, 0x009E, 0x0008, 0x00C1, 0x03A1, 0x02BF, 0x01C4, 0x02DF, + 0x009F, 0x0DC0, 0x00FF, 0x03A1, 0x009F, 0x03A8, 0x00FF, 0x03A2, 0x009F, 0x03A4, 0x00FF, 0x03A0, 0x1104, 0x044F, + 0x00C0, 0x03A2, 0x0083, 0x0390, 0x009F, 0x000E, 0x02BF, 0x0380, 0x00DA, 0x0390, 0x8600, 0x0295, 0x0440, 0x00DF, + 0x03A1, 0x1C7F, 0x0550, 0x1C1F, 0x009F, 0x0006, 0x02BF, 0x0380, 0x02BF, 0x03CF, 0x00DE, 0x03A2, 0x0410, 0x00FE, + 0x03A2, 0x00DE, 0x03A1, 0x0460, 0x00FE, 0x03A1, 0x00DE, 0x03A0, 0x7400, 0x00FE, 0x03A0, 0x0000, 0x02DF, 0x00C0, + 0x03A0, 0x181A, 0x8100, 0x181E, 0x00DB, 0x0391, 0x7400, 0xD100, 0x0270, 0x8100, 0x1B1E, 0x00DF, 0x03A1, 0x009B, + 0x00A0, 0x0081, 0x0393, 0x18BC, 0xB871, 0xBC00, 0x0080, 0x0050, 0x02BF, 0x008D, 0x02DF, 0x009F, 0x0DC0, 0x00FF, + 0x03A1, 0x009F, 0x03A8, 0x00FF, 0x03A2, 0x009F, 0x03A4, 0x00FF, 0x03A0, 0x1104, 0x0497, 0x00C0, 0x03A2, 0x0083, + 0x0390, 0x009F, 0x000E, 0x02BF, 0x0380, 0x00DA, 0x0390, 0x8600, 0x0295, 0x0488, 0x02BF, 0x0451, 0x00DE, 0x03A2, + 0x0410, 0x00FE, 0x03A2, 0x00DE, 0x03A1, 0x0460, 0x00FE, 0x03A1, 0x00DE, 0x03A0, 0x7400, 0x00FE, 0x03A0, 0x0000, + 0x02DF, 0x0081, 0x0386, 0x009F, 0x03A8, 0x0080, 0x0040, 0x02BF, 0x007E, 0x02DF, 0x191E, 0x189C, 0x4800, 0x1B1E, + 0x1B1C, 0x02DF, 0x8100, 0x26FE, 0x02C0, 0x8000, 0x029C, 0x04A9, 0x26FF, 0x02DF, 0x0080, 0x0388, 0x0081, 0x0051, + 0x173F, 0x00DE, 0x0344, 0x00FE, 0x0341, 0x00DE, 0x0345, 0x00FE, 0x038E, 0x173F, 0x02DF, 0x02BF, 0x04B0, 0x009E, + 0x8000, 0x00DC, 0x0341, 0x02BF, 0x005A, 0x8100, 0x00FE, 0x0355, 0x02BF, 0x0499, 0x00DE, 0x0341, 0x007E, 0x0675, + 0x02BF, 0x03AD, 0x02BF, 0x041A, 0x02BF, 0x0B77, 0x02BF, 0x04A8, 0x8100, 0x00FE, 0x0354, 0x00DE, 0x0342, 0x007E, + 0x0629, 0x00D8, 0x0354, 0x009A, 0x0180, 0x8100, 0x00DE, 0x0380, 0x00DC, 0x0381, 0x9000, 0x9400, 0x00FE, 0x034C, + 0x00FC, 0x034D, 0x02BF, 0x0367, 0x00DA, 0x0400, 0x8600, 0x0295, 0x0624, 0x00DA, 0x0401, 0x8600, 0x0294, 0x0624, + 0x00DA, 0x0433, 0x00FA, 0x03F8, 0x00DA, 0x0406, 0x8600, 0x0294, 0x0A1F, 0x8100, 0x00DE, 0x0480, 0x0605, 0x0295, + 0x0517, 0x0609, 0x0295, 0x0517, 0x0620, 0x0295, 0x088E, 0x0621, 0x0295, 0x0897, 0x0608, 0x0295, 0x0A27, 0x029F, + 0x023A, 0x00D8, 0x0402, 0x8100, 0x8900, 0x00DC, 0x0430, 0x8D00, 0x0099, 0x0050, 0xA000, 0xA400, 0x1404, 0x8C00, + 0x1FFE, 0x0083, 0x0580, 0x8100, 0x00DE, 0x0480, 0x0605, 0x0295, 0x053C, 0x00DA, 0x0481, 0x8600, 0x0295, 0x0540, + 0x00DA, 0x0489, 0x8100, 0x00DE, 0x048B, 0x3800, 0x0240, 0x000F, 0x0295, 0x0540, 0x02BF, 0x07C8, 0x029F, 0x0542, + 0x02BF, 0x0927, 0x0080, 0x0580, 0x0081, 0x0520, 0x0099, 0x0000, 0x02BF, 0x0143, 0x00DA, 0x04A8, 0x8600, 0x0295, + 0x0553, 0x0080, 0x0520, 0x02BF, 0x0B51, 0x009E, 0x0520, 0x00FE, 0x038F, 0x8900, 0x00DF, 0x0484, 0x0340, 0x001F, + 0xB900, 0x0295, 0x0583, 0x00DE, 0x038F, 0x5C00, 0x00FE, 0x038F, 0x1C7E, 0x0080, 0x0440, 0x05FE, 0x02BF, 0x0380, + 0x0080, 0x0490, 0x00C1, 0x038F, 0x8900, 0x00DF, 0x0484, 0x0340, 0x001F, 0x02BF, 0x01E3, 0x00DE, 0x038F, 0x0450, + 0x1C1E, 0x0083, 0x0440, 0x8900, 0x00DF, 0x0484, 0x0340, 0x001F, 0x05FE, 0x02BF, 0x0380, 0x00DE, 0x0484, 0x0240, + 0x0020, 0x0295, 0x05A5, 0x0080, 0x04A4, 0x00C1, 0x038F, 0x0082, 0x0454, 0x0083, 0x04A7, 0x18FA, 0x8600, 0x0294, + 0x05A3, 0x18FA, 0x8600, 0x0294, 0x05A3, 0x18FA, 0x8600, 0x0294, 0x05A3, 0x8100, 0x18FE, 0x0280, 0x7FFF, 0x0295, + 0x05A5, 0x02BF, 0x01FE, 0x8100, 0x1C9E, 0x1CDE, 0x7400, 0x1CFE, 0x8100, 0x00DE, 0x0407, 0xB100, 0x0295, 0x05BD, + 0x00C3, 0x038F, 0x0007, 0x0080, 0x0477, 0x0084, 0xFFFF, 0x0087, 0xFFFF, 0x199A, 0x6554, 0x005E, 0x65AD, 0x00DA, + 0x0485, 0x8600, 0x0295, 0x05D3, 0x8900, 0x0086, 0x0005, 0x0082, 0x040A, 0x1106, 0x05CB, 0x18DE, 0x147F, 0x4D36, + 0xB900, 0x0294, 0x05D3, 0x009A, 0x0001, 0x00FA, 0x0401, 0x8F00, 0x0086, 0x0002, 0x0082, 0x0408, 0x1106, 0x0603, + 0x8100, 0x195E, 0x1200, 0xB100, 0x0275, 0x1300, 0x1C7E, 0x195E, 0x195F, 0x5C00, 0x14FB, 0x1F5E, 0x1F1C, 0x185E, + 0x0240, 0x00FF, 0x1F7E, 0x185E, 0x1478, 0x009C, 0x0000, 0xD100, 0x0295, 0x05F8, 0x185E, 0x0272, 0x7400, 0x0271, + 0x7800, 0x1A5E, 0x0006, 0x00DE, 0x038F, 0x5600, 0x029D, 0x0601, 0x1C1E, 0x02BF, 0x0120, 0x0000, 0x1B5F, 0x000A, + 0x8E00, 0x8100, 0x00DE, 0x0407, 0xB100, 0x0295, 0x061A, 0x00C3, 0x038F, 0x0087, 0x004F, 0x001F, 0x0080, 0x0477, + 0x0084, 0xFFFF, 0x0087, 0xFFFF, 0x19FA, 0x6557, 0x005E, 0x65AF, 0x00DA, 0x0406, 0x8600, 0x0294, 0x0622, 0x8100, + 0x00FE, 0x0404, 0x02BF, 0x0370, 0x00DE, 0x0354, 0x7400, 0x00FE, 0x0354, 0x0000, 0x16FB, 0x0001, 0x02BF, 0x0AD2, + 0x02BF, 0x0AE5, 0x02BF, 0x0B3C, 0x0080, 0x09A0, 0x0083, 0x0D00, 0x009F, 0x0050, 0x0098, 0x5A82, 0x02BF, 0x0391, + 0x0080, 0x09A0, 0x0083, 0x0D60, 0x009F, 0x0050, 0x02BF, 0x0391, 0x0083, 0x0D00, 0x02BF, 0x0132, 0x0081, 0x0388, + 0x009F, 0x0D00, 0x0080, 0x0050, 0x02BF, 0x008B, 0x0080, 0x0FA0, 0x0083, 0x0D60, 0x009F, 0x0050, 0x0098, 0x8000, + 0x02BF, 0x0391, 0x0083, 0x0D60, 0x02BF, 0x0132, 0x0081, 0x038A, 0x009F, 0x0D60, 0x0080, 0x0050, 0x02BF, 0x008B, + 0x009A, 0x0000, 0x0098, 0x00A0, 0x0080, 0x0388, 0x02BF, 0x04A2, 0x0080, 0x038A, 0x02BF, 0x04A2, 0x02BF, 0x046B, + 0x0000, 0x0000, 0x029F, 0x0031, 0x0080, 0x0346, 0x02BF, 0x0051, 0x02BF, 0x0051, 0x0081, 0x0346, 0x193E, 0x193C, + 0x009F, 0x0400, 0x00C0, 0x0345, 0x02BF, 0x0080, 0x0081, 0x0348, 0x193E, 0x193C, 0x009F, 0x0800, 0x00C0, 0x0345, + 0x02BF, 0x0080, 0x0081, 0x0346, 0x193E, 0x193C, 0x009F, 0x0800, 0x00C0, 0x0345, 0x02BF, 0x008D, 0x0081, 0x0348, + 0x193E, 0x193C, 0x009F, 0x0400, 0x00C0, 0x0345, 0x02BF, 0x008D, 0x029F, 0x0049, 0x0080, 0x0346, 0x02BF, 0x0051, + 0x02BF, 0x0051, 0x0081, 0x0346, 0x193E, 0x193C, 0x009F, 0x0400, 0x00C0, 0x0345, 0x02BF, 0x0080, 0x0081, 0x0348, + 0x193E, 0x193C, 0x009F, 0x0400, 0x00C0, 0x0345, 0x02BF, 0x008D, 0x029F, 0x0049, 0x0080, 0x0346, 0x02BF, 0x0051, + 0x02BF, 0x0051, 0x0081, 0x0346, 0x193E, 0x193C, 0x009F, 0x0400, 0x00C0, 0x0345, 0x02BF, 0x00B0, 0x0081, 0x0348, + 0x193E, 0x193C, 0x009F, 0x0400, 0x00C0, 0x0345, 0x02BF, 0x008D, 0x029F, 0x0049, 0x0080, 0x0346, 0x02BF, 0x0051, + 0x02BF, 0x0051, 0x0081, 0x0346, 0x193E, 0x193C, 0x009F, 0x0400, 0x00C0, 0x0344, 0x02BF, 0x0080, 0x0081, 0x0348, + 0x193E, 0x193C, 0x009F, 0x0800, 0x00C0, 0x0344, 0x02BF, 0x0080, 0x0080, 0x0400, 0x0083, 0x0800, 0x0084, 0x0000, + 0x00DA, 0x0345, 0x00DF, 0x0344, 0x8F00, 0x197B, 0xB800, 0x197B, 0x007F, 0x070D, 0x199E, 0xBC00, 0x80B2, 0x0000, + 0x8E00, 0x0081, 0x0346, 0x193E, 0x193C, 0x009F, 0x0400, 0x00C0, 0x0344, 0x02BF, 0x008D, 0x009E, 0x8200, 0x00DC, + 0x0344, 0x02BF, 0x005A, 0x029F, 0x0031, 0x0080, 0x0346, 0x02BF, 0x0051, 0x0081, 0x0346, 0x009F, 0x0400, 0x00C0, + 0x0345, 0x02BF, 0x007E, 0x02BF, 0x8644, 0x029F, 0x0049, 0x009E, 0x0458, 0x2231, 0x4400, 0x1C1E, 0x1FDA, 0x3280, + 0x7400, 0x2232, 0x4400, 0x0090, 0x0000, 0x029F, 0x074E, 0x009E, 0x0458, 0x2231, 0x4400, 0x1C1E, 0x1FDA, 0x3280, + 0x7400, 0x2232, 0x4400, 0x0090, 0x0000, 0x8200, 0x0270, 0x1FDF, 0x1F3E, 0x02BF, 0x07BB, 0x2634, 0x2435, 0x7200, + 0x5300, 0x2E34, 0x2C35, 0x02DF, 0x8100, 0x2234, 0x2035, 0x4800, 0x147C, 0x2E36, 0x2C37, 0x2380, 0x8D00, 0xC810, + 0xAE00, 0x8C00, 0x2035, 0xF000, 0x4E00, 0x238C, 0x218D, 0x4A00, 0x2E38, 0x2C39, 0x1FD8, 0x0240, 0x000F, 0x2E31, + 0x268A, 0x248B, 0x5800, 0x2E3A, 0x2C3B, 0x02DF, 0x8100, 0x2601, 0xB100, 0x0294, 0x07AF, 0x2236, 0x2037, 0x8100, + 0x268A, 0x248B, 0x147C, 0x5800, 0x0295, 0x078B, 0x02BF, 0x0812, 0x0E10, 0x2E32, 0x8100, 0x2E31, 0x02DF, 0x228A, + 0x208B, 0x8100, 0x2634, 0x2435, 0x5800, 0x0290, 0x0798, 0x02BF, 0x0812, 0x263B, 0x029F, 0x0787, 0x8100, 0x2681, + 0xB100, 0x0295, 0x07B0, 0x2688, 0x2489, 0x2E34, 0x2C35, 0x0E10, 0x2E32, 0x02BF, 0x0758, 0x2682, 0x2E67, 0x2683, + 0x2E66, 0x8100, 0x00FE, 0x0362, 0x02BF, 0x0812, 0x02DF, 0x8100, 0x0081, 0x0458, 0x1010, 0x1B3E, 0x7400, 0x2E01, + 0x0E10, 0x2E32, 0x8100, 0x2E31, 0x02DF, 0xB100, 0x02D5, 0x04FE, 0x1F1E, 0x191E, 0x0291, 0x07C6, 0x191A, 0x0058, + 0x64A0, 0x6433, 0x1B7E, 0x02DF, 0x0092, 0x0004, 0x02BF, 0x0758, 0x8100, 0x00FE, 0x0362, 0x8100, 0x263A, 0x243B, + 0xB100, 0x0294, 0x07E5, 0x02BF, 0x0776, 0x2231, 0x8600, 0x0294, 0x07E2, 0x02BF, 0x073F, 0xB900, 0x0295, 0x080F, + 0x02BF, 0x0758, 0x8100, 0x263A, 0x243B, 0x1F1F, 0x009A, 0x0000, 0x5800, 0x0290, 0x07FC, 0x8100, 0x2631, 0xB100, + 0x0294, 0x07F6, 0x02BF, 0x0776, 0x2201, 0x8600, 0x0294, 0x080C, 0x02BF, 0x0731, 0x02BF, 0x0758, 0x029F, 0x07CF, + 0x8100, 0x2631, 0xB100, 0x0294, 0x0803, 0x02BF, 0x0776, 0x02BF, 0x073F, 0xB900, 0x0295, 0x080F, 0x02BF, 0x0758, + 0x029F, 0x07FC, 0x8100, 0x005F, 0x1B7E, 0x0092, 0x00FF, 0x02DF, 0x00FF, 0x0360, 0x00DA, 0x0362, 0x8600, 0x0294, + 0x0824, 0x0A01, 0x00FA, 0x0362, 0x2638, 0x2439, 0x009F, 0x0005, 0x02BF, 0x0105, 0x0092, 0x0004, 0x0080, 0xFFD3, + 0x0084, 0x0000, 0x199E, 0x1FFE, 0x1401, 0x0240, 0x001E, 0x0200, 0x0300, 0x1C3E, 0x157C, 0x0340, 0x000F, 0x0A11, + 0x5500, 0x8100, 0x2680, 0x0605, 0x0295, 0x0852, 0x009A, 0x00F0, 0x009B, 0x000F, 0x0082, 0x0370, 0x1998, 0x6000, + 0x1107, 0x0849, 0x3400, 0x1408, 0x6032, 0x3644, 0x140C, 0x6032, 0x3400, 0x1408, 0x6032, 0x3600, 0x140C, 0x1B5E, + 0x029F, 0x0872, 0x009A, 0xC000, 0x0082, 0x0370, 0x1998, 0x6000, 0x1103, 0x0865, 0x1408, 0x3400, 0x6032, 0x140A, + 0x3400, 0x6032, 0x140C, 0x3400, 0x6032, 0x140E, 0x3444, 0x6032, 0x1408, 0x3400, 0x6032, 0x140A, 0x3400, 0x6032, + 0x140C, 0x3400, 0x6032, 0x140E, 0x3400, 0x1B5E, 0x8F00, 0x1F7F, 0x2066, 0x2767, 0x193A, 0x1939, 0x0080, 0x0370, + 0x0081, 0x0458, 0x1C80, 0xA000, 0xEA70, 0x1108, 0x0888, 0x3A93, 0xA478, 0x1485, 0xE831, 0x3B92, 0xA570, 0x1585, + 0xEA39, 0x8E00, 0x8900, 0x00DF, 0x0360, 0x02DF, 0x8900, 0x009F, 0x0050, 0x0083, 0x0520, 0x02BF, 0x08A9, 0x029F, + 0x054A, 0x00D8, 0x0402, 0x8100, 0x8900, 0x00DC, 0x0430, 0x009A, 0x0050, 0x9000, 0x9400, 0x1404, 0x1FFE, 0x0083, + 0x0580, 0x02BF, 0x08A9, 0x029F, 0x0542, 0x0092, 0x0004, 0x8100, 0x263A, 0x243B, 0x1F1F, 0x009A, 0x0000, 0x5800, + 0x0290, 0x08C9, 0x8900, 0x00C0, 0x043B, 0x02BF, 0x08EE, 0x8100, 0x1FD8, 0x223B, 0x5400, 0x0007, 0x1979, 0x005E, + 0x1B79, 0x009F, 0x0001, 0x2F01, 0x8900, 0x2F3B, 0x0092, 0x00FF, 0x02DF, 0x2E3A, 0x2C3B, 0x8100, 0x8900, 0x268A, + 0x2734, 0x5C00, 0x2E36, 0x5000, 0x0290, 0x08E8, 0x00C0, 0x0436, 0x02BF, 0x08EE, 0x8100, 0x1FD8, 0x2236, 0x5400, + 0x1C1E, 0x8100, 0x2E34, 0x2688, 0x2489, 0x2E8C, 0x2C8D, 0x02BF, 0x08EE, 0x0092, 0x00FF, 0x02DF, 0x1C18, 0x02BF, + 0x08EE, 0x0092, 0x00FF, 0x02DF, 0x8100, 0x1FC0, 0xB100, 0x02D5, 0x8900, 0x2734, 0x0340, 0x0001, 0x009B, 0x0000, + 0x1F3F, 0x268C, 0x248D, 0x8900, 0x2534, 0x1501, 0x4C00, 0x5A00, 0x5A00, 0x1C20, 0x1FE0, 0x0502, 0x1C1F, 0x009F, + 0x0A00, 0x0092, 0x00FF, 0x02BF, 0x0080, 0x0092, 0x0004, 0x2734, 0x1F61, 0x4700, 0x2F34, 0x0080, 0x0A00, 0x8900, + 0x1FF9, 0xB900, 0x0274, 0x0008, 0x8900, 0x1FE1, 0x191E, 0x0701, 0x0293, 0x0925, 0x191A, 0x05FE, 0x005F, 0x64A0, + 0x1B7E, 0x1B7A, 0x02DF, 0x1B7E, 0x02DF, 0x0092, 0x0004, 0x2201, 0x8600, 0x0294, 0x0958, 0x2204, 0x8600, 0x02B4, + 0x09AC, 0x2231, 0x8600, 0x0295, 0x094D, 0x009E, 0x0458, 0x4400, 0x1C1E, 0x0E10, 0x5400, 0x1F7E, 0x02BF, 0x07BB, + 0xD900, 0x0292, 0x094C, 0x0295, 0x0948, 0x2631, 0x4C00, 0x2E31, 0x029F, 0x09A9, 0x8100, 0x2E31, 0x029F, 0x09A9, + 0x5700, 0x8100, 0x2605, 0xB100, 0x0295, 0x0969, 0x8100, 0x2E05, 0x2281, 0x8600, 0x0294, 0x095F, 0x8100, 0x005F, + 0x1B7E, 0x7400, 0x2E01, 0x029F, 0x09A9, 0x2688, 0x2489, 0x2E34, 0x2C35, 0x02BF, 0x09B1, 0x2682, 0x2483, 0x2E67, + 0x2C66, 0x00FF, 0x0360, 0x2638, 0x2439, 0x009F, 0x0005, 0x02BF, 0x0105, 0x0092, 0x0004, 0x8900, 0x00FF, 0x0362, + 0x00DF, 0x0360, 0x02BF, 0x09CA, 0x8100, 0x00DE, 0x0362, 0x2280, 0x4400, 0x00FE, 0x0362, 0x8100, 0x263A, 0x243B, + 0x0A01, 0x0081, 0x0405, 0x7A00, 0xB100, 0x0275, 0x1A3A, 0x2E3A, 0x2C3B, 0x0710, 0x0293, 0x0997, 0x05F0, 0x2205, + 0x8600, 0x0294, 0x0952, 0x029F, 0x0978, 0x0275, 0x8900, 0x2F31, 0x1FC3, 0x04F0, 0x1C1E, 0x0083, 0x0458, 0x0E10, + 0x02BF, 0x07BB, 0x2638, 0x2439, 0x00D8, 0x0362, 0x7000, 0x2C39, 0x2E38, 0x0092, 0x00FF, 0x02DF, 0x8100, 0x2E34, + 0x2E35, 0x2E66, 0x2E67, 0x2334, 0x2135, 0x268A, 0x248B, 0x5A00, 0x147C, 0x2E3A, 0x2C3B, 0x2634, 0x2435, 0x147C, + 0x2280, 0xC010, 0x9600, 0xF000, 0x4E00, 0x238C, 0x218D, 0x4A00, 0x2E38, 0x2C39, 0x8100, 0x2E05, 0x2E31, 0x02DF, + 0x00FF, 0x0360, 0x0080, 0xFFD3, 0x0084, 0x0000, 0x199E, 0x1FFE, 0x1401, 0x0240, 0x001E, 0x0200, 0x0300, 0x1C3E, + 0x157C, 0x0340, 0x000F, 0x0A11, 0x5500, 0x009A, 0x00F0, 0x009B, 0x000F, 0x0082, 0x0370, 0x1998, 0x6000, 0x1107, + 0x09EC, 0x3400, 0x1408, 0x6032, 0x3644, 0x140C, 0x6032, 0x3400, 0x1408, 0x6032, 0x3600, 0x140C, 0x1B5E, 0x8F00, + 0x1F7F, 0x2066, 0x2767, 0x193A, 0x1939, 0x0080, 0x0370, 0x1C80, 0xA000, 0xEA70, 0x3A93, 0xA478, 0x1485, 0xE833, + 0x3B92, 0xA570, 0x1585, 0xEA3B, 0x1106, 0x0A0F, 0x3A93, 0xA478, 0x1485, 0xE833, 0x3B92, 0xA570, 0x1585, 0xEA3B, + 0x3A93, 0xA478, 0x1485, 0xE833, 0x3B92, 0xA500, 0x1585, 0x1B7F, 0x2E66, 0x2F67, 0x8E00, 0x8900, 0x00DF, 0x0360, + 0x02DF, 0x0083, 0x0520, 0x00DE, 0x0433, 0x1050, 0x1B7E, 0x029F, 0x054A, 0x0092, 0x0004, 0x2002, 0x8100, 0x8900, + 0x2430, 0x8D00, 0x0099, 0x0050, 0xA000, 0xA400, 0x1404, 0x8C00, 0x1FFE, 0x0083, 0x0580, 0x2201, 0x8600, 0x0294, + 0x0A4A, 0x2204, 0x8600, 0x02B4, 0x0A93, 0x8100, 0x2605, 0xB100, 0x0295, 0x0A57, 0x8100, 0x2E05, 0x2281, 0x8600, + 0x0294, 0x0A51, 0x8100, 0x005F, 0x1B7E, 0x7400, 0x2E01, 0x029F, 0x0A8F, 0x2688, 0x2489, 0x2E34, 0x2C35, 0x02BF, + 0x0A96, 0x00FF, 0x0360, 0x2638, 0x2439, 0x009F, 0x0005, 0x02BF, 0x0105, 0x0092, 0x0004, 0x00DF, 0x0360, 0x8100, + 0x263A, 0xB100, 0x0294, 0x0A76, 0x263B, 0x5C00, 0x0290, 0x0A76, 0x223B, 0x02BF, 0x0AA7, 0x5500, 0x009A, 0x0001, + 0x00FA, 0x0405, 0x029F, 0x0A44, 0x1F5F, 0x02BF, 0x0AA7, 0x00FA, 0x0362, 0x8100, 0x263A, 0x243B, 0x1570, 0x0A01, + 0x0081, 0x0405, 0x5C00, 0xB100, 0x0275, 0x1A3A, 0x2E3A, 0x2C3B, 0x2638, 0x2439, 0x00D8, 0x0362, 0x7000, 0x2C39, + 0x2E38, 0x0092, 0x00FF, 0x029F, 0x0542, 0x8100, 0x2E34, 0x2E35, 0x2334, 0x2135, 0x268A, 0x248B, 0x5A00, 0x2E3A, + 0x2C3B, 0x2634, 0x2435, 0x238C, 0x218D, 0x4A00, 0x2E38, 0x2C39, 0x8100, 0x2E05, 0x02DF, 0x0080, 0xFFD3, 0x0084, + 0x0000, 0x007A, 0x0AAF, 0x199E, 0x1488, 0x1B7E, 0x02DF, 0x009E, 0xFFFF, 0x00FE, 0x03F2, 0x8100, 0x00FE, 0x03F0, + 0x00FE, 0x03F6, 0x009E, 0x0100, 0x00FE, 0x03F7, 0x00DA, 0x03F7, 0x009E, 0x8000, 0x5400, 0x00FE, 0x03F5, 0x009E, + 0x0030, 0x00FE, 0x03F3, 0x009E, 0x0010, 0x00FE, 0x03F4, 0x009E, 0x0096, 0x00FE, 0x03F1, 0x02DF, 0x0080, 0x0B00, + 0x8100, 0x00DE, 0x03F0, 0x8900, 0xB100, 0x0275, 0x0550, 0x00FF, 0x03F0, 0x0200, 0x0B60, 0x1C7E, 0x009F, 0x004E, + 0x02BF, 0x0380, 0x02DF, 0x00DE, 0x03F1, 0x0200, 0x0B60, 0x1C7E, 0x8100, 0x8900, 0x009F, 0x00A0, 0x00DE, 0x03F1, + 0x5D00, 0x009E, 0x0050, 0x0750, 0x0270, 0x5D00, 0x00DA, 0x03F2, 0x8600, 0x0290, 0x0B17, 0x00DE, 0x03F3, 0x5C00, + 0x0293, 0x0B02, 0x029F, 0x0B1C, 0x00DB, 0x03F7, 0x009E, 0x8000, 0x4600, 0x029F, 0x0B0E, 0x00DB, 0x03F7, 0x009E, + 0x8000, 0x5600, 0x00FE, 0x03F5, 0x1FDA, 0x7C00, 0x1F5E, 0x00FE, 0x03F2, 0x029F, 0x0B1C, 0x00DE, 0x03F4, 0x5D00, + 0x0293, 0x0B09, 0x8900, 0x00DD, 0x03F5, 0x1501, 0x8100, 0x00DC, 0x03F6, 0x008B, 0x009F, 0x0080, 0x0B00, 0x0099, + 0x0000, 0x1150, 0x0B30, 0x1878, 0x4C00, 0x1CFE, 0x001F, 0x1FD9, 0x1B18, 0x009F, 0x0B60, 0x1FC3, 0x5C00, 0x00FE, + 0x03F1, 0x00FC, 0x03F6, 0x008B, 0xFFFF, 0x02DF, 0x009F, 0x0050, 0x0080, 0x0B00, 0x0083, 0x0D60, 0x0098, 0x3FFF, + 0x02BF, 0x0391, 0x009F, 0x0050, 0x0080, 0x0B00, 0x0083, 0x0D00, 0x0098, 0x3FFF, 0x02BF, 0x0391, 0x02DF, 0x8A00, + 0x8F00, 0x8100, 0x00DE, 0x0404, 0xB100, 0x0295, 0x0B5E, 0x8100, 0x00FE, 0x0478, 0x00FE, 0x0479, 0x00DF, 0x0479, + 0x00DB, 0x0478, 0x0099, 0x0000, 0x0084, 0x0000, 0x1150, 0x0B6F, 0x199E, 0x5C7C, 0xC000, 0x6E00, 0x1488, 0x4A00, + 0x1B1E, 0x1F7E, 0x00FB, 0x0478, 0x00FF, 0x0479, 0x8B00, 0x8E00, 0x02DF, 0x0080, 0x01BE, 0x1918, 0x191A, 0x0080, + 0x0180, 0x0083, 0x0180, 0x9070, 0x1FFE, 0x1120, 0x0B88, 0x7C00, 0xD450, 0x6533, 0xC550, 0x1501, 0x643B, 0x0080, + 0x01FE, 0x191A, 0x1918, 0x0080, 0x01C0, 0x0083, 0x01C0, 0x1FF8, 0x9070, 0xF800, 0x0240, 0x01FF, 0x0260, 0x2000, + 0x02BF, 0x0B9B, 0x02DF, 0xB900, 0x0272, 0x7C00, 0x1F7E, 0x4700, 0x1110, 0x0BA5, 0x473B, 0x473B, 0x473B, 0x473B, + 0x02DF, 0x1306, 0x0092, 0x00FF, 0x0088, 0xFFFF, 0x0089, 0xFFFF, 0x008A, 0xFFFF, 0x008B, 0xFFFF, 0x8E00, 0x8B00, + 0x8C00, 0x0080, 0x0346, 0x02BF, 0x0051, 0x0081, 0x0346, 0x009F, 0x0500, 0x0080, 0x0010, 0x02BF, 0x007E, 0x02BF, + 0x0BCF, 0x8E00, 0x0081, 0x0508, 0x009F, 0x0520, 0x0080, 0x0004, 0x02BF, 0x008B, 0x1206, 0x029F, 0x0049, 0x8100, + 0x0081, 0x0510, 0x1020, 0x1B3E, 0x00DF, 0x1456, 0x0340, 0xFFD0, 0x8417, 0x0080, 0x0500, 0x00DE, 0x0500, 0x00FE, + 0x0520, 0x00DE, 0x0501, 0x00FE, 0x0521, 0x0086, 0x0000, 0x0082, 0x051F, 0x00DE, 0x15F6, 0x1408, 0x00DF, 0x1766, + 0x0340, 0x00FF, 0x1F5F, 0x02BF, 0x88E5, 0x1F1C, 0x811E, 0x191E, 0x1478, 0x1FFC, 0x1F5E, 0x02BF, 0x8809, 0x02BF, + 0x8723, 0x0006, 0x8106, 0x00DE, 0x166C, 0x1404, 0x0240, 0xFF00, 0x00DF, 0x1231, 0x1578, 0x0340, 0x00FF, 0x1F5F, + 0x02BF, 0x88E5, 0x1F1C, 0x811E, 0x191E, 0x1478, 0x1FFC, 0x1F5E, 0x02BF, 0x8809, 0x02BF, 0x8723, 0x8100, 0x8900, + 0x00D1, 0x0505, 0x9900, 0x8200, 0x0295, 0x0C30, 0x0291, 0x0C3E, 0x0082, 0x0510, 0x0086, 0x0001, 0x00D0, 0x171B, + 0x9100, 0x7D00, 0x4D00, 0x1501, 0x1F5F, 0x00DF, 0x0503, 0x1504, 0x02BF, 0x8809, 0x029F, 0x0C4D, 0x0082, 0x0511, + 0x00DF, 0x0503, 0x1501, 0x1F5F, 0x00DE, 0x1043, 0x0240, 0xFFF0, 0x02BF, 0x88E5, 0x029F, 0x0C4D, 0x0082, 0x0510, + 0x0086, 0x0001, 0x00D0, 0x1285, 0x9100, 0x4D00, 0x1501, 0x00DE, 0x0503, 0x1404, 0x1F5E, 0x02BF, 0x8809, 0x0083, + 0x0513, 0x1B7E, 0x8923, 0x0083, 0x0513, 0x00DF, 0x0507, 0x00DE, 0x11B8, 0x0240, 0xFFF0, 0x1F5E, 0x02BF, 0x81F4, + 0xF100, 0x02BF, 0x8458, 0x8F00, 0x0082, 0x0515, 0x00DE, 0x0506, 0x00DA, 0x165B, 0x02BF, 0x88E5, 0x14FD, 0x1403, + 0x1B5E, 0x1B5C, 0x0082, 0x0516, 0x00DE, 0x1723, 0x14F4, 0x00DA, 0x166B, 0x02BF, 0x88E5, 0xB100, 0x0290, 0x0C79, + 0x8100, 0x14FD, 0x8E00, 0x00DF, 0x1491, 0x0340, 0xD0F0, 0x1CBF, 0x00DF, 0x1468, 0x00D1, 0x11FC, 0x157C, 0x1CDF, + 0x00D1, 0x11B8, 0x9900, 0x1418, 0x1478, 0x1F5E, 0x1FFE, 0x1F65, 0x3600, 0x1402, 0x1F66, 0x3700, 0x1501, 0x4C00, + 0x1518, 0x9900, 0x3500, 0x4C00, 0x00DF, 0x0512, 0x3F00, 0x00FF, 0x0512, 0x1470, 0x00DF, 0x0511, 0x3F00, 0x00FF, + 0x0511, 0x1FA5, 0x1501, 0x1FE6, 0xF100, 0x15F8, 0xF500, 0x1F5F, 0x1F7D, 0x8100, 0x00DE, 0x0511, 0x3400, 0x8900, + 0x00DF, 0x0512, 0x3500, 0x4C00, 0x00DF, 0x0512, 0x1578, 0x4C00, 0x8900, 0x1FFE, 0x1508, 0x3B00, 0x00DE, 0x0511, + 0x3E00, 0x00DF, 0x0512, 0x3B00, 0x1CBF, 0x00DA, 0x15F1, 0x3500, 0x0295, 0x0CDD, 0x00DF, 0x10E2, 0x1508, 0x1F5F, + 0x00DF, 0x103B, 0x7900, 0x3900, 0x3080, 0x00FE, 0x0522, 0x00DC, 0x1229, 0x00DD, 0x11F8, 0x5C00, 0xF000, 0x1FE5, + 0x3080, 0x029F, 0x0CF0, 0x00DF, 0x10CA, 0x1508, 0x1F5F, 0x00DF, 0x1043, 0x7500, 0x3900, 0x3080, 0x00FE, 0x0522, + 0x00DC, 0x1259, 0x00DD, 0x16FE, 0x4C00, 0xF000, 0x1FE5, 0x3080, 0x00FE, 0x0523, 0x02DF, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + +extern s32 __DSPCheckMXICBoot2(DSPTaskInfo2* task) { + u32 mail; + + while (DSPCheckMailFromDSP() == 0); + mail = DSPReadMailFromDSP(); + + if((mail + 0x7F8F0000) == 0xFEED){ + DSPSendMailToDSP(0x80F3A001); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP((u32)task->iram_mmem_addr); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(0x80F3A002); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(task->iram_length); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(0x80F3C002); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(task->iram_addr); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(0x80F3B002); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(0); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(0x80F3D001); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(task->dsp_init_vector); + while (DSPCheckMailToDSP() != 0); + + return 1; + } + + if((mail + 0x3F010000) == 0 || (mail + 0x3F010000) == 1){ + DSPSendMailToDSP(0xC0028073); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(0xC000FFCE); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP((u32)task->iram_mmem_addr >> 16 | 0xC0010000); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(0xC000FFCF); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP((u16)task->iram_mmem_addr | 0xC0010000); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(0xC000FFCD); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(task->iram_addr | 0xC0010000); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(0xC000FFC9); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(0xC0010002); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(0xC000FFCB); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(task->iram_length | 0xC0010000); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(0xC0028073); + while (DSPCheckMailToDSP() != 0); + + DSPSendMailToDSP(task->dsp_init_vector | 0xC0020000); + while (DSPCheckMailToDSP() != 0); + + return 1; + } + + return 0; +} + + +extern void DSPInit() { + +} + + +extern void DSPInit2 (DSPTaskInfo2* task){ + BOOL enable; + u16 tmp; + + enable = OSDisableInterrupts(); + __OSUnmaskInterrupts(OS_INTRMASK_DSP_DSP); + + tmp = __DSPRegs[DSP_CONTROL_STATUS]; + tmp = (tmp & ~0xA8)| 0x800; + __DSPRegs[DSP_CONTROL_STATUS] = tmp; + + tmp = __DSPRegs[DSP_CONTROL_STATUS]; + tmp = (tmp & ~0xAC) ; + __DSPRegs[DSP_CONTROL_STATUS] = tmp; + + OSRestoreInterrupts(enable); + + if(__DSPCheckMXICBoot2(task) != 1){ + OSPanic("mxic.c", 357,"DSPInit(): MXIC Boot failed."); + } +} + + +void DspBoot(){ + DSPTaskInfo2 task; + + task.iram_mmem_addr = jdsp; + task.iram_length = sizeof(jdsp); + task.iram_addr = 0; + task.dram_mmem_addr = jdsp; + task.dram_length = 0x100; + task.dram_addr = 0; + + task.dsp_init_vector = 0; + DSPInit2(&task); + + while(DSPCheckMailFromDSP() == 0); + DSPReadMailFromDSP(); + DSPCheckMailFromDSP(); + DwaitFrame(); +} From 0896b19994bde7330dfe94da9736199ce8e8ad41 Mon Sep 17 00:00:00 2001 From: Prakxo Date: Thu, 13 Jun 2024 00:23:42 +0200 Subject: [PATCH 3/3] link dspproc --- config/disasm_overrides.yml | 2 +- config/dol_slices.yml | 3 + src/static/jaudio_NES/internal/dspproc.c | 92 ++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 src/static/jaudio_NES/internal/dspproc.c diff --git a/config/disasm_overrides.yml b/config/disasm_overrides.yml index a8a46532..e5db3a93 100644 --- a/config/disasm_overrides.yml +++ b/config/disasm_overrides.yml @@ -11,7 +11,7 @@ symbol_aligns: 0x80026400: 32 0x80031d80: 32 0x8001ada0: 32 - 0x8002cd20: 32 + 0x8002cfe0: 32 0x8018f1a8: 8 0x80207458: 8 # align RunQueue to 0x001251d8 0x800b9140: 32 # align gam_win_moji1_tex to 32 bytes diff --git a/config/dol_slices.yml b/config/dol_slices.yml index d889bc92..7a23d418 100644 --- a/config/dol_slices.yml +++ b/config/dol_slices.yml @@ -121,6 +121,9 @@ jaudio_NES/internal/dspboot.c: .rodata: [0x800aa780, 0x800aa7a0] .data: [0x800d3b00, 0x800d5500] .sdata2: [0x80218f08, 0x80218f10] +jaudio_NES/internal/dspproc.c: + .text: [0x8002cd20, 0x8002cfe0] + .sdata: [0x80217c18, 0x80217c20] jaudio_NES/internal/random.c: .text: [0x80031ce0, 0x80031d80] .sdata: [0x80217c38, 0x80217c40] diff --git a/src/static/jaudio_NES/internal/dspproc.c b/src/static/jaudio_NES/internal/dspproc.c new file mode 100644 index 00000000..8f97c5ed --- /dev/null +++ b/src/static/jaudio_NES/internal/dspproc.c @@ -0,0 +1,92 @@ +#include "jaudio_NES/dspproc.h" +#include "dolphin/dsp.h" + +static u16 DSP_MIXERLEVEL = 0x4000; + +extern s32 DSPSendCommands(u32* commands, u32 count) { + if (DSPCheckMailToDSP() != 0) { + return -1; + } + if (DSPCheckMailFromDSP() != 0) { + return -1; + } + + int i; + + for (i = 0; i < count; i++) { + DSPSendMailToDSP(commands[i]); + + while (DSPCheckMailToDSP() != 0); + } + + return 0; +} + +extern u32 DSPReleaseHalt() { + while (DSPCheckMailToDSP() != 0); + DSPSendMailToDSP(0); + if (DSPCheckMailFromDSP() != 0) { + DSPReadMailFromDSP(); + } + + return 0x88881357; +} + +extern void DSPWaitFinish() { + do { + while (DSPCheckMailFromDSP() == 0); + } while ((DSPReadMailFromDSP() + 0x77780000) == 0x1357); +} + +extern void DsetupTable(u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4) { + u32 commands[5]; + + commands[0] = (arg0 & 0xFFFF) | 0x81000000; + commands[1] = arg1; + commands[2] = arg2; + commands[3] = arg3; + commands[4] = arg4; + + DSPSendCommands(commands, ARRAY_COUNT(commands)); + DSPWaitFinish(); +} + +extern void DsyncFrame(u32 subframes, u32 dspbuf_start, u32 dspbuf_end){ + u32 commands[3]; + + commands[0] = (subframes << 16 & 0xFF0000) | 0x82000000 | DSP_MIXERLEVEL; + commands[1] = dspbuf_start; + commands[2] = dspbuf_end; + + DSPSendCommands(commands, ARRAY_COUNT(commands)); + DSPWaitFinish(); +} + +extern void DwaitFrame(){ + u32 commands[1]; + + commands[0] = 0x80000000; + DSPSendCommands(commands, ARRAY_COUNT(commands)); + DSPWaitFinish(); +} + +extern void DiplSec(u32 arg0){ + u32 commands[2]; + + commands[0] = 0x8B000008; + commands[1] = arg0; + DSPSendCommands(commands, ARRAY_COUNT(commands)); + DSPWaitFinish(); +} + +extern void DagbSec(u32 arg0){ + u32 commands[2]; + + commands[0] = 0x8C000008; + commands[1] = arg0; + DSPSendCommands(commands, ARRAY_COUNT(commands)); + DSPWaitFinish(); +} + + +