At a glance

In the game
Per-attack code for summons and special attacks (the slot-B "stagers"), plus other mode-specific modules that expose an entry-point or dispatch table.
Magic / marker
No header - the first u32 is a pointer into the overlay window 0x801C0000..=0x801FFFFF, followed by 3..63 more
Lives in
PROT.DAT entries in the 0900..=0968 range (extraction index), 42 entries, 14-160 KB; the attack stagers load at slot-B base 0x801F69D8
Parser
legaia_asset::overlay_ptr_table::detect (crates/asset/src/overlay_ptr_table.rs); load bases in crates/asset/data/static-overlays.toml
Confidence
Inferred as a detector (a shape heuristic with zero overlap against named formats); the individual attack-stager identities are capture-pinned.
Used by
summon.dat / readef.DAT, Static overlay pipeline

Layout

The overlay window is the RAM region reserved for swappable code, so a run of valid pointers into it is a strong sign the blob expects to live there. The run is 4 to 64 pointers long; the first word that is not such a pointer starts the body.

+0x00 +0x04 +N*4 +(N+1)*4 ptr_0 u32 LE ptr_1 ... ptr_N-2 N = 4..64 ptr_N-1 last in range body: MIPS code or ASCII title / jr ra stub first every pointer in 0x801C0000..0x801FFFFF
The detector consumes pointers until the first out-of-window word; the smallest pointer bounds the load address from above.
OffsetSizeFieldMeaning
+0x004ptr_0Address in 0x801C0000..=0x801FFFFF (the overlay window)
+0x044ptr_1Same range
+N*44ptr_{N-1}Last pointer (still in range); N is 4..64
+(N+1)*4restbodyFirst non-pointer u32 - typically MIPS code, sometimes a jr ra; nop stub or a leading ASCII string

Tables come in three shapes:

ShapeSizeTell
Function entry-point tableSmall (5-14)Monotonic; one slot per public function
Switch dispatch tableLargerRepeating handler addresses; the C compiler's switch(x) over a dense range
Per-mode actor vtableSmallOnly 3 distinct values across N slots

Detection

Two checks produce zero overlap with already-named formats:

  1. The first u32 is in 0x801C0000..=0x801FFFFF (the overlay window).
  2. The run of consecutive overlay-pointer u32s is between 4 and 64 long.

Monotonicity is not required - switch dispatch tables legitimately repeat handler addresses.

use legaia_asset::overlay_ptr_table;

if let Some(t) = overlay_ptr_table::detect(buf) {
    println!("Overlay pointer table: {} entries, first=0x{:08x}, last=0x{:08x}",
             t.count, t.first_ptr, t.last_ptr);
}

Once the load address is known (the pointer values bound it from above: base <= min_ptr), the entry can be imported into Ghidra via scripts/ghidra-analysis/bulk-import-overlays.sh.

Where they sit

All 42 matches are in the 0900..=0968_xxx_dat range, 14 KB to 160 KB, in two pointer clusters:

EntriesPointer rangeShape
300x801F6Axx - 0x801F71xxSmall function-entry tables, monotonic, 5-14 entries - the slot-B stagers
120x801F84xx and upMixed: some monotonic, some switch dispatch with repeating handlers

Entries that open with a title

A handful lead with an ASCII string before the pointer table. The string is the battle special-attack name the overlay stages. All of these load at slot-B base 0x801F69D8.

EntryTitleWhat it stagesSpell idPinned by
0907_xxx_datHell's MusicNighto's summon0x85Capture on the summon loader's 903..=913 slot; the same name in the spell table and summon.dat
0924_xxx_datUltimate RaveLippian (rare-Seru flute summon)0x96Capture mid-cast off the loader-B current id
0927_xxx_datDark EclipseJuggernaut (Evil Seru Magic)0x99Capture mid-cast off the loader-B current id
0957_xxx_dat(string table)The summon_effect_table overlay - a summon / effect / target label table, then an absolute-pointer table and code-Static overlay map

0924 and 0927 have computed rather than constant loader call sites, which is why their identities come from captures instead of a static loader constant.

History: the "Disco King dance-song" reading

The titles look like song names, and an earlier reading filed 0907's title as a Disco King dance track. It is refuted: the dance overlay (0980) contains zero slot-B loader call sites - its music is sequenced BGM via the sound streaming loader - while 0907 is capture-pinned as Nighto's summon stager. Retired readings are collected on do not re-walk.

How we know

ClaimEvidenceWhere
Pointer-run shape is codeZero overlap with any named format over the corpus; bodies disassemble as MIPScrates/asset/src/overlay_ptr_table.rs
Slot-B base 0x801F69D8Summon loader constant + the stager pointer clusterscrates/asset/data/static-overlays.toml
0907 = Nighto (spell 0x85)Capture of the summon loader's 903..=913 slot selectsummon.dat / readef.DAT action-id map
0924 = Lippian, 0927 = JuggernautMid-cast capture of the loader-B current idPCSX-Redux probes
0980 is not a stagerNo slot-B loader call site in the dance overlayAddress reference scan

Source of record: docs/formats/overlay-ptr-table.md.

See also