Key functions
A directory of the Ghidra-traced anchor functions across the codebase. The full per-function reference (with descriptions) is in the markdown doc on GitHub. This page is a quick orientation that groups them by subsystem.
By subsystem
Boot + asset loader
FUN_8003E4E8- boot-time TOC loader; reads first 3 sectors of PROT.DAT into0x801C70F0FUN_8003E8A8- LBA resolver against the in-RAM TOCFUN_8003E6BC- path-based file opener (data\battle\efect.datetc.)FUN_8003EBE4/FUN_8003EC70- overlay loaders A / B;param + 0x381→ raw TOC index = extraction entryparam + 0x37F(the resolver indexes the raw in-RAMPROT.DAThead, 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 in0x81..0x8b) callsFUN_8003EC70(id - 0x79)→ extraction PROT 903..913 (Gimard Burning Attack0x81→ PROT 903; the old “905..915” range was the+ 0x381off-by-2). The summon's 3D models live in those overlays + the extraction-0871etmd.datmodel library, not inbefect_data.FUN_8001F05C- asset-type dispatcherFUN_80020224- descriptor-pair walkerFUN_8002541C- streaming-asset driver
Game VMs
FUN_801D6628- actor / sprite VM (13 opcodes, JT at0x801CED70)FUN_80023070- move-table VM (71 opcodes, JT at0x80010778)FUN_801D362C- move-VM extension (61 sub-opcodes via op0x2F); same dispatcher in town / world-map / dialog / cutscene overlays at the same RAM addressFUN_8002519C- per-frame actor-list iterator; called 5x per frame fromFUN_80016444against the actor-list heads at_DAT_8007C34C..0x36CFUN_801DE840- field / event script VM (43 ops, switch at0x801E00F4)FUN_801E0C3C- field-VM0x4C2nd-stage dispatcher (16-entry JT at0x801CEE60)FUN_801E3040- field-VM0x4Couter-nibble-0xEsub-dispatcher (15-entry JT at0x801CF008)FUN_801E30E4- field-VM0x4C 0xE2FMV trigger; writes FMV index to_DAT_8007BA78+ game mode0x1A(StrInit) to_DAT_8007B83CFUN_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 + 0x801D0A6C0x801CAE40(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 entry1 + 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, fixesY=180, seeds the per-page timer to0x78(120 frames) - the in-engine cutscene-narration draw/pacing pathFUN_8003C83C- field-VM cross-context resolver;0xF8→ player / camera-anchor actor (_DAT_8007C364),0xFB→ system channelFUN_801DB8EC- camera focus + projection setter (field overlay; disassembled from live overlay RAM in thenew_game_cutscene_intro_asave, since the headless Ghidra dump truncates it). CallsFUN_801DAB90(transform_ptr, 0x801F3580)(builds the camera-param struct), sets the GTE H register from_DAT_8007B6F4viafunc_0x8003D254(=setCopControlWord(2,…)), and writes the focus globals_DAT_80089118/_DAT_80089120: when camera-mode byteDAT_8007B607>>4 == 5the 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 op0x4C 0x39and op0x4C 0x3E.
Renderer + GTE
FUN_8002735C- Legaia 60-GTE TMD renderer; the landmark emit leaf reached fromFUN_8001ADA4case-5 for each landmark TMD in a kingdom packFUN_80043390- Per-prim renderer dispatcher insideFUN_8001ADA4case-5 (default textured-TMD path). Selects an emit leaf from one of two function-pointer tables (SCUS0x8007657Cvs world-map overlay0x801F8968) based on_DAT_1F800394 & 1- the overlay variant routes every prim through fog-enabled leaves at0x801F7644..0x801F8690. This is the bulk world-map continent emit path.FUN_8001ADA4- Per-actor RENDER dispatcher (switch onactor[+0x56]); case-5 walks the mesh chain atactor[+0x44]and dispatches each TMD toFUN_80043390(textured),FUN_80029888(env-mapped), orFUN_8002735C(landmark)FUN_8001D140- Stack-swap wrapper aroundFUN_8001ADA4; called 6× per frame fromFUN_80016444against_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. Storestmd_ptratDAT_8007C018[DAT_8007B774++]then callsFUN_800268DCfor the per-group descriptor fixup. Reached fromFUN_8001F05Ccase 2 (TMD-pack) and case 9 (TMD2).FUN_800268DC- TMD pointer fixup; builds the+0xCgroup descriptor array (0x1C-byte stride) consumed byFUN_80043390.FUN_801F69D8- World-map top-view tile-visibility dispatcher inoverlay_world_map_top_ext.bin(643 instr, 2572 B). Walks per-tile visibility scratchpad and emits TMDs fromDAT_8007C018viaFUN_80043390. Was the captured warp-transition cluster-A caller.FUN_801D8280-DAT_8007C018table walker (overlay-resident). Iterates entries0..DAT_8007BB38and for each pointed-to TMD callsFUN_801D5E20per sub-record.0x8007C018- global TMD pointer table; installer-counter at0x8007B774, walk-counter at0x8007BB38. See formats / world-map-overlay -DAT_8007C018.0x80010778- move-VM jump tableDAT_8007326C- per-mode primitive descriptor table0x801CE868- move-VM extension JT0x800EB654- 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/0xFEFUN_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 isFUN_80047430→FUN_8004AD80→FUN_8004998C)FUN_801D8DE8- UI element ID mapper (3 KB, 75 callers)FUN_801DA6B4- battle actor display-state controller; opacity + pose flags for alive actorsFUN_801DB81C- next-valid-target scan;actor[+0x14C] != 0& no death/stoneFUN_801ED710- records / stats screen renderer (battles, escapes, play-time, max-hits)FUN_800520F0- battle scene loader; sequential state machine that pulls thebefect_datacluster (etim texels, etmd effect models registered viaFUN_80026B4C, vdf, efect.dat) and the PROT 871 effect-model library intoDAT_8007C018[3..32]FUN_80020050- flame / effect-texture atlas loader (SCUS). Uploads PROT entry0x366(870 - the flame TIMs) into VRAM twice viaFUN_8001fc00(→FUN_8003e8a8, the PROT-index/TOC resolver); the VRAM region is set up byFUN_80017888/FUN_8001e54c(arg0xf000). Gated on_DAT_8007b868 == 0. This is the long-missing blit site for PROT 870 - it is not loaded by the battle-bundle pathFUN_800520F0(which pulls0x367..0x36d).FUN_80026B4C- TMD validate + register (asserts magic0x80000002); stores into the global TMD tableDAT_8007C018FUN_8004E2F0- battle range / line-of-sightFUN_80054CB0- monster initFUN_80042558- per-frame stat aggregatorFUN_8003FB10- action validatorFUN_800431D0- ability bitmask read0x801C9370- 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 at0x801DDCCC(sw v0, -0xe94(a0)) by the per-frame scalar_DAT_1F800393;bgezbranches to0x801DFC3Cwhile still counting, underflow writes_DAT_8007B83C = 0x1A(= STR FMV mode 26) and zeroes_DAT_8007BA78→MV1.STR. Same fall-through as the field-VM0x4C 0xE2trigger atFUN_801E30E4. Pinned via PCSX-Redux watchpoint on the countdown; dump atghidra/scripts/funcs/overlay_title_801ddccc.txt.FUN_801D33D8- submenu rendering loopFUN_801E1C1C- shared menu-element rendererFUN_801CF650- equipment stat aggregator; reads 5 slots at char+0x196, sums intoDAT_801EF08C–09CFUN_801DD0C0- item category / slot validity check
Audio (PsyQ)
FUN_8001FA88- sound init / .dpk loaderFUN_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 loader0x80061-0x80067- libsnd SsAPI sequencer cluster0x80068-0x6D- libspu SPU control clusterFUN_80069B18- SPU DMA transfer state machine
World map
FUN_801E76D4- world-map controller (9320 B); top-view debug toggle + camera scroll/azimuth/zoomFUN_801EAD98- world-map developer menu renderer (7280 B); 24-entry scrollable listFUN_801DA51C- per-entity tick (260 B); 5-state SM onentity[+0x8A]FUN_801CFC40- top-view sprite batcher (524 B, top-view only)FUN_80016444(SCUS, 1352 B) - per-frame render tick reached fromFUN_80025EEC(default per-mode handler) orFUN_80025F2C(Mode 13 MAPDSIP);jal 0x801D7EA0gated by_DAT_8007BC3C == 2FUN_801D7EA0- 832-byte POLY_FT4 batch emitter; one-shot gated by_DAT_801F351C; 224-iter cos-rotation loopFUN_801D8258- 40-byte gate setter;_DAT_801F351C = 1+ scale/step/OT-layer paramsFUN_801D1344(world_map overlay) +FUN_801C2B2C(0897 field overlay) - 1332-byte gate-arm wrapper (overlay relocation pair). Distinct from the dialog overlay'sFUN_801D1344(different code at the same RAM address).
BIOS + libapi
0x80056678-EnterCriticalSection0x80056688-ExitCriticalSection0x80056658-TestEvent0x8006B844-WaitEvent0x80057024-memmove0x8005ACAC-memset0x8005E540-memcpy0x80056698+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:
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.