From 10efa92153f9a1c90702794e457fd7f684362f42 Mon Sep 17 00:00:00 2001 From: dbalatoni13 <40299962+dbalatoni13@users.noreply.github.com> Date: Sun, 6 Apr 2025 22:04:10 +0200 Subject: [PATCH] More fixes --- CMakeLists.txt | 2 ++ include/dolphin/os.h | 5 ++++ src/REL/bootDll/main.c | 46 ++++++++++++++++---------------- src/REL/w03Dll/mg_coin.c | 2 +- src/REL/w05Dll/mg_coin.c | 4 +-- src/REL/w05Dll/mg_item.c | 2 +- src/port/OS.c | 57 ++++++++++++++++++++++++++++++++++++++-- src/port/stubs.c | 20 +++++++------- 8 files changed, 99 insertions(+), 39 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cc797b7a..5bbe66b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,6 +26,8 @@ if(APPLE) add_compile_options(-Wno-declaration-after-statement) endif () +add_compile_options(-fsanitize=address) + add_subdirectory(extern/aurora EXCLUDE_FROM_ALL) add_subdirectory(extern/musyx EXCLUDE_FROM_ALL) diff --git a/include/dolphin/os.h b/include/dolphin/os.h index bfe75527..849cf282 100644 --- a/include/dolphin/os.h +++ b/include/dolphin/os.h @@ -23,10 +23,15 @@ extern "C" { #endif typedef s64 OSTime; typedef u32 OSTick; +#ifdef __MWERKS__ u32 __OSBusClock AT_ADDRESS(OS_BASE_CACHED | 0x00F8); // sync with OSLoMem.h u32 __OSCoreClock AT_ADDRESS(OS_BASE_CACHED | 0x00FC); // sync with OSLoMem.h #define OS_BUS_CLOCK (u32) __OSBusClock #define OS_CORE_CLOCK __OSCoreClock +#else +#define OS_BUS_CLOCK 162000000 +#define OS_BUS_CLOCK 486000000 +#endif #define OS_TIMER_CLOCK (OS_BUS_CLOCK / 4) #ifndef _DEBUG diff --git a/src/REL/bootDll/main.c b/src/REL/bootDll/main.c index ba27c5ca..eb32e58b 100644 --- a/src/REL/bootDll/main.c +++ b/src/REL/bootDll/main.c @@ -126,7 +126,7 @@ void ObjectSetup(void) // HuSprPosSet(group, 1, 288, 240); // HuSprAttrSet(group, 1, HUSPR_ATTR_DISPOFF); HuWinInit(1); - BootTitleCreate(); + //BootTitleCreate(); SystemInitF = 1; } else { @@ -167,16 +167,16 @@ void ObjectSetup(void) // TODO PC MGSeqInit(); #endif - HuWinInit(1); - BootTitleCreate(); + //HuWinInit(1); + //BootTitleCreate(); // data = HuSprAnimReadFile(TITLE_HUDSON_ANM); // sprite_hudson = HuSprCreate(data, 0, 0); // HuSprGrpMemberSet(group, 1, sprite_hudson); HuSprPosSet(group, 1, 288, 240); HuSprAttrSet(group, 1, HUSPR_ATTR_DISPOFF); - while (OSTicksToMilliseconds(OSGetTick() - tick_prev) < 3000) { - HuPrcVSleep(); - } + //while (OSTicksToMilliseconds(OSGetTick() - tick_prev) < 3000) { + // HuPrcVSleep(); + //} } else { for (i = 0; i < 180; i++) { @@ -209,9 +209,9 @@ void ObjectSetup(void) //group_samp = HuMemDirectMalloc(HEAP_DATA, msmSysGetSampSize(0)); //msmSysLoadGroup(0, group_samp, 0); //HuMemDirectFree(group_samp); - while (OSTicksToMilliseconds(OSGetTick() - tick_prev) < 3000) { - HuPrcVSleep(); - } + //while (OSTicksToMilliseconds(OSGetTick() - tick_prev) < 3000) { + // HuPrcVSleep(); + //} } else { for (i = 0; i < 180; i++) { @@ -234,14 +234,14 @@ void ObjectSetup(void) while (WipeStatGet()) { HuPrcVSleep(); } - tick_prev = OSGetTick(); - if (!SystemInitF) { - HuAudSndGrpSetSet(0); - SystemInitF = 1; - } - while (OSTicksToMilliseconds(OSGetTick() - tick_prev) < 1000) { - HuPrcVSleep(); - } + //tick_prev = OSGetTick(); + //if (!SystemInitF) { + // HuAudSndGrpSetSet(0); + // SystemInitF = 1; + //} + //while (OSTicksToMilliseconds(OSGetTick() - tick_prev) < 1000) { + // HuPrcVSleep(); + //} HuSprAttrSet(group, 0, HUSPR_ATTR_DISPOFF); HuSprAttrSet(group, 1, HUSPR_ATTR_DISPOFF); group_thp = HuSprGrpCreate(1); @@ -249,11 +249,11 @@ void ObjectSetup(void) //HuSprGrpMemberSet(group_thp, 0, sprite_thp); //HuSprPosSet(group_thp, 0, 288, 240); HuWinMesMaxSizeBetGet(win_size, MAKE_MESSID(54, 0), MAKE_MESSID(54, 4)); - demoWinId = HuWinCreate(-10000, 448 - win_size[1], win_size[0], win_size[1], 0); - HuWinMesSpeedSet(demoWinId, 0); - HuWinBGTPLvlSet(demoWinId, 0); - HuWinPriSet(demoWinId, 10); - HuWinAttrSet(demoWinId, 0x800); + //demoWinId = HuWinCreate(-10000, 448 - win_size[1], win_size[0], win_size[1], 0); + //HuWinMesSpeedSet(demoWinId, 0); + //HuWinBGTPLvlSet(demoWinId, 0); + //HuWinPriSet(demoWinId, 10); + //HuWinAttrSet(demoWinId, 0x800); HuPrcSleep(5); WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 10); while (WipeStatGet()) { @@ -622,7 +622,7 @@ void ObjectSetup(void) OSReport(">>>>>>>>MSM_SE_SEL_01 %d\n", msmSeGetEntryID(2092, seNo)); OSReport(">>>>>>>>SE Num %d\n", msmSeGetNumPlay(0)); #endif - HuAudSStreamPlay(20); + //HuAudSStreamPlay(20); WipeCreate(WIPE_MODE_IN, WIPE_TYPE_NORMAL, 30); while (WipeStatGet()) { HuPrcVSleep(); diff --git a/src/REL/w03Dll/mg_coin.c b/src/REL/w03Dll/mg_coin.c index dc05b755..dba306f1 100644 --- a/src/REL/w03Dll/mg_coin.c +++ b/src/REL/w03Dll/mg_coin.c @@ -761,7 +761,7 @@ void fn_1_97F8(s32 arg0) temp_r30 = OM_GET_WORK_PTR(temp_r3, unkTemp2); temp_r30->unk00_bit0 = 0; temp_r30->unk4 = arg0; - temp_r30->unk_0C = HuMemDirectMallocNum(0, 0x190, MEMORY_DEFAULT_NUM); + temp_r30->unk_0C = HuMemDirectMallocNum(0, 20 * sizeof(unkTemp), MEMORY_DEFAULT_NUM); BoardPlayerPosGet(arg0, &sp8); temp_r30->unk8 = (80.0f + sp8.y); memset(temp_r30->unk_0C, 0, 0x190); diff --git a/src/REL/w05Dll/mg_coin.c b/src/REL/w05Dll/mg_coin.c index c2f8d938..a5388cd8 100644 --- a/src/REL/w05Dll/mg_coin.c +++ b/src/REL/w05Dll/mg_coin.c @@ -157,7 +157,7 @@ void fn_1_9D0C(omObjData *arg0) s32 var_r30; dataCopy2 *temp_r31; - arg0->data = HuMemDirectMallocNum(HEAP_SYSTEM, 0x34, MEMORY_DEFAULT_NUM); + arg0->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(dataCopy2), MEMORY_DEFAULT_NUM); temp_r31 = arg0->data; temp_r31->unk_02 = 5; temp_r31->unk_04 = 0x3C; @@ -318,7 +318,7 @@ void fn_1_A5B0(omObjData *arg0) BoardModelVisibilitySet(lbl_1_bss_D4, 1); BoardModelMotionTimeSet(lbl_1_bss_D4, 110.0f); lbl_1_bss_C8 = temp_r29 = omAddObjEx(boardObjMan, 0x101, 0, 0, -1, fn_1_B3C4); - temp_r29->data = HuMemDirectMallocNum(HEAP_SYSTEM, 0xC, MEMORY_DEFAULT_NUM); + temp_r29->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(Vec), MEMORY_DEFAULT_NUM); temp_r31 = temp_r29->data; lbl_1_bss_C8->work[1] = 1; Hu3DModelObjPosGet(BoardModelIDGet(lbl_1_bss_14[1]), "fish", &sp14); diff --git a/src/REL/w05Dll/mg_item.c b/src/REL/w05Dll/mg_item.c index 0e942bef..4ea226d7 100644 --- a/src/REL/w05Dll/mg_item.c +++ b/src/REL/w05Dll/mg_item.c @@ -114,7 +114,7 @@ void fn_1_6B7C(void) lbl_1_bss_94 = omAddObjEx(boardObjMan, 0x101, 0, 0, -1, fn_1_7284); lbl_1_bss_8C = omAddObjEx(boardObjMan, 0x101, 0, 0, -1, fn_1_78A0); lbl_1_bss_90 = omAddObjEx(boardObjMan, 0x101, 0, 0, -1, NULL); - lbl_1_bss_90->data = HuMemDirectMallocNum(HEAP_SYSTEM, 0x14, MEMORY_DEFAULT_NUM); + lbl_1_bss_90->data = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(dataCopy), MEMORY_DEFAULT_NUM); if (lbl_1_bss_78 == NULL) { lbl_1_bss_78 = HuSprAnimReadFile(DATA_MAKE_NUM(DATADIR_EFFECT, 0x00)); HuSprAnimLock(lbl_1_bss_78); diff --git a/src/port/OS.c b/src/port/OS.c index 02850565..724a1925 100644 --- a/src/port/OS.c +++ b/src/port/OS.c @@ -3,12 +3,56 @@ #include +#ifndef _WIN32 +#include +#include +#if __APPLE__ +#include +#endif +#endif + +#ifdef _WIN32 +#include +#endif + +#if __APPLE__ +static u64 MachToDolphinNum; +static u64 MachToDolphinDenom; +#elif _WIN32 +static LARGE_INTEGER PerfFrequency; +#endif + // Credits: Super Monkey Ball #define MEM_SIZE (64 * 1024 * 1024) u8 LC_CACHE_BASE[4096]; +static u64 GetGCTicksPerSec() +{ + return 486000000ull; +} + +static u64 GetGCTicks() +{ +#if __APPLE__ + return mach_absolute_time() * MachToDolphinNum / MachToDolphinDenom; +#elif __linux__ || __FreeBSD__ + struct timespec tp; + clock_gettime(CLOCK_MONOTONIC, &tp); + + return u64((tp.tv_sec * 1000000000ull) + tp.tv_nsec) * GetGCTicksPerSec() / 1000000000ull; +#elif _WIN32 + LARGE_INTEGER perf; + QueryPerformanceCounter(&perf); + perf.QuadPart *= GetGCTicksPerSec(); + perf.QuadPart /= PerfFrequency.QuadPart; + return perf.QuadPart; +#else + return 0; +#endif +} + void OSInit() { puts("OSInit is a stub"); @@ -16,16 +60,25 @@ void OSInit() OSSetArenaLo(arena); OSSetArenaHi(arena + MEM_SIZE); + + #if __APPLE__ + mach_timebase_info_data_t timebase; + mach_timebase_info(&timebase); + MachToDolphinNum = GetGCTicksPerSec() * timebase.numer; + MachToDolphinDenom = 1000000000ull * timebase.denom; +#elif _WIN32 + QueryPerformanceFrequency(&PerfFrequency); +#endif } OSTime OSGetTime(void) { - return 0; + return (OSTime)GetGCTicks(); } OSTick OSGetTick(void) { - return 0; + return (OSTick)GetGCTicks(); } u32 OSGetPhysicalMemSize(void) diff --git a/src/port/stubs.c b/src/port/stubs.c index 79cf1fa1..70bb4995 100644 --- a/src/port/stubs.c +++ b/src/port/stubs.c @@ -536,53 +536,53 @@ VIRetraceCallback VISetPostRetraceCallback(VIRetraceCallback callback) void GXSetGPMetric(GXPerf0 perf0, GXPerf1 perf1) { - puts("GXSetGPMetric is a stub"); + // puts("GXSetGPMetric is a stub"); } void GXReadGPMetric(u32 *cnt0, u32 *cnt1) { - puts("GXReadGPMetric is a stub"); + // puts("GXReadGPMetric is a stub"); } void GXClearGPMetric(void) { - puts("GXClearGPMetric is a stub"); + // puts("GXClearGPMetric is a stub"); } void GXReadMemMetric( u32 *cp_req, u32 *tc_req, u32 *cpu_rd_req, u32 *cpu_wr_req, u32 *dsp_req, u32 *io_req, u32 *vi_req, u32 *pe_req, u32 *rf_req, u32 *fi_req) { - puts("GXReadMemMetric is a stub"); + // puts("GXReadMemMetric is a stub"); } void GXClearMemMetric(void) { - puts("GXClearMemMetric is a stub"); + // puts("GXClearMemMetric is a stub"); } void GXClearVCacheMetric(void) { - puts("GXClearVCacheMetric is a stub"); + // puts("GXClearVCacheMetric is a stub"); } void GXReadPixMetric(u32 *top_pixels_in, u32 *top_pixels_out, u32 *bot_pixels_in, u32 *bot_pixels_out, u32 *clr_pixels_in, u32 *copy_clks) { - puts("GXReadPixMetric is a stub"); + // puts("GXReadPixMetric is a stub"); } void GXClearPixMetric(void) { - puts("GXClearPixMetric is a stub"); + // puts("GXClearPixMetric is a stub"); } void GXSetVCacheMetric(GXVCachePerf attr) { - puts("GXSetVCacheMetric is a stub"); + // puts("GXSetVCacheMetric is a stub"); } void GXReadVCacheMetric(u32 *check, u32 *miss, u32 *stall) { - puts("GXReadVCacheMetric is a stub"); + // puts("GXReadVCacheMetric is a stub"); } void GXSetDrawSync(u16 token)