1
0
mirror of https://github.com/zeldaret/oot.git synced 2024-09-22 21:35:27 +00:00
oot/src/code/z_kaleido_manager.c

101 lines
3.7 KiB
C
Raw Normal View History

2020-03-17 04:31:30 +00:00
#include <global.h>
#include <vt.h>
2020-03-22 21:19:43 +00:00
#define KALEIDO_OVERLAY(name) \
{ \
NULL, (u32)_ovl_##name##SegmentRomStart, (u32)_ovl_##name##SegmentRomEnd, _ovl_##name##SegmentStart, \
_ovl_##name##SegmentEnd, 0, #name, \
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
KaleidoManagerOvl gKaleidoMgrOverlayTable[] = {
2020-03-17 04:31:30 +00:00
KALEIDO_OVERLAY(kaleido_scope),
KALEIDO_OVERLAY(player_actor),
};
void* sKaleidoAreaPtr = NULL;
KaleidoManagerOvl* gKaleidoMgrCurOvl = NULL;
u32 D_8012D1E0 = 0;
2020-03-22 21:19:43 +00:00
void KaleidoManager_LoadOvl(KaleidoManagerOvl* ovl) {
2020-03-17 04:31:30 +00:00
LogUtils_CheckNullPointer("KaleidoArea_allocp", sKaleidoAreaPtr, "../z_kaleido_manager.c", 99);
ovl->loadedRamAddr = sKaleidoAreaPtr;
Overlay_Load(ovl->vromStart, ovl->vromEnd, ovl->vramStart, ovl->vramEnd, ovl->loadedRamAddr);
osSyncPrintf(VT_FGCOL(GREEN));
2020-03-22 21:19:43 +00:00
osSyncPrintf("OVL(k):Seg:%08x-%08x Ram:%08x-%08x Off:%08x %s\n", ovl->vramStart, ovl->vramEnd, ovl->loadedRamAddr,
((u32)ovl->loadedRamAddr + ovl->vramEnd) - (u32)ovl->vramStart,
(u32)ovl->vramStart - (u32)ovl->loadedRamAddr, ovl->name);
2020-03-17 04:31:30 +00:00
osSyncPrintf(VT_RST);
ovl->off = (u32)ovl->loadedRamAddr - (u32)ovl->vramStart;
gKaleidoMgrCurOvl = ovl;
}
2020-03-22 21:19:43 +00:00
void KaleidoManager_ClearOvl(KaleidoManagerOvl* ovl) {
if (ovl->loadedRamAddr) {
2020-03-17 04:31:30 +00:00
ovl->off = 0;
bzero(ovl->loadedRamAddr, ovl->vramEnd - (u32)ovl->vramStart);
ovl->loadedRamAddr = NULL;
gKaleidoMgrCurOvl = NULL;
}
}
2020-03-22 21:19:43 +00:00
void KaleidoManager_Init(GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
s32 largestOvl;
s32 vramSize;
u32 idx;
largestOvl = 0;
2020-03-22 21:19:43 +00:00
for (idx = 0; idx < ARRAY_COUNT(gKaleidoMgrOverlayTable); idx++) {
2020-03-17 04:31:30 +00:00
vramSize = gKaleidoMgrOverlayTable[idx].vramEnd - (u32)gKaleidoMgrOverlayTable[idx].vramStart;
2020-03-22 21:19:43 +00:00
if (largestOvl < vramSize) {
2020-03-17 04:31:30 +00:00
largestOvl = vramSize;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
osSyncPrintf(VT_FGCOL(GREEN));
osSyncPrintf("KaleidoArea の最大サイズは %d バイトを確保します\n", largestOvl);
osSyncPrintf(VT_RST);
sKaleidoAreaPtr = GameState_Alloc(&globalCtx->state, largestOvl, "../z_kaleido_manager.c", 150);
2020-03-17 04:31:30 +00:00
LogUtils_CheckNullPointer("KaleidoArea_allocp", sKaleidoAreaPtr, "../z_kaleido_manager.c", 151);
osSyncPrintf(VT_FGCOL(GREEN));
osSyncPrintf("KaleidoArea %08x - %08x\n", sKaleidoAreaPtr, (u32)sKaleidoAreaPtr + largestOvl);
osSyncPrintf(VT_RST);
gKaleidoMgrCurOvl = 0;
}
2020-03-22 21:19:43 +00:00
void KaleidoManager_Destroy() {
if (gKaleidoMgrCurOvl) {
2020-03-17 04:31:30 +00:00
KaleidoManager_ClearOvl(gKaleidoMgrCurOvl);
gKaleidoMgrCurOvl = NULL;
}
sKaleidoAreaPtr = NULL;
}
2020-03-22 21:19:43 +00:00
// NOTE: this function looks messed up and probably doesn't work like how the devs wanted it to work
void* KaleidoManager_GetRamAddr(void* vram) {
2020-03-17 04:31:30 +00:00
KaleidoManagerOvl* iter;
KaleidoManagerOvl* ovl;
u32 idx;
iter = gKaleidoMgrCurOvl;
ovl = iter;
2020-03-22 21:19:43 +00:00
if (!ovl) {
2020-03-17 04:31:30 +00:00
iter = &gKaleidoMgrOverlayTable[0];
2020-03-22 21:19:43 +00:00
for (idx = 0; idx != ARRAY_COUNT(gKaleidoMgrOverlayTable); idx++) {
if ((u32)vram >= (u32)iter->vramStart && (u32)iter->vramEnd >= (u32)vram) {
2020-03-17 04:31:30 +00:00
KaleidoManager_LoadOvl(iter);
ovl = iter;
goto KaleidoManager_GetRamAddr_end;
}
2020-03-22 21:19:43 +00:00
// BUG: devs probably forgot iter++ here
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
osSyncPrintf("異常\n"); // Abnormal
2020-03-17 04:31:30 +00:00
return NULL;
}
KaleidoManager_GetRamAddr_end:
2020-03-22 21:19:43 +00:00
if (!ovl || (u32)vram < (u32)ovl->vramStart || (u32)vram >= (u32)ovl->vramEnd) {
2020-03-17 04:31:30 +00:00
return NULL;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return (void*)((u32)vram + ovl->off);
}