Starship/src/main/fox_load.c
2024-01-17 12:36:58 -03:00

202 lines
7.0 KiB
C

#include "global.h"
#include "sf64dma.h"
#define SEGMENT_SIZE(segment) ((ptrdiff_t) ((uintptr_t) (segment).end - (uintptr_t) (segment).start))
u8 sFillTimer = 3;
#include "fox_load_inits.c"
OverlayInit sCurrentOverlay = {
NO_OVERLAY,
{ /* 0x1 */ NO_SEGMENT,
/* 0x2 */ NO_SEGMENT,
/* 0x3 */ NO_SEGMENT,
/* 0x4 */ NO_SEGMENT,
/* 0x5 */ NO_SEGMENT,
/* 0x6 */ NO_SEGMENT,
/* 0x7 */ NO_SEGMENT,
/* 0x8 */ NO_SEGMENT,
/* 0x9 */ NO_SEGMENT,
/* 0xA */ NO_SEGMENT,
/* 0xB */ NO_SEGMENT,
/* 0xC */ NO_SEGMENT,
/* 0xD */ NO_SEGMENT,
/* 0xE */ NO_SEGMENT,
/* 0xF */ NO_SEGMENT },
};
void Overlay_LoadSegment(void* vRomAddress, void* dest, ptrdiff_t size) {
s32 i;
for (i = 0; gDmaTable[i].pRom.end != NULL; i++) {
if (gDmaTable[i].vRomAddress == vRomAddress) {
if (gDmaTable[i].compFlag == 0) {
Lib_DmaRead(gDmaTable[i].pRom.start, dest, size);
} else {
Lib_FillScreen(true);
sFillTimer = 3;
D_80161A39 = true;
Lib_DmaRead(gDmaTable[i].pRom.start, gFrameBuffers, SEGMENT_SIZE(gDmaTable[i].pRom));
Mio0_Decompress(gFrameBuffers, dest);
}
break;
}
}
}
u8 Overlay_Init(OverlayInit* ovlInit) {
u8* ramPtr = SEGMENT_VRAM_START(ovl_i1);
u8 segment;
u8 changeOvl = false;
if (ovlInit->ovl.rom.start == (0, sCurrentOverlay.ovl.rom.start)) { // fake because D_800CBDD4 is probably 2D array
ramPtr = ramPtr + SEGMENT_SIZE(ovlInit->ovl.rom);
ramPtr = ramPtr + SEGMENT_SIZE(ovlInit->ovl.bss);
} else {
sCurrentOverlay.ovl.rom.start = ovlInit->ovl.rom.start;
sCurrentOverlay.ovl.rom.end = ramPtr;
if (ovlInit->ovl.rom.start != 0) {
changeOvl = true;
Overlay_LoadSegment(ovlInit->ovl.rom.start, ramPtr, SEGMENT_SIZE(ovlInit->ovl.rom));
ramPtr = ramPtr + SEGMENT_SIZE(ovlInit->ovl.rom);
bzero(ovlInit->ovl.bss.start, SEGMENT_SIZE(ovlInit->ovl.bss));
ramPtr = ramPtr + SEGMENT_SIZE(ovlInit->ovl.bss);
}
}
segment = 0;
while ((segment < 15) && (ovlInit->assets[segment].start == sCurrentOverlay.assets[segment].start) &&
changeOvl == 0) {
if (ovlInit->assets[segment].start != 0) {
gSegments[segment + 1] = K0_TO_PHYS(ramPtr);
gSPSegment(gUnkDisp1++, segment + 1, K0_TO_PHYS(ramPtr));
ramPtr = ramPtr + SEGMENT_SIZE(ovlInit->assets[segment]);
}
segment += 1;
}
for (segment; segment < 15; segment += 1) {
sCurrentOverlay.assets[segment].start = ovlInit->assets[segment].start;
sCurrentOverlay.assets[segment].end = ramPtr;
if (ovlInit->assets[segment].start != 0) {
gSegments[segment + 1] = K0_TO_PHYS(ramPtr);
gSPSegment(gUnkDisp1++, segment + 1, K0_TO_PHYS(ramPtr));
Overlay_LoadSegment(ovlInit->assets[segment].start, ramPtr, SEGMENT_SIZE(ovlInit->assets[segment]));
ramPtr = ramPtr + SEGMENT_SIZE(ovlInit->assets[segment]);
}
}
if (sFillTimer != 0) {
sFillTimer--;
} else if (gStartNMI == 0) {
Lib_FillScreen(false);
}
return changeOvl;
}
u8 Overlay_Load(u8 ovlSetup, u8 ovlStage) {
u8 changeOvl;
switch (ovlSetup) {
case OVL_SETUP_TITLE:
changeOvl = Overlay_Init(&sOvlmenu_Title[ovlStage]);
if (changeOvl == true) {
func_8001DC6C(0, 0x16);
}
break;
case OVL_SETUP_MENU:
changeOvl = Overlay_Init(&sOvlmenu_Menu[ovlStage]);
break;
case OVL_SETUP_MAP:
changeOvl = Overlay_Init(&sOvlmenu_Map[ovlStage]);
break;
case OVL_SETUP_STATE_5:
changeOvl = Overlay_Init(&sOvlmenu_State5[ovlStage]);
break;
case OVL_SETUP_CORNERIA:
changeOvl = Overlay_Init(&sOvli1_Corneria[ovlStage]);
break;
case OVL_SETUP_METEO:
changeOvl = Overlay_Init(&sOvli2_Meteo[ovlStage]);
break;
case OVL_SETUP_TITANIA:
changeOvl = Overlay_Init(&sOvli5_Titania[ovlStage]);
break;
case OVL_SETUP_SECTOR_X:
changeOvl = Overlay_Init(&sOvli2_SectorX[ovlStage]);
break;
case OVL_SETUP_SECTOR_Z:
changeOvl = Overlay_Init(&sOvli4_SectorZ[ovlStage]);
break;
case OVL_SETUP_AQUAS:
changeOvl = Overlay_Init(&sOvli3_Aquas[ovlStage]);
break;
case OVL_SETUP_AREA_6:
changeOvl = Overlay_Init(&sOvli3_Area6[ovlStage]);
break;
case OVL_SETUP_FORTUNA:
changeOvl = Overlay_Init(&sOvli4_Fortuna[ovlStage]);
break;
case OVL_SETUP_UNK_4:
changeOvl = Overlay_Init(&sOvli3_Unk4[ovlStage]);
break;
case OVL_SETUP_SECTOR_Y:
changeOvl = Overlay_Init(&sOvli6_SectorY[ovlStage]);
break;
case OVL_SETUP_SOLAR:
changeOvl = Overlay_Init(&sOvli3_Solar[ovlStage]);
break;
case OVL_SETUP_ZONESS:
changeOvl = Overlay_Init(&sOvli3_Zoness[ovlStage]);
break;
case OVL_SETUP_VENOM_ANDROSS:
changeOvl = Overlay_Init(&sOvli6_Venom2[ovlStage]);
break;
case OVL_SETUP_TRAINING:
changeOvl = Overlay_Init(&sOvli1_Training[ovlStage]);
break;
case OVL_SETUP_VENOM_1:
changeOvl = Overlay_Init(&sOvli1_Venom1[ovlStage]);
break;
case OVL_SETUP_VENOM_2:
changeOvl = Overlay_Init(&sOvli6_VenomSW[ovlStage]);
break;
case OVL_SETUP_20:
changeOvl = Overlay_Init(&sOvli2_Setup20[ovlStage]);
break;
case OVL_SETUP_BOLSE:
changeOvl = Overlay_Init(&sOvli4_Bolse[ovlStage]);
break;
case OVL_SETUP_KATINA:
changeOvl = Overlay_Init(&sOvli4_Katina[ovlStage]);
break;
case OVL_SETUP_MACBETH:
changeOvl = Overlay_Init(&sOvli5_Macbeth[ovlStage]);
break;
case OVL_SETUP_VERSUS:
changeOvl = Overlay_Init(&sOvli2_Versus[ovlStage]);
if (changeOvl == true) {
func_8001DC6C(3, 0x310);
}
break;
case OVL_SETUP_LOGO:
changeOvl = Overlay_Init(&sNoOvl_Logo[ovlStage]); // Logo does not load an overlay file
if (changeOvl == true) {
func_8001DC6C(0, 0xE);
}
break;
case OVL_SETUP_CREDITS:
changeOvl = Overlay_Init(&sOvlending_Credits[ovlStage]);
break;
default:
(void) "DMA MODE ERROR %d\n";
changeOvl = false;
break;
}
return changeOvl;
}
void Overlay_InitDma(void) {
Lib_DmaRead(SEGMENT_ROM_START(dma_table), SEGMENT_VRAM_START(dma_table), SEGMENT_ROM_SIZE(dma_table));
Overlay_LoadSegment(SEGMENT_ROM_START(ast_DE5D50), SEGMENT_VRAM_START(ast_DE5D50), SEGMENT_ROM_SIZE(ast_DE5D50));
}