diff --git a/include/functions.h b/include/functions.h index 8ac7e3e4d3..3d9a0912ea 100644 --- a/include/functions.h +++ b/include/functions.h @@ -33,10 +33,10 @@ s32 DmaMgr_SendRequestImpl(DmaRequest* request, void* vramStart, u32 vromStart, s32 DmaMgr_SendRequest0(void* vramStart, u32 vromStart, u32 size); void Dmamgr_Start(void); void Dmamgr_Stop(void); -// u8* Yaz0_LoadFirstChunk(void); -u8* Yaz0_LoadNextChunk(void* currDecompPos); -s32 Yaz0_Decompress(u8* src, u8* dest); -void Yaz0_LoadAndDecompressFile(u32 romStart, u32 vramStart, u32 size); +void* Yaz0_FirstDMA(void); +void* Yaz0_NextDMA(void* curSrcPos); +s32 Yaz0_DecompressImpl(u8* hdr, u8* dst); +void Yaz0_Decompress(u32 romStart, void* dst, u32 size); void IrqMgr_AddClient(IrqMgr* irqmgr, OSMesgQueueListNode* param_2, OSMesgQueue* param_3); void IrqMgr_RemoveClient(IrqMgr* irqmgr, OSMesgQueueListNode* remove); void IrqMgr_SendMesgForClient(IrqMgr* irqmgr, OSMesg msg); @@ -247,7 +247,7 @@ s32 sprintf(char* s, char* fmt, ...); // void func_80087934(void); void wait_cycles(OSTime uParm1); // void func_800879CC(void); -// void func_80087A1C(void); +void func_80087A1C(UNK_TYPE); void func_80087A6C(u32 param_1); // void func_80087AC0(void); // void __osSetCause(void); @@ -418,7 +418,7 @@ void __osSetCompare(u32 value); // u32 __osGetCompare(void); u32 osDpGetStatus(void); void osDpSetStatus(u32 data); -void _bcopy(void* __src, void* __dest, size_t __n); +void bcopy(void* __src, void* __dest, size_t __n); // void __osResetGlobalIntMask(void); // void func_80091630(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); // void func_80091808(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); diff --git a/include/variables.h b/include/variables.h index 3086fee9b6..ccb145a9a4 100644 --- a/include/variables.h +++ b/include/variables.h @@ -295,8 +295,12 @@ extern OSMesg dmamgrMsqMessages[32]; extern OSThread dmamgrOSThread; extern u8 dmamgrStack[1280]; // extern UNK_TYPE1 D_8009BA08; -extern u8 yaz0FileBuffer[1024]; -extern Yaz0DecompState yaz0DecompStatus; +extern u8 sYaz0DataBuffer[0x400]; +extern u8* sYaz0CurDataEnd; +extern u32 sYaz0CurRomStart; +extern u32 sYaz0CurSize; +extern u8* sYaz0MaxPtr; +extern u8* D_8009BE20; extern UNK_TYPE4 D_8009BE30; extern UNK_TYPE4 D_8009BE34; extern FaultClient romInfoFaultClient; diff --git a/include/z64.h b/include/z64.h index 16161284fb..27001572bf 100644 --- a/include/z64.h +++ b/include/z64.h @@ -431,14 +431,6 @@ typedef struct { /* 0xC */ s32 rightX; } Viewport; // size = 0x10 -typedef struct { - /* 0x00 */ void* bufferEnd; - /* 0x04 */ u32 romReadHead; - /* 0x08 */ u32 amountLeftToRead; - /* 0x0C */ u32 loadNextChunkBoundary; - /* 0x10 */ u32 destBufferEnd; -} Yaz0DecompState; // size = 0x14 - typedef struct { /* 0x0 */ unsigned int inst1; /* 0x4 */ unsigned int inst2; diff --git a/linker_scripts/code_script.txt b/linker_scripts/code_script.txt index 66b0b32216..0bcd1325c9 100644 --- a/linker_scripts/code_script.txt +++ b/linker_scripts/code_script.txt @@ -15,7 +15,7 @@ SECTIONS build/src/boot_O2_g3/idle.o(.text) build/src/boot_O2_g3/viconfig.o(.text) build/src/boot_O2_g3/z_std_dma.o(.text) - build/asm/boot/boot_0x80080E30.o(.text) + build/src/boot_O2_g3/yaz0.o(.text) build/src/boot_O2_g3/irqmgr.o(.text) build/src/boot_O2_g3/CIC6105.o(.text) build/src/boot_O2_g3/boot_0x80081920.o(.text) @@ -252,7 +252,7 @@ SECTIONS build/src/boot_O2_g3/boot_main.o(.rodata) build/src/boot_O2_g3/idle.o(.rodata) build/asm/boot/boot_rodata_z_std_dma.o(.rodata) - build/asm/boot/boot_rodata_0x80080E30.o(.rodata) + build/src/boot_O2_g3/yaz0.o(.rodata) build/src/boot_O2_g3/irqmgr.o(.rodata) build/src/boot_O2_g3/CIC6105.o(.rodata) build/asm/boot/boot_rodata_fault.o(.rodata) @@ -284,7 +284,7 @@ SECTIONS . += 0x1C60; /* boot_main */ . += 0x140; /* idle */ . += 0x770; /* z_std_dma */ - . += 0x420; /* 0x80080E30 */ + . += 0x420; /* yaz0 */ . += 0x20; /* CIC6105 */ . += 0xE80; /* fault */ . += 0x40; /* fault_drawer */ diff --git a/src/boot_O2_g3/yaz0.c b/src/boot_O2_g3/yaz0.c new file mode 100644 index 0000000000..e583a086f5 --- /dev/null +++ b/src/boot_O2_g3/yaz0.c @@ -0,0 +1,150 @@ +#include +#include + +u8 sYaz0DataBuffer[0x400]; +u8* sYaz0CurDataEnd; +u32 sYaz0CurRomStart; +u32 sYaz0CurSize; +u8* sYaz0MaxPtr; +u8* D_8009BE20; + +void* Yaz0_FirstDMA() { + u32 pad0; + u32 dmaSize; + u32 curSize; + + sYaz0MaxPtr = sYaz0CurDataEnd - 0x19; + + curSize = (u32)sYaz0CurDataEnd - (u32)sYaz0DataBuffer; + dmaSize = (curSize > sYaz0CurSize) ? sYaz0CurSize : curSize; + + DmaMgr_DMARomToRam(sYaz0CurRomStart, sYaz0DataBuffer, dmaSize); + sYaz0CurRomStart += dmaSize; + sYaz0CurSize -= dmaSize; + return sYaz0DataBuffer; +} + +void* Yaz0_NextDMA(void* curSrcPos) { + u8* dst; + u32 restSize; + u32 dmaSize; + OSPri oldPri; + + restSize = (u32)sYaz0CurDataEnd - (u32)curSrcPos; + + dst = (restSize & 7) ? (sYaz0DataBuffer - (restSize & 7)) + 8 : sYaz0DataBuffer; + + bcopy(curSrcPos, dst, restSize); + dmaSize = ((u32)sYaz0CurDataEnd - (u32)dst) - restSize; + if (sYaz0CurSize < dmaSize) { + dmaSize = sYaz0CurSize; + } + + if (dmaSize != 0) { + DmaMgr_DMARomToRam(sYaz0CurRomStart, dst + restSize, dmaSize); + sYaz0CurRomStart += dmaSize; + sYaz0CurSize -= dmaSize; + if (!sYaz0CurSize) { + sYaz0MaxPtr = dst + restSize + dmaSize; + } + } else { + oldPri = osGetThreadPri(NULL); + osSetThreadPri(NULL, 0x7F); + Fault_Log("圧縮展開異常\n"); + osSetThreadPri(NULL, oldPri); + } + + return dst; +} + +typedef struct { + /* 0x00 */ u32 magic; // Yaz0 + /* 0x04 */ u32 decSize; + /* 0x08 */ u32 compInfoOffset; // only used in mio0 + /* 0x0C */ u32 uncompDataOffset; // only used in mio0 +} Yaz0Header; // size = 0x10 + +#define YAZ0_MAGIC 0x59617A30 // "Yaz0" + +s32 Yaz0_DecompressImpl(u8* src, u8* dst) { + u32 bitIdx = 0; + u8* dstEnd; + u32 chunkHeader = 0; + u32 nibble; + u8* backPtr; + s32 chunkSize; + u32 off; + u32 magic; + + magic = ((Yaz0Header*)src)->magic; + + if (magic != YAZ0_MAGIC) { + return -1; + } + + dstEnd = dst + ((Yaz0Header*)src)->decSize; + src = src + sizeof(Yaz0Header); + + do { + if (bitIdx == 0) { + if ((sYaz0MaxPtr < src) && (sYaz0CurSize != 0)) { + src = Yaz0_NextDMA(src); + } + + chunkHeader = *src++; + bitIdx = 8; + } + + if (chunkHeader & (1 << 7)) { // uncompressed + *dst = *src; + dst++; + src++; + } else { // compressed + off = ((*src & 0xF) << 8 | *(src + 1)); + nibble = *src >> 4; + backPtr = dst - off; + src += 2; + + chunkSize = (nibble == 0) // N = chunkSize; B = back offset + ? *src++ + 0x12 // 3 bytes 0B BB NN + : nibble + 2; // 2 bytes NB BB + + do { + *dst++ = *(backPtr++ - 1); + chunkSize--; + } while (chunkSize != 0); + } + chunkHeader <<= 1; + bitIdx--; + } while (dst != dstEnd); + + D_8009BE20 = dstEnd; + + return 0; +} + +void Yaz0_Decompress(u32 romStart, void* dst, u32 size) { + s32 status; + u32 pad; + u8 sp80[0x50]; + u8 sp30[0x50]; + + if (sYaz0CurDataEnd != NULL) { + while (sYaz0CurDataEnd != NULL) { + func_80087A1C(10); + } + } + + sYaz0CurDataEnd = sYaz0DataBuffer + sizeof(sYaz0DataBuffer); + sYaz0CurRomStart = romStart; + sYaz0CurSize = size; + status = Yaz0_DecompressImpl(Yaz0_FirstDMA(), dst); + + if (status != 0) { + sprintf(sp80, "slidma slidstart_szs ret=%d", status); + sprintf(sp30, "src:%08lx dst:%08lx siz:%08lx", romStart, dst, size); + Fault_AddHungupAndCrashImpl(sp80, sp30); + } + + sYaz0CurDataEnd = NULL; +} diff --git a/src/boot_O2_g3/z_std_dma.c b/src/boot_O2_g3/z_std_dma.c index 6b70433962..2f617eb032 100644 --- a/src/boot_O2_g3/z_std_dma.c +++ b/src/boot_O2_g3/z_std_dma.c @@ -134,7 +134,7 @@ void DmaMgr_ProcessMsg(DmaRequest* a0) { } osSetThreadPri(NULL, 10); - Yaz0_LoadAndDecompressFile(sp28, sp30, sp24); + Yaz0_Decompress(sp28, sp30, sp24); osSetThreadPri(NULL, 17); } else { Fault_AddHungupAndCrash(dmamgrString800981F4, 558); diff --git a/src/boot_O2_g3_trapuv/fault_drawer.c b/src/boot_O2_g3_trapuv/fault_drawer.c index b5710aba29..9648ca5aac 100644 --- a/src/boot_O2_g3_trapuv/fault_drawer.c +++ b/src/boot_O2_g3_trapuv/fault_drawer.c @@ -132,7 +132,7 @@ void FaultDrawer_SetInputCallback(void(*callback)()) { void FaultDrawer_Init() { sFaultDrawContext = &sFaultDrawerStruct; - _bcopy(&sFaultDrawerDefault, sFaultDrawContext, sizeof(FaultDrawer)); + bcopy(&sFaultDrawerDefault, sFaultDrawContext, sizeof(FaultDrawer)); sFaultDrawContext->fb = (u16*)((osMemSize | 0x80000000) - 0x25800); } diff --git a/src/code/z_lib.c b/src/code/z_lib.c index fb02269fae..cb48e72d31 100644 --- a/src/code/z_lib.c +++ b/src/code/z_lib.c @@ -2,7 +2,7 @@ #include void* Lib_bcopy(void* dest, void* src, size_t n) { - _bcopy(src, dest, n); + bcopy(src, dest, n); return dest; } diff --git a/src/code/z_scene_proc.c b/src/code/z_scene_proc.c index 11e6fa832d..b7775e8680 100644 --- a/src/code/z_scene_proc.c +++ b/src/code/z_scene_proc.c @@ -454,7 +454,7 @@ void SceneProc_DrawSceneConfig6(GlobalContext* ctxt) { for (i = 0; i < 9; i++, dlHead += 2) { u32 lodFrac = 0; - _bcopy(D_801C3C88, dlHead, sizeof(Gfx[2])); + bcopy(D_801C3C88, dlHead, sizeof(Gfx[2])); switch(i) { case 0: diff --git a/src/code/z_skelanime.c b/src/code/z_skelanime.c index c85e83d8d2..4612cd33ee 100644 --- a/src/code/z_skelanime.c +++ b/src/code/z_skelanime.c @@ -1731,5 +1731,5 @@ void SkelAnime_Free(SkelAnime* skelAnime, GlobalContext* globalCtx) { } void SkelAnime_CopyVec3s(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src) { - _bcopy(src, dst, sizeof(Vec3s) * skelAnime->limbCount); + bcopy(src, dst, sizeof(Vec3s) * skelAnime->limbCount); } diff --git a/src/libultra/io/sptask.c b/src/libultra/io/sptask.c index a731089125..394ce4bf23 100644 --- a/src/libultra/io/sptask.c +++ b/src/libultra/io/sptask.c @@ -5,7 +5,7 @@ OSTask* _VirtualToPhysicalTask(OSTask* intp) { OSTask* tp = &tmp_task; - _bcopy((void*)intp, (void*)tp, sizeof(OSTask)); + bcopy((void*)intp, (void*)tp, sizeof(OSTask)); if (tp->t.ucode) { tp->t.ucode = (u64*)osVirtualToPhysical(tp->t.ucode); } diff --git a/tables/functions.txt b/tables/functions.txt index 5b5315cb77..41190224bb 100644 --- a/tables/functions.txt +++ b/tables/functions.txt @@ -23,10 +23,10 @@ 0x80080C90:("DmaMgr_SendRequest0",), 0x80080D0C:("Dmamgr_Start",), 0x80080E00:("Dmamgr_Stop",), - 0x80080E30:("Yaz0_LoadFirstChunk",), - 0x80080ED0:("Yaz0_LoadNextChunk",), - 0x80080FF0:("Yaz0_Decompress",), - 0x80081178:("Yaz0_LoadAndDecompressFile",), + 0x80080E30:("Yaz0_FirstDMA",), + 0x80080ED0:("Yaz0_NextDMA",), + 0x80080FF0:("Yaz0_DecompressImpl",), + 0x80081178:("Yaz0_Decompress",), 0x80081250:("IrqMgr_AddClient",), 0x800812DC:("IrqMgr_RemoveClient",), 0x80081368:("IrqMgr_SendMesgForClient",), @@ -408,7 +408,7 @@ 0x80091290:("__osGetCompare",), 0x800912A0:("osDpGetStatus",), 0x800912B0:("osDpSetStatus",), - 0x800912C0:("_bcopy",), + 0x800912C0:("bcopy",), 0x800915D0:("__osResetGlobalIntMask",), 0x80091630:("func_80091630",), 0x80091808:("func_80091808",), diff --git a/tables/objects.txt b/tables/objects.txt index 64c8dcc035..d62038303f 100644 --- a/tables/objects.txt +++ b/tables/objects.txt @@ -3,7 +3,7 @@ 0x80080150:"idle", 0x800805E0:"viconfig", 0x80080790:"z_std_dma", - 0x80080E30:"", + 0x80080E30:"yaz0", 0x80081250:"irqmgr", 0x80081820:"CIC6105", 0x80081920:"", diff --git a/tables/variables.txt b/tables/variables.txt index bba0ffe515..34138bc278 100644 --- a/tables/variables.txt +++ b/tables/variables.txt @@ -291,8 +291,12 @@ 0x8009B358:("dmamgrOSThread","OSThread","",0x1b0), 0x8009B508:("dmamgrStack","u8","[1280]",0x500), 0x8009BA08:("D_8009BA08","UNK_TYPE1","",0x1), - 0x8009BA10:("yaz0FileBuffer","u8","[1024]",0x400), - 0x8009BE10:("yaz0DecompStatus","Yaz0DecompState","",0x14), + 0x8009BA10:("sYaz0DataBuffer","u8","[1024]",0x400), + 0x8009BE10:("sYaz0CurDataEnd","u8*","",0x4), + 0x8009BE14:("sYaz0CurRomStart","u32","",0x4), + 0x8009BE18:("sYaz0CurSize","u32","",0x4), + 0x8009BE1C:("sYaz0MaxPtr","u8*","",0x4), + 0x8009BE20:("D_8009BE20","u8*","",0x4), 0x8009BE30:("D_8009BE30","UNK_TYPE4","",0x4), 0x8009BE34:("D_8009BE34","UNK_TYPE4","",0x4), 0x8009BE38:("romInfoFaultClient","FaultClient","",0x10), diff --git a/tools/preprocess.py b/tools/preprocess.py index 01db33ba8d..c01fd2870d 100755 --- a/tools/preprocess.py +++ b/tools/preprocess.py @@ -32,8 +32,9 @@ opt_flags = [x for x in compile_args if x in ['-g', '-O2', '-framepointer', '-g3 preprocessed_file = tempfile.NamedTemporaryFile(prefix='preprocessed', suffix='.c') if opt_flags != []: - subprocess.check_call(asm_processor + opt_flags + [in_file], stdout=preprocessed_file) + asmproc_flags = opt_flags + [in_file, '--input-enc', 'utf-8', '--output-enc', 'euc-jp'] + subprocess.check_call(asm_processor + asmproc_flags, stdout=preprocessed_file) subprocess.check_call(compiler + compile_args + ['-I', in_dir, '-o', out_file, preprocessed_file.name]) - subprocess.check_call(asm_processor + opt_flags + [in_file, '--post-process', out_file, '--assembler', assembler_sh, '--asm-prelude', prelude]) + subprocess.check_call(asm_processor + asmproc_flags + ['--post-process', out_file, '--assembler', assembler_sh, '--asm-prelude', prelude]) else: subprocess.check_call(compiler + compile_args + ['-I', in_dir, '-o', out_file, in_file]) \ No newline at end of file diff --git a/undef.txt b/undef.txt index 8d84389c34..3eafbaecd2 100644 --- a/undef.txt +++ b/undef.txt @@ -30,8 +30,12 @@ dmamgrMsqMessages = boot_bss_start + 0x00001DD8; dmamgrOSThread = boot_bss_start + 0x00001E58; dmamgrStack = boot_bss_start + 0x00002008; D_8009BA08 = boot_bss_start + 0x00002508; -yaz0FileBuffer = boot_bss_start + 0x00002510; -yaz0DecompStatus = boot_bss_start + 0x00002910; +sYaz0DataBuffer = boot_bss_start + 0x00002510; +sYaz0CurDataEnd = boot_bss_start + 0x00002910; +sYaz0CurRomStart = boot_bss_start + 0x00002914; +sYaz0CurSize = boot_bss_start + 0x00002918; +sYaz0MaxPtr = boot_bss_start + 0x0000291C; +D_8009BE20 = boot_bss_start + 0x00002920; D_8009BE30 = boot_bss_start + 0x00002930; D_8009BE34 = boot_bss_start + 0x00002934; romInfoFaultClient = boot_bss_start + 0x00002938;