mirror of
https://github.com/HarbourMasters/Starship.git
synced 2025-02-10 04:02:26 +03:00
202 lines
7.0 KiB
C
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));
|
|
}
|