189 lines
5.0 KiB
C
189 lines
5.0 KiB
C
#include <ultra64.h>
|
|
#include "functions.h"
|
|
#include "variables.h"
|
|
|
|
typedef struct struct_2a_s{
|
|
char *name;
|
|
u8* ram_start;
|
|
u8* ram_end;
|
|
u8* unkC; //uncompressed_rom_range_start
|
|
u8* unk10; //uncompressed_rom_range_end
|
|
u8* code_start;
|
|
u8* code_end;
|
|
u8* data_start;
|
|
u8* data_end;
|
|
u8* bss_start;
|
|
u8* bss_end;
|
|
} OverlayAddressMap;
|
|
|
|
|
|
extern u8 D_803A5D00;
|
|
|
|
#define SEGMENT_EXTERNS(segname) \
|
|
extern u8 segname##_VRAM[]; \
|
|
extern u8 segname##_VRAM_END[]; \
|
|
extern u8 segname##_ROM_START[]; \
|
|
extern u8 segname##_ROM_END[]; \
|
|
extern u8 segname##_TEXT_START[]; \
|
|
extern u8 segname##_TEXT_END[]; \
|
|
extern u8 segname##_DATA_START[]; \
|
|
extern u8 segname##_DATA_END[]; \
|
|
extern u8 segname##_RODATA_START[]; \
|
|
extern u8 segname##_RODATA_END[]; \
|
|
extern u8 segname##_BSS_START[]; \
|
|
extern u8 segname##_BSS_END[]
|
|
|
|
SEGMENT_EXTERNS(core2);
|
|
SEGMENT_EXTERNS(emptyLvl);
|
|
SEGMENT_EXTERNS(CC);
|
|
SEGMENT_EXTERNS(MMM);
|
|
SEGMENT_EXTERNS(GV);
|
|
SEGMENT_EXTERNS(TTC);
|
|
SEGMENT_EXTERNS(MM);
|
|
SEGMENT_EXTERNS(BGS);
|
|
SEGMENT_EXTERNS(RBB);
|
|
SEGMENT_EXTERNS(FP);
|
|
SEGMENT_EXTERNS(CCW);
|
|
SEGMENT_EXTERNS(SM);
|
|
SEGMENT_EXTERNS(cutscenes);
|
|
SEGMENT_EXTERNS(lair);
|
|
SEGMENT_EXTERNS(fight);
|
|
|
|
#define SEGMENT_ENTRY(segname, realname) \
|
|
{#realname, segname##_VRAM, segname##_VRAM_END, segname##_ROM_START, segname##_ROM_END, segname##_TEXT_START, segname##_TEXT_END, segname##_DATA_START, segname##_RODATA_END, segname##_BSS_START, segname##_BSS_END}
|
|
|
|
#define DUMMY_SEGMENT_ENTRY(segname, realname) \
|
|
{#realname, segname##_VRAM, segname##_VRAM_END, segname##_ROM_START, segname##_ROM_END, NULL, NULL, NULL, NULL, NULL, NULL}
|
|
|
|
/* .data */
|
|
static OverlayAddressMap overlayAddressMap[] = {
|
|
SEGMENT_ENTRY(core2, gs),
|
|
DUMMY_SEGMENT_ENTRY(emptyLvl, coshow),
|
|
SEGMENT_ENTRY(CC, whale),
|
|
SEGMENT_ENTRY(MMM, haunted),
|
|
SEGMENT_ENTRY(GV, desert),
|
|
SEGMENT_ENTRY(TTC, beach),
|
|
SEGMENT_ENTRY(MM, jungle),
|
|
SEGMENT_ENTRY(BGS, swamp),
|
|
SEGMENT_ENTRY(RBB, ship),
|
|
SEGMENT_ENTRY(FP, snow),
|
|
SEGMENT_ENTRY(CCW, tree),
|
|
SEGMENT_ENTRY(SM, training),
|
|
SEGMENT_ENTRY(cutscenes, intro),
|
|
SEGMENT_ENTRY(lair, witch),
|
|
SEGMENT_ENTRY(fight, battle),
|
|
};
|
|
static s32 overlayCount = sizeof(overlayAddressMap) / sizeof(overlayAddressMap[0]);
|
|
|
|
/* .bss */
|
|
enum overlay_e overlayMgrLoadedId;
|
|
|
|
|
|
void overlayManagerdebug(void);
|
|
|
|
/* .code */
|
|
OverlayAddressMap *__overlayManagergetLargetOverlayAddressMap(void){
|
|
//returns OverlayAddressMap ptr with largest RAM size
|
|
int i;
|
|
OverlayAddressMap * largest_overlay;
|
|
|
|
largest_overlay = &overlayAddressMap[1];
|
|
for(i = 1; i < overlayCount; i++){
|
|
if(largest_overlay->ram_end - largest_overlay->ram_start < (u32)(overlayAddressMap[i].ram_end - overlayAddressMap[i].ram_start)){
|
|
largest_overlay = &overlayAddressMap[i];
|
|
}
|
|
}
|
|
return largest_overlay;
|
|
}
|
|
|
|
s32 __overlayManager80251170(void){
|
|
return 0;
|
|
}
|
|
|
|
s32 __overlayManager80251178(void){
|
|
int sp24;
|
|
OverlayAddressMap *largest_overlay;
|
|
s32 sp1C;
|
|
s32 sp18;
|
|
|
|
|
|
largest_overlay = __overlayManagergetLargetOverlayAddressMap();
|
|
sp18 = func_802546DC();
|
|
sp1C = __overlayManager80251170();
|
|
|
|
return ((sp1C + &D_803A5D00) - largest_overlay->ram_end) + sp18;
|
|
}
|
|
|
|
void __overlayManager802511C4(void){
|
|
s32 sp24;
|
|
int sp20;
|
|
int sp1C;
|
|
int heap_size;
|
|
u32 tmp_v0;
|
|
|
|
sp24 = __overlayManager80251178();
|
|
heap_size = heap_get_size();
|
|
sp20 = func_802546DC();
|
|
sp1C = heap_size - sp20;
|
|
|
|
if(sp24 < 0){
|
|
overlayManagerdebug();
|
|
tmp_v0 = sp1C + sp24;
|
|
while( tmp_v0 & 0xF){tmp_v0--;}
|
|
}
|
|
}
|
|
|
|
int overlayManagergetLoadedId(void){
|
|
return overlayMgrLoadedId;
|
|
}
|
|
|
|
bool overlayManagerisOverlayLoaded(int overlay_id){
|
|
return overlayMgrLoadedId == overlay_id;
|
|
}
|
|
|
|
bool overlayManagerload(enum overlay_e overlay_id){
|
|
s32 rom_addr;
|
|
|
|
if(overlay_id == 0)
|
|
return FALSE;
|
|
|
|
if(overlay_id == overlayMgrLoadedId)
|
|
return FALSE;
|
|
|
|
overlayMgrLoadedId = overlay_id;
|
|
rom_addr = (s32)(overlayAddressMap + overlay_id);
|
|
|
|
overlay_load(
|
|
overlay_id,
|
|
((OverlayAddressMap*)rom_addr)->ram_start,
|
|
((OverlayAddressMap*)rom_addr)->ram_end,
|
|
((OverlayAddressMap*)rom_addr)->unkC,
|
|
((OverlayAddressMap*)rom_addr)->unk10,
|
|
((OverlayAddressMap*)rom_addr)->code_start,
|
|
((OverlayAddressMap*)rom_addr)->code_end,
|
|
((OverlayAddressMap*)rom_addr)->data_start,
|
|
((OverlayAddressMap*)rom_addr)->data_end,
|
|
((OverlayAddressMap*)rom_addr)->bss_start,
|
|
((OverlayAddressMap*)rom_addr)->bss_end
|
|
);
|
|
return TRUE;
|
|
}
|
|
|
|
s32 overlayManagerclearLoadedId(void){
|
|
overlayMgrLoadedId = 0;
|
|
}
|
|
|
|
void overlayManagerloadCore2(void){
|
|
overlayManagerclearLoadedId();
|
|
overlay_load(0,
|
|
core2_VRAM, core2_VRAM_END,
|
|
core2_ROM_START, core2_ROM_END,
|
|
core2_TEXT_START, core2_TEXT_END,
|
|
core2_DATA_START, core2_RODATA_END,
|
|
core2_BSS_START, core2_BSS_END
|
|
);
|
|
__overlayManager802511C4();
|
|
}
|
|
|
|
void overlayManagerdebug(void){}
|