mirror of
https://github.com/BanjoRecomp/BanjoRecomp
synced 2026-05-23 06:34:20 -04:00
170 lines
4.3 KiB
C
170 lines
4.3 KiB
C
#include "patches.h"
|
|
#include "overlay_loading.h"
|
|
#include "misc_funcs.h"
|
|
|
|
struct Overlay {
|
|
void *start;
|
|
void *end;
|
|
};
|
|
|
|
#define MAKE_OVERLAYS() \
|
|
OVERLAY(core2,0) \
|
|
OVERLAY(emptyLvl,1) \
|
|
OVERLAY(CC,2) \
|
|
OVERLAY(MMM,3) \
|
|
OVERLAY(GV,4) \
|
|
OVERLAY(TTC,5) \
|
|
OVERLAY(MM,6) \
|
|
OVERLAY(BGS,7) \
|
|
OVERLAY(RBB,8) \
|
|
OVERLAY(FP,9) \
|
|
OVERLAY(CCW,10) \
|
|
OVERLAY(SM,11) \
|
|
OVERLAY(cutscenes,12) \
|
|
OVERLAY(lair,13) \
|
|
OVERLAY(fight,14)
|
|
|
|
extern struct Overlay gOverlayTable[];
|
|
|
|
#define OVERLAY(ovl, _) \
|
|
extern u8 boot_##ovl##_rzip_ROM_START[]; \
|
|
extern u8 boot_##ovl##_rzip_ROM_END[];
|
|
MAKE_OVERLAYS()
|
|
#undef OVERLAY
|
|
|
|
#define OVERLAY(ovl, _) \
|
|
extern u8 ovl##_ROM_START[]; \
|
|
extern u8 ovl##_ROM_END[]; \
|
|
extern u8 ovl##_VRAM[]; \
|
|
extern u8 ovl##_VRAM_END[]; \
|
|
extern u8 ovl##_TEXT_START[]; \
|
|
extern u8 ovl##_TEXT_END[]; \
|
|
extern u8 ovl##_DATA_START[]; \
|
|
extern u8 ovl##_DATA_END[]; \
|
|
extern u8 ovl##_RODATA_START[]; \
|
|
extern u8 ovl##_RODATA_END[]; \
|
|
extern u8 ovl##_BSS_START[]; \
|
|
extern u8 ovl##_BSS_END[];
|
|
OVERLAY(core1, 0)
|
|
MAKE_OVERLAYS()
|
|
#undef OVERLAY
|
|
|
|
|
|
#define OVERLAY_START(ovl) boot_##ovl##_rzip_ROM_START
|
|
#define OVERLAY_END(ovl) boot_##ovl##_rzip_ROM_END
|
|
|
|
// @recomp Patched to load overlays, prefixed with boot_ to account for the decomp build system.
|
|
RECOMP_PATCH void boot___osInitialize_common(void) {
|
|
// Nothing of the original function needs to happen, so the body can be empty besides the overlay load.
|
|
|
|
// @recomp Load core1.
|
|
recomp_load_overlays_by_rom((u32)core1_ROM_START, core1_VRAM, core1_ROM_END - core1_ROM_START);
|
|
}
|
|
|
|
typedef struct{
|
|
u32 unk0;
|
|
u32 unk4;
|
|
}struct49s;
|
|
|
|
extern struct49s D_803FFE10[];
|
|
extern u8 D_8000E800;
|
|
extern u8 D_8002D500;
|
|
extern u32 D_8027BF2C;
|
|
extern u32 D_8027BF30;
|
|
|
|
void func_80254008(void);
|
|
void piMgr_read(void* vaddr, s32 devaddr, s32 size);
|
|
void rarezip_uncompress(u8 **srcPtr, u8 **dstPtr);
|
|
|
|
RECOMP_PATCH void overlay_load(
|
|
s32 overlay_id, u32 ram_start, u32 ram_end, u32 rom_start, u32 rom_end,
|
|
u32 code_start, u32 code_end, u32 data_start, u32 data_end, u32 bss_start, u32 bss_end
|
|
){
|
|
// @recomp Track the original input values for later.
|
|
u32 uncompressed_rom_start = rom_start;
|
|
u32 uncompressed_rom_size = rom_end - rom_start;
|
|
u32 overlay_vram_start = ram_start;
|
|
u8* sp34;
|
|
u32 sp30;
|
|
u32 sp2C;
|
|
u32 *tmp;
|
|
|
|
osWriteBackDCacheAll();
|
|
osInvalDCache((void*)ram_start, ram_end - ram_start);
|
|
osInvalICache((void*)ram_start, ram_end - ram_start);
|
|
|
|
if(bss_start){
|
|
osInvalDCache((void*)bss_start, bss_end - bss_start);
|
|
}
|
|
|
|
rom_start = D_803FFE10[overlay_id].unk0;
|
|
rom_end = D_803FFE10[overlay_id].unk4;
|
|
|
|
if(overlay_id){
|
|
func_80254008();
|
|
sp34 = &D_8000E800;
|
|
}
|
|
else{
|
|
sp34 = &D_8002D500;
|
|
}
|
|
piMgr_read(sp34, rom_start, rom_end - rom_start);
|
|
rarezip_uncompress(&sp34, (u8**)&ram_start);
|
|
sp2C = D_8027BF2C;
|
|
sp30 = D_8027BF30;
|
|
rarezip_uncompress(&sp34, (u8**)&ram_start);
|
|
|
|
if(bss_start){
|
|
bzero((void*)bss_start, bss_end - bss_start);
|
|
osWriteBackDCacheAll();
|
|
tmp = (u32*) bss_start;
|
|
tmp[0] = sp2C;
|
|
tmp[1] = sp30;
|
|
tmp[2] = D_8027BF2C;
|
|
tmp[3] = D_8027BF30;
|
|
}
|
|
|
|
// @recomp Load the overlay.
|
|
recomp_load_overlays_by_rom(uncompressed_rom_start, (void*)overlay_vram_start, uncompressed_rom_size);
|
|
}
|
|
|
|
#define UCODE_SIZE 256
|
|
|
|
extern u8 sUcodeData[UCODE_SIZE];
|
|
extern s32 D_80283380;
|
|
extern s32 D_80283384;
|
|
extern s32 D_80283388;
|
|
|
|
RECOMP_PATCH void ucode_load(void) {
|
|
D_80283384 = 0;
|
|
D_80283388 = (D_80283384) ? 1 :0;
|
|
D_80283380 = 0;
|
|
D_80283388 |= (D_80283380) ? 2 :0;
|
|
if (D_80283388 == 0) {
|
|
piMgr_read(&sUcodeData, 0xB0000B70, UCODE_SIZE);
|
|
}
|
|
}
|
|
|
|
typedef struct Animation_s Animation;
|
|
|
|
typedef struct animctrl_s{
|
|
Animation *animation;
|
|
f32 timer;
|
|
f32 subrange_start;
|
|
f32 subrange_end;
|
|
f32 animation_duration;
|
|
f32 transition_duration;
|
|
float start;
|
|
s32 index;
|
|
u8 playback_type;
|
|
u8 playback_direction;
|
|
u8 smooth_transition;
|
|
u8 unk23;
|
|
u8 unk24;
|
|
u8 default_start;
|
|
u8 pad26[2];
|
|
} AnimCtrl;
|
|
|
|
RECOMP_PATCH void anctrl_setDuration(AnimCtrl *this, f32 arg1){
|
|
this->animation_duration = arg1;
|
|
}
|