Files
BFM-decomp/docs/memory-map.md
T
2026-06-10 22:02:07 -06:00

26 KiB
Raw Blame History

Memory Map — Seed Address Ledger (SLUS-00726)

Evolvable reference layer. This file may be updated freely as RE progresses; note each change in the active phase log (CURRENT_PHASE.md). It is the single canonical address ledger for the project. Once an address is imported into Ghidra, Ghidra becomes the authoritative record for that symbol (name, type, xrefs); this file then serves as the provenance record and the staging area for addresses not yet imported.

Purpose and rules

  1. Every address carries a Region and a Source. No exceptions.
  2. JP addresses are NEVER assumed valid for US. The Archipelago AP-world documents cross-region deltas (see Region deltas), but these are block-specific and heuristic only — any US address derived by delta must be marked heuristic until byte-verified against the US binary or a live US RAM dump.
  3. Confidence levels:
    • verified — byte-checked against the local SLUS-00726 dump in this project (or an address referenced directly by byte-verified code).
    • reported — published by an external source; plausible and often multi-source, but not yet locally verified against the US binary/RAM.
    • heuristic — derived via a cross-region delta or pattern match; must be re-derived before any use as a symbol.
  4. Overlay-region addresses (≳0x80120000) are state-dependent: they are only valid while a specific location overlay is loaded. Never import them as static EXE symbols.

Region codes

Code Meaning
US SLUS-00726, USA retail (final build 1998-09-22 per Hidden Palace)
JP SLPS-01490 Brave Fencer Musashiden (1998-07-16); re-release SLPS-02769 unexamined
JPDEMO Japanese demo build (known only from TCRF's per-version debug GameShark code)
PROTO US prototypes: Aug-31-1998 demo proto, Sep-8-1998 near-final master (Hidden Palace)
DEMO SLUS-90029 US demo disc (listed by psxdatacenter; unexamined)

Region deltas (JP ↔ US) — heuristic only

From the AP-world client (client.py), which supports both discs and is independently consistent with TCRF's per-region debug codes:

Block Delta (US → JP) Cross-check
Main state block (0x800B9xxx) −0xEA0 US menu-state 0x800B99DE ↔ JP 0x800B8B3E — matches TCRF debug codes exactly
Zone-loaded block (0x80075400) −0xE70 AP-world only
Stats table −0xEA4 AP-world only (note: not the same as the main-block delta)
Code regions varies: +0x2A8, +0xA70, +0x344, +0x2D0, +0xE8 per-overlay, no single delta — never apply blindly

UNVERIFIED inconsistency carried from research: AP-world notes the town-ID-check patch at US 0x8015A7E4 with "JP equivalent 0x8015AB20, delta +0x2A8", but 0x8015AB20 − 0x8015A7E4 = 0x33C, not 0x2A8. Do not resolve by guesswork; re-check client.py when importing.

Address-base conversion for external sources

Source Convention Conversion to PSX virtual address
AP-world client.py BizHawk MAIN_RAM offset add 0x80000000 (e.g. 0x078EB4 → 0x80078EB4)
Autosplitter (Aalaizah gist) BizHawk octoshock.dll offset subtract 0x30DF90, add 0x80000000 (conversion cross-verified via playerLocation)
GameShark codes (libretro cht / gamehacking.org) 0x80-prefixed or bare offset already KSEG0 (8007xxxx etc.)

1. PS-X EXE header facts (locally verified 2026-06-10)

Extracted from SLUS_007.26 (disc LBA 24, 413,696 bytes, MODE2/2352 track 1; user data at raw-sector offset 24).

Field Value Confidence Notes
magic PS-X EXE verified
pc0 (entry) 0x80010000 verified
gp0 0x00000000 verified Header carries no $gp ⇒ −G0 likely; confirm via $gp usage in Ghidra (Phase 6 compiler fingerprint)
t_addr 0x80010000 verified
t_size 0x64800 verified EXE image spans 0x80010000–0x80074800
sp 0x801FFFF0 verified Matches SYSTEM.CNF STACK = 801ffff0

The EXE is tiny (~400 KB) relative to the game: the bulk of engine/script code lives in the .CD overlays (see §4).


2. Static EXE region — 0x80010000–0x80074800 (US)

2.1 LZSS decompressor (byte-verified vs AiroRom listing)

The annotated MIPS listing at https://raw.githubusercontent.com/wiki/pleonex/AiroRom/Brave-fencer-Musashi.md (the GitHub wiki UI fails to render it; fetch raw) was byte-verified in-session against the local SLUS-00726 EXE (words checked at 0x80018730/34/90, 0x800187BC, 0x80018824, 0x80018910, and the table at 0x80072A30). The routine is a resumable 5-state machine consuming input in 0x800-byte CD-sector chunks. Format details live in docs/formats.md.

Address Symbol/Name (proposed) Region Source/Provenance Confidence Notes
0x80018730 LzssDecodeSector (entry) US AiroRom wiki listing; byte-verified vs local EXE verified Primary Phase-1 milestone anchor (MCP round-trip target)
0x80018790 .LzssState1_initToken US AiroRom listing (state table), byte-verified code verified State 1: init token/ring
0x800187A4 .LzssState2_checkBit US same verified State 2: check token bit
0x800187F8 .LzssState3_match US same verified State 3: process match
0x80018824 .LzssState0_finish US same verified State 0: finish
0x800188B4 .LzssState4_nextBit US same verified State 4: next token bit
0x80018910 (return point) US same verified Routine return
0x80072A30 LzssStateTable US AiroRom listing; byte-verified vs local EXE verified Data: 00000000 FFFFFFFF then 5 pointers to the state entry points above

2.2 CD-path string table (locally verified 2026-06-10, exact)

Re-derived in-session by scanning the extracted EXE: a table of \NAME;1 path strings, 23 entries, 0x30-byte stride, spanning 0x80062C24–0x8006307x. (An earlier session note said "≈0x80063045"; the exact string starts, including the backslash, are below.)

Address Symbol/Name (proposed) Region Source/Provenance Confidence Notes
0x80062C24 CdPathTable (first entry: \LIST.CD;1) US local EXE scan 2026-06-10 verified Entry stride 0x30; order: LIST.CD, MAIN.CD, SC01–SC07.CD, then STR movies
0x80062C54 \MAIN.CD;1 US local EXE scan verified
0x80062C84 \SC01.CD;1 … (SC02–SC07 follow at +0x30 each) US local EXE scan verified SC07 at 0x80062DA5−1 = 0x80062DA4
0x80062DD4–0x80062FE4 STR movie paths (ST01–ST06, SHOPS01, OPEN, END, OUT; entry starts) US local EXE scan verified ST04 and ST05 each appear twice; LOGOA/LOGOB.STR and the .DA audio files are absent from this table — referenced elsewhere (TBD)
0x80063014 \MUSA.ID;1 US local EXE scan verified Disc-ID check file (9 bytes MUSASHI\r\n on disc)
0x80063044 \DEBUG.BIN;1 US local EXE scan verified DEBUG.BIN is absent from the retail ISO ⇒ a surviving debug-loader code path references this string. Prime RE anchor: find xrefs to locate the debug loader

2.3 Other static EXE data

Address Symbol/Name (proposed) Region Source/Provenance Confidence Notes
0x800638FA BodyStatLevelTable US AP-world client.py (0x0638FA + 16*level) reported 16-byte records indexed by level; inside EXE static data — verify in Ghidra
~EXE+0x62620 overlay/script pointer table JP jywjyw note.md (JP EXE file offset) reported (JP-only — re-derive for US) EXE-side pointer table tied to the resident script blob (§4). US analogue TBD — Phase 3

3. BSS / runtime statics (0x80074800–0x800Cxxxx region + scratchpad)

The PS-X EXE header declares no separate BSS; everything above the file image (>0x80074800) is runtime-cleared memory. Addresses 0x800747xx fall inside the loaded image (late data/sbss).

3.1 LZSS decompressor state (code-derived from the byte-verified routine)

Address Symbol/Name (proposed) Region Source/Provenance Confidence Notes
0x800747A0 lzss_curMask US AiroRom listing (referenced by verified code) verified Current flag-bit mask (byte), 0x01→0x80
0x800747A4 lzss_curToken US same verified Current token byte
0x800747AC lzss_outPtr US same verified Output write pointer
0x800747B0 lzss_ringIndex US same verified Ring-buffer write index
0x800747B4 lzss_partialCode US same verified Partial 16-bit match code (resume across sector boundary)
0x800C7D24 lzss_state US AiroRom listing (referenced by verified code) verified State variable 0–4; indexes LzssStateTable @ 0x80072A30. Lives beyond the EXE image (runtime BSS)
0x1F800000 lzss_ringBuffer US (hardware) AiroRom listing; byte-verified code verified 1024-byte ring window in PS1 scratchpad (D-cache). Match offsets are absolute ring indices with −1 bias — see docs/formats.md

3.2 Loader buffers

Address Symbol/Name (proposed) Region Source/Provenance Confidence Notes
0x80078BD0–0x800793D0 lzss_sectorStagingBuf (0x800 bytes) JP jywjyw note.md (SLPS-01490) reported (JP-only — re-derive for US) Sector-at-a-time staging buffer feeding the LZSS decoder. US equivalent TBD; +0xEA0 would give 0x80079A70 but that delta is for the data block — heuristic only. Find via the US decoder's buffer-pointer xrefs instead
TBD listCd_ramCache US inferred from jywjyw note.md (LIST.CD "loaded into RAM at game start") TBD Where the 0x1000-byte LIST.CD TOC concatenation lives in US RAM — Phase 3 target

3.3 Pad / input state

Address Symbol/Name (proposed) Region Source/Provenance Confidence Notes
0x80078DC2 padState_raw (halfword) US TCRF debug GameShark condition (D0078DC2 0200) reported 0x0200 = L3. Distinct from 0x80078DCA — do not conflate
0x80078DCA padState_mirror US gamehacking.org #88529 / libretro cht (joker code) reported Separate pad mirror/field used by GameShark joker codes

3.4 Player state block (0x80078E7C–0x80078F08)

Sources: gamehacking.org NTSC-U page 88529 and the libretro-database GameShark .cht (35 cheats; addresses recovered via the libretro mirror because gamehacking.org blocks scripts), AP-world client.py, and the LiveSplit autosplitter gist. A coherent player/stats struct clearly lives here — good candidate for a single Ghidra struct.

Address Symbol/Name (proposed) Region Source/Provenance Confidence Notes
0x80078E7C gameClock (2 words) US libretro cht reported In-game clock
0x80078E80 storyProgress (u32) US autosplitter (octoshock conversion cross-verified) reported Progress/story counter
0x80078E8E money US gamehacking 88529 ("money(?)"), cht ("cash") reported
0x80078EA6 tiredness US libretro cht reported
0x80078EB2 hp_? (u16) US gamehacking/cht say HP cur; AP-world says 0x078EB4 is current HP reported (conflict) cur/max assignment between 0xEB2/0xEB4 is contradicted across sources — verify live before naming
0x80078EB4 hp_current (u16) US AP-world client.py (actively maintained, live-tested) reported See conflict note above
0x80078EB6 / 0x80078EB8 bp_current / bp_max US gamehacking 88529 / cht reported
0x80078EE4 / 0x80078EE8 bodyLevel / bodyExp US gamehacking / cht reported
0x80078EEC / 0x80078EF0 mindLevel / mindExp US gamehacking / cht reported
0x80078EF4 / 0x80078EF8 fusionLevel / fusionExp US gamehacking / cht reported Fusion sword (JP らいこうまる)
0x80078EFC / 0x80078F00 luminaLevel / luminaExp US gamehacking / cht reported Lumina sword (JP Reigando); exp max 0x031B per cht
0x80078F08 exp_quickLevel US gamehacking / cht reported

Known-bad datum: the cht's "Charging Bar Always Full" code is listed as 80078EEBE (9 digits — typo for 0x078EEB or 0x078EBE). UNVERIFIED — test in emulator before use.

3.5 Game flags block (0x800AE6xx)

Address Symbol/Name (proposed) Region Source/Provenance Confidence Notes
0x800AE640 musicId (byte) US gamehacking / cht reported Music modifier; track 128 is the unused TCRF tune
0x800AE64A–0x800AE64C scrolls_legendaryArmor (3 bytes) US AP-world; cht (armor 0x0AE64B–4C); autosplitter (0x800AE64B) reported
0x800AE650 minkuFlags US AP-world reported
0x800AE651 chestFlags (5 bytes) US AP-world; autosplitter uses byte 0x800AE652 within it reported
0x800AE658 techsBitfield US gamehacking / cht reported All-techniques bitfield
0x800AE666 castleGuardState US AP-world reported
0x800AE671 binchoRescueFlags (9 bytes) US AP-world reported

3.6 Mode / location / world state

Address Symbol/Name (proposed) Region Source/Provenance Confidence Notes
0x800B99DE gameMode US TCRF debug code (800B99DE 0007); AP-world ("main-menu flag") reported Writing 7 (while pad == 0x0200) enters the debug menu — see §5. JP: 0x800B8B3E; JPDEMO: 0x800B894E
0x800B9A08 currentLocationId (s16/u16) US autosplitter; AP-world; gamehacking "map modifier" (3 independent sources) reported Map IDs: 0x1010 town, 0x2018 interiors, 0x3000+ dungeons; autosplitter start-trigger value 12293 (0x3005); ~25 room IDs enumerated in the gist
0x80075400 zoneLoadedBlock US AP-world (zone-loaded + portal-destination control block) reported JP delta −0xE70
0x800BA1E7 inventory US AP-world reported
0x800BA1F3 geezerFlag US AP-world reported
0x800BA1F8–0x800BA21A rescueCompleteFlags US libretro cht reported
0x800BA21B toyCollection (43 bytes) US AP-world reported
0x800BA285 steamwoodStatus US AP-world reported Adjacent to:
0x800BA286 raftLogs US gamehacking / cht reported
0x8000BA94 buildIdBytes US+JP AP-world (region auto-detect reads MAIN_RAM 0x00BA94) reported Below the EXE base (kernel-area RAM) — nature TBD; AP uses it to distinguish US vs JP at runtime

3.7 Misc reported (low priority)

Address Symbol/Name (proposed) Region Source/Provenance Confidence Notes
0x800A63F3 shading byte US gamehacking / cht reported
0x800AFAF9/FB/FD screen-tilt bytes US gamehacking (FB/FD) / cht (F9/FB/FD) reported
0x800AFB0C "model weirdness" US gamehacking / cht reported

4. Overlay region (≳0x800B9480 / 0x800CDF58+)

4.1 JP overlay map — JP-only, re-derive every address for US in Phase 3

Source: jywjyw's bravefencer-hack doc/note.md (Japanese SLPS-01490; same engine). jywjyw's IDA workflow — load the EXE, then "load additional binary" for the two blobs at the addresses below — is directly replicable in Ghidra once US equivalents are found. Research explicitly warns: US addresses will differ (e.g. US font offset 0x4CBC vs JP 0x4C4C).

Address Symbol/Name (proposed) Region Source/Provenance Confidence Notes
0x80010000–0x80073FFF JP EXE image JP jywjyw note.md reported JP file offset = vaddr − 0x8000F800; JP image slightly smaller than US (US ends 0x80074800)
0x800B9480 SQV/audio region JP jywjyw note.md reported (JP-only)
0x800CDF58–0x80128504 residentScriptBlob — MAIN.CD FILE_010 PAC entry "1.1" (type 1, uncompressed) JP jywjyw note.md reported (JP-only — re-derive for US) Memory-resident script blob loaded at game start; pointer table in EXE near JP file offset ~0x62620
0x80128508+ locationScriptOverlay — current location's type-4 "0.4" blob (LZSS-decompressed, ~800 KB) JP jywjyw note.md reported (JP-only — re-derive for US) Contains MIPS code: text/font pointers materialized by lui/addiu pairs inside the blob (JP examples 0x8013928C/0x8013920C/0x801391EC; Vehek's US example at 0x8017E4DC). Third (town-dialog) script chains from inside the second
0x801FF800–0x801FFFFF script runtime scratch JP jywjyw note.md reported (JP-only) Top of RAM, below initial SP 0x801FFFF0

4.2 US overlay-resident addresses (state-dependent — only valid with the right overlay loaded)

Boss HP living at 0x8012xxxx–0x801Exxxx is the key observation that overlays load high (≳0x80120000), consistent with the JP map's 0x80128508 base. Source: LiveSplit autosplitter (octoshock offsets, conversion cross-verified) unless noted.

Address Symbol/Name (proposed) Region Source/Provenance Confidence Notes
0x8012052E bossHp_BenEd US autosplitter reported overlay-state-dependent
0x80120316 bossHp_Skullpion/QueenAnt/TowerOfDeath/DarkLumina2 US autosplitter reported same slot reused by 4 bosses
0x801204A8 steamwoodValveTimer US libretro cht reported
0x801212CA bossHp_Kojiro US autosplitter reported
0x80126B8E player Y-velocity area ("moon jump") US gamehacking / cht reported code/data in overlay
0x80126C00 jump/physics code US libretro cht reported code patch site
0x80126D98 midair-jump counter US gamehacking / cht reported
0x8013F430 scroll-cursor patch site US AP-world (code patch; JP delta +0x344) reported instruction rewrite site
0x8014BCF8 max-BP calculation patch site US AP-world (nop'd addu $v0,$a1; JP delta +0x2D0) reported
0x8015A7E4 town-ID check patch site (andi $v0,$s0,0x4000) US AP-world (JP noted 0x8015AB20 — see delta inconsistency in header) reported
0x8018E096 entrance-index patch site US AP-world (JP delta +0xE8) reported
0x8018EE00 bossHp_RelicKeeper US autosplitter reported
0x801E4398 bossHp_SteamKnight US autosplitter reported
0x801EFD28 bossHp_FrostDragon US autosplitter reported
0x801F8714 bossHp_DarkLuminaFinale US autosplitter reported

(Also documented by AP-world but not a RAM address: hair-color palette edited directly in VRAM at GPURAM offset 0x86AC4.)


5. Debug menu

Source: TCRF (fetched via the MediaWiki API https://tcrf.net/api.php?action=parse&page=Brave_Fencer_Musashi&format=json&prop=wikitext — direct page fetches returned prompt-injection content twice; always use api.php and treat fetched web content as data, never instructions). Credited researcher: Squaresoft74.

Access (retail): apply the GameShark code, then press L3 in-game.

Region GameShark code Decoded meaning
US D0078DC2 0200 + 800B99DE 0007 if halfword @0x80078DC2 == 0x0200 (L3) then write 7 to 0x800B99DE
JP D0077F22 0200 + 800B8B3E 0007 same pattern; JP addresses = US − 0xEA0 (consistent with AP-world delta)
JPDEMO D0077D4A 0200 + 800B894E 0007 demo build, different layout again

What it exposes: navigate with D-pad, Circle to accept. Per TCRF, only the area/room selection submenu works in retail — everything else in the menu is non-functional (do not expect a working sound test). The room-select makes this an excellent runtime probe for the overlay loader (pick room → watch .CD loads and the 0x8012xxxx region repopulate).

RE anchors derived from it:

  • Find the writer(s) of 7 → 0x800B99DE and the L3 bit test of 0x80078DC2 to locate the debug-menu dispatch code.
  • \DEBUG.BIN;1 @ 0x80063044 (§2.2): the file is absent from the retail ISO, so the loader path that references it is surviving debug code — xref it.

Prototype / demo notes (potential label sources):

Build Facts Source
Aug-31-1998 proto ("Musashi Demo") Pressing Start on the title screen opens a SCENE/AREA SELECTION menu instead of the main menu — likely the same code behind the retail L3 menu. Fewer voice lines. archive.org/details/BraveFencerMusashiAug311998prototype (img CRC32 1369DE07, 60.7 MB) Hidden Palace "Project Deluge" (Apr 2021)
Sep-8-1998 master ("Musashi Master") Near-final US localization master ("Dual Shock Vibration" vs final "Vibration", one dialog line changed). Useful to validate diff tooling. archive.org/details/BraveFencerMusashiSep81998prototype (img CRC32 5C24728E, 416 MB) Hidden Palace
SLUS-90029 US demo disc listed by psxdatacenter; unexamined psxdatacenter

No debug symbols are noted by Hidden Palace for either prototype — symbol potential is UNVERIFIED (hunt for .SYM files, debug strings, or less-optimized code when diffing). Whether the proto's scene-select shares tables with the retail L3 menu is an open question.


6. Open questions (mirrors Phase 3 targets)

# Question Why it matters Suggested attack
1 US equivalents of JP overlay addresses: resident "1.1" blob (JP 0x800CDF58), location "0.4" base (JP 0x80128508), staging buffer (JP 0x80078BD0) Required before any overlay can be imported into Ghidra at the right vaddr Trace US LZSS decoder output pointer (0x800747AC) live in PCSX-Redux; cross-check that AP-world US patch sites 0x8013xxxx–0x8018xxxx fall inside the located blob
2 US analogue of the JP EXE pointer table (~JP EXE offset 0x62620) Maps which sub-file loads where — the overlay map Search US EXE for the same pointer pattern; xref from the resident-blob loader
3 LIST.CD RAM cache location (US) The game reads sub-file TOCs from this in-RAM copy; key to the loader Xref the \LIST.CD;1 string @ 0x80062C24; breakpoint the CdRead of LBA 227
4 CdRead call chain: which routine reads LIST.CD / dispatches .CD sub-file loads Core of the file-loader RE (Phase 3 milestone) Xrefs from CdPathTable strings + PsyQ CdRead/CdlSetloc signature hits (psx_ldr PsyQ signatures)
5 Save / memory-card format + checksum No public documentation exists anywhere Xrefs from PsyQ memcard/write API functions
6 Who calls LzssDecodeSector (0x80018730) and how the staging buffer is filled Connects CD streaming to decompression Xrefs in Ghidra; watchpoint on staging buffer once US address known
7 PAC types 6/7 semantics; meaning of PAC header u32 at +0x08 Unknown to every prior source (CUE: "???"; jywjyw: "??") Ghidra analysis of the PAC-header parser in the loader
8 Are overlay blobs position-locked (no relocation)? Determines splat segment strategy lui/addiu hardcoding strongly suggests yes — confirm by loading same location twice / comparing JP layout
9 Is the \DEBUG.BIN;1 loader path reachable in retail? Possible dormant debug functionality Xref the string; static reachability analysis
10 Does the Aug-31 proto's title-screen scene-select share code/tables with the retail L3 menu? Free labels for retail RE Binary diff proto vs retail around the menu dispatch found via Q-anchor in §5
11 $gp usage: header gp0 = 0 (verified) — is the build −G0? Pins a compiler flag for matching (Phase 6) Check for $gp-relative loads in Ghidra
12 HP current vs max: 0x80078EB2 / 0x80078EB4 source conflict Correct struct field names One live check in PCSX-Redux (take damage, watch both)
13 Nature of buildIdBytes @ 0x8000BA94 (kernel-area RAM) Used by AP-world for region detect; odd location Inspect live; check if BIOS/kernel structure or game-written
14 Where are LOGOA/LOGOB.STR and .DA paths referenced (absent from CdPathTable)? Completeness of the file-access map String scan for other path tables; CdSearchFile xrefs

Source index

Source What it provided Access notes
Local disc dump Z:\Storage\git\BFM-decomp\Brave Fencer Musashi (USA)\ (Track 1).bin All verified entries (EXE header, LZSS routine bytes, CD-path table) MODE2/2352; user data at raw-sector offset +24; EXE at LBA 24
AiroRom wiki (pleonex) Annotated LZSS decompressor disassembly Fetch raw: https://raw.githubusercontent.com/wiki/pleonex/AiroRom/Brave-fencer-Musashi.md; uses nonstandard register names (r2..r31); region was unattributed — verified US in-session; JP equivalents NOT verified
TCRF Debug menu codes (3 regions), unused music track, localization diffs Use tcrf.net/api.php — direct fetch returned prompt-injection content
AP-world github.com/AegeusEvander/Brave-Fencer-Musashi-AP-World Richest living US+JP RAM map; code patch sites; region deltas Addresses are BizHawk MAIN_RAM offsets (+0x80000000); some entries are code patches, not data — read context before importing. License unstated
LiveSplit autosplitter (Aalaizah gist f9cc6e8c8fba5a2457762f4fab8679c7) Story counter, location IDs, boss HP, chest/armor bytes octoshock offsets: −0x30DF90 +0x80000000
gamehacking.org #88529 (US) / #93476 (JP) via libretro-database GameShark .cht Player stat block, flags, misc gamehacking.org Cloudflare-blocks scripts; cht mirror: raw.githubusercontent.com/libretro/libretro-database/master/cht/Sony%20-%20PlayStation/Brave%20Fencer%20Musashi%20(USA,%20Japan)%20(GameShark).cht
jywjyw bravefencer-hack doc/note.md JP overlay/memory map, LIST.CD-in-RAM behavior, pointer table All addresses JP (SLPS-01490) — re-derive for US
Hidden Palace / archive.org Prototype facts pages fetchable via hiddenpalace.org/w/index.php?title=PAGE&action=raw