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
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 };