By subsystem

Boot + asset loader

  • FUN_8003E4E8 - boot-time TOC loader; reads first 3 sectors of PROT.DAT into 0x801C70F0
  • FUN_8003E8A8 - LBA resolver against the in-RAM TOC
  • FUN_8003E6BC - path-based file opener (data\battle\efect.dat etc.)
  • FUN_8003EBE4 / FUN_8003EC70 - overlay loaders A / B; param + 0x381 → raw TOC index = extraction entry param + 0x37F (the resolver indexes the raw in-RAM PROT.DAT head, 2 above extraction indexing); two overlays resident at once. Loader B pages in the per-summon Seru-magic overlays: a player Seru-magic cast (spell id in 0x81..0x8b) calls FUN_8003EC70(id - 0x79) → extraction PROT 903..913 (Gimard Burning Attack 0x81 → PROT 903; the old “905..915” range was the + 0x381 off-by-2). The summon's 3D models live in those overlays + the extraction-0871 etmd.dat model library, not in befect_data.
  • FUN_8001F05C - asset-type dispatcher
  • FUN_80020224 - descriptor-pair walker
  • FUN_8002541C - streaming-asset driver

Game VMs

  • FUN_801D6628 - actor / sprite VM (13 opcodes, JT at 0x801CED70)
  • FUN_80023070 - move-table VM (71 opcodes, JT at 0x80010778)
  • FUN_801D362C - move-VM extension (61 sub-opcodes via op 0x2F); same dispatcher in town / world-map / dialog / cutscene overlays at the same RAM address
  • FUN_8002519C - per-frame actor-list iterator; called 5x per frame from FUN_80016444 against the actor-list heads at _DAT_8007C34C..0x36C
  • FUN_801DE840 - field / event script VM (43 ops, switch at 0x801E00F4)
  • FUN_801E0C3C - field-VM 0x4C 2nd-stage dispatcher (16-entry JT at 0x801CEE60)
  • FUN_801E3040 - field-VM 0x4C outer-nibble-0xE sub-dispatcher (15-entry JT at 0x801CF008)
  • FUN_801E30E4 - field-VM 0x4C 0xE2 FMV trigger; writes FMV index to _DAT_8007BA78 + game mode 0x1A (StrInit) to _DAT_8007B83C
  • FUN_8003CE9C - field-VM context resolver (sign-extended u16 read)
  • FUN_800204F8 - move-buffer setup (Tactical Arts)
  • FUN_80021DF4 - per-frame actor tick

Cutscene / FMV

  • FUN_801CF098 - STR/MDEC FMV main play loop (1236 B / 309 instr; takes (loop_mode, &runtime_fmv_state))
  • 0x801CECA0 - jal site that selects the FMV-state struct via _DAT_8007BA78 << 6 + 0x801D0A6C
  • 0x801CAE40 (data) - compact MV-file table (24 B × 6 entries: name + libcd BCD MSF + size)
  • 0x801D0A6C (data) - runtime FMV-state table (64 B × 6 entries; populated from the compact table at startup)
  • FUN_8003BDE0 - partition-record → VM-context dispatcher; partition-2 cutscene-timeline records use a named-record header (name + 3 story-flag gates), script entry 1 + name_len*2 + (1+C0) + (1+C1*2) + (1+C2*2) (opdeene record 18 → 0x10)
  • FUN_8003C764 - on-screen text-balloon spawner; centers the line, fixes Y=180, seeds the per-page timer to 0x78 (120 frames) - the in-engine cutscene-narration draw/pacing path
  • FUN_8003C83C - field-VM cross-context resolver; 0xF8 → player / camera-anchor actor (_DAT_8007C364), 0xFB → system channel
  • FUN_801DB8EC - camera focus + projection setter (field overlay; disassembled from live overlay RAM in the new_game_cutscene_intro_a save, since the headless Ghidra dump truncates it). Calls FUN_801DAB90(transform_ptr, 0x801F3580) (builds the camera-param struct), sets the GTE H register from _DAT_8007B6F4 via func_0x8003D254 (= setCopControlWord(2,…)), and writes the focus globals _DAT_80089118/_DAT_80089120: when camera-mode byte DAT_8007B607>>4 == 5 the focus is tile-derived -(tile<<7)-0x40, otherwise anchor-follow -(anchor+0x14)/-(anchor+0x18). So this is the focus + FOV setter, not an eye-position build - retail has no explicit eye-distance param (see cutscene op-0x45). Invoked by field-VM op 0x4C 0x39 and op 0x4C 0x3E.

Renderer + GTE

  • FUN_8002735C - Legaia 60-GTE TMD renderer; the landmark emit leaf reached from FUN_8001ADA4 case-5 for each landmark TMD in a kingdom pack
  • FUN_80043390 - Per-prim renderer dispatcher inside FUN_8001ADA4 case-5 (default textured-TMD path). Selects an emit leaf from one of two function-pointer tables (SCUS 0x8007657C vs world-map overlay 0x801F8968) based on _DAT_1F800394 & 1 - the overlay variant routes every prim through fog-enabled leaves at 0x801F7644..0x801F8690. This is the bulk world-map continent emit path.
  • FUN_8001ADA4 - Per-actor RENDER dispatcher (switch on actor[+0x56]); case-5 walks the mesh chain at actor[+0x44] and dispatches each TMD to FUN_80043390 (textured), FUN_80029888 (env-mapped), or FUN_8002735C (landmark)
  • FUN_8001D140 - Stack-swap wrapper around FUN_8001ADA4; called 6× per frame from FUN_80016444 against _DAT_8007C34C..0x36C (render pass)
  • FUN_8002519C - Per-frame actor-list TICK iterator; called 5× per frame (distinct from the render pass)
  • FUN_8002C69C - HUD / menu / dialog sprite-batch POLY_FT4 emitter (~120 prims/frame for world-map UI; not the continent)
  • FUN_80026B4C - TMD validate + register. Stores tmd_ptr at DAT_8007C018[DAT_8007B774++] then calls FUN_800268DC for the per-group descriptor fixup. Reached from FUN_8001F05C case 2 (TMD-pack) and case 9 (TMD2).
  • FUN_800268DC - TMD pointer fixup; builds the +0xC group descriptor array (0x1C-byte stride) consumed by FUN_80043390.
  • FUN_801F69D8 - World-map top-view tile-visibility dispatcher in overlay_world_map_top_ext.bin (643 instr, 2572 B). Walks per-tile visibility scratchpad and emits TMDs from DAT_8007C018 via FUN_80043390. Was the captured warp-transition cluster-A caller.
  • FUN_801D8280 - DAT_8007C018 table walker (overlay-resident). Iterates entries 0..DAT_8007BB38 and for each pointed-to TMD calls FUN_801D5E20 per sub-record.
  • 0x8007C018 - global TMD pointer table; installer-counter at 0x8007B774, walk-counter at 0x8007BB38. See formats / world-map-overlay - DAT_8007C018.
  • 0x80010778 - move-VM jump table
  • DAT_8007326C - per-mode primitive descriptor table
  • 0x801CE868 - move-VM extension JT
  • 0x800EB654 - battle context struct (pointed to by _DAT_8007BD24)

Battle

  • FUN_801E295C - battle action state machine (16 KB)
  • FUN_801D0748 - battle / level-up main tick; sub-states 0x1E/0x32/0x6E/0xFE
  • FUN_801D388C - battle animation dispatcher; switch on animation_type (0..0x31+)
  • FUN_801D5854 - battle per-pose camera/presentation driver (never writes the anim-id fields; the anim system is FUN_80047430FUN_8004AD80FUN_8004998C)
  • FUN_801D8DE8 - UI element ID mapper (3 KB, 75 callers)
  • FUN_801DA6B4 - battle actor display-state controller; opacity + pose flags for alive actors
  • FUN_801DB81C - next-valid-target scan; actor[+0x14C] != 0 & no death/stone
  • FUN_801ED710 - records / stats screen renderer (battles, escapes, play-time, max-hits)
  • FUN_800520F0 - battle scene loader; sequential state machine that pulls the befect_data cluster (etim texels, etmd effect models registered via FUN_80026B4C, vdf, efect.dat) and the PROT 871 effect-model library into DAT_8007C018[3..32]
  • FUN_80020050 - flame / effect-texture atlas loader (SCUS). Uploads PROT entry 0x366 (870 - the flame TIMs) into VRAM twice via FUN_8001fc00 (→ FUN_8003e8a8, the PROT-index/TOC resolver); the VRAM region is set up by FUN_80017888 / FUN_8001e54c (arg 0xf000). Gated on _DAT_8007b868 == 0. This is the long-missing blit site for PROT 870 - it is not loaded by the battle-bundle path FUN_800520F0 (which pulls 0x367..0x36d).
  • FUN_80026B4C - TMD validate + register (asserts magic 0x80000002); stores into the global TMD table DAT_8007C018
  • FUN_8004E2F0 - battle range / line-of-sight
  • FUN_80054CB0 - monster init
  • FUN_80042558 - per-frame stat aggregator
  • FUN_8003FB10 - action validator
  • FUN_800431D0 - ability bitmask read
  • 0x801C9370 - 8-actor pointer table (party 0–2, monsters 3–7); actor HP at +0x14C

Menu overlay

  • FUN_801DD35C - per-frame title-overlay tick / top-level menu dispatcher (12 KB, 3 026 instr). Decrements the attract countdown at 0x801DDCCC (sw v0, -0xe94(a0)) by the per-frame scalar _DAT_1F800393; bgez branches to 0x801DFC3C while still counting, underflow writes _DAT_8007B83C = 0x1A (= STR FMV mode 26) and zeroes _DAT_8007BA78MV1.STR. Same fall-through as the field-VM 0x4C 0xE2 trigger at FUN_801E30E4. Pinned via PCSX-Redux watchpoint on the countdown; dump at ghidra/scripts/funcs/overlay_title_801ddccc.txt.
  • FUN_801D33D8 - submenu rendering loop
  • FUN_801E1C1C - shared menu-element renderer
  • FUN_801CF650 - equipment stat aggregator; reads 5 slots at char +0x196, sums into DAT_801EF08C–09C
  • FUN_801DD0C0 - item category / slot validity check

Audio (PsyQ)

  • FUN_8001FA88 - sound init / .dpk loader
  • FUN_8001FC00 - streaming-asset loader (sound\)
  • FUN_8001EBEC - equipment-conditional per-character TMD group patch (OBJECT 10/11 swap)
  • FUN_800243F0 - BGM lookup (PROT-relative)
  • FUN_8003E104 - monster.snd loader
  • 0x80061-0x80067 - libsnd SsAPI sequencer cluster
  • 0x80068-0x6D - libspu SPU control cluster
  • FUN_80069B18 - SPU DMA transfer state machine

World map

  • FUN_801E76D4 - world-map controller (9320 B); top-view debug toggle + camera scroll/azimuth/zoom
  • FUN_801EAD98 - world-map developer menu renderer (7280 B); 24-entry scrollable list
  • FUN_801DA51C - per-entity tick (260 B); 5-state SM on entity[+0x8A]
  • FUN_801CFC40 - top-view sprite batcher (524 B, top-view only)
  • FUN_80016444 (SCUS, 1352 B) - per-frame render tick reached from FUN_80025EEC (default per-mode handler) or FUN_80025F2C (Mode 13 MAPDSIP); jal 0x801D7EA0 gated by _DAT_8007BC3C == 2
  • FUN_801D7EA0 - 832-byte POLY_FT4 batch emitter; one-shot gated by _DAT_801F351C; 224-iter cos-rotation loop
  • FUN_801D8258 - 40-byte gate setter; _DAT_801F351C = 1 + scale/step/OT-layer params
  • FUN_801D1344 (world_map overlay) + FUN_801C2B2C (0897 field overlay) - 1332-byte gate-arm wrapper (overlay relocation pair). Distinct from the dialog overlay's FUN_801D1344 (different code at the same RAM address).

BIOS + libapi

  • 0x80056678 - EnterCriticalSection
  • 0x80056688 - ExitCriticalSection
  • 0x80056658 - TestEvent
  • 0x8006B844 - WaitEvent
  • 0x80057024 - memmove
  • 0x8005ACAC - memset
  • 0x8005E540 - memcpy
  • 0x80056698+ stride 0x10 - BIOS B-vector thunk cluster

Full reference

Every function above (and ~50 more) is described in detail with provenance citations in the markdown doc:

docs/reference/functions.md →

Per-function dumps (Ghidra disassembly + decompile) live under ghidra/scripts/funcs/<addr>.txt in the repo (gitignored - Sony-derived). Overlay-specific dumps are prefixed overlay_<label>_<addr>.txt.

See also