diff --git a/include/romfile.h b/include/romfile.h new file mode 100644 index 0000000000..0ae0fcc68c --- /dev/null +++ b/include/romfile.h @@ -0,0 +1,19 @@ +#ifndef ROMFILE_H +#define ROMFILE_H + +#include "ultra64.h" +#include "libc/stdint.h" + +typedef struct { + /* 0x00 */ uintptr_t vromStart; + /* 0x04 */ uintptr_t vromEnd; +} RomFile; // size = 0x8 + +#define ROM_FILE(name) \ + { (uintptr_t)_##name##SegmentRomStart, (uintptr_t)_##name##SegmentRomEnd } +#define ROM_FILE_EMPTY(name) \ + { (uintptr_t)_##name##SegmentRomStart, (uintptr_t)_##name##SegmentRomStart } +#define ROM_FILE_UNSET \ + { 0, 0 } + +#endif diff --git a/include/segment_symbols.h b/include/segment_symbols.h index 74d56d0319..2c53511b97 100644 --- a/include/segment_symbols.h +++ b/include/segment_symbols.h @@ -4,6 +4,8 @@ #include "libc/stddef.h" #include "PR/ultratypes.h" +#include "romfile.h" + #define DECLARE_SEGMENT(name) \ extern u8 _##name##SegmentStart[]; \ extern u8 _##name##SegmentEnd[]; @@ -34,13 +36,6 @@ #define SEGMENT_BSS_END(segment) (_ ## segment ## SegmentBssEnd) #define SEGMENT_BSS_SIZE(segment) ((uintptr_t)SEGMENT_BSS_END(segment) - (uintptr_t)SEGMENT_BSS_START(segment)) -#define ROM_FILE(name) \ - { SEGMENT_ROM_START(name), SEGMENT_ROM_END(name) } -#define ROM_FILE_EMPTY(name) \ - { SEGMENT_ROM_START(name), SEGMENT_ROM_START(name) } -#define ROM_FILE_UNSET \ - { 0, 0 } - DECLARE_SEGMENT(framebuffer_lo) DECLARE_SEGMENT(boot) diff --git a/include/z64actor_dlftbls.h b/include/z64actor_dlftbls.h index 2a1472d4e4..942732576e 100644 --- a/include/z64actor_dlftbls.h +++ b/include/z64actor_dlftbls.h @@ -31,8 +31,7 @@ typedef enum AllocType { } AllocType; typedef struct ActorOverlay { - /* 0x00 */ uintptr_t vromStart; - /* 0x04 */ uintptr_t vromEnd; + /* 0x00 */ RomFile file; /* 0x08 */ void* vramStart; /* 0x0C */ void* vramEnd; /* 0x10 */ void* loadedRamAddr; // original name: "allocp" diff --git a/include/z64dma.h b/include/z64dma.h index ff02441c3e..b6003823fa 100644 --- a/include/z64dma.h +++ b/include/z64dma.h @@ -4,6 +4,8 @@ #include "ultra64.h" #include "unk.h" +#include "romfile.h" + typedef struct { /* 0x00 */ uintptr_t vromAddr; // VROM address (source) /* 0x04 */ void* dramAddr; // DRAM address (destination) @@ -15,14 +17,8 @@ typedef struct { /* 0x1C */ OSMesg notifyMsg; // Completion notification message } DmaRequest; // size = 0x20 -typedef struct RomFile { - /* 0x0 */ uintptr_t vromStart; - /* 0x4 */ uintptr_t vromEnd; -} RomFile; // size = 0x8 - typedef struct { - /* 0x0 */ uintptr_t vromStart; - /* 0x4 */ uintptr_t vromEnd; + /* 0x0 */ RomFile file; /* 0x8 */ uintptr_t romStart; /* 0xC */ uintptr_t romEnd; } DmaEntry; // size = 0x10 diff --git a/include/z64effect_ss.h b/include/z64effect_ss.h index aab6ff7eff..3bf63cfdfa 100644 --- a/include/z64effect_ss.h +++ b/include/z64effect_ss.h @@ -6,6 +6,7 @@ #include "color.h" #include "z64math.h" +#include "z64dma.h" #include "z64eff_ss_dead.h" struct Actor; @@ -37,8 +38,7 @@ typedef struct EffectSsInit { } EffectSsInit; // size = 0x8 typedef struct EffectSsOverlay { - /* 0x00 */ uintptr_t vromStart; - /* 0x04 */ uintptr_t vromEnd; + /* 0x00 */ RomFile file; /* 0x08 */ void* vramStart; /* 0x0C */ void* vramEnd; /* 0x10 */ void* loadedRamAddr; diff --git a/include/z64game.h b/include/z64game.h index 462922bd77..42105de759 100644 --- a/include/z64game.h +++ b/include/z64game.h @@ -8,6 +8,7 @@ #include "gamealloc.h" #include "padmgr.h" #include "padutils.h" +#include "romfile.h" #include "tha.h" #include "unk.h" @@ -31,8 +32,7 @@ typedef void (*GameStateFunc)(struct GameState* gameState); typedef struct GameStateOverlay { /* 0x00 */ void* loadedRamAddr; - /* 0x04 */ uintptr_t vromStart; // if applicable - /* 0x08 */ uintptr_t vromEnd; // if applicable + /* 0x04 */ RomFile file; // if applicable /* 0x0C */ void* vramStart; // if applicable /* 0x10 */ void* vramEnd; // if applicable /* 0x14 */ UNK_PTR unk_14; diff --git a/include/z64pause_menu.h b/include/z64pause_menu.h index ec69f17344..fdb63ea100 100644 --- a/include/z64pause_menu.h +++ b/include/z64pause_menu.h @@ -2,6 +2,7 @@ #define Z64PAUSE_MENU_H #include "ultra64.h" +#include "romfile.h" #include "z64math.h" #include "z64view.h" #include "unk.h" @@ -197,8 +198,7 @@ typedef enum KaleidoMgrOverlayType { typedef struct KaleidoMgrOverlay { /* 0x00 */ void* loadedRamAddr; - /* 0x04 */ uintptr_t vromStart; - /* 0x08 */ uintptr_t vromEnd; + /* 0x04 */ RomFile file; /* 0x0C */ void* vramStart; /* 0x10 */ void* vramEnd; /* 0x14 */ uintptr_t offset; // loadedRamAddr - vramStart diff --git a/include/z64transition.h b/include/z64transition.h index 24b15555c1..45e92255aa 100644 --- a/include/z64transition.h +++ b/include/z64transition.h @@ -6,6 +6,8 @@ #include "libc/stdint.h" #include "unk.h" +#include "romfile.h" + #include "overlays/fbdemos/ovl_fbdemo_triforce/z_fbdemo_triforce.h" #include "overlays/fbdemos/ovl_fbdemo_wipe1/z_fbdemo_wipe1.h" #include "overlays/fbdemos/ovl_fbdemo_wipe3/z_fbdemo_wipe3.h" @@ -71,8 +73,7 @@ typedef struct TransitionOverlay { } loadInfo; /* 0x04 */ void* vramStart; /* 0x08 */ void* vramEnd; - /* 0x0C */ uintptr_t vromStart; - /* 0x10 */ uintptr_t vromEnd; + /* 0x0C */ RomFile file; /* 0x14 */ TransitionInit* initInfo; /* 0x18 */ size_t size; } TransitionOverlay; diff --git a/src/boot/z_std_dma.c b/src/boot/z_std_dma.c index d15da65182..71e64ad695 100644 --- a/src/boot/z_std_dma.c +++ b/src/boot/z_std_dma.c @@ -114,8 +114,8 @@ s32 DmaMgr_AudioDmaHandler(OSPiHandle* pihandle, OSIoMesg* mb, s32 direction) { DmaEntry* DmaMgr_FindDmaEntry(uintptr_t vrom) { DmaEntry* entry; - for (entry = gDmaDataTable; entry->vromEnd != 0; entry++) { - if ((vrom >= entry->vromStart) && (vrom < entry->vromEnd)) { + for (entry = gDmaDataTable; entry->file.vromEnd != 0; entry++) { + if ((vrom >= entry->file.vromStart) && (vrom < entry->file.vromEnd)) { return entry; } } @@ -128,10 +128,10 @@ s32 DmaMgr_TranslateVromToRom(uintptr_t vrom) { if (entry != NULL) { if (entry->romEnd == 0) { - return vrom + entry->romStart - entry->vromStart; + return vrom + entry->romStart - entry->file.vromStart; } - if (vrom == entry->vromStart) { + if (vrom == entry->file.vromStart) { return entry->romStart; } @@ -169,23 +169,23 @@ void DmaMgr_ProcessRequest(DmaRequest* req) { if (entry->romEnd == 0) { // romEnd of 0 indicates that the file is uncompressed. Files that are stored uncompressed can have // only part of their content loaded into RAM, so DMA only the requested region. - if (entry->vromEnd < (vrom + size)) { + if (entry->file.vromEnd < (vrom + size)) { // Error, vrom + size ends up in a different file than it started in Fault_AddHungupAndCrash("../z_std_dma.c", 499); } - DmaMgr_DmaRomToRam((entry->romStart + vrom) - entry->vromStart, ram, size); + DmaMgr_DmaRomToRam((entry->romStart + vrom) - entry->file.vromStart, ram, size); } else { // File is compressed. Files that are stored compressed must be loaded into RAM all at once. romSize = entry->romEnd - entry->romStart; romStart = entry->romStart; - if (vrom != entry->vromStart) { + if (vrom != entry->file.vromStart) { // Error, requested vrom is not the start of a file Fault_AddHungupAndCrash("../z_std_dma.c", 518); } - if (size != (entry->vromEnd - entry->vromStart)) { + if (size != (entry->file.vromEnd - entry->file.vromStart)) { // Error, only part of the file was requested Fault_AddHungupAndCrash("../z_std_dma.c", 525); } @@ -290,7 +290,7 @@ void DmaMgr_Init(void) { DmaEntry* entry = gDmaDataTable; s32 index = 0; - while (entry->vromEnd != 0) { + while (entry->file.vromEnd != 0) { entry++; index++; } diff --git a/src/code/graph.c b/src/code/graph.c index ee0f5671e4..191ea1960c 100644 --- a/src/code/graph.c +++ b/src/code/graph.c @@ -362,7 +362,7 @@ void Graph_ThreadEntry(void* arg) { size = ovl->instanceSize; - func_800809F4(ovl->vromStart); + func_800809F4(ovl->file.vromStart); gameState = malloc(size); diff --git a/src/code/z_DLF.c b/src/code/z_DLF.c index 14031d3d3a..e1091e5931 100644 --- a/src/code/z_DLF.c +++ b/src/code/z_DLF.c @@ -17,8 +17,8 @@ void Overlay_LoadGameState(GameStateOverlay* overlayEntry) { return; } - overlayEntry->loadedRamAddr = - Overlay_AllocateAndLoad(overlayEntry->vromStart, overlayEntry->vromEnd, vramStart, overlayEntry->vramEnd); + overlayEntry->loadedRamAddr = Overlay_AllocateAndLoad(overlayEntry->file.vromStart, overlayEntry->file.vromEnd, + vramStart, overlayEntry->vramEnd); if (overlayEntry->loadedRamAddr != NULL) { overlayEntry->unk_14 = (void*)(uintptr_t)((overlayEntry->unk_14 != NULL) diff --git a/src/code/z_actor.c b/src/code/z_actor.c index bd4457671f..6b5d79ecde 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -3299,8 +3299,8 @@ ActorInit* Actor_LoadOverlay(ActorContext* actorCtx, s16 index) { return NULL; } - Overlay_Load(overlayEntry->vromStart, overlayEntry->vromEnd, overlayEntry->vramStart, overlayEntry->vramEnd, - overlayEntry->loadedRamAddr); + Overlay_Load(overlayEntry->file.vromStart, overlayEntry->file.vromEnd, overlayEntry->vramStart, + overlayEntry->vramEnd, overlayEntry->loadedRamAddr); overlayEntry->numLoaded = 0; } diff --git a/src/code/z_actor_dlftbls.c b/src/code/z_actor_dlftbls.c index d3d925fbce..f884de2dfb 100644 --- a/src/code/z_actor_dlftbls.c +++ b/src/code/z_actor_dlftbls.c @@ -17,18 +17,21 @@ // Actor Overlay Table definition #define DEFINE_ACTOR(name, _enumValue, allocType, _debugName) \ - { SEGMENT_ROM_START(ovl_##name), \ - SEGMENT_ROM_END(ovl_##name), \ - SEGMENT_START(ovl_##name), \ - SEGMENT_END(ovl_##name), \ - NULL, \ - &name##_InitVars, \ - NULL, \ - allocType, \ - 0 }, + { \ + ROM_FILE(ovl_##name), \ + SEGMENT_START(ovl_##name), \ + SEGMENT_END(ovl_##name), \ + NULL, \ + &name##_InitVars, \ + NULL, \ + allocType, \ + 0, \ + }, -#define DEFINE_ACTOR_INTERNAL(name, _enumValue, allocType, _debugName) \ - { 0, 0, NULL, NULL, NULL, &name##_InitVars, NULL, allocType, 0 }, +#define DEFINE_ACTOR_INTERNAL(name, _enumValue, allocType, _debugName) \ + { \ + ROM_FILE_UNSET, NULL, NULL, NULL, &name##_InitVars, NULL, allocType, 0, \ + }, #define DEFINE_ACTOR_UNSET(_enumValue) { 0 }, diff --git a/src/code/z_effect_soft_sprite.c b/src/code/z_effect_soft_sprite.c index 3b340a15c0..abe0f5d974 100644 --- a/src/code/z_effect_soft_sprite.c +++ b/src/code/z_effect_soft_sprite.c @@ -191,8 +191,8 @@ void EffectSs_Spawn(PlayState* play, s32 type, s32 priority, void* initData) { return; } - Overlay_Load(overlayEntry->vromStart, overlayEntry->vromEnd, overlayEntry->vramStart, overlayEntry->vramEnd, - overlayEntry->loadedRamAddr); + Overlay_Load(overlayEntry->file.vromStart, overlayEntry->file.vromEnd, overlayEntry->vramStart, + overlayEntry->vramEnd, overlayEntry->loadedRamAddr); } initInfo = (void*)(uintptr_t)((overlayEntry->initInfo != NULL) diff --git a/src/code/z_effect_soft_sprite_dlftbls.c b/src/code/z_effect_soft_sprite_dlftbls.c index 6f561dd055..69dab2885f 100644 --- a/src/code/z_effect_soft_sprite_dlftbls.c +++ b/src/code/z_effect_soft_sprite_dlftbls.c @@ -13,15 +13,9 @@ #undef DEFINE_EFFECT_SS #undef DEFINE_EFFECT_SS_UNSET -#define DEFINE_EFFECT_SS(name, _enumValue) \ - { \ - SEGMENT_ROM_START(ovl_##name), \ - SEGMENT_ROM_END(ovl_##name), \ - SEGMENT_START(ovl_##name), \ - SEGMENT_END(ovl_##name), \ - NULL, \ - &name##_InitVars, \ - 1, \ +#define DEFINE_EFFECT_SS(name, _enumValue) \ + { \ + ROM_FILE(ovl_##name), SEGMENT_START(ovl_##name), SEGMENT_END(ovl_##name), NULL, &name##_InitVars, 1, \ }, #define DEFINE_EFFECT_SS_UNSET(_enumValue) { 0 }, diff --git a/src/code/z_fbdemo_dlftbls.c b/src/code/z_fbdemo_dlftbls.c index df73ed1b3d..091d02ed66 100644 --- a/src/code/z_fbdemo_dlftbls.c +++ b/src/code/z_fbdemo_dlftbls.c @@ -20,8 +20,7 @@ { 0, 0 }, \ SEGMENT_START(ovl_##name), \ SEGMENT_END(ovl_##name), \ - SEGMENT_ROM_START(ovl_##name), \ - SEGMENT_ROM_END(ovl_##name), \ + ROM_FILE(ovl_##name), \ &structName##_InitVars, \ sizeof(structName), \ }, diff --git a/src/code/z_game_dlftbls.c b/src/code/z_game_dlftbls.c index cb3aee3170..36ffa0e60b 100644 --- a/src/code/z_game_dlftbls.c +++ b/src/code/z_game_dlftbls.c @@ -16,22 +16,26 @@ #undef DEFINE_GAMESTATE_INTERNAL // Gamestate Overlay Table definition -#define DEFINE_GAMESTATE_INTERNAL(typeName, _enumName) \ - { NULL, 0, 0, NULL, NULL, NULL, typeName##_Init, typeName##_Destroy, NULL, NULL, 0, sizeof(typeName##State) }, +#define DEFINE_GAMESTATE_INTERNAL(typeName, _enumName) \ + { \ + NULL, ROM_FILE_UNSET, NULL, NULL, NULL, typeName##_Init, typeName##_Destroy, NULL, NULL, \ + 0, sizeof(typeName##State), \ + }, #define DEFINE_GAMESTATE(typeName, _enumName, segmentName) \ - { NULL, \ - (uintptr_t)SEGMENT_ROM_START(ovl_##segmentName), \ - (uintptr_t)SEGMENT_ROM_END(ovl_##segmentName), \ - SEGMENT_START(ovl_##segmentName), \ - SEGMENT_END(ovl_##segmentName), \ - NULL, \ - typeName##_Init, \ - typeName##_Destroy, \ - NULL, \ - NULL, \ - 0, \ - sizeof(typeName##State) }, + { \ + NULL, \ + ROM_FILE(ovl_##segmentName), \ + SEGMENT_START(ovl_##segmentName), \ + SEGMENT_END(ovl_##segmentName), \ + NULL, \ + typeName##_Init, \ + typeName##_Destroy, \ + NULL, \ + NULL, \ + 0, \ + sizeof(typeName##State), \ + }, GameStateOverlay gGameStateOverlayTable[GAMESTATE_ID_MAX] = { #include "tables/gamestate_table.h" diff --git a/src/code/z_kaleido_manager.c b/src/code/z_kaleido_manager.c index 83256b8163..5ec22b1d32 100644 --- a/src/code/z_kaleido_manager.c +++ b/src/code/z_kaleido_manager.c @@ -4,11 +4,8 @@ #include "fault.h" #include "loadfragment.h" -#define KALEIDO_OVERLAY(name) \ - { \ - NULL, SEGMENT_ROM_START(ovl_##name), SEGMENT_ROM_END(ovl_##name), SEGMENT_START(ovl_##name), \ - SEGMENT_END(ovl_##name), 0, #name, \ - } +#define KALEIDO_OVERLAY(name) \ + { NULL, ROM_FILE(ovl_##name), SEGMENT_START(ovl_##name), SEGMENT_END(ovl_##name), 0, #name } KaleidoMgrOverlay gKaleidoMgrOverlayTable[KALEIDO_OVL_MAX] = { KALEIDO_OVERLAY(kaleido_scope), @@ -43,7 +40,7 @@ uintptr_t KaleidoManager_FaultAddrConv(uintptr_t address, void* param) { void KaleidoManager_LoadOvl(KaleidoMgrOverlay* ovl) { ovl->loadedRamAddr = sKaleidoAreaPtr; - Overlay_Load(ovl->vromStart, ovl->vromEnd, ovl->vramStart, ovl->vramEnd, ovl->loadedRamAddr); + Overlay_Load(ovl->file.vromStart, ovl->file.vromEnd, ovl->vramStart, ovl->vramEnd, ovl->loadedRamAddr); ovl->offset = (uintptr_t)ovl->loadedRamAddr - (uintptr_t)ovl->vramStart; gKaleidoMgrCurOvl = ovl; } diff --git a/src/code/z_overlay.c b/src/code/z_overlay.c index c994ba9ec8..dd20a6b3c3 100644 --- a/src/code/z_overlay.c +++ b/src/code/z_overlay.c @@ -31,7 +31,7 @@ TransitionOverlayStatus TransitionOverlay_Load(TransitionOverlay* overlayEntry) s32 count; void* loadedRamAddr; - if (overlayEntry->vromStart == 0) { + if (overlayEntry->file.vromStart == 0) { return TRANSITION_OVERLAY_STATUS_INTERNAL; } @@ -42,8 +42,8 @@ TransitionOverlayStatus TransitionOverlay_Load(TransitionOverlay* overlayEntry) return TRANSITION_OVERLAY_STATUS_FAILED; } - Overlay_Load(overlayEntry->vromStart, overlayEntry->vromEnd, overlayEntry->vramStart, overlayEntry->vramEnd, - loadedRamAddr); + Overlay_Load(overlayEntry->file.vromStart, overlayEntry->file.vromEnd, overlayEntry->vramStart, + overlayEntry->vramEnd, loadedRamAddr); overlayEntry->loadInfo.addr = Lib_VirtualToPhysical(loadedRamAddr); overlayEntry->loadInfo.count = 1; return TRANSITION_OVERLAY_STATUS_LOAD_FREE; @@ -68,7 +68,7 @@ TransitionOverlayStatus TransitionOverlay_Free(TransitionOverlay* overlayEntry) s32 count; void* loadedRamAddr; - if (overlayEntry->vromStart == 0) { + if (overlayEntry->file.vromStart == 0) { return TRANSITION_OVERLAY_STATUS_INTERNAL; } @@ -98,6 +98,6 @@ void TransitionOverlay_SetSegment(TransitionOverlay* overlayEntry, void* vramSta uintptr_t vromEnd) { overlayEntry->vramStart = vramStart; overlayEntry->vramEnd = vramEnd; - overlayEntry->vromStart = vromStart; - overlayEntry->vromEnd = vromEnd; + overlayEntry->file.vromStart = vromStart; + overlayEntry->file.vromEnd = vromEnd; } diff --git a/src/dmadata/dmadata.c b/src/dmadata/dmadata.c index faeb5f3386..42cb8fcf3b 100644 --- a/src/dmadata/dmadata.c +++ b/src/dmadata/dmadata.c @@ -11,10 +11,8 @@ #undef DEFINE_DMA_ENTRY_SYMS // dmadata Table definition -#define DEFINE_DMA_ENTRY(name, _nameString) \ - { SEGMENT_ROM_START(name), SEGMENT_ROM_END(name), SEGMENT_ROM_START(name), 0 }, -#define DEFINE_DMA_ENTRY_SYMS(name, _nameString) \ - { SEGMENT_ROM_START(name), SEGMENT_ROM_END(name), 0xFFFFFFFF, 0xFFFFFFFF }, +#define DEFINE_DMA_ENTRY(name, _nameString) { ROM_FILE(name), SEGMENT_ROM_START(name), 0 }, +#define DEFINE_DMA_ENTRY_SYMS(name, _nameString) { ROM_FILE(name), 0xFFFFFFFF, 0xFFFFFFFF }, DmaEntry gDmaDataTable[] = { #include "tables/dmadata_table.h"