====== Overlay Files ====== Yoshi's Story uses overlays to save memory. The structure of an overlay file is as follows: u8 text[textSize] u8 data[dataSize] u8 rodata[rodataSize] meta { u32 textSize u32 dataSize u32 rodataSize u32 bssSize u32 numRelocations u32 relocations[numRelocations] } u32 metaSize * The position of the meta section is calculated by subtracting metaSize from the total size of the overlay file. * The .bss section is allocated immediately after the overlay file in memory. Relocation bitfields: ss -- rrrr oooooooooooooooooooooooo ^Bitfield^Description^ |s|Section (0 = invalid?, 1 = .text, 2 = .data, 3 = .rodata)| |-|Unused?| |r|Relocation type (4 = R_MIPS_26, 5 = R_MIPS_HI16, 6 = R_MIPS_LO16)| |o|Offset| The dynamic linker routine is located at 0x80081430 in RAM. func_80081430(void *overlay_block, void *meta_section); The game keeps track of active overlays using an array of the following struct at 0x800DA840 in RAM. struct OverlayEntry { /*00*/ void *location; // actual location in memory /*04*/ u16 objectId; // id of the object that this overlay belongs to u8 _pad[2]; /*08*/ void *fakeMemStart; // fake start address /*0C*/ void *fakeMemEnd; // fake end address };