N64 PS1 Comparison - smeagol44/MKMSZ-Randomizer GitHub Wiki
N64–PS1 comparison
The ports share strong source/data lineage, but they do not share executable addresses, overlay placement, file containers, patch sites, free-memory claims, or checksum behavior.
For how to turn these transfer rules into an actual phased port once N64 1.0 is finished, see N64 -> PS1 port planning and strategy.
| Concept | N64 USA Rev. 0 | PS1 SLUS_004.76 |
Transfer status |
|---|---|---|---|
| Executable base | Cartridge segments/overlays; main overlay base 0x802ECE30 |
Payload 0x80010000, overlay base near 0x80130FF8 |
Concept only |
| Stage selector | 0x8000D0B8, index 0x800C11E0 |
0x8002A688, index 0x800D8150 |
Same label order; separate activation |
| Ordinary pickups | 84 records, manager 0x80038ACC |
84 records, manager 0x8005499C |
Record grammar strongly shared |
| Pickup record | 0x30 bytes; identity +0x10..+0x2B |
Same structure | Field semantics transferable; addresses are not |
| Inventory | 0x800A600C, insertion 0x80075448 |
0x800ACE28, insertion 0x8004C0B0 |
Ten-word design shared |
| Enemy chain | 71500 -> 719F0 -> 71B20 -> 2FCDC |
3955C -> 39A3C -> 39B50 -> 41BF0 |
Architecture shared |
| Enemy streams | Global table region 0x800B... |
Overlay/start region 0x80010000... |
Grammar/ordering shared; bytes endian/platform-specific |
| Type 1 descriptor | 0x22AD8, file 0x89 |
0x22AD8, file 0x92 MONK2 |
Descriptor offset conserved, resource ID differs |
| Type 9 descriptor | 0x2C084, file 0x25 |
0x2C084, file 0x28 HULK |
Same caveat |
| Type A descriptor | 0x20FC8, file 0x20 |
0x20FC8, file 0x20 FAST |
Strong shared lineage |
| Text | 0x80073E74, width 0x80074084 |
0x8004ACD4, width 0x8004AEEC |
Similar service, different implementation |
| Save | Native cartridge save paths; N64 research fields differ | 0x900 memory-card image, 0x78 records, XOR checksum |
Platform-specific |
| Output checksum | N64 header CRC1/CRC2 | PS1 file/disc layout and save checksum | Never reuse |
Shared type-specific AI/control data
A particularly strong cross-port data match exists in the Test Scorpion/type-0x12 synthetic-control system:
| Data | PS1 | N64 |
|---|---|---|
| per-type AI/control table | 0x80010FC8 |
0x800AF340 |
type-0x12 list |
0x800114E8 |
0x800AF860 |
first type-0x12 condition |
0x80011554 |
0x800AF8CC |
| common sentinel | 0x80012B08 |
0x800B0E80 |
The descriptor bytes match after endian conversion. This is direct shared game-data lineage, not merely similar high-level behavior. It still does not make the PS1 and N64 evaluator code addresses interchangeable.
Safe conclusions
- The
0x30pickup grammar, 84-location boundary, item-ID family, ordinary-enemy stream concept, and several fighter descriptor offsets are common lineage. - PS1 can use N64 discoveries as search signatures and semantic hypotheses.
- Each port still requires its own guarded patch sites, resource residency proof, runtime allocation plan, and validation.
Unsafe conclusions
- An N64 virtual address cannot be transplanted to PS1.
- N64 stage-local resource slot numbers are not PS1 global file IDs.
- A matching descriptor offset does not prove identical surrounding binary data.
- Apparent space between PS1 overlay end and stack is not automatically free.
- N64 CRC logic, KSEG alias rules, and MIPS instruction patches do not define PS1 disc/save handling.
First PS1 runtime sequence
The bounded order is: guarded selector activation, runtime overlay/memory observation, safe eight-stage mapping, one same-stage Fire enemy substitution, one stage pickup/resource mapping, then a port estimate. Jumping directly to a full randomizer would conflate platform and gameplay unknowns.