mirror of https://github.com/zeldaret/mm.git
yaz0.c OK (#71)
This commit is contained in:
parent
a53626049f
commit
8342329538
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
#include <global.h>
|
||||
|
||||
void* Lib_bcopy(void* dest, void* src, size_t n) {
|
||||
_bcopy(src, dest, n);
|
||||
bcopy(src, dest, n);
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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",),
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
0x80080150:"idle",
|
||||
0x800805E0:"viconfig",
|
||||
0x80080790:"z_std_dma",
|
||||
0x80080E30:"",
|
||||
0x80080E30:"yaz0",
|
||||
0x80081250:"irqmgr",
|
||||
0x80081820:"CIC6105",
|
||||
0x80081920:"",
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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])
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue