diff --git a/Makefile b/Makefile index 2b0aa54..35477ef 100644 --- a/Makefile +++ b/Makefile @@ -24,6 +24,11 @@ ASFLAGS := $(INC) -D_MIPS_SZLONG=32 -D_LANGUAGE_ASSEMBLY -DBBPLAYER -nostdinc -f OPTFLAGS := -Os MIPS_VERSION := -mips2 +CHECK_WARNINGS := -Wall -Wextra -Wno-format-security -Wno-unknown-pragmas -Wno-unused-parameter -Wno-unused-variable -Wno-missing-braces +CHECK_WARNINGS += -Werror=implicit-int -Werror=implicit-function-declaration -Werror=int-conversion -Werror=incompatible-pointer-types +MIPS_BUILTIN_DEFS := -D_MIPS_ISA_MIPS2=2 -D_MIPS_ISA=_MIPS_ISA_MIPS2 -D_ABIO32=1 -D_MIPS_SIM=_ABIO32 -D_MIPS_SZINT=32 -D_MIPS_SZLONG=32 -D_MIPS_SZPTR=32 +CC_CHECK = COMPILER_PATH="" gcc -m32 -nostdinc -fno-builtin -fsyntax-only -funsigned-char -std=gnu90 -DNON_MATCHING -D_LANGUAGE_C -D_MIPS_SZLONG=32 -DBBPLAYER -DF3D_GBI $(MIPS_BUILTIN_DEFS) $(INC) $(CHECK_WARNINGS) + build/src/libultra/reg/_getcount.o: MIPS_VERSION := -mips3 build/src/libultra/reg/_setcompare.o: MIPS_VERSION := -mips3 build/src/libz/%.o: MIPS_VERSION := -mips3 @@ -43,7 +48,7 @@ O_FILES := $(foreach f,$(C_FILES:.c=.o),build/$f) \ # Create build directories $(shell mkdir -p build $(foreach dir,$(SRC_DIRS) $(ASM_DIRS) $(DATA_DIRS),build/$(dir))) -.PHONY: all clean distclean disasm setup +.PHONY: all clean distclean disasm expected setup all: $(TARGET) ifeq ($(COMPARE),1) @@ -65,11 +70,15 @@ disasm: $(SPLAT) sa1.yaml --modes code data bin $(RM) asm/header.s +expected: + $(RM) -r expected + mkdir -p expected && cp -r build expected/build + setup: $(MAKE) -C tools $(MAKE) disasm $(MAKE) all COMPARE=1 - mkdir -p expected && cp -r build expected/build + $(MAKE) expected $(TARGET): $(ELF) $(OBJCOPY) -O binary $< $(@:.bin=.tmp) @@ -94,6 +103,7 @@ build/src/%.o: src/%.s @$(OBJDUMP) -drz $@ > $(@:.o=.s) build/src/%.o: src/%.c + $(CC_CHECK) $< $(CC) $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -c $< -o $@ @$(STRIP) -N dummy_symbol_ $@ $(ELFPATCH) $@ diff --git a/src/sa1/1050.c b/src/sa1/1050.c index b4b939c..38b92ef 100644 --- a/src/sa1/1050.c +++ b/src/sa1/1050.c @@ -5,24 +5,29 @@ void __osBbVideoPllInit(s32 tvType); void osBbPowerOff(void); - -void func_80003A28(void*); - -void func_80002248(void*); -void func_8000234C(void*); - -void func_80003094(void); +void osBbUsbInit(void); +u32 osBbUsbGetResetCount(s32 which); +void osBbSetErrorLed(s32); +void __osDisableInt(void); +s32 osBbUsbSetCtlrModes(s32 which, u32 mask); + +void fbInit(u32); +void fbSetBg(u16); +void fbClear(void); + +void sa1InitRDP(void); +void sa1ConfigureVI(void*); +void sa1IdleThread(void*); +void sa1MainThread(void*); +s32 sa1CheckIdSys(void); +void sa1BootSA2(void (*entrypoint)(u32), u32 arg); +void* sa1AuthenticateAndLoadSA2(void); +s32 sa1DisplayImage(void*, size_t); +void sa1CommandLoop(void); extern u8 framebuffer[]; -extern u32 D_8001AF40; -extern u32 D_800163A0; -extern u32 D_80016398; -extern u8 D_8001B0F8[0x8000]; -extern u8 D_800232A8[0x8000]; -extern OSThread D_8001AF48; extern OSMesg prenmiMesgBuf[1]; extern OSMesgQueue prenmiMesgQueue; -extern OSThread D_800230F8; extern OSMesgQueue piMesgQueue; extern OSMesgQueue siMesgQueue; extern OSMesgQueue siMesgQueue; @@ -31,61 +36,68 @@ extern OSMesg viMesgBuf[1]; extern OSMesg piMesgBuf[200]; extern OSMesg siMesgBuf[200]; extern OSMesg viRetraceMesg; -extern OSThread D_8002B2A8; -extern u8 D_8002B458[0x8000]; -extern u32 D_80016390; -extern u32 D_80016394; -extern u32 D_80016398; -extern u32 D_8001639C; -extern s32 D_80016490; -extern s32 D_800164A0; -extern s32 D_800178A0; -extern s32 D_800178B0; - +extern OSThread idleThread; +extern u8 idleThreadStack[0x8000]; +extern OSThread mainThread; +extern u8 mainThreadStack[0x8000]; +extern OSThread eventThread; +extern u8 eventThreadStack[0x8000]; + +extern u32 skBootValue; +extern u32 powerBtnPressed; +extern u32 usbNum; +extern u32 usbTypeA; +extern u32 usbLineUnstable; +extern u32 usbNotConnected; +extern s32 sa1Image1Size; +extern s32 sa1Image1Data; +extern s32 sa1Image2Size; +extern s32 sa1Image2Data; typedef struct { u8 data[0x100]; } Struct_Unk; +extern Struct_Unk appSavedState; -extern Struct_Unk D_80033458; - -void func_80002050(u32 arg0) { - D_80033458 = *(Struct_Unk*)PHYS_TO_K1(0x04A80100); - func_80003094(); +void sa1Setup(u32 arg0) { + appSavedState = *(Struct_Unk*)PHYS_TO_K1(0x04A80100); + sa1CheckIdSys(); } -void func_80002114(s32 arg0) { - D_8001AF40 = arg0; +void sa1Entrypoint(u32 arg) { + skBootValue = arg; IO_WRITE(MI_3C_REG, 0x01000000); - if (!(arg0 & 0x4C)) { + if (!(arg & 0x4C)) { + // Cold boot __osBbVideoPllInit(OS_TV_NTSC); - func_80003A28(framebuffer); + sa1ConfigureVI(framebuffer); } else { + // Warm boot IO_WRITE(VI_H_VIDEO_REG, 0); } osInitialize(); - osCreateThread(&D_8001AF48, 1, func_80002248, 0, D_8001B0F8 + sizeof(D_8001B0F8), 0x14); - osStartThread(&D_8001AF48); + osCreateThread(&idleThread, 1, sa1IdleThread, 0, idleThreadStack + sizeof(idleThreadStack), 0x14); + osStartThread(&idleThread); } -void func_800021C8(void) { - if (D_800163A0 != 0) { +void sa1Event(void) { + if (powerBtnPressed) { if (osRecvMesg(&prenmiMesgQueue, NULL, OS_MESG_NOBLOCK) == 0) { osBbPowerOff(); } } else if (!(IO_READ(MI_38_REG) & 0x01000000)) { IO_WRITE(MI_3C_REG, 0x02000000); - D_800163A0 = 1; + powerBtnPressed = TRUE; } } -void func_80002248(void* arg0) { - osCreatePiManager(0x96, &piMesgQueue, piMesgBuf, ARRLEN(piMesgBuf)); +void sa1IdleThread(void* arg) { + osCreatePiManager(OS_PRIORITY_PIMGR, &piMesgQueue, piMesgBuf, ARRLEN(piMesgBuf)); osCreateMesgQueue(&siMesgQueue, siMesgBuf, ARRLEN(siMesgBuf)); osSetEventMesg(OS_EVENT_SI, &siMesgQueue, (OSMesg)200); - osCreateThread(&D_800230F8, 3, func_8000234C, arg0, D_800232A8 + sizeof(D_800232A8), 0x12); - osStartThread(&D_800230F8); + osCreateThread(&mainThread, 3, sa1MainThread, arg, mainThreadStack + sizeof(mainThreadStack), 0x12); + osStartThread(&mainThread); osCreateMesgQueue(&prenmiMesgQueue, prenmiMesgBuf, ARRLEN(prenmiMesgBuf)); osSetEventMesg(OS_EVENT_PRENMI, &prenmiMesgQueue, (OSMesg)1); osSetThreadPri(NULL, 0); @@ -95,83 +107,96 @@ void func_80002248(void* arg0) { } } -void func_80002320(void) { +void sa1EventThread(void* arg) { while (TRUE) { osRecvMesg(&viMesgQueue, NULL, OS_MESG_BLOCK); - func_800021C8(); + sa1Event(); } } #ifdef NON_MATCHING // Needs data imported -void func_8000234C(void* arg0) { - s32 temp_s3; - u64 temp_s0; - u32 temp_s2; +void sa1MainThread(void* arg) { + void* sa2Entrypoint; + OSTime thresholdTime; + u32 usbResetCount; - osCreateViManager(0xFE); + osCreateViManager(OS_PRIORITY_VIMGR); fbInit(0); osCreateMesgQueue(&viMesgQueue, viMesgBuf, 1); osViSetEvent(&viMesgQueue, viRetraceMesg, 1); - osViBlack(1); + osViBlack(TRUE); osViSwapBuffer(framebuffer); fbSetBg(0); fbClear(); - osViBlack(0); + osViBlack(FALSE); osWritebackDCacheAll(); osViSwapBuffer(framebuffer); fbClear(); - func_80003C20(); - func_80002050(D_8001AF40); - osCreateThread(&D_8002B2A8, 5, func_80002320, arg0, D_8002B458 + sizeof(D_8002B458), 0xF); - osStartThread(&D_8002B2A8); - D_80016398 = 1; - osBbUsbSetCtlrModes(D_80016398 ^ 1, 0); - osBbUsbSetCtlrModes(D_80016398 ^ 0, 2); + sa1InitRDP(); + sa1Setup(skBootValue); + osCreateThread(&eventThread, 5, sa1EventThread, arg, eventThreadStack + sizeof(eventThreadStack), 0xF); + osStartThread(&eventThread); + + // Start with USB1 + usbNum = 1; + osBbUsbSetCtlrModes(usbNum ^ 1, 0); + osBbUsbSetCtlrModes(usbNum ^ 0, 2); osBbUsbInit(); - temp_s3 = func_80002DCC(); - D_80016390 = (D_80016398 == 0) ? !(IO_READ(0x04900018) & (1 << 7)) : 0; + sa2Entrypoint = sa1AuthenticateAndLoadSA2(); + + // No ID pin on USB1, always assume Type B / Unconnected + usbTypeA = (usbNum == 0) ? !(IO_READ(0x04900018) & (1 << 7)) : 0; + // Line state is unstable + usbLineUnstable = !(IO_READ((usbNum == 0) ? 0x04900018 : 0x04A00018) & (1 << 5)); - D_80016394 = !(IO_READ((D_80016398 == 0) ? 0x04900018 : 0x04A00018) & (1 << 5)); + if (!usbLineUnstable) { + // If USB1 line state stable, it isn't connected? - if (D_80016394 == 0) { - D_80016398 = ~D_80016398 & 1; - osBbUsbSetCtlrModes(D_80016398 ^ 1, 0); - osBbUsbSetCtlrModes(D_80016398 ^ 0, 2); + // Flip to USB0 + usbNum = ~usbNum & 1; + osBbUsbSetCtlrModes(usbNum ^ 1, 0); + osBbUsbSetCtlrModes(usbNum ^ 0, 2); osBbUsbInit(); - D_80016390 = (D_80016398 == 0) ? !(IO_READ(0x04900018) & (1 << 7)) : 0; - D_80016394 = 0; - temp_s2 = osBbUsbGetResetCount(D_80016398); - temp_s0 = OS_CYCLES_TO_USEC(osGetCount()) + 2000000; - while (OS_CYCLES_TO_USEC(osGetCount()) < temp_s0) { - if (temp_s2 < osBbUsbGetResetCount(D_80016398)) { - D_80016394 = 1; + // USB0 has ID pin detection, use it to differentiate Type A or Type B / Unconnected + usbTypeA = (usbNum == 0) ? !(IO_READ(0x04900018) & (1 << 7)) : 0; + // Determine line stability by reset count over the next 2 seconds + usbLineUnstable = 0; + usbResetCount = osBbUsbGetResetCount(usbNum); + thresholdTime = OS_CYCLES_TO_USEC(osGetCount()) + 2000000; // +2 seconds + while (OS_CYCLES_TO_USEC(osGetCount()) < thresholdTime) { + if (osBbUsbGetResetCount(usbNum) > usbResetCount) { + usbLineUnstable = 1; break; } } } - D_8001639C = (D_80016390 != 0) || (D_80016394 == 0); + // Type A or stable + usbNotConnected = usbTypeA || !usbLineUnstable; osBbSetErrorLed(0); - if (D_8001639C != 0) { - if (temp_s3 != 0) { + if (usbNotConnected) { + if (sa2Entrypoint != NULL) { + // No USB, SA2 __osDisableInt(); - *(Struct_Unk*)PHYS_TO_K1(0x04A80100) = D_80033458; + *(Struct_Unk*)PHYS_TO_K1(0x04A80100) = appSavedState; - func_80002D94(temp_s3, D_8001AF40); + sa1BootSA2(sa2Entrypoint, skBootValue); } else { - func_80004390(&D_800178B0, D_800178A0); - func_800033CC(); + // No USB, no SA2 + sa1DisplayImage(&sa1Image2Data, sa1Image2Size); + sa1CommandLoop(); } } else { - func_80004390(&D_800164A0, D_80016490); - func_800033CC(); + // USB + sa1DisplayImage(&sa1Image1Data, sa1Image1Size); + sa1CommandLoop(); } osBbPowerOff(); } #else -INCLUDE_ASM("asm/nonmatchings/sa1/1050", func_8000234C); +INCLUDE_ASM("asm/nonmatchings/sa1/1050", sa1MainThread); #endif diff --git a/src/sa1/17A0.c b/src/sa1/17A0.c index 9bcec3d..e2eb2e5 100644 --- a/src/sa1/17A0.c +++ b/src/sa1/17A0.c @@ -9,15 +9,15 @@ s32 osBbAtbSetup(u32 vAddrBase, u16* fsBlockList, u32 maxListLen); s32 expand_gzip(void* src, void* dst, size_t, size_t); -s32 skVerifyHash(BbShaHash* hash, BbEccSig* outSignature, BbRsaCert**, BbAppLaunchCrls*); +s32 skVerifyHash(BbShaHash* hash, u32* outSignature, BbRsaCert**, BbAppLaunchCrls*); -extern u16 D_80037C10[72]; -extern u8 D_80033C10[0x4000]; +extern u16 sa2BlockList[72]; +extern u8 cmdBlock[0x4000]; -s32 func_800027A0(s32 arg0, s32 arg1) { - IO_WRITE(PI_70_REG, arg0 << 9); +s32 sa1CardReadPage(s32 pageNum, s32 bufSelect) { + IO_WRITE(PI_70_REG, pageNum * 0x200); - if (arg1 != 0) { + if (bufSelect != 0) { IO_WRITE(PI_48_REG, 0x9F00CA10); } else { IO_WRITE(PI_48_REG, 0x9F008A10); @@ -36,23 +36,24 @@ s32 func_800027A0(s32 arg0, s32 arg1) { return 0; } -u32 func_80002838(u32 regVal) { - u32 temp_v1 = (regVal >> 8) & 0xFF; +/* Determines block link by majority vote */ +u32 sa1NextGoodBlock(u32 curSpare) { + u32 blockNum = (curSpare >> 8) & 0xFF; - if (temp_v1 == ((regVal >> 0x10) & 0xFF)) { - return temp_v1; + if (blockNum == ((curSpare >> 0x10) & 0xFF)) { + return blockNum; } - return regVal >> 0x18; + return curSpare >> 0x18; } -s32 func_80002860(s32 blockNum) { +s32 sa1CardReadBlock(s32 blockNum) { s32 ret; s32 var_a0; u32 var; s32 i; while (TRUE) { - ret = func_800027A0(blockNum << 5, 0); + ret = sa1CardReadPage(blockNum * 0x20, 0); if (ret == -3) { return -3; } @@ -76,11 +77,11 @@ s32 func_80002860(s32 blockNum) { return blockNum - 1; } -s32 func_800028FC(s32 arg0, s32 arg1) { +s32 sa1SkipBlocks(s32 arg0, s32 nSkip) { s32 i; - for (i = 0; i <= arg1; i++) { - arg0 = func_80002860(arg0); + for (i = 0; i <= nSkip; i++) { + arg0 = sa1CardReadBlock(arg0); if (arg0 < 0) { break; @@ -90,21 +91,21 @@ s32 func_800028FC(s32 arg0, s32 arg1) { return arg0 - 1; } -s32 func_80002950(u8* arg0, void* arg1, s32 arg2) { +s32 sa1CheckHash(u8* expectedHash, void* data, s32 dataSize) { SHA1Context sha1Ctx; BbShaHash hash; SHA1Reset(&sha1Ctx); - SHA1Input(&sha1Ctx, arg1, arg2); + SHA1Input(&sha1Ctx, data, dataSize); SHA1Result(&sha1Ctx, (u8*)&hash); - if (memcmp(&hash, arg0, sizeof(hash)) == 0) { + if (memcmp(&hash, expectedHash, sizeof(hash)) == 0) { return TRUE; } return FALSE; } -s32 func_800029CC(u8* arg0) { +s32 sa1VerifyCMD(u8* arg0) { BbRsaCert* certChain[3]; BbShaHash hash; SHA1Context sha1Ctx; @@ -137,10 +138,10 @@ s32 func_800029CC(u8* arg0) { SHA1Input(&sha1Ctx, (void*)cmd, sizeof(BbContentMetaDataHead) - sizeof(BbRsaSig2048)); SHA1Result(&sha1Ctx, (u8*)&hash); - return skVerifyHash(&hash, &cmd->contentMetaDataSign, certChain, appLaunchCrls); + return skVerifyHash(&hash, cmd->contentMetaDataSign, certChain, appLaunchCrls); } -void* func_80002ABC(BbContentMetaDataHead* cmd, u16* fsBlockList, s32 maxListLen, void* dst) { +void* sa1LoadAndCheckSA2(BbContentMetaDataHead* cmd, u16* fsBlockList, s32 maxListLen, void* dst) { OSMesgQueue retQueue; OSIoMesg mb; OSMesg retMesgBuf[1]; @@ -176,130 +177,134 @@ void* func_80002ABC(BbContentMetaDataHead* cmd, u16* fsBlockList, s32 maxListLen osTvType = OS_TV_NTSC; if (cmd != NULL) { - if (!func_80002950((u8*)cmd->hash, dst, cmd->size)) { + if (!sa1CheckHash((u8*)cmd->hash, dst, cmd->size)) { return NULL; } } return dst; } -void* func_80002BF8(BbContentMetaDataHead* cmd, u16* fsBlockList, s32 maxListLen, s32 arg3) { - u32 temp_s0; - u32 var_a0; - u32 var_a2; +void* sa1LoadAndDecompressSA2(BbContentMetaDataHead* cmd, u16* fsBlockList, s32 maxListLen, s32 includeHeader) { + void* entrypoint; + void* start; + u32 size; - if (func_80002ABC(cmd, fsBlockList, maxListLen, (void*)0x80200000) == NULL) { + if (sa1LoadAndCheckSA2(cmd, fsBlockList, maxListLen, (void*)0x80200000) == NULL) { return NULL; } - var_a2 = expand_gzip((void*)0x80200000, (void*)0x80300000, cmd->size, 0x100000); - if (var_a2 < 0x1000) { + size = (u32)expand_gzip((void*)0x80200000, (void*)0x80300000, cmd->size, 0x100000); + if (size < 0x1000) { return NULL; } - temp_s0 = *(u32*)0x80300008; + entrypoint = *(void**)0x80300008; - if (arg3 != 0) { - var_a0 = temp_s0 - 0x1000; - if (var_a0 < 0x80400000) { + if (includeHeader) { + start = (void*)((u32)entrypoint - 0x1000); + if (start < (void*)0x80400000) { return NULL; } - memcpy((void*)var_a0, (void*)0x80300000, var_a2); + memcpy(start, (void*)0x80300000, size); } else { - if (temp_s0 < 0x80400000) { + if (entrypoint < (void*)0x80400000) { return NULL; } - memcpy((void*)temp_s0, (void*)0x80301000, var_a2 - 0x1000); + memcpy(entrypoint, (void*)0x80301000, size - 0x1000); } - return (void*)temp_s0; + return entrypoint; } -s32 func_80002CB0(s32* arg0, u32 arg1) { - s32 temp_s3; +s32 sa1ReadAndVerifyCMD(u32* blockP, u32 numBlocksToSkip) { + s32 blockNum; s32 i; s32 j; - u32* var_s1 = (u32*)&D_80033C10; + u32* dst = (u32*)&cmdBlock; s32 ret; - ret = func_800028FC(*arg0, arg1); + // Skip arg1 bad blocks? + ret = sa1SkipBlocks(*blockP, numBlocksToSkip); if (ret < 0) { return ret; } - temp_s3 = ret; + blockNum = ret; + // Read 1 block's worth of data one page at a time for (i = 0; i < 0x20; i++) { - ret = func_800027A0((temp_s3 << 5) + i, 0); + ret = sa1CardReadPage(blockNum * 0x20 + i, 0); if (ret < 0) { return ret; } if (i == 0) { - *arg0 = func_80002838(IO_READ(PI_10400_REG)); + *blockP = sa1NextGoodBlock(IO_READ(PI_10400_REG)); } for (j = 0; j < 0x200; j += 4) { - *var_s1++ = IO_READ(PI_10000_BUF(j)); + *dst++ = IO_READ(PI_10000_BUF(j)); } } - if (func_800029CC(D_80033C10) == 0) { + if (sa1VerifyCMD(cmdBlock) == 0) { return 0; } return -1; } -void func_80002D94(void (*arg0)(), void* arg1) { +void sa1BootSA2(void (*entrypoint)(u32), u32 arg) { __osDisableInt(); - arg0(arg1); + entrypoint(arg); } -void* func_80002DCC(void) { +void* sa1AuthenticateAndLoadSA2(void) { u32 sp10 = 0; u32 sp14 = 0; - void* var_v0; - u32 temp_s1; - u32 temp_s2; - BbContentMetaDataHead* cmd = (BbContentMetaDataHead*)&D_80033C10[0]; + void* entrypoint; + u32 numSA1Blocks; + u32 numSA2Blocks; + BbContentMetaDataHead* cmd = (BbContentMetaDataHead*)&cmdBlock[0]; u32 i; - if (func_80002CB0(&sp10, 4) < 0) { + // Read CMD of SA1 + if (sa1ReadAndVerifyCMD(&sp10, 4) < 0) { return 0; } sp14 = sp10; - temp_s1 = cmd->size >> 0xE; + numSA1Blocks = cmd->size / 0x4000; - for (i = 1; i <= temp_s1; i++) { - if (func_800027A0(sp14 << 5, 0) < 0) { + for (i = 1; i <= numSA1Blocks; i++) { + if (sa1CardReadPage(sp14 * 0x20, 0) < 0) { return 0; } - sp14 = func_80002838(IO_READ(PI_10400_REG)); + sp14 = sa1NextGoodBlock(IO_READ(PI_10400_REG)); } - if (func_80002CB0(&sp14, 0) < 0) { + // Read CMD of SA2 + if (sa1ReadAndVerifyCMD(&sp14, 0) < 0) { return 0; } - temp_s2 = cmd->size >> 0xE; - if (temp_s2 > 0x40) { + numSA2Blocks = cmd->size / 0x4000; + if (numSA2Blocks > 64) { // Max size of 64 blocks or 1MiB return 0; } - D_80037C10[0] = sp14; + sa2BlockList[0] = sp14; - for (i = 1; i < temp_s2; i++) { - if (func_800027A0(D_80037C10[i - 1] << 5, 0) < 0) { + for (i = 1; i < numSA2Blocks; i++) { + if (sa1CardReadPage(sa2BlockList[i - 1] * 0x20, 0) < 0) { return 0; } - D_80037C10[i] = func_80002838(IO_READ(PI_10400_REG)); + sa2BlockList[i] = sa1NextGoodBlock(IO_READ(PI_10400_REG)); } - D_80037C10[i] = 0; + sa2BlockList[i] = 0; - var_v0 = func_80002BF8(cmd, D_80037C10, temp_s2, 1); - if (var_v0 == NULL) { + entrypoint = sa1LoadAndDecompressSA2(cmd, sa2BlockList, numSA2Blocks, TRUE); + if (entrypoint == NULL) { return NULL; } - return var_v0; + return entrypoint; } diff --git a/src/sa1/1F40.c b/src/sa1/1F40.c index f6d6f54..574a4c4 100644 --- a/src/sa1/1F40.c +++ b/src/sa1/1F40.c @@ -6,6 +6,7 @@ #include "include_asm.h" s32 skGetId(BbId* bbId); +s32 skSignHash(BbShaHash* hash, BbEccSig* outSignature); void osBbSetErrorLed(s32); void __osBbDelay(u32); @@ -26,64 +27,62 @@ void osBbRtcInit(void); void osBbRtcSet(u8 year, u8 month, u8 day, u8 dow, u8 hour, u8 min, u8 sec); void osBbRtcGet(u8* year, u8* month, u8* day, u8* dow, u8* hour, u8* min, u8* sec); -s32 skSignHash(BbShaHash* hash, BbEccSig* outSignature); +extern s32 __osBbIsBb; -extern OSThread D_80047DB0; -extern s32 D_800163C4; -extern u8 D_80047F60[0x8000]; -extern OSMesgQueue D_800C9C28; -extern OSMesg D_8001AEB0; -extern OSBbFs D_80037CA0; -extern u8 D_8003FCA0[0x4000]; +extern OSThread ledThread; +extern OSMesgQueue ledTimerQueue; +extern OSMesg ledTimerMsgBuf; + +extern s32 ledThreadNeedsInit; // = TRUE +extern u8 ledThreadStack[0x8000]; +extern OSBbFs bbfs; +extern u8 blockData[0x4000]; +extern u8 spareData[0x10]; +extern s32 cardPresent; +extern s32 cardChanged; +extern u32 sequenceNumber; +extern u8 blockStats[0x4000]; +extern char fileName[0x100]; extern s8* D_800163C8; -extern s32 D_8001AE38; // card changed -extern s32 D_8001AEC4; -extern u32 D_8001AEC8; -extern OSBbFs D_80037CA0; -extern u8 D_8003FCA0[0x4000]; -extern u8 D_80043CA0[0x4000]; -extern u8 D_80047CA0[0x10]; -extern u8 D_80047CB0[0x100]; -extern s32 __osBbIsBb; -void func_80002F40(u32 delay) { +void sa1LEDBlinkOnce(u32 delay) { osBbSetErrorLed(1); __osBbDelay(delay); osBbSetErrorLed(0); __osBbDelay(delay); } -void func_80002F80(void* arg) { +void sa1LEDThread(void* arg) { OSTimer timer; - s32 var_s1 = 1; + s32 ledState = 1; while (TRUE) { - osBbSetErrorLed(var_s1); - osSetTimer(&timer, 23437500, 0, &D_800C9C28, NULL); - osRecvMesg(&D_800C9C28, NULL, OS_MESG_BLOCK); - var_s1 ^= 1; + osBbSetErrorLed(ledState); + osSetTimer(&timer, OS_USEC_TO_CYCLES(500000), 0, &ledTimerQueue, NULL); + osRecvMesg(&ledTimerQueue, NULL, OS_MESG_BLOCK); + ledState ^= 1; } } -void func_80002FE8(void) { - if (D_800163C4 != 0) { - osCreateMesgQueue(&D_800C9C28, &D_8001AEB0, 1); - osCreateThread(&D_80047DB0, 9, func_80002F80, NULL, D_80047F60 + sizeof(D_80047F60), 9); - D_800163C4 = 0; +void sa1LEDThreadStart(void) { + if (ledThreadNeedsInit) { + osCreateMesgQueue(&ledTimerQueue, &ledTimerMsgBuf, 1); + osCreateThread(&ledThread, 9, sa1LEDThread, NULL, ledThreadStack + sizeof(ledThreadStack), 9); + ledThreadNeedsInit = FALSE; } - osStartThread(&D_80047DB0); + osStartThread(&ledThread); } -void func_80003068(void) { - osStopThread(&D_80047DB0); +void sa1LEDThreadStop(void) { + osStopThread(&ledThread); osBbSetErrorLed(0); } -s32 func_80003094(void) { - char sp10[9] = "temp.tmp"; - char sp20[7] = "id.sys"; +s32 sa1CheckIdSys(void) { + char temptmp[9] = "temp.tmp"; + char idsys[7] = "id.sys"; BbId bbId; - s32 temp_s0; + u32 savedBbId; s32 fd; s32 ret; @@ -93,53 +92,61 @@ s32 func_80003094(void) { goto end; } - if (osBbFInit(&D_80037CA0) < 0) { + if (osBbFInit(&bbfs) < 0) { ret = -2; goto end; } - bzero(D_8003FCA0, sizeof(D_8003FCA0)); + bzero(blockData, sizeof(blockData)); - fd = osBbFOpen(sp20, "r"); + fd = osBbFOpen(idsys, "r"); if (fd >= 0) { - if (osBbFRead(fd, 0, &D_8003FCA0, sizeof(D_8003FCA0)) < 0) { + // id.sys exists .. + if (osBbFRead(fd, 0, blockData, sizeof(blockData)) < 0) { + // .. but cannot be read? osBbFClose(fd); ret = -2; } else { - temp_s0 = *(u32*)&D_8003FCA0[0]; + // .. check that the saved bbid is the same + savedBbId = *(u32*)&blockData[0]; osBbFClose(fd); - if (bbId != temp_s0) { + if (bbId != savedBbId) { ret = -3; } } } else if (fd == -8) { - bcopy(&bbId, &D_8003FCA0, sizeof(bbId)); - osBbFDelete(sp10); - osBbFCreate(sp10, 1, sizeof(D_8003FCA0)); + // id.sys does not exist, create temp.tmp + bcopy(&bbId, blockData, sizeof(bbId)); + osBbFDelete(temptmp); + osBbFCreate(temptmp, 1, sizeof(blockData)); - fd = osBbFOpen(sp10, "w"); + // Open the created file + fd = osBbFOpen(temptmp, "w"); if (fd < 0) { ret = -2; } else { - if (osBbFWrite(fd, 0, &D_8003FCA0, sizeof(D_8003FCA0)) < 0) { + // Write the bbid + if (osBbFWrite(fd, 0, blockData, sizeof(blockData)) < 0) { osBbFClose(fd); - osBbFDelete(sp10); + osBbFDelete(temptmp); ret = -2; } + // Rename temp.tmp to id.sys osBbFClose(fd); - osBbFRename(sp10, sp20); + osBbFRename(temptmp, idsys); } } else { + // Other error when trying to open id.sys ret = -2; } end: return ret; } -u32 func_8000328C(u8* data, s32 size, u32 initVal) { +u32 sa1CalcChecksum(u8* data, s32 size, u32 initVal) { u32 csum = initVal; s32 i; @@ -150,7 +157,7 @@ u32 func_8000328C(u8* data, s32 size, u32 initVal) { } // calculate checksum of "size" bytes of "fileName" -s32 func_800032B8(const char* fileName, u32 size, u32 expectedChksum) { +s32 sa1VerifyChecksum(const char* fileName, u32 size, u32 expectedChksum) { OSBbStatBuf sb; s32 fd; s32 offset; @@ -170,25 +177,25 @@ s32 func_800032B8(const char* fileName, u32 size, u32 expectedChksum) { } remaining = size; - if (sb.size < remaining) { + if ((u32)remaining > sb.size) { remaining = sb.size; } offset = 0; while (remaining > 0) { - bzero(D_8003FCA0, sizeof(D_8003FCA0)); - osInvalDCache(&D_8003FCA0, sizeof(D_8003FCA0)); + bzero(blockData, sizeof(blockData)); + osInvalDCache(&blockData, sizeof(blockData)); blockSize = remaining; - if (blockSize > sizeof(D_8003FCA0)) { - blockSize = sizeof(D_8003FCA0); + if (blockSize > sizeof(blockData)) { + blockSize = sizeof(blockData); } - ret = osBbFRead(fd, offset, &D_8003FCA0, sizeof(D_8003FCA0)); + ret = osBbFRead(fd, offset, &blockData, sizeof(blockData)); if (ret < 0) { return ret; } remaining -= blockSize; - offset += sizeof(D_8003FCA0); - computedChksum = func_8000328C(D_8003FCA0, (s32)blockSize, computedChksum); + offset += sizeof(blockData); + computedChksum = sa1CalcChecksum(blockData, (s32)blockSize, computedChksum); } return (expectedChksum == computedChksum) ? 0 : -1; @@ -215,14 +222,14 @@ typedef enum { CMD_SIGN_HASH = 0x20, } CmdId; -void func_800033CC(void) { +void sa1CommandLoop(void) { u32 dataIn[2]; u32 dataOut[2]; u32 status[2]; BbShaHash hash; BbEccSig eccSig; - s32 numBlocks; + u32 numBlocks; u32 regVal; void* sparePtr; u32 ledValue; @@ -250,16 +257,16 @@ void func_800033CC(void) { if (__osBbIsBb) { osBbRtcInit(); osBbCardInit(); - ret = osBbFInit(&D_80037CA0); + ret = osBbFInit(&bbfs); } } - D_8001AE38 = osBbCardClearChange(); - func_80002F40(100000); + cardPresent = osBbCardClearChange(); + sa1LEDBlinkOnce(100000); while (1) { if (ret < 0) { - func_80003068(); + sa1LEDThreadStop(); } ret = osBbReadHost(dataIn, sizeof(dataIn)); @@ -268,11 +275,11 @@ void func_800033CC(void) { } osBbCardStatus(0, (u8*)status); - D_8001AEC4 = osBbCardChange(); - if (D_8001AEC4 != 0) { - D_8001AEC8 = 0; - D_8001AE38 = osBbCardClearChange(); - if (D_8001AE38) { + cardChanged = osBbCardChange(); + if (cardChanged) { + sequenceNumber = 0; + cardPresent = osBbCardClearChange(); + if (cardPresent) { osBbCardInit(); } } @@ -284,24 +291,24 @@ void func_800033CC(void) { switch (dataIn[0]) { case CMD_FILE_CHECKSUM: length = (dataIn[1] + 3) & ~3; - if (length > sizeof(D_80047CB0)) { - length = sizeof(D_80047CB0); + if (length > sizeof(fileName)) { + length = sizeof(fileName); } - ret = osBbReadHost(D_80047CB0, length); + ret = osBbReadHost(fileName, length); if (ret < 0) { break; } - D_80047CB0[0xFF] = 0; + fileName[255] = '\0'; ret = osBbReadHost(dataIn, sizeof(dataIn)); if (ret < 0) { break; } - dataOut[1] = func_800032B8(D_80047CB0, dataIn[1], dataIn[0]); + dataOut[1] = sa1VerifyChecksum(fileName, dataIn[1], dataIn[0]); ret = osBbWriteHost(dataOut, sizeof(dataOut)); break; case CMD_SET_LED: - func_80003068(); + sa1LEDThreadStop(); ledValue = dataIn[1] & 3; if (ledValue < 2) { osBbSetErrorLed(0); @@ -312,7 +319,7 @@ void func_800033CC(void) { } else if (ledValue != 3) { dataOut[1] = 0; } else { - func_80002FE8(); + sa1LEDThreadStart(); dataOut[1] = 0; } ret = osBbWriteHost(dataOut, sizeof(dataOut)); @@ -343,37 +350,37 @@ void func_800033CC(void) { break; case CMD_WRITE_BLOCK_WITH_SPARE: - sparePtr = D_80047CA0; + sparePtr = spareData; case CMD_WRITE_BLOCK: - ret = osBbReadHost(D_8003FCA0, sizeof(D_8003FCA0)); + ret = osBbReadHost(blockData, sizeof(blockData)); if (ret < 0) { break; } if (sparePtr != NULL) { - ret = osBbReadHost(D_80047CA0, sizeof(D_80047CA0)); + ret = osBbReadHost(spareData, sizeof(spareData)); if (ret < 0) { break; } } osBbCardEraseBlock(0, dataIn[1]); - dataOut[1] = osBbCardWriteBlock(0, dataIn[1], D_8003FCA0, sparePtr); + dataOut[1] = osBbCardWriteBlock(0, dataIn[1], blockData, sparePtr); ret = osBbWriteHost(dataOut, sizeof(dataOut)); break; case CMD_READ_BLOCK_WITH_SPARE: - sparePtr = D_80047CA0; + sparePtr = spareData; case CMD_READ_BLOCK: - dataOut[1] = osBbCardReadBlock(0, dataIn[1], D_8003FCA0, D_80047CA0); + dataOut[1] = osBbCardReadBlock(0, dataIn[1], blockData, spareData); ret = osBbWriteHost(dataOut, sizeof(dataOut)); if (ret < 0) { break; } - ret = osBbWriteHost(D_8003FCA0, sizeof(D_8003FCA0)); + ret = osBbWriteHost(blockData, sizeof(blockData)); if (ret < 0) { break; } if (sparePtr != NULL) { - ret = osBbWriteHost(D_80047CA0, sizeof(D_80047CA0)); + ret = osBbWriteHost(spareData, sizeof(spareData)); } break; @@ -381,20 +388,20 @@ void func_800033CC(void) { numBlocks = osBbCardBlocks(0); for (n = 0; n < numBlocks; n++) { - D_80047CA0[5] = 0xFF; - osBbCardReadBlock(0, n, D_8003FCA0, D_80047CA0); - D_80043CA0[n] = D_80047CA0[5] != 0xFF; // bad block indicator + spareData[5] = 0xFF; + osBbCardReadBlock(0, n, blockData, spareData); + blockStats[n] = spareData[5] != 0xFF; // bad block indicator } dataOut[1] = n; // numBlocks ret = osBbWriteHost(dataOut, sizeof(dataOut)); if (ret < 0) { break; } - ret = osBbWriteHost(D_80043CA0, n); + ret = osBbWriteHost(blockStats, n); break; case CMD_INIT_FS: - dataOut[1] = osBbFInit(&D_80037CA0); + dataOut[1] = osBbFInit(&bbfs); ret = osBbWriteHost(dataOut, sizeof(dataOut)); break; @@ -404,15 +411,15 @@ void func_800033CC(void) { break; case CMD_SET_SEQ_NUM: - dataOut[1] = D_8001AEC8 = D_8001AE38 ? dataIn[1] : 0; + dataOut[1] = sequenceNumber = cardPresent ? dataIn[1] : 0; ret = osBbWriteHost(dataOut, sizeof(dataOut)); break; case CMD_GET_SEQ_NUM: - if (!D_8001AE38) { + if (!cardPresent) { dataOut[1] = -1; } else { - dataOut[1] = D_8001AEC8; + dataOut[1] = sequenceNumber; } ret = osBbWriteHost(dataOut, sizeof(dataOut)); break; @@ -448,7 +455,7 @@ void func_800033CC(void) { while ((s32)n > 0) { remaining = MIN(n, 0x4000); - ret = osBbReadHost(D_8003FCA0, remaining); + ret = osBbReadHost(blockData, remaining); if (ret < 0) { break; } diff --git a/src/sa1/2980.c b/src/sa1/2980.c index 682b320..cd0115d 100644 --- a/src/sa1/2980.c +++ b/src/sa1/2980.c @@ -6,7 +6,7 @@ void __osBbDelay(u32); -void func_80003980(void) { +void sa1TestVIBuffer(void) { u32 saveCtrl = IO_READ(VI_CONTROL_REG); IO_WRITE(VI_CONTROL_REG, VI_CTRL_TEST_ENABLE | VI_CTRL_KILL_WE); @@ -26,7 +26,7 @@ void func_80003980(void) { IO_WRITE(VI_CONTROL_REG, saveCtrl); } -s32 func_800039DC(void) { +s32 sa1CheckVIBuffer(void) { u32 saveCtrl = IO_READ(VI_CONTROL_REG); u32 data; @@ -43,11 +43,11 @@ s32 func_800039DC(void) { return FALSE; } -s32 func_80003A28(void* arg0) { +s32 sa1ConfigureVI(void* framebuffer) { s32 i = 0; u32 saveMask = __osDisableInt(); - bzero(arg0, 0x1900); + bzero(framebuffer, 0x1900); do { u32 temp; @@ -59,7 +59,7 @@ s32 func_80003A28(void* arg0) { __osBbDelay(1); IO_WRITE(MI_30_REG, temp | 0x02000000); - IO_WRITE(VI_ORIGIN_REG, arg0); + IO_WRITE(VI_ORIGIN_REG, framebuffer); // NTSC LAN1 configuration IO_WRITE(VI_WIDTH_REG, 320); @@ -74,7 +74,7 @@ s32 func_80003A28(void* arg0) { IO_WRITE(VI_X_SCALE_REG, 0x200); IO_WRITE(VI_Y_SCALE_REG, 0x400); - func_80003980(); + sa1TestVIBuffer(); IO_WRITE(VI_CURRENT_REG, 0); @@ -86,7 +86,7 @@ s32 func_80003A28(void* arg0) { } i++; - } while (func_800039DC()); + } while (sa1CheckVIBuffer()); IO_WRITE(VI_H_START_REG, 0); diff --git a/src/sa1/2C20.c b/src/sa1/2C20.c index 77c5765..e86e153 100644 --- a/src/sa1/2C20.c +++ b/src/sa1/2C20.c @@ -5,35 +5,34 @@ s32 expand_gzip(void* src, void* dst, size_t, size_t); -extern OSMesgQueue D_8006B770; -extern OSMesg D_8006B788[1]; -extern OSMesg D_8006B78C; +extern OSMesgQueue rdpDoneQueue; +extern OSMesg rdpDoneMsgBuf[1]; +extern OSMesg rdpDoneMsg; typedef struct { Gfx cmdBuffer[0x2800]; void* frameBuffer; } GfxPool; -extern GfxPool D_80057768; +extern GfxPool gfxPool; -extern u8 D_8004FF60[]; +extern u8 imgBuffer[0x7800]; extern u64 gfxYieldBuffer[OS_YIELD_DATA_SIZE/sizeof(u64)]; extern u64 gfxDramStack[0x400/sizeof(u64)]; -extern void* D_8006B768; extern u8 framebuffer[]; -extern Gfx D_800163E0[]; -extern Gfx D_80016408[]; +extern Gfx rspInitDL[]; +extern Gfx rdpInitDL[]; extern Gfx* gfxListHead; -void func_80003C20(void) { - osCreateMesgQueue(&D_8006B770, D_8006B788, ARRLEN(D_8006B788)); - osSetEventMesg(OS_EVENT_DP, &D_8006B770, D_8006B78C); - D_80057768.frameBuffer = framebuffer; +void sa1InitRDP(void) { + osCreateMesgQueue(&rdpDoneQueue, rdpDoneMsgBuf, ARRLEN(rdpDoneMsgBuf)); + osSetEventMesg(OS_EVENT_DP, &rdpDoneQueue, rdpDoneMsg); + gfxPool.frameBuffer = framebuffer; } -void func_80003C7C(void* timg, s32 fmt, s32 siz, u32 width, u32 height, s32 tileWidthX, s32 tileWidthY, f32 x, f32 y) { +void sa1BuildImageDL(void* timg, u32 fmt, u32 siz, u32 width, u32 height, u32 tileWidthX, u32 tileWidthY, f32 x, f32 y) { f32 s; f32 t; s32 uls; @@ -48,10 +47,10 @@ void func_80003C7C(void* timg, s32 fmt, s32 siz, u32 width, u32 height, s32 tile s32 uly; f32 temp; - gSPDisplayList(gfxListHead++, D_80016408); + gSPDisplayList(gfxListHead++, rdpInitDL); - for (offx = 0; offx < width; offx += tileWidthX) { - for (offy = 0; offy < height; offy += tileWidthY) { + for (offx = 0; (u32)offx < width; offx += tileWidthX) { + for (offy = 0; (u32)offy < height; offy += tileWidthY) { if (offx != 0) { s = (f32)offx - 0.5; } else { @@ -112,13 +111,13 @@ void func_80003C7C(void* timg, s32 fmt, s32 siz, u32 width, u32 height, s32 tile } } -void func_800040EC(GfxPool* gfxPool) { +void sa1RenderImage(GfxPool* gfxPool) { OSTask gfxTask; gfxListHead = gfxPool->cmdBuffer; - gSPDisplayList(gfxListHead++, D_80016408); - gSPDisplayList(gfxListHead++, D_800163E0); + gSPDisplayList(gfxListHead++, rdpInitDL); + gSPDisplayList(gfxListHead++, rspInitDL); gDPPipeSync(gfxListHead++); gDPSetCycleType(gfxListHead++, G_CYC_FILL); gDPSetColorImage(gfxListHead++, G_IM_FMT_RGBA, G_IM_SIZ_16b, 320, osVirtualToPhysical(gfxPool->frameBuffer)); @@ -126,16 +125,16 @@ void func_800040EC(GfxPool* gfxPool) { gDPFillRectangle(gfxListHead++, 0, 0, 320 - 1, 240 - 1); gDPPipeSync(gfxListHead++); - func_80003C7C(D_8004FF60, G_IM_FMT_RGBA, G_IM_SIZ_16b, 160, 96, 32, 32, 80.0f, 72.0f); + sa1BuildImageDL(imgBuffer, G_IM_FMT_RGBA, G_IM_SIZ_16b, 160, 96, 32, 32, 80.0f, 72.0f); gDPFullSync(gfxListHead++); gSPEndDisplayList(gfxListHead++); gfxTask.t.type = M_GFXTASK; - gfxTask.t.ucode_boot = rspbootTextStart; + gfxTask.t.ucode_boot = (u64*)rspbootTextStart; gfxTask.t.ucode_boot_size = (u32)rspbootTextEnd - (u32)rspbootTextStart; - gfxTask.t.ucode = gspFast3DTextStart; - gfxTask.t.ucode_data = gspFast3DDataStart; + gfxTask.t.ucode = (u64*)gspFast3DTextStart; + gfxTask.t.ucode_data = (u64*)gspFast3DDataStart; gfxTask.t.ucode_data_size = 0x800; gfxTask.t.dram_stack = gfxDramStack; gfxTask.t.dram_stack_size = 0x400; @@ -150,17 +149,17 @@ void func_800040EC(GfxPool* gfxPool) { osWritebackDCacheAll(); osSpTaskLoad(&gfxTask); osSpTaskStartGo(&gfxTask); - osRecvMesg(&D_8006B770, &D_8006B78C, OS_MESG_BLOCK); + osRecvMesg(&rdpDoneQueue, &rdpDoneMsg, OS_MESG_BLOCK); osViSwapBuffer(gfxPool->frameBuffer); } -s32 func_80004390(void* arg0, size_t arg1) { +s32 sa1DisplayImage(void* arg0, size_t arg1) { s32 ret; - bzero(D_8004FF60, 0x7800); - ret = expand_gzip(arg0, D_8004FF60, arg1, 0x7800); + bzero(imgBuffer, 0x7800); + ret = expand_gzip(arg0, imgBuffer, arg1, 0x7800); if (ret > 0) { - func_800040EC(&D_80057768); + sa1RenderImage(&gfxPool); } return ret; } diff --git a/tools/splat_files/relocs.txt b/tools/splat_files/relocs.txt index 3e8761f..40441d3 100644 --- a/tools/splat_files/relocs.txt +++ b/tools/splat_files/relocs.txt @@ -10,19 +10,19 @@ rom:0x68C0 symbol:ramromThreadStack reloc:MIPS_HI16 addend:0x400 rom:0x68C4 symbol:ramromThreadStack reloc:MIPS_LO16 addend:0x400 rom:0x4F48 symbol:viThreadStack reloc:MIPS_HI16 addend:0x1000 rom:0x4F4C symbol:viThreadStack reloc:MIPS_LO16 addend:0x1000 -rom:0x1424 symbol:D_8002B458 reloc:MIPS_HI16 addend:0x8000 -rom:0x1428 symbol:D_8002B458 reloc:MIPS_LO16 addend:0x8000 -rom:0x1188 symbol:D_8001B0F8 reloc:MIPS_HI16 addend:0x8000 -rom:0x118C symbol:D_8001B0F8 reloc:MIPS_LO16 addend:0x8000 -rom:0x12C0 symbol:D_800232A8 reloc:MIPS_HI16 addend:0x8000 -rom:0x12C4 symbol:D_800232A8 reloc:MIPS_LO16 addend:0x8000 -rom:0x2028 symbol:D_80047F60 reloc:MIPS_HI16 addend:0x8000 -rom:0x202C symbol:D_80047F60 reloc:MIPS_LO16 addend:0x8000 +rom:0x1424 symbol:eventThreadStack reloc:MIPS_HI16 addend:0x8000 +rom:0x1428 symbol:eventThreadStack reloc:MIPS_LO16 addend:0x8000 +rom:0x1188 symbol:idleThreadStack reloc:MIPS_HI16 addend:0x8000 +rom:0x118C symbol:idleThreadStack reloc:MIPS_LO16 addend:0x8000 +rom:0x12C0 symbol:mainThreadStack reloc:MIPS_HI16 addend:0x8000 +rom:0x12C4 symbol:mainThreadStack reloc:MIPS_LO16 addend:0x8000 +rom:0x2028 symbol:ledThreadStack reloc:MIPS_HI16 addend:0x8000 +rom:0x202C symbol:ledThreadStack reloc:MIPS_LO16 addend:0x8000 // entrypoint rom:0x1028 symbol:bootStack reloc:MIPS_HI16 addend:0x8000 rom:0x102C symbol:bootStack reloc:MIPS_LO16 addend:0x8000 -rom:0x1030 symbol:func_80002114 reloc:MIPS_HI16 addend:0 -rom:0x1034 symbol:func_80002114 reloc:MIPS_LO16 addend:0 +rom:0x1030 symbol:sa1Entrypoint reloc:MIPS_HI16 addend:0 +rom:0x1034 symbol:sa1Entrypoint reloc:MIPS_LO16 addend:0 rom:0x1000 symbol:__bss_start reloc:MIPS_HI16 addend:-0x10000 rom:0x1004 symbol:__bss_start reloc:MIPS_LO16 addend:-0x10000 rom:0x1008 symbol:__bss_size reloc:MIPS_HI16 addend:-0x10000 diff --git a/tools/splat_files/symbol_addrs_bss.txt b/tools/splat_files/symbol_addrs_bss.txt index 2349bfd..c4c9579 100644 --- a/tools/splat_files/symbol_addrs_bss.txt +++ b/tools/splat_files/symbol_addrs_bss.txt @@ -1,5 +1,5 @@ local_setup_packet = 0x8001AE30; // size:8 file=libultra/bb/usb/usbdevice.c -D_8001AE38 = 0x8001AE38; // size:4 file=sa1/1F40.c +cardPresent = 0x8001AE38; // size:4 file=sa1/1F40.c __osBbFsBlocks = 0x8001AE3C; // size:2 file=libultra/bb/fs/fsinit.c __osBaseCounter = 0x8001AE40; // size:4 file=libultra/time/timerintr.c __kmc_pt_mode = 0x8001AE44; // size:4 file=libultra/system/initialize.c @@ -26,13 +26,13 @@ __osBbLastVCount = 0x8001AEA0; // size:4 file=libultra/reg/_getcount.c usb_status = 0x8001AEA4; // size:2 file=libultra/bb/usb/usbdevice.c __osThprofLastTimer = 0x8001AEA8; // size:4 file=libultra/debug/threadprofile.c __osRdb_IP6_CurSend = 0x8001AEAC; // size:4 file=libultra/host/initrdb.c -D_8001AEB0 = 0x8001AEB0; // size:4 file=sa1/1F40.c +ledTimerMsgBuf = 0x8001AEB0; // size:4 file=sa1/1F40.c __osTimerCounter = 0x8001AEB4; // size:4 file=libultra/time/timerintr.c __osBbCardMultiplane = 0x8001AEB8; // size:1 file=libultra/bb/card/cardinit.c FB_SCREEN_HT = 0x8001AEBC; // size:4 file=libfb/init.c __usb_endpt_desc_reg = 0x8001AEC0; // size:4 file=libultra/bb/usb/usbinit.c -D_8001AEC4 = 0x8001AEC4; // size:4 file=sa1/1F40.c -D_8001AEC8 = 0x8001AEC8; // size:4 file=sa1/1F40.c +cardChanged = 0x8001AEC4; // size:4 file=sa1/1F40.c +sequenceNumber = 0x8001AEC8; // size:4 file=sa1/1F40.c sof_count = 0x8001AECC; // size:2 file=libultra/bb/usb/usbdevice.c __osBbVCountWraps = 0x8001AED0; // size:4 file=libultra/reg/_getcount.c D_8001AED4 = 0x8001AED4; // size:4 file=FIXME @@ -50,15 +50,15 @@ __osArcHostHandle = 0x8001AF08; // size:8 file=libultra/bb/usb/usbhw.c __osBbFatBlock = 0x8001AF10; // size:2 file=libultra/bb/fs/fsinit.c __osRdb_IP6_Ct = 0x8001AF14; // size:4 file=libultra/host/initrdb.c FB_BGCOLOR = 0x8001AF18; // size:2 file=libfb/init.c -D_8001AF40 = 0x8001AF40; // size:4 file=sa1/1050.c +skBootValue = 0x8001AF40; // size:4 file=sa1/1050.c D_8001AF44 = 0x8001AF44; // size:4 file=sa1/1050.c -D_8001AF48 = 0x8001AF48; // size:0x1B0 file=sa1/1050.c -D_8001B0F8 = 0x8001B0F8; // size:0x8000 file=sa1/1050.c -D_800230F8 = 0x800230F8; // size:0x1B0 file=sa1/1050.c -D_800232A8 = 0x800232A8; // size:0x8000 file=sa1/1050.c -D_8002B2A8 = 0x8002B2A8; // size:0x1B0 file=sa1/1050.c -D_8002B458 = 0x8002B458; // size:0x8000 file=sa1/1050.c -D_80033458 = 0x80033458; // size:0x100 file=sa1/1050.c +idleThread = 0x8001AF48; // size:0x1B0 file=sa1/1050.c +idleThreadStack = 0x8001B0F8; // size:0x8000 file=sa1/1050.c +mainThread = 0x800230F8; // size:0x1B0 file=sa1/1050.c +mainThreadStack = 0x800232A8; // size:0x8000 file=sa1/1050.c +eventThread = 0x8002B2A8; // size:0x1B0 file=sa1/1050.c +eventThreadStack = 0x8002B458; // size:0x8000 file=sa1/1050.c +appSavedState = 0x80033458; // size:0x100 file=sa1/1050.c piMesgBuf = 0x80033558; // size:0x320 file=sa1/1050.c piMesgQueue = 0x80033878; // size:0x18 file=sa1/1050.c siMesgBuf = 0x80033890; // size:0x320 file=sa1/1050.c @@ -68,21 +68,21 @@ viRetraceMesg = 0x80033BE0; // size:4 file=sa1/1050.c viMesgBuf = 0x80033BE4; // size:4 file=sa1/1050.c prenmiMesgBuf = 0x80033BE8; // size:4 file=sa1/1050.c prenmiMesgQueue = 0x80033BEC; // size:0x18 file=sa1/1050.c -D_80033C10 = 0x80033C10; // size:0x4000 file=sa1/17A0.c -D_80037C10 = 0x80037C10; // size:0x90 file=sa1/17A0.c -D_80037CA0 = 0x80037CA0; // size:0x8000 file=sa1/1F40.c -D_8003FCA0 = 0x8003FCA0; // size:0x4000 file=sa1/1F40.c -D_80043CA0 = 0x80043CA0; // size:0x4000 file=sa1/1F40.c -D_80047CA0 = 0x80047CA0; // size:0x10 file=sa1/1F40.c -D_80047CB0 = 0x80047CB0; // size:0x100 file=sa1/1F40.c -D_80047DB0 = 0x80047DB0; // size:0x1B0 file=sa1/1F40.c -D_80047F60 = 0x80047F60; // size:0x8000 file=sa1/1F40.c -D_8004FF60 = 0x8004FF60; // size:0x7800 file=sa1/2C20.c +cmdBlock = 0x80033C10; // size:0x4000 file=sa1/17A0.c +sa2BlockList = 0x80037C10; // size:0x90 file=sa1/17A0.c +bbfs = 0x80037CA0; // size:0x8000 file=sa1/1F40.c +blockData = 0x8003FCA0; // size:0x4000 file=sa1/1F40.c +blockStats = 0x80043CA0; // size:0x4000 file=sa1/1F40.c +spareData = 0x80047CA0; // size:0x10 file=sa1/1F40.c +fileName = 0x80047CB0; // size:0x100 file=sa1/1F40.c +ledThread = 0x80047DB0; // size:0x1B0 file=sa1/1F40.c +ledThreadStack = 0x80047F60; // size:0x8000 file=sa1/1F40.c +imgBuffer = 0x8004FF60; // size:0x7800 file=sa1/2C20.c gfxListHead = 0x80057760; // size:4 file=sa1/2C20.c -D_80057768 = 0x80057768; // size:0x14004 file=sa1/2C20.c -D_8006B770 = 0x8006B770; // size:0x18 file=sa1/2C20.c -D_8006B788 = 0x8006B788; // size:4 file=sa1/2C20.c -D_8006B78C = 0x8006B78C; // size:4 file=sa1/2C20.c +gfxPool = 0x80057768; // size:0x14004 file=sa1/2C20.c +rdpDoneQueue = 0x8006B770; // size:0x18 file=sa1/2C20.c +rdpDoneMsgBuf = 0x8006B788; // size:4 file=sa1/2C20.c +rdpDoneMsg = 0x8006B78C; // size:4 file=sa1/2C20.c readHostMesgQueue = 0x8006B790; // size:0x18 file=libultra/host/readhost.c readHostMesgBuf = 0x8006B7A8; // size:8 file=libultra/host/readhost.c writeHostMesgQueue = 0x8006B7B0; // size:0x18 file=libultra/host/writehost.c @@ -155,6 +155,6 @@ __osBaseTimer = 0x800C91E0; // size:0x20 file=libultra/time/timerintr.c gfxYieldBuffer = 0x800C9200; // size:0x900 file=sa1/2C20.c __osProfTimerQ = 0x800C9B00; // size:0x18 file=libultra/time/timerintr.c __osEventStateTab = 0x800C9B18; // size:0x110 file=libultra/message/seteventmesg.c -D_800C9C28 = 0x800C9C28; // size:0x18 file=sa1/1F40.c +ledTimerQueue = 0x800C9C28; // size:0x18 file=sa1/1F40.c thprof = 0x800C9C40; // size:0x400 file=libultra/debug/threadprofile.c gfxDramStack = 0x800CA040; // size:0x400 file=sa1/2C20.c diff --git a/tools/splat_files/symbol_addrs_data.txt b/tools/splat_files/symbol_addrs_data.txt index 1d895e8..85a2d05 100644 --- a/tools/splat_files/symbol_addrs_data.txt +++ b/tools/splat_files/symbol_addrs_data.txt @@ -1,10 +1,10 @@ // asm/data/15490.data.s -D_80016490 = 0x80016490; -D_800164A0 = 0x800164A0; // dont_allow_addend:True -D_800178A0 = 0x800178A0; -D_800178B0 = 0x800178B0; // dont_allow_addend:True +sa1Image1Size = 0x80016490; +sa1Image1Data = 0x800164A0; // dont_allow_addend:True +sa1Image2Size = 0x800178A0; +sa1Image2Data = 0x800178B0; // dont_allow_addend:True // asm/data/libultra/vi/vimgr.data.s @@ -182,25 +182,25 @@ osViModeNtscLpn1 = 0x800191C0; // type:label size:0x50 // asm/data/sa1/1F40.data.s -D_800163B0 = 0x800163B0; // type:label size:17 -D_800163C4 = 0x800163C4; // type:label size:4 +sa1BuildDate = 0x800163B0; // type:label size:18 +ledThreadNeedsInit = 0x800163C4; // type:label size:4 D_800163C8 = 0x800163C8; // type:label size:4 // asm/data/sa1/1050.data.s -D_80016390 = 0x80016390; // type:label size:4 -D_80016394 = 0x80016394; // type:label size:4 -D_80016398 = 0x80016398; // type:label size:4 -D_8001639C = 0x8001639C; // type:label size:4 -D_800163A0 = 0x800163A0; // type:label size:4 +usbTypeA = 0x80016390; // type:label size:4 +usbLineUnstable = 0x80016394; // type:label size:4 +usbNum = 0x80016398; // type:label size:4 +usbNotConnected = 0x8001639C; // type:label size:4 +powerBtnPressed = 0x800163A0; // type:label size:4 // asm/data/sa1/2C20.data.s -D_800163D0 = 0x800163D0; // type:label size:0x10 -D_800163E0 = 0x800163E0; // type:label size:0x28 -D_80016408 = 0x80016408; // type:label size:0x88 +viewport = 0x800163D0; // type:label size:0x10 +rspInitDL = 0x800163E0; // type:label size:0x28 +rdpInitDL = 0x80016408; // type:label size:0x88 // asm/data/rsp/gspFast3D.data.s diff --git a/tools/splat_files/symbol_addrs_text.txt b/tools/splat_files/symbol_addrs_text.txt index b71e9fc..88b28ea 100644 --- a/tools/splat_files/symbol_addrs_text.txt +++ b/tools/splat_files/symbol_addrs_text.txt @@ -783,53 +783,53 @@ SHA1Result = 0x800120C0; // type:func // src/sa1/1F40.c -func_80002F40 = 0x80002F40; // type:func -func_80002F80 = 0x80002F80; // type:func -func_80002FE8 = 0x80002FE8; // type:func -func_80003068 = 0x80003068; // type:func -func_80003094 = 0x80003094; // type:func -func_8000328C = 0x8000328C; // type:func -func_800032B8 = 0x800032B8; // type:func -func_800033CC = 0x800033CC; // type:func +sa1LEDBlinkOnce = 0x80002F40; // type:func +sa1LEDThread = 0x80002F80; // type:func +sa1LEDThreadStart = 0x80002FE8; // type:func +sa1LEDThreadStop = 0x80003068; // type:func +sa1CheckIdSys = 0x80003094; // type:func +sa1CalcChecksum = 0x8000328C; // type:func +sa1VerifyChecksum = 0x800032B8; // type:func +sa1CommandLoop = 0x800033CC; // type:func // src/sa1/2C20.c -func_80003C20 = 0x80003C20; // type:func -func_80003C7C = 0x80003C7C; // type:func -func_800040EC = 0x800040EC; // type:func -func_80004390 = 0x80004390; // type:func +sa1InitRDP = 0x80003C20; // type:func +sa1BuildImageDL = 0x80003C7C; // type:func +sa1RenderImage = 0x800040EC; // type:func +sa1DisplayImage = 0x80004390; // type:func // src/sa1/1050.c -func_80002050 = 0x80002050; // type:func -func_80002114 = 0x80002114; // type:func -func_800021C8 = 0x800021C8; // type:func -func_80002248 = 0x80002248; // type:func -func_80002320 = 0x80002320; // type:func -func_8000234C = 0x8000234C; // type:func +sa1Setup = 0x80002050; // type:func +sa1Entrypoint = 0x80002114; // type:func +sa1Event = 0x800021C8; // type:func +sa1IdleThread = 0x80002248; // type:func +sa1EventThread = 0x80002320; // type:func +sa1MainThread = 0x8000234C; // type:func // src/sa1/17A0.c -func_800027A0 = 0x800027A0; // type:func -func_80002838 = 0x80002838; // type:func -func_80002860 = 0x80002860; // type:func -func_800028FC = 0x800028FC; // type:func -func_80002950 = 0x80002950; // type:func -func_800029CC = 0x800029CC; // type:func -func_80002ABC = 0x80002ABC; // type:func -func_80002BF8 = 0x80002BF8; // type:func -func_80002CB0 = 0x80002CB0; // type:func -func_80002D94 = 0x80002D94; // type:func -func_80002DCC = 0x80002DCC; // type:func +sa1CardReadPage = 0x800027A0; // type:func +sa1NextGoodBlock = 0x80002838; // type:func +sa1CardReadBlock = 0x80002860; // type:func +sa1SkipBlocks = 0x800028FC; // type:func +sa1CheckHash = 0x80002950; // type:func +sa1VerifyCMD = 0x800029CC; // type:func +sa1LoadAndCheckSA2 = 0x80002ABC; // type:func +sa1LoadAndDecompressSA2 = 0x80002BF8; // type:func +sa1ReadAndVerifyCMD = 0x80002CB0; // type:func +sa1BootSA2 = 0x80002D94; // type:func +sa1AuthenticateAndLoadSA2 = 0x80002DCC; // type:func // src/sa1/2980.c -func_80003980 = 0x80003980; // type:func -func_800039DC = 0x800039DC; // type:func -func_80003A28 = 0x80003A28; // type:func +sa1TestVIBuffer = 0x80003980; // type:func +sa1CheckVIBuffer = 0x800039DC; // type:func +sa1ConfigureVI = 0x80003A28; // type:func // src/libz/zutil.c