diff --git a/Makefile b/Makefile index 7a80f5ad89..1ec16e5bf6 100644 --- a/Makefile +++ b/Makefile @@ -66,60 +66,109 @@ ifeq ($(VERSION),ntsc-1.0) REGION ?= JP PLATFORM := N64 DEBUG_FEATURES ?= 0 + BUILD_DATE := 98-10-21 + BUILD_TIME := 04:56:31 + REVISION := 0 else ifeq ($(VERSION),ntsc-1.1) REGIONAL_CHECKSUM := 1 REGION ?= JP PLATFORM := N64 DEBUG_FEATURES ?= 0 + BUILD_DATE := 98-10-26 + BUILD_TIME := 10:58:45 + REVISION := 1 else ifeq ($(VERSION),pal-1.0) REGION ?= EU PLATFORM := N64 DEBUG_FEATURES ?= 0 + BUILD_DATE := 98-11-10 + BUILD_TIME := 14:34:22 + REVISION := 0 else ifeq ($(VERSION),ntsc-1.2) REGIONAL_CHECKSUM := 1 REGION ?= JP PLATFORM := N64 DEBUG_FEATURES ?= 0 + BUILD_DATE := 98-11-12 + BUILD_TIME := 18:17:03 + REVISION := 2 else ifeq ($(VERSION),pal-1.1) REGION ?= EU PLATFORM := N64 DEBUG_FEATURES ?= 0 + BUILD_DATE := 98-11-18 + BUILD_TIME := 17:36:49 + REVISION := 1 else ifeq ($(VERSION),gc-jp) REGION ?= JP PLATFORM := GC DEBUG_FEATURES ?= 0 + BUILD_DATE := 02-10-29 + BUILD_TIME := 23:49:53 + REVISION := 15 else ifeq ($(VERSION),gc-jp-mq) REGION ?= JP PLATFORM := GC DEBUG_FEATURES ?= 0 + BUILD_DATE := 02-10-30 + BUILD_TIME := 00:15:15 + REVISION := 15 else ifeq ($(VERSION),gc-us) REGION ?= US PLATFORM := GC DEBUG_FEATURES ?= 0 + BUILD_DATE := 02-12-19 + BUILD_TIME := 13:28:09 + REVISION := 15 else ifeq ($(VERSION),gc-us-mq) REGION ?= US PLATFORM := GC DEBUG_FEATURES ?= 0 + BUILD_DATE := 02-12-19 + BUILD_TIME := 14:05:42 + REVISION := 15 else ifeq ($(VERSION),gc-eu-mq-dbg) REGION ?= EU PLATFORM := GC DEBUG_FEATURES ?= 1 + BUILD_DATE := 03-02-21 + BUILD_TIME := 00:16:31 + REVISION := 15 else ifeq ($(VERSION),gc-eu) REGION ?= EU PLATFORM := GC DEBUG_FEATURES ?= 0 + BUILD_DATE := 03-02-21 + BUILD_TIME := 20:12:23 + REVISION := 15 else ifeq ($(VERSION),gc-eu-mq) REGION ?= EU PLATFORM := GC DEBUG_FEATURES ?= 0 + BUILD_DATE := 03-02-21 + BUILD_TIME := 20:37:19 + REVISION := 15 else ifeq ($(VERSION),gc-jp-ce) REGION ?= JP PLATFORM := GC DEBUG_FEATURES ?= 0 + BUILD_DATE := 03-10-08 + BUILD_TIME := 21:53:00 + REVISION := 15 else $(error Unsupported version $(VERSION)) endif +ifeq ($(PLATFORM),N64) + BUILD_CREATOR := zelda@srd44 + LIBULTRA_VERSION := I + LIBULTRA_PATCH := 1 +else + BUILD_CREATOR := zelda@srd022j + LIBULTRA_VERSION := L + LIBULTRA_PATCH := 0 +endif + # ORIG_COMPILER cannot be combined with a non-IDO compiler. Check for this case and error out if found. ifneq ($(COMPILER),ido) ifeq ($(ORIG_COMPILER),1) @@ -149,8 +198,11 @@ CPPFLAGS += -P -xc -fno-dollars-in-identifiers # Converts e.g. ntsc-1.0 to NTSC_1_0 VERSION_MACRO := $(shell echo $(VERSION) | tr a-z-. A-Z__) -CPP_DEFINES += -DOOT_VERSION=$(VERSION_MACRO) +CPP_DEFINES += -DOOT_VERSION=$(VERSION_MACRO) -DOOT_REVISION=$(REVISION) CPP_DEFINES += -DOOT_REGION=REGION_$(REGION) +CPP_DEFINES += -DBUILD_CREATOR="\"$(BUILD_CREATOR)\"" -DBUILD_DATE="\"$(BUILD_DATE)\"" -DBUILD_TIME="\"$(BUILD_TIME)\"" +CPP_DEFINES += -DLIBULTRA_VERSION=LIBULTRA_VERSION_$(LIBULTRA_VERSION) +CPP_DEFINES += -DLIBULTRA_PATCH=$(LIBULTRA_PATCH) ifeq ($(PLATFORM),N64) CPP_DEFINES += -DPLATFORM_N64=1 -DPLATFORM_GC=0 @@ -494,7 +546,7 @@ $(BUILD_DIR)/src/libultra/libc/ll.o: MIPS_VERSION := -mips3 -32 $(BUILD_DIR)/src/libultra/libc/llcvt.o: OPTFLAGS := -O1 $(BUILD_DIR)/src/libultra/libc/llcvt.o: MIPS_VERSION := -mips3 -32 -ifeq ($(PLATFORM),N64) +ifeq ($(LIBULTRA_VERSION),I) $(BUILD_DIR)/src/libultra/gu/%.o: OPTFLAGS := -O3 $(BUILD_DIR)/src/libultra/io/%.o: OPTFLAGS := -O1 $(BUILD_DIR)/src/libultra/libc/%.o: OPTFLAGS := -O3 diff --git a/format.py b/format.py index 775d188c18..a5faa79c97 100755 --- a/format.py +++ b/format.py @@ -31,7 +31,7 @@ APPLY_OPTS = "--format --style=file" # Compiler options used with Clang-Tidy # Normal warnings are disabled with -Wno-everything to focus only on tidying INCLUDES = "-Iinclude -Isrc -Ibuild/gc-eu-mq-dbg -I." -DEFINES = "-D_LANGUAGE_C -DNON_MATCHING -DF3DEX_GBI_2" +DEFINES = "-D_LANGUAGE_C -DNON_MATCHING -DF3DEX_GBI_2 -DBUILD_CREATOR=\"\" -DBUILD_DATE=__DATE__ -DBUILD_TIME=__TIME__" COMPILER_OPTS = f"-fno-builtin -std=gnu90 -m32 -Wno-everything {INCLUDES} {DEFINES}" diff --git a/include/ultra64.h b/include/ultra64.h index e1f9a7c9b9..e8a4bd0ca7 100644 --- a/include/ultra64.h +++ b/include/ultra64.h @@ -31,6 +31,7 @@ #include "ultra64/motor.h" #include "ultra64/R4300.h" #include "ultra64/ucode.h" +#include "ultra64/version.h" union uObjBg; @@ -42,7 +43,7 @@ void osStopThread(OSThread* thread); void osViExtendVStart(u32 value); s32 osRecvMesg(OSMesgQueue* mq, OSMesg* msg, s32 flag); -#if PLATFORM_N64 +#if LIBULTRA_VERSION < LIBULTRA_VERSION_K void osInitialize(void); #else #define osInitialize() \ diff --git a/include/ultra64/version.h b/include/ultra64/version.h new file mode 100644 index 0000000000..00d772845e --- /dev/null +++ b/include/ultra64/version.h @@ -0,0 +1,14 @@ +#ifndef ULTRA64_VERSION_H +#define ULTRA64_VERSION_H + +#define LIBULTRA_VERSION_D 'D' +#define LIBULTRA_VERSION_E 'E' +#define LIBULTRA_VERSION_F 'F' +#define LIBULTRA_VERSION_G 'G' +#define LIBULTRA_VERSION_H 'H' +#define LIBULTRA_VERSION_I 'I' +#define LIBULTRA_VERSION_J 'J' +#define LIBULTRA_VERSION_K 'K' +#define LIBULTRA_VERSION_L 'L' + +#endif diff --git a/src/boot/build.c b/src/boot/build.c index 49992adc54..31e48096b2 100644 --- a/src/boot/build.c +++ b/src/boot/build.c @@ -1,39 +1,5 @@ #include "versions.h" -#if PLATFORM_N64 -const char gBuildCreator[] = "zelda@srd44"; -#else -const char gBuildCreator[] = "zelda@srd022j"; -#endif - -#if OOT_VERSION == NTSC_1_0 -const char gBuildDate[] = "98-10-21 04:56:31"; -#elif OOT_VERSION == NTSC_1_1 -const char gBuildDate[] = "98-10-26 10:58:45"; -#elif OOT_VERSION == PAL_1_0 -const char gBuildDate[] = "98-11-10 14:34:22"; -#elif OOT_VERSION == NTSC_1_2 -const char gBuildDate[] = "98-11-12 18:17:03"; -#elif OOT_VERSION == PAL_1_1 -const char gBuildDate[] = "98-11-18 17:36:49"; -#elif OOT_VERSION == GC_JP -const char gBuildDate[] = "02-10-29 23:49:53"; -#elif OOT_VERSION == GC_JP_MQ -const char gBuildDate[] = "02-10-30 00:15:15"; -#elif OOT_VERSION == GC_US -const char gBuildDate[] = "02-12-19 13:28:09"; -#elif OOT_VERSION == GC_US_MQ -const char gBuildDate[] = "02-12-19 14:05:42"; -#elif OOT_VERSION == GC_EU_MQ_DBG -const char gBuildDate[] = "03-02-21 00:16:31"; -#elif OOT_VERSION == GC_EU -const char gBuildDate[] = "03-02-21 20:12:23"; -#elif OOT_VERSION == GC_EU_MQ -const char gBuildDate[] = "03-02-21 20:37:19"; -#elif OOT_VERSION == GC_JP_CE -const char gBuildDate[] = "03-10-08 21:53:00"; -#else -#error "Unsupported OOT_VERSION" -#endif - +const char gBuildCreator[] = BUILD_CREATOR; +const char gBuildDate[] = BUILD_DATE " " BUILD_TIME; const char gBuildMakeOption[] = ""; diff --git a/src/libultra/gu/rotate.c b/src/libultra/gu/rotate.c index b9108e1bc5..7d495e98ef 100644 --- a/src/libultra/gu/rotate.c +++ b/src/libultra/gu/rotate.c @@ -8,7 +8,7 @@ void guRotateF(f32 m[4][4], f32 a, f32 x, f32 y, f32 z) { f32 bc; f32 ca; f32 t; -#if !PLATFORM_N64 +#if LIBULTRA_VERSION >= LIBULTRA_VERSION_K f32 xs; f32 ys; f32 zs; @@ -27,14 +27,14 @@ void guRotateF(f32 m[4][4], f32 a, f32 x, f32 y, f32 z) { guMtxIdentF(m); -#if PLATFORM_N64 -#define xs (x * sine) -#define ys (y * sine) -#define zs (z * sine) -#else +#if LIBULTRA_VERSION >= LIBULTRA_VERSION_K xs = x * sine; ys = y * sine; zs = z * sine; +#else +#define xs (x * sine) +#define ys (y * sine) +#define zs (z * sine) #endif t = x * x; diff --git a/src/libultra/os/exceptasm.s b/src/libultra/os/exceptasm.s index 6b8003fd28..3c55d66ac8 100644 --- a/src/libultra/os/exceptasm.s +++ b/src/libultra/os/exceptasm.s @@ -4,6 +4,7 @@ #include "ultra64/message.h" #include "ultra64/thread.h" #include "ultra64/exception.h" +#include "ultra64/version.h" .set noat .set noreorder @@ -448,7 +449,7 @@ pi: andi $t1, $s1, MI_INTR_PI beqz $t1, dp nop -#if PLATFORM_N64 +#if LIBULTRA_VERSION < LIBULTRA_VERSION_J // Clear interrupt and mask out pi interrupt li $t1, PI_STATUS_CLR_INTR lui $at, %hi(PHYS_TO_K1(PI_STATUS_REG)) @@ -855,7 +856,7 @@ LEAF(__osPopThread) sw $t9, ($a0) END(__osPopThread) -#if !PLATFORM_N64 +#if LIBULTRA_VERSION >= LIBULTRA_VERSION_K LEAF(__osNop) jr $ra nop diff --git a/src/libultra/os/initialize.c b/src/libultra/os/initialize.c index e985d551d9..427a517710 100644 --- a/src/libultra/os/initialize.c +++ b/src/libultra/os/initialize.c @@ -16,12 +16,14 @@ OSHWIntr __OSGlobalIntMask = OS_IM_ALL; u32 __osFinalrom; -#if PLATFORM_N64 +#if LIBULTRA_VERSION < LIBULTRA_VERSION_K #define OSINITIALIZE_FUNC osInitialize #define SPEED_PARAM_FUNC createSpeedParam +#if (LIBULTRA_VERSION == LIBULTRA_VERSION_I && LIBULTRA_PATCH == 1) || (LIBULTRA_VERSION == LIBULTRA_VERSION_J) static void SPEED_PARAM_FUNC(void); +#endif #else @@ -46,14 +48,14 @@ void SPEED_PARAM_FUNC(void) { void OSINITIALIZE_FUNC(void) { u32 pifdata; -#if PLATFORM_N64 +#if LIBULTRA_VERSION < LIBULTRA_VERSION_K u32 clock = 0; #endif __osFinalrom = true; __osSetSR(__osGetSR() | SR_CU1); __osSetFpcCsr(FPCSR_FS | FPCSR_EV); -#if !PLATFORM_N64 +#if LIBULTRA_VERSION >= LIBULTRA_VERSION_K __osSetWatchLo(0x04900000); #endif @@ -71,9 +73,11 @@ void OSINITIALIZE_FUNC(void) { osWritebackDCache((void*)K0BASE, E_VEC - K0BASE + sizeof(__osExceptionVector)); osInvalICache((void*)K0BASE, E_VEC - K0BASE + sizeof(__osExceptionVector)); +#if (LIBULTRA_VERSION == LIBULTRA_VERSION_I && LIBULTRA_PATCH == 1) || (LIBULTRA_VERSION > LIBULTRA_VERSION_I) SPEED_PARAM_FUNC(); osUnmapTLBAll(); osMapTLBRdb(); +#endif osClockRate = osClockRate * 3 / 4; @@ -89,19 +93,21 @@ void OSINITIALIZE_FUNC(void) { osViClock = VI_NTSC_CLOCK; } +#if (LIBULTRA_VERSION == LIBULTRA_VERSION_I && LIBULTRA_PATCH == 1) || (LIBULTRA_VERSION >= LIBULTRA_VERSION_J) // If PreNMI is pending, loop until reset if (__osGetCause() & CAUSE_IP5) { while (true) { ; } } +#endif IO_WRITE(AI_CONTROL_REG, AI_CONTROL_DMA_ON); IO_WRITE(AI_DACRATE_REG, AI_MAX_DAC_RATE - 1); IO_WRITE(AI_BITRATE_REG, AI_MAX_BIT_RATE - 1); } -#if PLATFORM_N64 +#if (LIBULTRA_VERSION == LIBULTRA_VERSION_I && LIBULTRA_PATCH == 1) || (LIBULTRA_VERSION == LIBULTRA_VERSION_J) static void SPEED_PARAM_FUNC(void) { __Dom1SpeedParam.type = DEVICE_TYPE_INIT; __Dom1SpeedParam.latency = IO_READ(PI_BSD_DOM1_LAT_REG); diff --git a/src/libultra/os/settimer.c b/src/libultra/os/settimer.c index 194f4eff78..a876641e88 100644 --- a/src/libultra/os/settimer.c +++ b/src/libultra/os/settimer.c @@ -2,7 +2,7 @@ s32 osSetTimer(OSTimer* timer, OSTime countdown, OSTime interval, OSMesgQueue* mq, OSMesg msg) { UNUSED OSTime time; -#if !PLATFORM_N64 +#if LIBULTRA_VERSION >= LIBULTRA_VERSION_K OSTimer* next; u32 count; u32 value; @@ -21,12 +21,7 @@ s32 osSetTimer(OSTimer* timer, OSTime countdown, OSTime interval, OSMesgQueue* m timer->mq = mq; timer->msg = msg; -#if PLATFORM_N64 - time = __osInsertTimer(timer); - if (__osTimerList->next == timer) { - __osSetTimerIntr(time); - } -#else +#if LIBULTRA_VERSION >= LIBULTRA_VERSION_K prevInt = __osDisableInt(); if (__osTimerList->next != __osTimerList) { if (1) {} @@ -46,6 +41,11 @@ s32 osSetTimer(OSTimer* timer, OSTime countdown, OSTime interval, OSMesgQueue* m __osSetTimerIntr(__osTimerList->next->value); __osRestoreInt(prevInt); +#else + time = __osInsertTimer(timer); + if (__osTimerList->next == timer) { + __osSetTimerIntr(time); + } #endif return 0; diff --git a/src/libultra/os/timerintr.c b/src/libultra/os/timerintr.c index 943aca0ffc..ce5c12fc5f 100644 --- a/src/libultra/os/timerintr.c +++ b/src/libultra/os/timerintr.c @@ -63,7 +63,7 @@ void __osSetTimerIntr(OSTime time) { OSTime newTime; u32 prevInt; -#if !PLATFORM_N64 +#if LIBULTRA_VERSION >= LIBULTRA_VERSION_K if (time < 468) { time = 468; } diff --git a/src/makerom/rom_header.h b/src/makerom/rom_header.h index 1069ae86fe..65cfc89da3 100644 --- a/src/makerom/rom_header.h +++ b/src/makerom/rom_header.h @@ -54,13 +54,13 @@ * and what libultra version (os_ver) it uses. * * The hardware revision for a retail N64 is (2,0). - * The libultra version may be a single letter, without quotes. + * The libultra version must be a single char, in quotes. */ -#define LIBULTRA_VERSION(hw_major, hw_minor, os_ver) \ +#define OS_VERSION(hw_major, hw_minor, os_ver) \ .half 0; \ .byte (hw_major) * 10 + (hw_minor); \ _os_ver_start = .; \ - .ascii #os_ver ; \ + .byte (os_ver) ; \ .if (. - _os_ver_start) != 1; \ .error "OS version should be just one letter"; \ .endif diff --git a/src/makerom/rom_header.s b/src/makerom/rom_header.s index 525bee6e88..d3d938cda3 100644 --- a/src/makerom/rom_header.s +++ b/src/makerom/rom_header.s @@ -1,4 +1,5 @@ #include "rom_header.h" +#include "ultra64/version.h" #include "region.h" #include "versions.h" @@ -6,11 +7,7 @@ /* 0x01 */ PI_DOMAIN_1_CFG(64, 18, 7, 3) /* 0x04 */ SYSTEM_CLOCK_RATE_SETTING(0xF) /* 0x08 */ ENTRYPOINT(0x80000400) -#if PLATFORM_N64 -/* 0x0C */ LIBULTRA_VERSION(2, 0, I) -#else -/* 0x0C */ LIBULTRA_VERSION(2, 0, L) -#endif +/* 0x0C */ OS_VERSION(2, 0, LIBULTRA_VERSION) /* 0x10 */ CHECKSUM() /* 0x18 */ PADDING(8) /* 0x20 */ ROM_NAME("THE LEGEND OF ZELDA") @@ -28,12 +25,4 @@ #elif OOT_REGION == REGION_EU /* 0x3E */ REGION(PAL) #endif -#if OOT_VERSION == NTSC_1_0 || OOT_VERSION == PAL_1_0 -/* 0x3F */ GAME_REVISION(0) -#elif OOT_VERSION == NTSC_1_1 || OOT_VERSION == PAL_1_1 -/* 0x3F */ GAME_REVISION(1) -#elif OOT_VERSION == NTSC_1_2 -/* 0x3F */ GAME_REVISION(2) -#else -/* 0x3F */ GAME_REVISION(15) -#endif +/* 0x3F */ GAME_REVISION(OOT_REVISION)