From 60f9607569249813d508ec70ef501db6d46682ea Mon Sep 17 00:00:00 2001 From: cadmic Date: Wed, 9 Oct 2024 06:48:53 -0700 Subject: [PATCH] [ntsc-1.0/1.1] Match "system" files (#2254) --- include/z64.h | 10 ++++++---- src/boot/cic6105.c | 4 ++++ src/boot/is_debug.c | 5 +++++ src/code/irqmgr.c | 42 ++++++++++++++++++++++++++++++++++++++++++ src/code/main.c | 13 ++++++++++++- src/code/z_vimode.c | 40 +++++++++++++++++++++++++++++++++++++++- 6 files changed, 108 insertions(+), 6 deletions(-) diff --git a/include/z64.h b/include/z64.h index d52d459de3..5779205b38 100644 --- a/include/z64.h +++ b/include/z64.h @@ -389,10 +389,12 @@ ALIGNED(4) typedef struct PreNmiBuff { } PreNmiBuff; // size = 0x18 (actually osAppNMIBuffer is 0x40 bytes large but the rest is unused) typedef enum ViModeEditState { - /* 0 */ VI_MODE_EDIT_STATE_INACTIVE, - /* 1 */ VI_MODE_EDIT_STATE_ACTIVE, - /* 2 */ VI_MODE_EDIT_STATE_2, // active, more adjustments - /* 3 */ VI_MODE_EDIT_STATE_3 // active, more adjustments, print comparison with NTSC LAN1 mode + /* -2 */ VI_MODE_EDIT_STATE_NEGATIVE_2 = -2, + /* -1 */ VI_MODE_EDIT_STATE_NEGATIVE_1, + /* 0 */ VI_MODE_EDIT_STATE_INACTIVE, + /* 1 */ VI_MODE_EDIT_STATE_ACTIVE, + /* 2 */ VI_MODE_EDIT_STATE_2, // active, more adjustments + /* 3 */ VI_MODE_EDIT_STATE_3 // active, more adjustments, print comparison with NTSC LAN1 mode } ViModeEditState; typedef struct ViMode { diff --git a/src/boot/cic6105.c b/src/boot/cic6105.c index e0ddcb2c49..85ae47b0c7 100644 --- a/src/boot/cic6105.c +++ b/src/boot/cic6105.c @@ -39,7 +39,11 @@ void CIC6105_FaultClient(void) { Fault_Printf(" [Creator:%s]", gBuildCreator); Fault_SetCursor(56, 192); Fault_Printf("[Date:%s]", gBuildDate); +#if OOT_VERSION < PAL_1_0 + Fault_SetCursor(128, 24); +#else Fault_SetCursor(96, 32); +#endif Fault_Printf("I LOVE YOU %08x", func_80001714()); } diff --git a/src/boot/is_debug.c b/src/boot/is_debug.c index dc2cedc4b8..44d22fa874 100644 --- a/src/boot/is_debug.c +++ b/src/boot/is_debug.c @@ -48,6 +48,11 @@ void rmonPrintf(const char* fmt, ...) { va_end(args); } +#if OOT_VERSION < PAL_1_0 +void func_800015F4(void) { +} +#endif + #if OOT_DEBUG void* is_proutSyncPrintf(void* arg, const char* str, size_t count) { u32 data; diff --git a/src/code/irqmgr.c b/src/code/irqmgr.c index d623ddad88..3a1e3cdf55 100644 --- a/src/code/irqmgr.c +++ b/src/code/irqmgr.c @@ -34,6 +34,7 @@ */ #include "global.h" #include "terminal.h" +#include "versions.h" vu32 gIrqMgrResetStatus = IRQ_RESET_STATUS_IDLE; volatile OSTime sIrqMgrResetTime = 0; @@ -43,9 +44,13 @@ u32 sIrqMgrRetraceCount = 0; // Internal messages #define IRQ_RETRACE_MSG 666 #define IRQ_PRENMI_MSG 669 +#if OOT_VERSION < PAL_1_0 +#define IRQ_PRENMI500_MSG 670 +#else #define IRQ_PRENMI450_MSG 671 #define IRQ_PRENMI480_MSG 672 #define IRQ_PRENMI500_MSG 673 +#endif /** * Registers a client and an associated message queue with the IRQ manager. When an @@ -163,8 +168,13 @@ void IrqMgr_HandlePreNMI(IrqMgr* irqMgr) { irqMgr->resetStatus = IRQ_RESET_STATUS_PRENMI; sIrqMgrResetTime = irqMgr->resetTime = osGetTime(); +#if OOT_VERSION < PAL_1_0 + // Schedule a PRENMI500 message to be handled in 500ms + osSetTimer(&irqMgr->timer, OS_USEC_TO_CYCLES(500000), 0, &irqMgr->queue, (OSMesg)IRQ_PRENMI500_MSG); +#else // Schedule a PRENMI450 message to be handled in 450ms osSetTimer(&irqMgr->timer, OS_USEC_TO_CYCLES(450000), 0, &irqMgr->queue, (OSMesg)IRQ_PRENMI450_MSG); +#endif IrqMgr_JamMesgToClients(irqMgr, (OSMesg)&irqMgr->prenmiMsg); } @@ -183,6 +193,27 @@ void IrqMgr_CheckStacks(void) { } } +#if OOT_VERSION < PAL_1_0 + +void IrqMgr_HandlePreNMI500(IrqMgr* irqMgr) { + u64 nmi = IRQ_RESET_STATUS_NMI; // required to match + u32 result; + + gIrqMgrResetStatus = nmi; + irqMgr->resetStatus = IRQ_RESET_STATUS_NMI; + + IrqMgr_SendMesgToClients(irqMgr, (OSMesg)&irqMgr->nmiMsg); + + result = osAfterPreNMI(); + if (result != 0) { + // Schedule another PRENMI500 message to be handled in 1ms + osSetTimer(&irqMgr->timer, OS_USEC_TO_CYCLES(1000), 0, &irqMgr->queue, (OSMesg)IRQ_PRENMI500_MSG); + } + IrqMgr_CheckStacks(); +} + +#else + void IrqMgr_HandlePreNMI450(IrqMgr* irqMgr) { u64 nmi = IRQ_RESET_STATUS_NMI; // required to match @@ -215,6 +246,8 @@ void IrqMgr_HandlePreNMI500(IrqMgr* irqMgr) { IrqMgr_CheckStacks(); } +#endif + /** * Runs on each vertical retrace * @@ -244,6 +277,11 @@ void IrqMgr_ThreadEntry(void* arg) { while (!exit) { osRecvMesg(&irqMgr->queue, (OSMesg*)&msg, OS_MESG_BLOCK); switch (msg) { +#if OOT_VERSION < PAL_1_0 + default: + break; +#endif + case IRQ_RETRACE_MSG: IrqMgr_HandleRetrace(irqMgr); break; @@ -254,6 +292,7 @@ void IrqMgr_ThreadEntry(void* arg) { IrqMgr_HandlePreNMI(irqMgr); break; +#if OOT_VERSION >= PAL_1_0 case IRQ_PRENMI450_MSG: PRINTF("PRENMI450_MSG\n"); PRINTF(T("スケジューラ:PRENMI450メッセージを受信\n", "Scheduler: Receives PRENMI450 message\n")); @@ -265,6 +304,7 @@ void IrqMgr_ThreadEntry(void* arg) { PRINTF(T("スケジューラ:PRENMI480メッセージを受信\n", "Scheduler: Receives PRENMI480 message\n")); IrqMgr_HandlePreNMI480(irqMgr); break; +#endif case IRQ_PRENMI500_MSG: PRINTF("PRENMI500_MSG\n"); @@ -273,11 +313,13 @@ void IrqMgr_ThreadEntry(void* arg) { exit = true; break; +#if OOT_VERSION >= PAL_1_0 default: PRINTF(T("irqmgr.c:予期しないメッセージを受け取りました(%08x)\n", "irqmgr.c: Unexpected message received (%08x)\n"), msg); break; +#endif } } diff --git a/src/code/main.c b/src/code/main.c index 8e572bdce3..6c2b35af29 100644 --- a/src/code/main.c +++ b/src/code/main.c @@ -1,4 +1,5 @@ #include "ultra64.h" +#include "versions.h" // Declared before including other headers for BSS ordering extern uintptr_t gSegments[NUM_SEGMENTS]; @@ -39,7 +40,11 @@ uintptr_t gSegments[NUM_SEGMENTS]; OSThread sGraphThread; STACK(sGraphStack, 0x1800); +#if OOT_VERSION < PAL_1_0 +STACK(sSchedStack, 0x400); +#else STACK(sSchedStack, 0x600); +#endif STACK(sAudioStack, 0x800); STACK(sPadMgrStack, 0x500); STACK(sIrqMgrStack, 0x500); @@ -78,7 +83,7 @@ void Main(void* arg) { #if PLATFORM_N64 func_800AD410(); if (D_80121211 != 0) { - systemHeapStart = (uintptr_t)&_n64ddSegmentEnd; + systemHeapStart = (uintptr_t)_n64ddSegmentEnd; SysCfb_Init(1); } else { func_800AD488(); @@ -150,7 +155,10 @@ void Main(void* arg) { StackCheck_Init(&sGraphStackInfo, sGraphStack, STACK_TOP(sGraphStack), 0, 0x100, "graph"); osCreateThread(&sGraphThread, THREAD_ID_GRAPH, Graph_ThreadEntry, arg, STACK_TOP(sGraphStack), THREAD_PRI_GRAPH); osStartThread(&sGraphThread); + +#if OOT_VERSION >= PAL_1_0 osSetThreadPri(NULL, THREAD_PRI_MAIN); +#endif while (true) { s16* msg = NULL; @@ -162,6 +170,9 @@ void Main(void* arg) { switch (*msg) { case OS_SC_PRE_NMI_MSG: PRINTF(T("main.c: リセットされたみたいだよ\n", "main.c: Looks like it's been reset\n")); +#if OOT_VERSION < PAL_1_0 + StackCheck_Check(NULL); +#endif PreNmiBuff_SetReset(gAppNmiBufferPtr); break; } diff --git a/src/code/z_vimode.c b/src/code/z_vimode.c index 8abcb62e79..a971810758 100644 --- a/src/code/z_vimode.c +++ b/src/code/z_vimode.c @@ -1,5 +1,6 @@ #include "global.h" #include "ultra64/viint.h" +#include "versions.h" void ViMode_LogPrint(OSViMode* osViMode) { LOG_ADDRESS("osvimodep", osViMode, "../z_vimode.c", 87); @@ -182,6 +183,7 @@ void ViMode_Save(ViMode* viMode) { R_VI_MODE_EDIT_ULX_ADJ = viMode->leftAdjust; R_VI_MODE_EDIT_LRX_ADJ = viMode->rightAdjust; +#if OOT_VERSION >= PAL_1_0 if (SREG(58) == 1) { SREG(58) = 0; @@ -200,6 +202,7 @@ void ViMode_Save(ViMode* viMode) { break; } } +#endif } void ViMode_Load(ViMode* viMode) { @@ -270,8 +273,18 @@ void ViMode_Update(ViMode* viMode, Input* input) { // Load state from REGs ViMode_Load(viMode); +#if OOT_VERSION < PAL_1_0 + if (viMode->editState == VI_MODE_EDIT_STATE_NEGATIVE_2) { + // Log comparison between the NTSC LAN1 mode and the custom mode + ViMode_LogPrint(&osViModeNtscLan1); + ViMode_LogPrint(&viMode->customViMode); + viMode->editState = VI_MODE_EDIT_STATE_NEGATIVE_1; + } else if ((viMode->editState == VI_MODE_EDIT_STATE_2) || (viMode->editState == VI_MODE_EDIT_STATE_3)) +#else if ((viMode->editState == VI_MODE_EDIT_STATE_ACTIVE) || (viMode->editState == VI_MODE_EDIT_STATE_2) || - (viMode->editState == VI_MODE_EDIT_STATE_3)) { + (viMode->editState == VI_MODE_EDIT_STATE_3)) +#endif + { gScreenWidth = viMode->viWidth; gScreenHeight = viMode->viHeight; @@ -333,6 +346,21 @@ void ViMode_Update(ViMode* viMode, Input* input) { } // Clamp adjustments +#if OOT_VERSION < PAL_1_0 + // Do not allow parts of the framebuffer to end up offscreen + if (viMode->leftAdjust < 0) { + viMode->leftAdjust = 0; + } + if (viMode->upperAdjust < 0) { + viMode->upperAdjust = 0; + } + if (viMode->rightAdjust > 0) { + viMode->rightAdjust = 0; + } + if (viMode->lowerAdjust > 0) { + viMode->lowerAdjust = 0; + } +#else if (viMode->editState >= VI_MODE_EDIT_STATE_2) { // Allow parts of the framebuffer to possibly be offscreen by a small margin if (viMode->leftAdjust < -16) { @@ -362,11 +390,21 @@ void ViMode_Update(ViMode* viMode, Input* input) { viMode->lowerAdjust = 0; } } +#endif // Configure the custom VI mode with the selected settings ViMode_Configure(viMode, OS_VI_MPAL_LPN1, osTvType, viMode->loRes, viMode->antialiasOff, viMode->modeN, viMode->fb16Bit, viMode->viWidth, viMode->viHeight, viMode->leftAdjust, viMode->rightAdjust, viMode->upperAdjust, viMode->lowerAdjust); + +#if OOT_VERSION < PAL_1_0 + if (viMode->editState == VI_MODE_EDIT_STATE_3) { + // Log comparison between the NTSC LAN1 mode and the custom mode + ViMode_LogPrint(&osViModeNtscLan1); + ViMode_LogPrint(&viMode->customViMode); + } +#endif + ViMode_ConfigureFeatures(viMode, viMode->viFeatures); if (viMode->editState == VI_MODE_EDIT_STATE_3) {