yaz0.c OK (#71)

This commit is contained in:
Rozelette 2021-03-16 20:49:27 -05:00 committed by GitHub
parent a53626049f
commit 8342329538
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 192 additions and 37 deletions

View File

@ -33,10 +33,10 @@ s32 DmaMgr_SendRequestImpl(DmaRequest* request, void* vramStart, u32 vromStart,
s32 DmaMgr_SendRequest0(void* vramStart, u32 vromStart, u32 size); s32 DmaMgr_SendRequest0(void* vramStart, u32 vromStart, u32 size);
void Dmamgr_Start(void); void Dmamgr_Start(void);
void Dmamgr_Stop(void); void Dmamgr_Stop(void);
// u8* Yaz0_LoadFirstChunk(void); void* Yaz0_FirstDMA(void);
u8* Yaz0_LoadNextChunk(void* currDecompPos); void* Yaz0_NextDMA(void* curSrcPos);
s32 Yaz0_Decompress(u8* src, u8* dest); s32 Yaz0_DecompressImpl(u8* hdr, u8* dst);
void Yaz0_LoadAndDecompressFile(u32 romStart, u32 vramStart, u32 size); void Yaz0_Decompress(u32 romStart, void* dst, u32 size);
void IrqMgr_AddClient(IrqMgr* irqmgr, OSMesgQueueListNode* param_2, OSMesgQueue* param_3); void IrqMgr_AddClient(IrqMgr* irqmgr, OSMesgQueueListNode* param_2, OSMesgQueue* param_3);
void IrqMgr_RemoveClient(IrqMgr* irqmgr, OSMesgQueueListNode* remove); void IrqMgr_RemoveClient(IrqMgr* irqmgr, OSMesgQueueListNode* remove);
void IrqMgr_SendMesgForClient(IrqMgr* irqmgr, OSMesg msg); void IrqMgr_SendMesgForClient(IrqMgr* irqmgr, OSMesg msg);
@ -247,7 +247,7 @@ s32 sprintf(char* s, char* fmt, ...);
// void func_80087934(void); // void func_80087934(void);
void wait_cycles(OSTime uParm1); void wait_cycles(OSTime uParm1);
// void func_800879CC(void); // void func_800879CC(void);
// void func_80087A1C(void); void func_80087A1C(UNK_TYPE);
void func_80087A6C(u32 param_1); void func_80087A6C(u32 param_1);
// void func_80087AC0(void); // void func_80087AC0(void);
// void __osSetCause(void); // void __osSetCause(void);
@ -418,7 +418,7 @@ void __osSetCompare(u32 value);
// u32 __osGetCompare(void); // u32 __osGetCompare(void);
u32 osDpGetStatus(void); u32 osDpGetStatus(void);
void osDpSetStatus(u32 data); 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 __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_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); // void func_80091808(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5);

View File

@ -295,8 +295,12 @@ extern OSMesg dmamgrMsqMessages[32];
extern OSThread dmamgrOSThread; extern OSThread dmamgrOSThread;
extern u8 dmamgrStack[1280]; extern u8 dmamgrStack[1280];
// extern UNK_TYPE1 D_8009BA08; // extern UNK_TYPE1 D_8009BA08;
extern u8 yaz0FileBuffer[1024]; extern u8 sYaz0DataBuffer[0x400];
extern Yaz0DecompState yaz0DecompStatus; 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_8009BE30;
extern UNK_TYPE4 D_8009BE34; extern UNK_TYPE4 D_8009BE34;
extern FaultClient romInfoFaultClient; extern FaultClient romInfoFaultClient;

View File

@ -431,14 +431,6 @@ typedef struct {
/* 0xC */ s32 rightX; /* 0xC */ s32 rightX;
} Viewport; // size = 0x10 } 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 { typedef struct {
/* 0x0 */ unsigned int inst1; /* 0x0 */ unsigned int inst1;
/* 0x4 */ unsigned int inst2; /* 0x4 */ unsigned int inst2;

View File

@ -15,7 +15,7 @@ SECTIONS
build/src/boot_O2_g3/idle.o(.text) build/src/boot_O2_g3/idle.o(.text)
build/src/boot_O2_g3/viconfig.o(.text) build/src/boot_O2_g3/viconfig.o(.text)
build/src/boot_O2_g3/z_std_dma.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/irqmgr.o(.text)
build/src/boot_O2_g3/CIC6105.o(.text) build/src/boot_O2_g3/CIC6105.o(.text)
build/src/boot_O2_g3/boot_0x80081920.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/boot_main.o(.rodata)
build/src/boot_O2_g3/idle.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_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/irqmgr.o(.rodata)
build/src/boot_O2_g3/CIC6105.o(.rodata) build/src/boot_O2_g3/CIC6105.o(.rodata)
build/asm/boot/boot_rodata_fault.o(.rodata) build/asm/boot/boot_rodata_fault.o(.rodata)
@ -284,7 +284,7 @@ SECTIONS
. += 0x1C60; /* boot_main */ . += 0x1C60; /* boot_main */
. += 0x140; /* idle */ . += 0x140; /* idle */
. += 0x770; /* z_std_dma */ . += 0x770; /* z_std_dma */
. += 0x420; /* 0x80080E30 */ . += 0x420; /* yaz0 */
. += 0x20; /* CIC6105 */ . += 0x20; /* CIC6105 */
. += 0xE80; /* fault */ . += 0xE80; /* fault */
. += 0x40; /* fault_drawer */ . += 0x40; /* fault_drawer */

150
src/boot_O2_g3/yaz0.c Normal file
View File

@ -0,0 +1,150 @@
#include <ultra64.h>
#include <global.h>
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;
}

View File

@ -134,7 +134,7 @@ void DmaMgr_ProcessMsg(DmaRequest* a0) {
} }
osSetThreadPri(NULL, 10); osSetThreadPri(NULL, 10);
Yaz0_LoadAndDecompressFile(sp28, sp30, sp24); Yaz0_Decompress(sp28, sp30, sp24);
osSetThreadPri(NULL, 17); osSetThreadPri(NULL, 17);
} else { } else {
Fault_AddHungupAndCrash(dmamgrString800981F4, 558); Fault_AddHungupAndCrash(dmamgrString800981F4, 558);

View File

@ -132,7 +132,7 @@ void FaultDrawer_SetInputCallback(void(*callback)()) {
void FaultDrawer_Init() { void FaultDrawer_Init() {
sFaultDrawContext = &sFaultDrawerStruct; sFaultDrawContext = &sFaultDrawerStruct;
_bcopy(&sFaultDrawerDefault, sFaultDrawContext, sizeof(FaultDrawer)); bcopy(&sFaultDrawerDefault, sFaultDrawContext, sizeof(FaultDrawer));
sFaultDrawContext->fb = (u16*)((osMemSize | 0x80000000) - 0x25800); sFaultDrawContext->fb = (u16*)((osMemSize | 0x80000000) - 0x25800);
} }

View File

@ -2,7 +2,7 @@
#include <global.h> #include <global.h>
void* Lib_bcopy(void* dest, void* src, size_t n) { void* Lib_bcopy(void* dest, void* src, size_t n) {
_bcopy(src, dest, n); bcopy(src, dest, n);
return dest; return dest;
} }

View File

@ -454,7 +454,7 @@ void SceneProc_DrawSceneConfig6(GlobalContext* ctxt) {
for (i = 0; i < 9; i++, dlHead += 2) { for (i = 0; i < 9; i++, dlHead += 2) {
u32 lodFrac = 0; u32 lodFrac = 0;
_bcopy(D_801C3C88, dlHead, sizeof(Gfx[2])); bcopy(D_801C3C88, dlHead, sizeof(Gfx[2]));
switch(i) { switch(i) {
case 0: case 0:

View File

@ -1731,5 +1731,5 @@ void SkelAnime_Free(SkelAnime* skelAnime, GlobalContext* globalCtx) {
} }
void SkelAnime_CopyVec3s(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src) { void SkelAnime_CopyVec3s(SkelAnime* skelAnime, Vec3s* dst, Vec3s* src) {
_bcopy(src, dst, sizeof(Vec3s) * skelAnime->limbCount); bcopy(src, dst, sizeof(Vec3s) * skelAnime->limbCount);
} }

View File

@ -5,7 +5,7 @@
OSTask* _VirtualToPhysicalTask(OSTask* intp) OSTask* _VirtualToPhysicalTask(OSTask* intp)
{ {
OSTask* tp = &tmp_task; OSTask* tp = &tmp_task;
_bcopy((void*)intp, (void*)tp, sizeof(OSTask)); bcopy((void*)intp, (void*)tp, sizeof(OSTask));
if (tp->t.ucode) { if (tp->t.ucode) {
tp->t.ucode = (u64*)osVirtualToPhysical(tp->t.ucode); tp->t.ucode = (u64*)osVirtualToPhysical(tp->t.ucode);
} }

View File

@ -23,10 +23,10 @@
0x80080C90:("DmaMgr_SendRequest0",), 0x80080C90:("DmaMgr_SendRequest0",),
0x80080D0C:("Dmamgr_Start",), 0x80080D0C:("Dmamgr_Start",),
0x80080E00:("Dmamgr_Stop",), 0x80080E00:("Dmamgr_Stop",),
0x80080E30:("Yaz0_LoadFirstChunk",), 0x80080E30:("Yaz0_FirstDMA",),
0x80080ED0:("Yaz0_LoadNextChunk",), 0x80080ED0:("Yaz0_NextDMA",),
0x80080FF0:("Yaz0_Decompress",), 0x80080FF0:("Yaz0_DecompressImpl",),
0x80081178:("Yaz0_LoadAndDecompressFile",), 0x80081178:("Yaz0_Decompress",),
0x80081250:("IrqMgr_AddClient",), 0x80081250:("IrqMgr_AddClient",),
0x800812DC:("IrqMgr_RemoveClient",), 0x800812DC:("IrqMgr_RemoveClient",),
0x80081368:("IrqMgr_SendMesgForClient",), 0x80081368:("IrqMgr_SendMesgForClient",),
@ -408,7 +408,7 @@
0x80091290:("__osGetCompare",), 0x80091290:("__osGetCompare",),
0x800912A0:("osDpGetStatus",), 0x800912A0:("osDpGetStatus",),
0x800912B0:("osDpSetStatus",), 0x800912B0:("osDpSetStatus",),
0x800912C0:("_bcopy",), 0x800912C0:("bcopy",),
0x800915D0:("__osResetGlobalIntMask",), 0x800915D0:("__osResetGlobalIntMask",),
0x80091630:("func_80091630",), 0x80091630:("func_80091630",),
0x80091808:("func_80091808",), 0x80091808:("func_80091808",),

View File

@ -3,7 +3,7 @@
0x80080150:"idle", 0x80080150:"idle",
0x800805E0:"viconfig", 0x800805E0:"viconfig",
0x80080790:"z_std_dma", 0x80080790:"z_std_dma",
0x80080E30:"", 0x80080E30:"yaz0",
0x80081250:"irqmgr", 0x80081250:"irqmgr",
0x80081820:"CIC6105", 0x80081820:"CIC6105",
0x80081920:"", 0x80081920:"",

View File

@ -291,8 +291,12 @@
0x8009B358:("dmamgrOSThread","OSThread","",0x1b0), 0x8009B358:("dmamgrOSThread","OSThread","",0x1b0),
0x8009B508:("dmamgrStack","u8","[1280]",0x500), 0x8009B508:("dmamgrStack","u8","[1280]",0x500),
0x8009BA08:("D_8009BA08","UNK_TYPE1","",0x1), 0x8009BA08:("D_8009BA08","UNK_TYPE1","",0x1),
0x8009BA10:("yaz0FileBuffer","u8","[1024]",0x400), 0x8009BA10:("sYaz0DataBuffer","u8","[1024]",0x400),
0x8009BE10:("yaz0DecompStatus","Yaz0DecompState","",0x14), 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), 0x8009BE30:("D_8009BE30","UNK_TYPE4","",0x4),
0x8009BE34:("D_8009BE34","UNK_TYPE4","",0x4), 0x8009BE34:("D_8009BE34","UNK_TYPE4","",0x4),
0x8009BE38:("romInfoFaultClient","FaultClient","",0x10), 0x8009BE38:("romInfoFaultClient","FaultClient","",0x10),

View File

@ -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') preprocessed_file = tempfile.NamedTemporaryFile(prefix='preprocessed', suffix='.c')
if opt_flags != []: 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(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: else:
subprocess.check_call(compiler + compile_args + ['-I', in_dir, '-o', out_file, in_file]) subprocess.check_call(compiler + compile_args + ['-I', in_dir, '-o', out_file, in_file])

View File

@ -30,8 +30,12 @@ dmamgrMsqMessages = boot_bss_start + 0x00001DD8;
dmamgrOSThread = boot_bss_start + 0x00001E58; dmamgrOSThread = boot_bss_start + 0x00001E58;
dmamgrStack = boot_bss_start + 0x00002008; dmamgrStack = boot_bss_start + 0x00002008;
D_8009BA08 = boot_bss_start + 0x00002508; D_8009BA08 = boot_bss_start + 0x00002508;
yaz0FileBuffer = boot_bss_start + 0x00002510; sYaz0DataBuffer = boot_bss_start + 0x00002510;
yaz0DecompStatus = boot_bss_start + 0x00002910; 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_8009BE30 = boot_bss_start + 0x00002930;
D_8009BE34 = boot_bss_start + 0x00002934; D_8009BE34 = boot_bss_start + 0x00002934;
romInfoFaultClient = boot_bss_start + 0x00002938; romInfoFaultClient = boot_bss_start + 0x00002938;