The shape of the engine

Every page here comes from tracing the original PlayStation code with a disassembler and reimplementing the behaviour in Rust. The game shipped without symbols, so a routine's RAM address is its name: FUN_8002735c points at one specific traced function you can find in the project's dumps.

Half the runtime lives in the main executable SCUS_942.54: boot, disc I/O, the asset dispatcher, two of the VMs, the audio and rendering libraries. The other half is RAM overlays - chunks of code streamed from the disc into one shared window on demand, one at a time. Field, battle, menu, cutscene and minigame each load into that window and never coexist; the world map, save, shop, level-up and options screens are subsystems inside the field and menu overlays, not overlays of their own.

Overlay residency in the 0x801C0000 window RAM overlay window - mutually exclusive at runtime 0x801C0000 0x80200000 ~256 KB window. The disc loads exactly one slot-A overlay here for the active game mode. Title (0899 tail) Title tick + card manager FUN_801DD35C Field / town (0897) Field/event script VM FUN_801DE840 + world map Battle (0898) Action SM + effect VM FUN_801E295C / FUN_801E0088 Menu (0899) window-widget VM, status, + save, shop, level-up, options Cutscene (0970) STR / MDEC video game modes 26/27 Minigames (0972..0980) fishing / slot / baka / dance / muscle dome - one per warp sub-id Slot B (0900 / 0901) + side-band streams summon-render pair, battle special-attack + stage bands, summon.dat / readef.DAT slots streamed mid-battle Always resident in 0x80010000-0x800FFFFF SCUS_942.54: boot path, asset dispatcher, move VM, motion VM, battle setup, libsnd / libspu / libcd / libapi
The slot-A family loads at 0x801CE818 and never coexists: battle loads on top of the field overlay, the menu on top of either. The title overlay is the tail of PROT entry 899 (see boot); PROT 0971 is the dev debug-menu overlay. Minigames have their own playable page; the randomizer's injected vendor screen lives in 0899's dead space (write-up).

Boot, loading, drawing, sound

The plumbing every other subsystem stands on: getting the archive directory into RAM, turning a scene name into meshes and palettes, putting triangles on screen, and getting music out of the speaker.

Field, towns + the world map

Where you spend most of the game: walking around, talking to people, triggering events, and crossing the overworld.

Battle

From "Fight" on the command menu to the damage number: the scene loader, the per-action state machine, and the arithmetic underneath.

The runtime VMs

Most in-game behaviour is authored as scripts in the data files and run by a handful of small bytecode interpreters, so designers could change behaviour without recompiling. Four are clean opcode dispatchers; the effect VM is a per-slot state machine with the same role.

VMDrivesLives inOps
Field / event VMNPC lines, cutscenes, doors, story flagsField overlay 089743 (+ MENU_CTRL sub-dispatch)
Move-table VMPer-actor animation, motion and Tactical ArtsSCUS + a 0897 extension71 + 61
Motion VMsPursue / patrol / face-target; scripted motion + flag writesSCUS6
Window-widget VMMenu window choreographyMenu overlay 089913
Effect VMBattle effect spawnsBattle overlay 0898state machine

The from-scratch port

The Rust port has its own page - goals, the fidelity / enhancement split, crate layering, the runtime architecture, and the legal posture.