From 7d61d4e6ff2e15dc3c7f166d407a203594a9c90b Mon Sep 17 00:00:00 2001 From: MMDecomp Date: Tue, 23 Jun 2020 01:08:52 +0200 Subject: [PATCH] Decompile `game.c` --- include/convert.h | 24 +++ include/functions.h | 56 +++---- include/global.h | 2 + include/macros.h | 11 +- include/regs.h | 103 +++++++++++++ include/structs.h | 37 ++++- include/variables.h | 16 +- linker_scripts/code_script.txt | 7 +- src/code/game.c | 262 +++++++++++++++++++++++++++++++++ src/code/title_setup.c | 66 +++++++++ src/code/z_prenmi.c | 4 +- src/code/z_rcp.c | 2 +- tables/functions.txt | 56 +++---- tables/variables.txt | 10 +- tools/regconvert.py | 23 +++ undef.txt | 2 +- 16 files changed, 598 insertions(+), 83 deletions(-) create mode 100644 include/convert.h create mode 100644 include/regs.h create mode 100644 src/code/game.c create mode 100644 src/code/title_setup.c create mode 100644 tools/regconvert.py diff --git a/include/convert.h b/include/convert.h new file mode 100644 index 0000000000..20ee30130a --- /dev/null +++ b/include/convert.h @@ -0,0 +1,24 @@ +#ifndef _ULTRA64_CONVERT_H_ +#define _ULTRA64_CONVERT_H_ + +#define OS_CLOCK_RATE 62500000LL +#define OS_CPU_COUNTER (OS_CLOCK_RATE*3/4) + +/* Macros */ +#define OS_NSEC_TO_CYCLES(n) (((u64)(n)*(OS_CPU_COUNTER/15625000LL))/(1000000000LL/15625000LL)) +#define OS_USEC_TO_CYCLES(n) (((u64)(n)*(OS_CPU_COUNTER/15625LL))/(1000000LL/15625LL)) +#define OS_CYCLES_TO_NSEC(c) (((u64)(c)*(1000000000LL/15625000LL))/(OS_CPU_COUNTER/15625000LL)) +#define OS_CYCLES_TO_USEC(c) (((u64)(c)*(1000000LL/15625LL))/(OS_CPU_COUNTER/15625LL)) + +#define OS_K0_TO_PHYSICAL(x) (u32)(((char*)(x)-0x80000000)) +#define OS_K1_TO_PHYSICAL(x) (u32)(((char*)(x)-0xA0000000)) + +#define OS_PHYSICAL_TO_K0(x) (void*)(((u32)(x)+0x80000000)) +#define OS_PHYSICAL_TO_K1(x) (void*)(((u32)(x)+0xA0000000)) + +/* Functions */ + +extern u32 osVirtualToPhysical(void*); +extern void* osPhysicalToVirtual(u32); + +#endif diff --git a/include/functions.h b/include/functions.h index 9bcdfabb0d..4b7df1e1db 100644 --- a/include/functions.h +++ b/include/functions.h @@ -1530,7 +1530,7 @@ s32 func_800E8F08(Vec3s* param_1, Vec3s* param_2); // func_800E8F08 s32 func_800E8FA4(Actor* actor, Vec3f* param_2, Vec3s* param_3, Vec3s* param_4); // func_800E8FA4 s32 func_800E9138(GlobalContext* ctxt, Actor* actor, Vec3s* param_3, Vec3s* param_4, f32 param_5); // func_800E9138 s32 func_800E9250(GlobalContext* ctxt, Actor* actor, Vec3s* param_3, Vec3s* param_4, Vec3f param_5); // func_800E9250 -void func_800E9360(void); // func_800E9360 +u8 func_800E9360(void); // func_800E9360 void static_context_init(void); // func_800E93E0 void func_800E9470(void); // func_800E9470 void func_800E9488(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE2 param_5, UNK_TYPE2 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE1 param_10, UNK_TYPE1 param_11, UNK_TYPE1 param_12, UNK_TYPE1 param_13, UNK_TYPE2 param_14, UNK_TYPE4 param_15); // func_800E9488 @@ -2760,13 +2760,13 @@ void func_80140260(OSViMode* vimode); // func_80140260 void func_8014026C(OSViMode* param_1, UNK_TYPE1 param_2, int param_3, int param_4, int param_5, int param_6, int param_7, int param_8, UNK_TYPE4 param_9, int param_10, short param_11, unsigned int param_12, UNK_TYPE4 param_13); // func_8014026C void func_80140730(void); // func_80140730 void func_80140810(void); // func_80140810 -void func_80140898(void); // func_80140898 -void func_80140900(void); // func_80140900 +void func_80140898(void* arg0); // func_80140898 +void func_80140900(void* arg0); // func_80140900 void func_8014090C(void); // func_8014090C void func_80140970(void); // func_80140970 -void func_80140CE0(void); // func_80140CE0 -void func_80140D04(void); // func_80140D04 -void func_80140D10(void); // func_80140D10 +void func_80140CE0(void* arg0); // func_80140CE0 +void func_80140D04(void* arg0); // func_80140D04 +void func_80140D10(void* arg0, Gfx** gfx, u32 arg2); // func_80140D10 void func_80140E80(void* param_1); // func_80140E80 void func_80140EA0(void); // func_80140EA0 void func_80140EAC(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); // func_80140EAC @@ -2777,15 +2777,15 @@ void func_80141200(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_ void func_8014151C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); // func_8014151C void func_80141678(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); // func_80141678 void func_80141778(void); // func_80141778 -void func_801418B0(void); // func_801418B0 -void func_80141900(void); // func_80141900 +void func_801418B0(void* arg0); // func_801418B0 +void func_80141900(void* arg0); // func_80141900 void func_80141924(void); // func_80141924 void func_80141C34(void); // func_80141C34 -void func_80141E60(void); // func_80141E60 +void VisMono_Draw(void* arg0, Gfx** gfx, u32 arg2); // VisMono_Draw void func_8014204C(void); // func_8014204C -void func_801420C0(void); // func_801420C0 -void func_801420F4(void); // func_801420F4 -void func_80142100(void); // func_80142100 +void func_801420C0(void* arg0); // func_801420C0 +void func_801420F4(void* arg0); // func_801420F4 +void func_80142100(void* arg0, Gfx** gfx, u32 arg2); // func_80142100 void func_80142440(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE1 param_5, UNK_TYPE1 param_6, UNK_TYPE1 param_7, UNK_TYPE1 param_8, UNK_TYPE4 param_9); // func_80142440 void func_80143148(void); // func_80143148 void func_801431E8(void); // func_801431E8 @@ -3121,15 +3121,15 @@ void Audio_Stop(void); // func_80172EAC void Audio_ThreadEntry(AudioThreadStruct* audio); // func_80172ED0 void Audio_WaitForInit(AudioThreadStruct* param_1); // func_80173048 void Audio_Start(AudioThreadStruct* audio, s32* audioThreadStackEnd, OSPri pri, OSId id, SchedThreadStruct* sched, IrqMgr* irq); // func_80173074 -void func_80173130(void); // func_80173130 -void Initial_Init2(GameState* ctxt); // func_801732DC -void Initial_Fini(void); // func_8017332C -void Initial_Init(GameState* ctxt); // func_80173338 +void TitleSetup_GameStateResetContext(void); // func_80173130 +void TitleSetup_InitImpl(GameState* gameState); // func_801732DC +void TitleSetup_Destroy(GameState* gameState); // func_8017332C +void TitleSetup_Init(GameState* gameState); // func_80173338 void Game_UpdateFramerateVariables(s32 divisor); // func_80173360 -void Game_SetFramerateDivisor(GameState* iParm1, u32 divisor); // func_801733A8 -void func_801733DC(void); // func_801733DC +void Game_SetFramerateDivisor(GameState* gameState, s32 divisor); // func_801733A8 +void GameState_SetFBFilter(Gfx** gfx, u32 arg1); // func_801733DC void Game_Nop80173534(GameState* ctxt); // func_80173534 -void func_80173540(GameState* ctxt, GraphicsContext* gCtxt); // func_80173540 +void GameState_Draw(GameState* ctxt, GraphicsContext* gCtxt); // func_80173540 void Game_ResetSegments(GraphicsContext* gCtxt); // func_80173644 void func_801736DC(GraphicsContext* gCtxt); // func_801736DC void Game_UpdateInput(GameState* ctxt); // func_80173754 @@ -3137,13 +3137,13 @@ void Game_Update(GameState* ctxt); // func_8017377C void Game_IncrementFrameCount(GameState* ctxt); // func_801737E4 void Game_InitHeap(GameState* ctxt, u32 size); // func_80173810 void Game_ResizeHeap(GameState* ctxt, u32 size); // func_80173880 -void Game_StateInit(GameState* ctxt, func_ptr gameStateInit, GraphicsContext* gCtxt); // func_80173950 +void Game_StateInit(GameState* ctxt, GameStateFunc gameStateInit, GraphicsContext* gCtxt); // func_80173950 void Game_StateFini(GameState* ctxt); // func_80173A50 -UNK_TYPE4 Game_GetNextStateInit(GameState* ctxt); // func_80173B00 +GameStateFunc Game_GetNextStateInit(GameState* ctxt); // func_80173B00 u32 Game_GetNextStateSize(GameState* ctxt); // func_80173B0C u32 Game_GetShouldContinue(GameState* ctxt); // func_80173B18 -void Game_GetHeapFreeSize(GameState* ctxt); // func_80173B24 -int func_80173B48(GameState* ctxt); // func_80173B48 +s32 Game_GetHeapFreeSize(GameState* ctxt); // func_80173B24 +s32 func_80173B48(GameState* ctxt); // func_80173B48 GameAlloc* func_80173BF0(GameAlloc* heap); // func_80173BF0 void* Gamealloc_Alloc(GameAlloc* heap, u32 size); // func_80173C10 void Gamealloc_Free(GameAlloc* heap, void* ptr); // func_80173C7C @@ -3222,12 +3222,12 @@ void Sched_ThreadEntry(SchedThreadStruct* sched); // func_8017715C void func_80177280(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE1 param_5, UNK_TYPE1 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10, UNK_TYPE4 param_11, UNK_TYPE4 param_12); // func_80177280 void Sched_Start(SchedThreadStruct* sched, void* stack, OSPri pri, UNK_TYPE4 param_4, UNK_TYPE4 param_5, IrqMgr* irqmgrStruct); // func_801772A0 void func_80177390(void); // func_80177390 -void func_801773A0(void); // func_801773A0 -void func_801773C4(void); // func_801773C4 -void func_801773D0(void); // func_801773D0 +void func_801773A0(void* arg0); // func_801773A0 +void func_801773C4(void* arg0); // func_801773C4 +void SpeedMeter_DrawTimeEntries(void* displayList, GraphicsContext* gCtx); // func_801773D0 void func_80177A84(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE2 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9); // func_80177A84 void func_80177AC8(void); // func_80177AC8 -void func_80177E58(void); // func_80177E58 +void SpeedMeter_DrawAllocEntries(void* displayList, GraphicsContext *gCtx, GameState *ctx); // func_80177E58 void func_801780F0(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7); // func_801780F0 void func_801781EC(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); // func_801781EC void func_8017842C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE2 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10, UNK_TYPE4 param_11); // func_8017842C @@ -3455,7 +3455,7 @@ void func_801857A0(void); // func_801857A0 void func_801857C0(void); // func_801857C0 char* func_801857D0(void); // func_801857D0 void func_80185864(void); // func_80185864 -void func_80185908(void); // func_80185908 +u32 func_80185908(void); // func_80185908 void func_80185968(void); // func_80185968 void func_801859F0(void); // func_801859F0 void func_80185A2C(void); // func_80185A2C diff --git a/include/global.h b/include/global.h index ee8a2f4655..ae12d97a96 100644 --- a/include/global.h +++ b/include/global.h @@ -1,8 +1,10 @@ #ifndef _GLOBAL_H_ #define _GLOBAL_H_ +#include "macros.h" #include "structs.h" #include "functions.h" +#include "regs.h" #include "variables.h" #include "macros.h" diff --git a/include/macros.h b/include/macros.h index 70c85f2a8e..2928f32103 100644 --- a/include/macros.h +++ b/include/macros.h @@ -1,6 +1,8 @@ #ifndef _MACROS_H_ #define _MACROS_H_ +#include "convert.h" + #define ARRAY_COUNT(arr) (s32)(sizeof(arr) / sizeof(arr[0])) #define ARRAY_COUNTU(arr) (u32)(sizeof(arr) / sizeof(arr[0])) @@ -12,4 +14,11 @@ #define ALIGN16(val) (((val) + 0xF) & ~0xF) -#endif +// Currently most often called ctxt in MM, TODO: Refactor names when its used +#define ACTIVE_CAM globalCtx->cameraPtrs[globalCtx->activeCamera] + +#define SET_NEXT_GAMESTATE(curState, newInit, newStruct) \ + (curState)->nextGameStateInit = (GameStateFunc)newInit; \ + (curState)->nextGameStateSize = sizeof(newStruct); + +#endif // _MACROS_H_ diff --git a/include/regs.h b/include/regs.h new file mode 100644 index 0000000000..e6358527ae --- /dev/null +++ b/include/regs.h @@ -0,0 +1,103 @@ +/* Header taken as placeholder from OoT sister project */ +/* Confirm as needed */ + +#ifndef _REGS_H_ +#define _REGS_H_ + +#define REG_GROUPS 29 // number of REG groups, i.e. REG, SREG, OREG, etc. +#define REG_PAGES 6 +#define REG_PER_PAGE 16 +#define REG_PER_GROUP REG_PAGES * REG_PER_PAGE + +/* We probably want a better name for gStaticContext based on OoT discussions */ +#define BASE_REG(n, r) gStaticContext->data[n * REG_PER_GROUP + r] + +#define REG(r) BASE_REG(0, r) +#define SREG(r) BASE_REG(1, r) +#define OREG(r) BASE_REG(2, r) +#define PREG(r) BASE_REG(3, r) +#define QREG(r) BASE_REG(4, r) +#define MREG(r) BASE_REG(5, r) +#define YREG(r) BASE_REG(6, r) +#define DREG(r) BASE_REG(7, r) +#define UREG(r) BASE_REG(8, r) +#define IREG(r) BASE_REG(9, r) +#define ZREG(r) BASE_REG(10, r) +#define CREG(r) BASE_REG(11, r) +#define NREG(r) BASE_REG(12, r) +#define KREG(r) BASE_REG(13, r) +#define XREG(r) BASE_REG(14, r) +#define cREG(r) BASE_REG(15, r) +#define sREG(r) BASE_REG(16, r) +#define iREG(r) BASE_REG(17, r) +#define WREG(r) BASE_REG(18, r) +#define AREG(r) BASE_REG(19, r) +#define VREG(r) BASE_REG(20, r) +#define HREG(r) BASE_REG(21, r) +#define GREG(r) BASE_REG(22, r) +#define mREG(r) BASE_REG(23, r) +#define nREG(r) BASE_REG(24, r) +#define BREG(r) BASE_REG(25, r) +#define dREG(r) BASE_REG(26, r) +#define kREG(r) BASE_REG(27, r) +#define bREG(r) BASE_REG(28, r) + +/* TODO: Actually confirm these, in case of miss-match it's at least a simple list to `sed` */ +#define R_ENABLE_ARENA_DBG SREG(0) +#define R_RUN_SPEED_LIMIT REG(45) +#define R_UPDATE_RATE SREG(30) +#define R_PAUSE_MENU_MODE SREG(94) +#define R_C_UP_ICON_X YREG(88) +#define R_C_UP_ICON_Y YREG(89) +#define R_MAGIC_FILL_COLOR(i) ZREG(0 + i) +#define R_C_BTN_COLOR(i) ZREG(39 + i) +#define R_B_BTN_COLOR(i) ZREG(43 + i) +#define R_START_LABEL_DD(i) ZREG(48 + i) +#define R_START_LABEL_Y(i) ZREG(51 + i) +#define R_START_LABEL_X(i) ZREG(54 + i) +#define R_C_UP_BTN_X ZREG(62) +#define R_C_UP_BTN_Y ZREG(63) +#define R_START_BTN_X ZREG(68) +#define R_START_BTN_Y ZREG(69) +#define R_ITEM_BTN_X(i) ZREG(70 + i) +#define R_ITEM_BTN_Y(i) ZREG(74 + i) +#define R_ITEM_BTN_DD(i) ZREG(78 + i) +#define R_ITEM_ICON_X(i) ZREG(82 + i) +#define R_ITEM_ICON_Y(i) ZREG(86 + i) +#define R_ITEM_ICON_DD(i) ZREG(90 + i) +#define R_A_BTN_Y XREG(16) +#define R_A_BTN_X XREG(17) +#define R_A_ICON_Y XREG(19) +#define R_A_ICON_X XREG(20) +#define R_A_BTN_COLOR(i) XREG(22 + i) +#define R_MAGIC_BAR_SMALL_Y XREG(48) +#define R_MAGIC_BAR_X XREG(49) +#define R_MAGIC_BAR_LARGE_Y XREG(50) +#define R_MAGIC_FILL_X XREG(51) +#define R_B_LABEL_DD WREG(0) +#define R_OW_MINIMAP_X WREG(29) +#define R_OW_MINIMAP_Y WREG(30) +#define R_MINIMAP_TOGGLED WREG(31) +#define R_B_LABEL_X(i) WREG(40 + i) +#define R_B_LABEL_Y(i) WREG(43 + i) +#define R_DGN_MINIMAP_X WREG(68) +#define R_DGN_MINIMAP_Y WREG(69) +#define R_MAP_INDEX VREG(11) +#define R_MAP_TEX_INDEX_BASE VREG(12) +#define R_MAP_TEX_INDEX VREG(13) +#define R_COMPASS_SCALE_X VREG(14) +#define R_COMPASS_SCALE_Y VREG(15) +#define R_COMPASS_OFFSET_X VREG(16) +#define R_COMPASS_OFFSET_Y VREG(17) +#define R_MINIMAP_COLOR(i) VREG(18 + i) +#define R_ITEM_AMMO_X(i) VREG(64 + i) +#define R_ITEM_AMMO_Y(i) VREG(68 + i) +#define R_ITEM_ICON_WIDTH(i) VREG(76 + i) +#define R_ITEM_BTN_WIDTH(i) VREG(80 + i) + +#define R_FB_FILTER_TYPE SREG(80) +#define R_FB_FILTER_PRIM_COLOR(c) SREG(81 + c) +#define R_FB_FILTER_A SREG(84) +#define R_FB_FILTER_ENV_COLOR(c) SREG(85 + c) + +#endif diff --git a/include/structs.h b/include/structs.h index 9b69e69376..6360c0e3f6 100644 --- a/include/structs.h +++ b/include/structs.h @@ -496,11 +496,13 @@ typedef struct { /* 0x2B8 */ DispBuf polyXlu; /* 0x2C8 */ s32 displaylistCounter; /* 0x2CC */ void* framebuffer; -/* 0x2D0 */ UNK_TYPE1 pad2D0[0xB]; +/* 0x2D0 */ int pad2D0; +/* 0x2D4 */ u32 viConfigFeatures; +/* 0x2D8 */ UNK_TYPE1 gap2D8[0x3]; /* 0x2DB */ u8 framebufferCounter; /* 0x2DC */ UNK_TYPE1 pad2DC[0x8]; -/* 0x2E4 */ f32 unk2E4; -/* 0x2E8 */ f32 unk2E8; +/* 0x2E4 */ f32 viConfigXScale; +/* 0x2E8 */ f32 viConfigYScale; /* 0x2EC */ UNK_TYPE1 pad2EC[0x4]; } GraphicsContext; // size = 0x2F0 @@ -2134,11 +2136,12 @@ struct GameAlloc { /* 0x10 */ GameAllocNode* head; }; // size = 0x14 +typedef void (*GameStateFunc)(struct GameState* gameState); struct GameState { /* 0x00 */ GraphicsContext* gfxCtx; -/* 0x04 */ func_ptr main; -/* 0x08 */ func_ptr destroy; -/* 0x0C */ func_ptr nextGameStateInit; +/* 0x04 */ GameStateFunc main; +/* 0x08 */ GameStateFunc destroy; +/* 0x0C */ GameStateFunc nextGameStateInit; /* 0x10 */ u32 nextGameStateSize; /* 0x14 */ Input input[4]; /* 0x74 */ GameStateHeap heap; @@ -3100,5 +3103,27 @@ struct ActorBgIknvObj { /* 0x1AC */ actor_func updateFunc; }; // size = 0x1B0 +typedef struct { + /* 0x00 */ u32 type; + /* 0x04 */ u32 setScissor; + /* 0x08 */ ColorRGBA8 color; + /* 0x0C */ ColorRGBA8 envColor; +} struct_801F8010; // size = 0x10 + +typedef struct { + /* 0x00 */ u32 useRgba; + /* 0x04 */ u32 setScissor; + /* 0x08 */ ColorRGBA8 primColor; + /* 0x08 */ ColorRGBA8 envColor; +} struct_801F8020; // size = 0x10 + +typedef struct { + /* 0x00 */ u32 unk_00; + /* 0x04 */ u32 setScissor; + /* 0x08 */ ColorRGBA8 primColor; + /* 0x0C */ ColorRGBA8 envColor; + /* 0x10 */ u16* tlut; + /* 0x14 */ Gfx* monoDl; +} VisMono; // size = 0x18 #endif diff --git a/include/variables.h b/include/variables.h index 2e25cbaef7..99c349b994 100644 --- a/include/variables.h +++ b/include/variables.h @@ -2319,12 +2319,12 @@ extern UNK_TYPE2 D_801D14E0; // D_801D14E0 extern UNK_TYPE2 D_801D14E4; // D_801D14E4 extern UNK_TYPE2 D_801D14E8; // D_801D14E8 extern UNK_TYPE4 D_801D14F0; // D_801D14F0 -extern UNK_TYPE4 gFramerateDivisor; // D_801D1500 +extern s32 gFramerateDivisor; // D_801D1500 extern f32 gFramerateDivisorF; // D_801D1504 extern f32 gFramerateDivisorHalf; // D_801D1508 extern f32 gFramerateDivisorThird; // D_801D150C -extern UNK_TYPE4 D_801D1510; // D_801D1510 -extern UNK_TYPE4 D_801D1514; // D_801D1514 +extern u32 D_801D1510; // D_801D1510 +extern u32 D_801D1514[3]; // D_801D1514 extern s32 gScreenWidth; // D_801D1520 extern s32 gScreenHeight; // D_801D1524 extern UNK_TYPE4 startHeapSize; // D_801D1528 @@ -4098,9 +4098,9 @@ extern StackEntry slowlyStackEntry; // D_801F6FC8 extern u8 slowlyStack[4096]; // D_801F6FE8 extern UNK_TYPE1 D_801F7FE8; // D_801F7FE8 extern UNK_TYPE1 D_801F7FF0; // D_801F7FF0 -extern UNK_TYPE1 D_801F8010; // D_801F8010 -extern UNK_TYPE1 D_801F8020; // D_801F8020 -extern UNK_TYPE1 D_801F8030; // D_801F8030 +extern struct_801F8010 D_801F8010; // D_801F8010 +extern struct_801F8020 D_801F8020; // D_801F8020 +extern VisMono sMonoColors; // sMonoColors extern UNK_TYPE1 D_801F8048; // D_801F8048 extern FaultAddrConvClient grapgFaultAddrConvClient; // D_801F80D0 extern FaultClient graphFaultClient; // D_801F80E0 @@ -4138,8 +4138,8 @@ extern UNK_TYPE1 D_801FBAD0; // D_801FBAD0 extern UNK_TYPE1 D_801FBAD4; // D_801FBAD4 extern UNK_TYPE1 D_801FBAE0; // D_801FBAE0 extern UNK_TYPE1 D_801FBAE8; // D_801FBAE8 -extern u64 D_801FBAF0; // D_801FBAF0 -extern u64 lastRenderFrameDuration; // D_801FBAF8 +extern volatile OSTime D_801FBAF0; // D_801FBAF0 +extern volatile OSTime lastRenderFrameDuration; // D_801FBAF8 extern UNK_TYPE1 D_801FBB00; // D_801FBB00 extern UNK_TYPE1 D_801FBB04; // D_801FBB04 extern UNK_TYPE1 D_801FBB08; // D_801FBB08 diff --git a/linker_scripts/code_script.txt b/linker_scripts/code_script.txt index c54917e8f1..5d6bfff283 100644 --- a/linker_scripts/code_script.txt +++ b/linker_scripts/code_script.txt @@ -416,7 +416,8 @@ SECTIONS build/asm/code_0x80172A00.o(.text) build/asm/code_0x80172BC0.o(.text) build/asm/code_0x80172C30.o(.text) - build/asm/game.o(.text) + build/src/code/title_setup.o(.text) + build/src/code/game.o(.text) build/asm/gamealloc.o(.text) build/asm/graph.o(.text) build/asm/code_0x80174A40.o(.text) @@ -515,7 +516,7 @@ SECTIONS build/asm/code_data_z_play.o(.text) build/asm/code_data_z_play_hireso.o(.text) build/asm/code_data_0x80172C30.o(.text) - build/asm/code_data_game.o(.text) + build/src/code/game.o(.data) build/asm/code_data_graph.o(.text) build/asm/code_data_padmgr.o(.text) build/asm/code_data_speed_meter.o(.text) @@ -587,7 +588,7 @@ SECTIONS build/asm/code_rodata_PreRender.o(.text) build/asm/code_rodata_0x80172BC0.o(.text) build/asm/code_rodata_0x80172C30.o(.text) - build/asm/code_rodata_game.o(.text) + build/src/code/game.o(.rodata) build/asm/code_rodata_graph.o(.text) build/asm/code_rodata_main.o(.text) build/asm/code_rodata_padmgr.o(.text) diff --git a/src/code/game.c b/src/code/game.c new file mode 100644 index 0000000000..206cd69a4f --- /dev/null +++ b/src/code/game.c @@ -0,0 +1,262 @@ +#include +#include + +s32 gFramerateDivisor = 1; +f32 gFramerateDivisorF = 1.0f; +f32 gFramerateDivisorHalf = 1.0f / 2.0f; +f32 gFramerateDivisorThird = 1.0f / 3.0f; + +u32 D_801D1510 = 0x0000000A; +u32 D_801D1514[3] = { 0 }; + +void Game_UpdateFramerateVariables(s32 divisor) { + gFramerateDivisor = divisor; + gFramerateDivisorF = (f32) divisor; + gFramerateDivisorHalf = (f32) (divisor * 0.5f); + gFramerateDivisorThird = (f32) (divisor / 3.0f); +} + +void Game_SetFramerateDivisor(GameState *gameState, s32 divisor) { + R_UPDATE_RATE = (s16) divisor; + gameState->framerateDivisor = divisor; + Game_UpdateFramerateVariables(divisor); +} + +void GameState_SetFBFilter(Gfx** gfx, u32 arg1) { + Gfx* _gfx = *gfx; + + if ((R_FB_FILTER_TYPE > 0) && (R_FB_FILTER_TYPE < 5)) { + D_801F8010.type = R_FB_FILTER_TYPE; + D_801F8010.color.red = R_FB_FILTER_PRIM_COLOR(0); + D_801F8010.color.green = R_FB_FILTER_PRIM_COLOR(1); + D_801F8010.color.blue = R_FB_FILTER_PRIM_COLOR(2); + D_801F8010.color.alpha = R_FB_FILTER_A; + func_80140D10(&D_801F8010, &_gfx, arg1); + } else { + if ((R_FB_FILTER_TYPE == 5) || (R_FB_FILTER_TYPE == 6)) { + D_801F8020.useRgba = (R_FB_FILTER_TYPE == 6); + D_801F8020.primColor.red = R_FB_FILTER_PRIM_COLOR(0); + D_801F8020.primColor.green = R_FB_FILTER_PRIM_COLOR(1); + D_801F8020.primColor.blue = R_FB_FILTER_PRIM_COLOR(2); + D_801F8020.primColor.alpha = R_FB_FILTER_A; + D_801F8020.envColor.red = R_FB_FILTER_ENV_COLOR(0); + D_801F8020.envColor.green = R_FB_FILTER_ENV_COLOR(1); + D_801F8020.envColor.blue = R_FB_FILTER_ENV_COLOR(2); + D_801F8020.envColor.alpha = R_FB_FILTER_A; + func_80142100(&D_801F8020, &_gfx, arg1); + } else { + if (R_FB_FILTER_TYPE == 7) { + sMonoColors.unk_00 = 0; + sMonoColors.primColor.red = R_FB_FILTER_PRIM_COLOR(0); + sMonoColors.primColor.green = R_FB_FILTER_PRIM_COLOR(1); + sMonoColors.primColor.blue = R_FB_FILTER_PRIM_COLOR(2); + sMonoColors.primColor.alpha = R_FB_FILTER_A; + sMonoColors.envColor.red = R_FB_FILTER_ENV_COLOR(0); + sMonoColors.envColor.green = R_FB_FILTER_ENV_COLOR(1); + sMonoColors.envColor.blue = R_FB_FILTER_ENV_COLOR(2); + sMonoColors.envColor.alpha = R_FB_FILTER_A; + VisMono_Draw(&sMonoColors, &_gfx, arg1); + } + } + } + + *gfx = _gfx; +} + +void Game_Nop80173534(GameState *ctxt) { + ; +} + +void GameState_Draw(GameState *ctxt, GraphicsContext *gCtxt) { + Gfx* nextDisplayList; + Gfx* _polyOpa; + // Unused vars impact regalloc + Gfx* temp_t2; + u32 temp_v1; + + _polyOpa = gCtxt->polyOpa.p; + nextDisplayList = Graph_GfxPlusOne(gCtxt->polyOpa.p); + gSPDisplayList(gCtxt->overlay.p++, nextDisplayList); + + if (R_FB_FILTER_TYPE && R_FB_FILTER_ENV_COLOR(3) == 0) { + GameState_SetFBFilter(&nextDisplayList, (u32) gCtxt->zbuffer); + } + + if (R_ENABLE_ARENA_DBG < 0) { + R_ENABLE_ARENA_DBG = 0; + } + + gSPEndDisplayList(nextDisplayList++); + Graph_BranchDlist(_polyOpa, nextDisplayList); + gCtxt->polyOpa.p = nextDisplayList; + +lblUnk:; // Label prevents reordering, if(1) around the above block don't seem to help unlike in OoT + func_800E9F78(gCtxt); + + if (R_ENABLE_ARENA_DBG != 0) { + SpeedMeter_DrawTimeEntries(&D_801F7FF0, gCtxt); + SpeedMeter_DrawAllocEntries(&D_801F7FF0, gCtxt, ctxt); + } +} + +void Game_ResetSegments(GraphicsContext *gCtxt) { + gSPSegment(gCtxt->polyOpa.p++, 0, 0); + gSPSegment(gCtxt->polyOpa.p++, 0xF, gCtxt->framebuffer); + gSPSegment(gCtxt->polyXlu.p++, 0, 0); + gSPSegment(gCtxt->polyXlu.p++, 0xF, gCtxt->framebuffer); + gSPSegment(gCtxt->overlay.p++, 0, 0); + gSPSegment(gCtxt->overlay.p++, 0xF, gCtxt->framebuffer); +} + +void func_801736DC(GraphicsContext *gCtxt) { + Gfx* nextDisplayList; + Gfx* _polyOpa; + + nextDisplayList = Graph_GfxPlusOne(_polyOpa = gCtxt->polyOpa.p); + gSPDisplayList(gCtxt->overlay.p++, nextDisplayList); + gSPEndDisplayList(nextDisplayList++); + Graph_BranchDlist(_polyOpa, nextDisplayList); + + gCtxt->polyOpa.p = nextDisplayList; +} + +void Game_UpdateInput(GameState *ctxt) { + Padmgr_GetInput(ctxt->input, 1); +} + +void Game_Update(GameState *ctxt) { + GraphicsContext* _gCtx; + _gCtx = ctxt->gfxCtx; + + Game_ResetSegments(ctxt->gfxCtx); + + ctxt->main(ctxt); + + if (R_PAUSE_MENU_MODE != 2) { + GameState_Draw(ctxt, _gCtx); + func_801736DC(_gCtx); + } +} + +void Game_IncrementFrameCount(GameState *ctxt) { + Game_Nop80173534(ctxt); + ctxt->frames++; +} + +void Game_InitHeap(GameState *ctxt, u32 size) { + GameState *_ctx; + void *buf; + + _ctx = ctxt; + buf = Gamealloc_Alloc(&_ctx->alloc, size); + + if (buf) { + GameStateHeap_Init(&ctxt->heap, buf, size); + return; + } + + GameStateHeap_Init(&ctxt->heap, NULL, 0); + assert_fail("../game.c", 0x40B); +} + +void Game_ResizeHeap(GameState *ctxt, u32 size) +{ + GameAlloc *alloc; + void *buf; + u32 systemMaxFree; + u32 bytesFree; + u32 bytesAllocated; + void *heapStart; + + heapStart = ctxt->heap.heapStart; + alloc = &ctxt->alloc; + GameStateHeap_Clear(&ctxt->heap); + Gamealloc_Free(alloc, heapStart); + StartHeap_AnalyzeArena(&systemMaxFree, &bytesFree, &bytesAllocated); + size = ((systemMaxFree - (sizeof(ArenaNode))) < size) ? (0) : (size); + if (!size) + { + size = systemMaxFree - (sizeof(ArenaNode)); + } + + if (buf = Gamealloc_Alloc(alloc, size)) + { + GameStateHeap_Init(&ctxt->heap, buf, size); + } + else + { + GameStateHeap_Init(&ctxt->heap, 0, 0); + assert_fail("../game.c", 0x432); + } +} + +void Game_StateInit(GameState *ctxt, GameStateFunc gameStateInit, GraphicsContext *gCtxt) { + ctxt->gfxCtx = gCtxt; + ctxt->frames = 0U; + ctxt->main = NULL; + ctxt->destroy = NULL; + ctxt->running = 1; + gCtxt->unk274 = D_801FBB88; + gCtxt->viConfigFeatures = gViConfigFeatures; + gCtxt->viConfigXScale = gViConfigXScale; + gCtxt->viConfigYScale = gViConfigYScale; + ctxt->nextGameStateInit = NULL; + ctxt->nextGameStateSize = 0U; + +lblUnk:; + Gamealloc_Init(&ctxt->alloc); + Game_InitHeap(ctxt, 0x100000); + Game_SetFramerateDivisor(ctxt, 3); + + gameStateInit(ctxt); + + func_80140CE0(&D_801F8010); + func_801420C0(&D_801F8020); + func_801418B0(&sMonoColors); + func_80140898(&D_801F8048); + func_801773A0(&D_801F7FF0); + func_8013ED9C(); + + osSendMesg(&ctxt->gfxCtx->unk5C, NULL, 1); +} + +void Game_StateFini(GameState *ctxt) { + func_80172BC0(); + func_8019E014(); + osRecvMesg(&ctxt->gfxCtx->unk5C, 0, 1); + + if (ctxt->destroy != 0) { + ctxt->destroy(ctxt); + } + + func_8013EDD0(); + func_801773C4(&D_801F7FF0); + func_80140D04(&D_801F8010); + func_801420F4(&D_801F8020); + func_80141900(&sMonoColors); + func_80140900(&D_801F8048); + GameStateHeap_Clear(&ctxt->heap); + Gamealloc_FreeAll(&ctxt->alloc); +} + +GameStateFunc Game_GetNextStateInit(GameState *ctxt) { + return ctxt->nextGameStateInit; +} + +u32 Game_GetNextStateSize(GameState *ctxt) { + return ctxt->nextGameStateSize; +} + +u32 Game_GetShouldContinue(GameState *ctxt) { + return ctxt->running; +} + +s32 Game_GetHeapFreeSize(GameState *ctxt) { + return GameStateHeap_GetFreeSize(&ctxt->heap); +} + +s32 func_80173B48(GameState *ctxt) { + s32 result; + result = OS_CYCLES_TO_NSEC(ctxt->framerateDivisor * sIrqMgrRetraceTime) - OS_CYCLES_TO_NSEC(D_801FBAF0); + return result; +} diff --git a/src/code/title_setup.c b/src/code/title_setup.c new file mode 100644 index 0000000000..9fae784929 --- /dev/null +++ b/src/code/title_setup.c @@ -0,0 +1,66 @@ +#include +#include + +void TitleSetup_GameStateResetContext(void) { + XREG(2) = 0; + XREG(10) = 0x1A; + XREG(11) = 0x14; + XREG(12) = 0xE; + XREG(13) = 0; + XREG(31) = 0; + XREG(41) = 0x50; + XREG(43) = 0xFFFFFC54; + + XREG(44) = 0xD7; + XREG(45) = 0xDA; + XREG(68) = 0x61; + XREG(69) = 0x93; + XREG(70) = 0x28; + XREG(73) = 0x1E; + XREG(74) = 0x42; + XREG(75) = 0x1E; + XREG(76) = 0x1C; + XREG(77) = 0x3C; + XREG(78) = 0x2F; + XREG(79) = 0x62; + XREG(87) = 0; + XREG(88) = 0x56; + XREG(89) = 0x258; + XREG(90) = 0x1C2; + XREG(91) = 0; + XREG(94) = 0; + XREG(95) = 0; + + YREG(32) = 0x50; + YREG(33) = 0x3C; + YREG(34) = 0xDC; + YREG(35) = 0x3C; + YREG(36) = 0x50; + YREG(37) = 0xA0; + YREG(38) = 0xDC; + YREG(39) = 0xA0; + YREG(40) = 0x8E; + YREG(41) = 0x6C; + YREG(42) = 0xCC; + YREG(43) = 0xB1; +} + +void TitleSetup_InitImpl(GameState *gameState) { + func_80185908(); + func_800E9360(); + TitleSetup_GameStateResetContext(); + + gameState->running = 0; + +setNextGamestate:; // This label is probably a leftover of a debug ifdef, it's essential to not have gameState->running reordered! + SET_NEXT_GAMESTATE(gameState, &Title_Init, TitleContext); +} + +void TitleSetup_Destroy(GameState *gameState) { + ; +} + +void TitleSetup_Init(GameState *gameState) { + gameState->destroy = &TitleSetup_Destroy; + TitleSetup_InitImpl(gameState); +} diff --git a/src/code/z_prenmi.c b/src/code/z_prenmi.c index e2e9721da1..bf2dd00a12 100644 --- a/src/code/z_prenmi.c +++ b/src/code/z_prenmi.c @@ -43,8 +43,8 @@ void PreNMI_Main(PreNMIContext* prenmiCtx) { void PreNMI_Destroy(PreNMIContext* prenmiCtx) {} void PreNMI_Init(PreNMIContext* prenmiCtx) { - prenmiCtx->state.main = (func_ptr)PreNMI_Main; - prenmiCtx->state.destroy = (func_ptr)PreNMI_Destroy; + prenmiCtx->state.main = (GameStateFunc)PreNMI_Main; + prenmiCtx->state.destroy = (GameStateFunc)PreNMI_Destroy; prenmiCtx->timer = 30; prenmiCtx->unkA8 = 10; diff --git a/src/code/z_rcp.c b/src/code/z_rcp.c index f56a26eeac..ba3e24b299 100644 --- a/src/code/z_rcp.c +++ b/src/code/z_rcp.c @@ -1307,7 +1307,7 @@ GLOBAL_ASM("asm/non_matchings/z_rcp/func_8012CF0C.asm") #endif void func_8012D374(GraphicsContext* gCtxt, u8 r, u8 g, u8 b) { - if ((gStaticContext->data[0xbe] < 2) && (D_801F6D10 < 2)) { + if ((R_PAUSE_MENU_MODE < 2) && (D_801F6D10 < 2)) { func_8012CF0C(gCtxt, 1, 1, r, g, b); } else { diff --git a/tables/functions.txt b/tables/functions.txt index 1bbf95ad4b..08e89edbd6 100644 --- a/tables/functions.txt +++ b/tables/functions.txt @@ -1527,7 +1527,7 @@ 0x800E8FA4:("func_800E8FA4","s32","Actor* actor, Vec3f* param_2, Vec3s* param_3, Vec3s* param_4"), 0x800E9138:("func_800E9138","s32","GlobalContext* ctxt, Actor* actor, Vec3s* param_3, Vec3s* param_4, f32 param_5"), 0x800E9250:("func_800E9250","s32","GlobalContext* ctxt, Actor* actor, Vec3s* param_3, Vec3s* param_4, Vec3f param_5"), - 0x800E9360:("func_800E9360","void","void"), + 0x800E9360:("func_800E9360","u8","void"), 0x800E93E0:("static_context_init","void","void"), 0x800E9470:("func_800E9470","void","void"), 0x800E9488:("func_800E9488","void","UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE2 param_5, UNK_TYPE2 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE1 param_10, UNK_TYPE1 param_11, UNK_TYPE1 param_12, UNK_TYPE1 param_13, UNK_TYPE2 param_14, UNK_TYPE4 param_15"), @@ -2757,13 +2757,13 @@ 0x8014026C:("func_8014026C","void","OSViMode* param_1, UNK_TYPE1 param_2, int param_3, int param_4, int param_5, int param_6, int param_7, int param_8, UNK_TYPE4 param_9, int param_10, short param_11, unsigned int param_12, UNK_TYPE4 param_13"), 0x80140730:("func_80140730","void","void"), 0x80140810:("func_80140810","void","void"), - 0x80140898:("func_80140898","void","void"), - 0x80140900:("func_80140900","void","void"), + 0x80140898:("func_80140898","void","void* arg0"), + 0x80140900:("func_80140900","void","void* arg0"), 0x8014090C:("func_8014090C","void","void"), 0x80140970:("func_80140970","void","void"), - 0x80140CE0:("func_80140CE0","void","void"), - 0x80140D04:("func_80140D04","void","void"), - 0x80140D10:("func_80140D10","void","void"), + 0x80140CE0:("func_80140CE0","void","void* arg0"), + 0x80140D04:("func_80140D04","void","void* arg0"), + 0x80140D10:("func_80140D10","void","void* arg0, Gfx** gfx, u32 arg2"), 0x80140E80:("func_80140E80","void","void* param_1"), 0x80140EA0:("func_80140EA0","void","void"), 0x80140EAC:("func_80140EAC","void","UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6"), @@ -2774,15 +2774,15 @@ 0x8014151C:("func_8014151C","void","UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6"), 0x80141678:("func_80141678","void","UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5"), 0x80141778:("func_80141778","void","void"), - 0x801418B0:("func_801418B0","void","void"), - 0x80141900:("func_80141900","void","void"), + 0x801418B0:("func_801418B0","void","void* arg0"), + 0x80141900:("func_80141900","void","void* arg0"), 0x80141924:("func_80141924","void","void"), 0x80141C34:("func_80141C34","void","void"), - 0x80141E60:("func_80141E60","void","void"), + 0x80141E60:("VisMono_Draw","void","void* arg0, Gfx** gfx, u32 arg2"), 0x8014204C:("func_8014204C","void","void"), - 0x801420C0:("func_801420C0","void","void"), - 0x801420F4:("func_801420F4","void","void"), - 0x80142100:("func_80142100","void","void"), + 0x801420C0:("func_801420C0","void","void* arg0"), + 0x801420F4:("func_801420F4","void","void* arg0"), + 0x80142100:("func_80142100","void","void* arg0, Gfx** gfx, u32 arg2"), 0x80142440:("func_80142440","void","UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE1 param_5, UNK_TYPE1 param_6, UNK_TYPE1 param_7, UNK_TYPE1 param_8, UNK_TYPE4 param_9"), 0x80143148:("func_80143148","void","void"), 0x801431E8:("func_801431E8","void","void"), @@ -3118,15 +3118,15 @@ 0x80172ED0:("Audio_ThreadEntry","void","AudioThreadStruct* audio"), 0x80173048:("Audio_WaitForInit","void","AudioThreadStruct* param_1"), 0x80173074:("Audio_Start","void","AudioThreadStruct* audio, s32* audioThreadStackEnd, OSPri pri, OSId id, SchedThreadStruct* sched, IrqMgr* irq"), - 0x80173130:("func_80173130","void","void"), - 0x801732DC:("Initial_Init2","void","GameState* ctxt"), - 0x8017332C:("Initial_Fini","void","void"), - 0x80173338:("Initial_Init","void","GameState* ctxt"), + 0x80173130:("TitleSetup_GameStateResetContext","void","void"), + 0x801732DC:("TitleSetup_InitImpl","void","GameState* gameState"), + 0x8017332C:("TitleSetup_Destroy","void","GameState* gameState"), + 0x80173338:("TitleSetup_Init","void","GameState* gameState"), 0x80173360:("Game_UpdateFramerateVariables","void","s32 divisor"), - 0x801733A8:("Game_SetFramerateDivisor","void","GameState* iParm1, u32 divisor"), - 0x801733DC:("func_801733DC","void","void"), + 0x801733A8:("Game_SetFramerateDivisor","void","GameState* gameState, s32 divisor"), + 0x801733DC:("GameState_SetFBFilter","void","Gfx** gfx, u32 arg1"), 0x80173534:("Game_Nop80173534","void","GameState* ctxt"), - 0x80173540:("func_80173540","void","GameState* ctxt, GraphicsContext* gCtxt"), + 0x80173540:("GameState_Draw","void","GameState* ctxt, GraphicsContext* gCtxt"), 0x80173644:("Game_ResetSegments","void","GraphicsContext* gCtxt"), 0x801736DC:("func_801736DC","void","GraphicsContext* gCtxt"), 0x80173754:("Game_UpdateInput","void","GameState* ctxt"), @@ -3134,13 +3134,13 @@ 0x801737E4:("Game_IncrementFrameCount","void","GameState* ctxt"), 0x80173810:("Game_InitHeap","void","GameState* ctxt, u32 size"), 0x80173880:("Game_ResizeHeap","void","GameState* ctxt, u32 size"), - 0x80173950:("Game_StateInit","void","GameState* ctxt, func_ptr gameStateInit, GraphicsContext* gCtxt"), + 0x80173950:("Game_StateInit","void","GameState* ctxt, GameStateFunc gameStateInit, GraphicsContext* gCtxt"), 0x80173A50:("Game_StateFini","void","GameState* ctxt"), - 0x80173B00:("Game_GetNextStateInit","UNK_TYPE4","GameState* ctxt"), + 0x80173B00:("Game_GetNextStateInit","GameStateFunc","GameState* ctxt"), 0x80173B0C:("Game_GetNextStateSize","u32","GameState* ctxt"), 0x80173B18:("Game_GetShouldContinue","u32","GameState* ctxt"), - 0x80173B24:("Game_GetHeapFreeSize","void","GameState* ctxt"), - 0x80173B48:("func_80173B48","int","GameState* ctxt"), + 0x80173B24:("Game_GetHeapFreeSize","s32","GameState* ctxt"), + 0x80173B48:("func_80173B48","s32","GameState* ctxt"), 0x80173BF0:("func_80173BF0","GameAlloc*","GameAlloc* heap"), 0x80173C10:("Gamealloc_Alloc","void*","GameAlloc* heap, u32 size"), 0x80173C7C:("Gamealloc_Free","void","GameAlloc* heap, void* ptr"), @@ -3219,12 +3219,12 @@ 0x80177280:("func_80177280","void","UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE1 param_5, UNK_TYPE1 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10, UNK_TYPE4 param_11, UNK_TYPE4 param_12"), 0x801772A0:("Sched_Start","void","SchedThreadStruct* sched, void* stack, OSPri pri, UNK_TYPE4 param_4, UNK_TYPE4 param_5, IrqMgr* irqmgrStruct"), 0x80177390:("func_80177390","void","void"), - 0x801773A0:("func_801773A0","void","void"), - 0x801773C4:("func_801773C4","void","void"), - 0x801773D0:("func_801773D0","void","void"), + 0x801773A0:("func_801773A0","void","void* arg0"), + 0x801773C4:("func_801773C4","void","void* arg0"), + 0x801773D0:("SpeedMeter_DrawTimeEntries","void","void* displayList, GraphicsContext* gCtx"), 0x80177A84:("func_80177A84","void","UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE2 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9"), 0x80177AC8:("func_80177AC8","void","void"), - 0x80177E58:("func_80177E58","void","void"), + 0x80177E58:("SpeedMeter_DrawAllocEntries","void","void* displayList, GraphicsContext *gCtx, GameState *ctx"), 0x801780F0:("func_801780F0","void","UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7"), 0x801781EC:("func_801781EC","void","UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5"), 0x8017842C:("func_8017842C","void","UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE2 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10, UNK_TYPE4 param_11"), @@ -3452,7 +3452,7 @@ 0x801857C0:("func_801857C0","void","void"), 0x801857D0:("func_801857D0","char*","void"), 0x80185864:("func_80185864","void","void"), - 0x80185908:("func_80185908","void","void"), + 0x80185908:("func_80185908","u32","void"), 0x80185968:("func_80185968","void","void"), 0x801859F0:("func_801859F0","void","void"), 0x80185A2C:("func_80185A2C","void","void"), diff --git a/tables/variables.txt b/tables/variables.txt index a38eba5066..17925041e1 100644 --- a/tables/variables.txt +++ b/tables/variables.txt @@ -4217,9 +4217,9 @@ 0x801F6FE8:("slowlyStack","u8","[4096]",0x1000), 0x801F7FE8:("D_801F7FE8","UNK_TYPE1","",0x1), 0x801F7FF0:("D_801F7FF0","UNK_TYPE1","",0x1), - 0x801F8010:("D_801F8010","UNK_TYPE1","",0x1), - 0x801F8020:("D_801F8020","UNK_TYPE1","",0x1), - 0x801F8030:("D_801F8030","UNK_TYPE1","",0x1), + 0x801F8010:("D_801F8010","struct_801F8010","",0x10), + 0x801F8020:("D_801F8020","struct_801F8020","",0x10), + 0x801F8030:("sMonoColors","VisMono","",0x18), 0x801F8048:("D_801F8048","UNK_TYPE1","",0x1), 0x801F80D0:("grapgFaultAddrConvClient","FaultAddrConvClient","",0xc), 0x801F80E0:("graphFaultClient","FaultClient","",0x10), @@ -4257,8 +4257,8 @@ 0x801FBAD4:("D_801FBAD4","UNK_TYPE1","",0x1), 0x801FBAE0:("D_801FBAE0","UNK_TYPE1","",0x1), 0x801FBAE8:("D_801FBAE8","UNK_TYPE1","",0x1), - 0x801FBAF0:("D_801FBAF0","u64","",0x8), - 0x801FBAF8:("lastRenderFrameDuration","u64","",0x8), + 0x801FBAF0:("D_801FBAF0","volatile OSTime","",0x8), + 0x801FBAF8:("lastRenderFrameDuration","volatile OSTime","",0x8), 0x801FBB00:("D_801FBB00","UNK_TYPE1","",0x1), 0x801FBB04:("D_801FBB04","UNK_TYPE1","",0x1), 0x801FBB08:("D_801FBB08","UNK_TYPE1","",0x1), diff --git a/tools/regconvert.py b/tools/regconvert.py new file mode 100644 index 0000000000..fdc1090b67 --- /dev/null +++ b/tools/regconvert.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 + +import argparse + +GROUP_SIZE = 0x60 +DATA_OFFSET = 0x14 + +REGISTER_NAMES = " SOPQMYDUIZCNKXcsiWAVHGmnBdkb" + +def get_reg_macro(offset): + reg = (offset - DATA_OFFSET) // 2 + group = reg // GROUP_SIZE + reg_in_group = reg % GROUP_SIZE + return "%cREG(%d)\n" % (REGISTER_NAMES[group], reg_in_group) + +def main(): + parser = argparse.ArgumentParser(description="Converts a GameInfo offset to a REG macro.") + parser.add_argument("offset", help="offset to GameInfo in hexadecimal") + args = parser.parse_args() + print(get_reg_macro(int(args.offset, 16))) + +if __name__ == "__main__": + main() diff --git a/undef.txt b/undef.txt index 8b6b65f212..8d84389c34 100644 --- a/undef.txt +++ b/undef.txt @@ -379,7 +379,7 @@ D_801F7FE8 = code_bss_start + 0x00014048; D_801F7FF0 = code_bss_start + 0x00014050; D_801F8010 = code_bss_start + 0x00014070; D_801F8020 = code_bss_start + 0x00014080; -D_801F8030 = code_bss_start + 0x00014090; +sMonoColors = code_bss_start + 0x00014090; D_801F8048 = code_bss_start + 0x000140A8; grapgFaultAddrConvClient = code_bss_start + 0x00014130; graphFaultClient = code_bss_start + 0x00014140;