String pool location
- File:
arm9_full_plaintext.bin(BLZ-decompressed ARM9, 723 KB) - Pool start: file offset
0xa6e44โ RAM0x020a6e44 - Pool end: file offset
0xa6f88โ RAM0x020a6f88 - 26 string records, total span: ~324 bytes (varies; record sizes differ)
- Strings are SHIFT-JIS-style packed bytes (game's internal short encoding)
"Plaintext-ARM9" trick
The original ROM ships ARM9 in BLZ-compressed form (564,488 bytes at ROM
offset 0x4000). Editing the embedded string pool in place
is awkward because the strings live after the BLZ-decompressed
boundary. Patching the Nintendo SDK module-params field
CompressedStaticEnd := StaticBSSStart (where
StaticBSSStart = 0x020A87A0) makes the boot ROM skip BLZ
decompression entirely โ the ARM9 is loaded as plaintext at boot.
Decompressed size: 723,032 bytes (0xB0858). Validated in
notes/arm9_passthrough_test_RESULTS.md. See
BLZ & the plaintext-ARM9 trick
for the full format breakdown.
Slot widths
The patcher fits each EN string into the slot's pre-allocated byte width. Slot column = byte budget. Strings that overflow even the canon shortened form are marked CO (canon-overflow) and will be restored if a pool relocator is added later.
ARM9 pool โ 26 strings
| # | file off | slot | EN | CO? | source | JP / G1 canon note |
|---|---|---|---|---|---|---|
| 1 | 0xa6e44 | 8 | Get | CO | canon-mine | ใใค (G1: Hold) |
| 2 | 0xa6e4c | 8 | Put | CO | canon-mine | ใใ (G1: Place) |
| 3 | 0xa6e54 | 8 | Dig | CO | canon-mine | ใใใ (G1: Bury) |
| 4 | 0xa6e5c | 8 | Bin | CO | canon-mine | ใใฆใ (G1: Discard) |
| 5 | 0xa6e64 | 8 | End | CO | canon-mine | ใใใ (G1: Exit/Quit) |
| 6 | 0xa6e6c | 8 | Hum | fresh | ใใใ (sing; Sing overflows by 1) | |
| 7 | 0xa6e74 | 8 | Nxt | CO | canon-mine | ใคใใธ (G1: Next) |
| 8 | 0xa6e7c | 8 | <<< | CO | canon-mine | ใใฉใ (G1: Back) |
| 9 | 0xa6e84 | 12 | Save | corpus | ใจใใใ (G1: Register/Save) | |
| 10 | 0xa6e90 | 12 | 1 R | CO | canon-mine | ๏ผใชใใ |
| 11 | 0xa6e9c | 12 | Call | CO | canon-mine | ใใกใถใ (G1: Whistle) |
| 12 | 0xa6ea8 | 12 | Free | CO | canon-mine | ใใใซใใ (G1: Release insect) |
| 13 | 0xa6eb4 | 12 | Equip | canon-G1 | ใฟใซใคใใ โ | |
| 14 | 0xa6ec0 | 12 | 10 R | CO | canon-mine | ๏ผ๏ผใชใใ |
| 15 | 0xa6ecc | 12 | Walls | CO | canon-mine | ใในใใใ (G1: Change wallpaper) |
| 16 | 0xa6ed8 | 12 | Floor | CO | canon-mine | ใใใใใ (G1: Change flooring) |
| 17 | 0xa6ee4 | 16 | Swap | fresh | ใใ/ใใใ | |
| 18 | 0xa6ef4 | 16 | Unequip | canon-G1 | ใใใณใฏใใ โ | |
| 19 | 0xa6f04 | 16 | Release | CO | canon-mine | ใใใชใซใใ (G1: Release fish) |
| 20 | 0xa6f14 | 16 | Hat off | CO | canon-mine | ใผใใใฏใใ (G1: Remove hat) |
| 21 | 0xa6f24 | 16 | No spex | CO | canon-mine | ใใใญใฏใใ (G1: Remove glasses) |
| 22 | 0xa6f34 | 16 | 100 R | CO | canon-mine | ๏ผ๏ผ๏ผใชใใ |
| 23 | 0xa6f44 | 16 | 1000 R | CO | canon-mine | ๏ผ๏ผ๏ผ๏ผใชใใ |
| 24 | 0xa6f54 | 20 | 10000 R | CO | canon-mine | ๏ผ๏ผ๏ผ๏ผ๏ผใชใใ |
| 25 | 0xa6f68 | 20 | Take off | fresh | ใใใฏใฌในใฏใใ (G1: Remove [N]) | |
| 26 | 0xa6f7c | 28 | 100000 Ritch | canon-G1 | ๏ผ๏ผ๏ผ๏ผ๏ผ๏ผใชใใ โ |
Overlay single-string slots (ov047 / ov059 / ov065)
| Overlay | file off | slot | EN | source | JP / canon notes |
|---|---|---|---|---|---|
| ov047 | 0x1c70 | 20 | Show BGM | fresh | ใทใงใผใฎใใใใ |
| ov059 | 0x1b2c | 12 | Magic | fresh | ใจใใใ (G1 dropped "Pointy") |
| ov065 | 0x3378 | 40 | Like this? (Y/N) | fresh | ใใใงใใใใ๏ผ (confirm prompt) |
Overlay 096 โ NPC interaction menu (20 strings)
The friend-chat / NPC interaction menu. All fresh translations except
Mystery and Rumors which lean on Game 1 corpus parallels
(ใตใใ โ mystery, ใฆใฏใต โ rumor) and Berry's
which is the shop name carried verbatim from friend-chat dialog. The first
slot (<<<) is canon-overflow for "Back".
| # | file off | slot | EN | source | JP |
|---|---|---|---|---|---|
| 1 | 0x540 | 8 | <<< | canon-mine (CO) | ใใฉใ (G1: Back) |
| 2 | 0x548 | 12 | Picks | fresh | ใชในในใก |
| 3 | 0x554 | 12 | Any | fresh | ใชใใงใ |
| 4 | 0x560 | 16 | Shops | fresh | ใใฟใใฎใใจ |
| 5 | 0x570 | 16 | Stories | fresh | ใฏใชใใใใ |
| 6 | 0x580 | 16 | Hangout | fresh | ใชใใใใใ |
| 7 | 0x590 | 16 | Nothing | fresh | ใชใใงใใชใ |
| 8 | 0x5a0 | 16 | Fashion | fresh | ใใใใใฎใใจ |
| 9 | 0x5b0 | 16 | Fairs | fresh | ใใงใขใซใคใใฆ |
| 10 | 0x5c0 | 16 | Go play | fresh | ใใใณใซใใใ |
| 11 | 0x5d0 | 16 | Mystery | corpus | ใตใใใซใคใใฆ (G1: ใตใใโmystery) |
| 12 | 0x5e0 | 16 | Rumors | corpus | ใฆใฏใตใซใคใใฆ (G1: ใฆใฏใตโrumor) |
| 13 | 0x5f0 | 16 | Gift | fresh | ใใใขใใใใ |
| 14 | 0x600 | 20 | Berry's | canon | ใใชใผใบใซใคใใฆ (shop name; possessive matches friend-chat dialog) |
| 15 | 0x614 | 20 | Errand? | fresh | ใใใใฏใชใใซ๏ผ |
| 16 | 0x628 | 20 | To school | fresh | ใใฃใใใซใใใ (G1: ใใฃใใโschool) |
| 17 | 0x63c | 20 | Trends | fresh | ใใ
ใใใใซใคใใฆ |
| 18 | 0x650 | 20 | Reviews | fresh | ใฒใใใฐใใซใคใใฆ |
| 19 | 0x664 | 24 | Go shopping | fresh | ใทใงใใใณใฐใซใใใ |
| 20 | 0x67c | 32 | Style check | fresh | ใใกใใทใงใณใใงใใฏ |
Overlay 170 / 171 โ equip + remake slots
Two late-game / extra-event overlays. The equip slots align with Game 1
canon (ใฟใซใคใใ โ Equip); the remake slots ship as a fresh
translation of ใคใใใชใใ, choosing "Remake" over the more
literal "Redo" to preserve the dress-up meaning.
| Overlay | file off | slot | EN | source |
|---|---|---|---|---|
| ov170 | 0x1d50 | 16 | Equip | canon-G1 โ |
| ov171 | 0x740 | 12 | Equip | canon-G1 โ |
| ov171 | 0x74c | 12 | Equip | canon-G1 โ |
| ov171 | 0x758 | 16 | Remake | fresh |
| ov171 | 0x768 | 16 | Remake | fresh |
| ov171 | 0x778 | 16 | Remake | fresh |
Currency canon
Game 1's official Konami currency name is Ritch (not
"Mira"). Evidence: 66 corpus hits, including the standalone slot-form
ใชใใ โ Ritch. The 6 currency tier strings:
1ใชใใ โ 1 R, 10ใชใใ โ 10 R, โฆ,
100000ใชใใ โ 100000 Ritch.
Slot budgets vs canonical EN length
20 slots cannot fit the full Konami EN canon within their fixed slot
stride. The constraint is structural: each slot is allocated a
pre-computed byte width in the pool, and any string longer than that
byte width would overrun into the next slot. A pool relocator that
rewrote the pointer table and grew the pool would relax these
per-slot byte budgets; that is not currently in scope. The table below
records the gap between the byte-budget-fitting EN and the longer
canonical Konami EN so the cost is visible. The currency tiers and
"Change wallpaper" / "Change flooring" are the highest-information-loss
cases; Hat off, No spex, and
Release are close-enough-to-canon semantically.
| Slot | Fits in slot | Full Konami canon |
|---|---|---|
arm9 0xa6e44 | Get | Hold |
arm9 0xa6e4c | Put | Place |
arm9 0xa6e54 | Dig | Bury |
arm9 0xa6e5c | Bin | Discard |
arm9 0xa6e64 | End | Exit |
arm9 0xa6e74 | Nxt | Next |
arm9 0xa6e7c | <<< | Back |
arm9 0xa6e90 | 1 R | 1 Ritch |
arm9 0xa6e9c | Call | Whistle |
arm9 0xa6ea8 | Free | Release insect |
arm9 0xa6ec0 | 10 R | 10 Ritch |
arm9 0xa6ecc | Walls | Change wallpaper |
arm9 0xa6ed8 | Floor | Change flooring |
arm9 0xa6f04 | Release | Release fish |
arm9 0xa6f14 | Hat off | Remove hat |
arm9 0xa6f24 | No spex | Remove glasses |
arm9 0xa6f34 | 100 R | 100 Ritch |
arm9 0xa6f44 | 1000 R | 1000 Ritch |
arm9 0xa6f54 | 10000 R | 10000 Ritch |
ov96 0x540 | <<< | Back |
Slot accounting
| Source | Count |
|---|---|
| canon-G1 (full canon, fits) | 5 (Equip ร4, Unequip ร1, 100000 Ritch) |
| canon-mine (canon overflow, shortened) | 20 |
| canon (shop name, fits) | 1 (Berry's at ov96 0x600) |
| corpus (G1 dialog inference) | 3 (Save / Mystery / Rumors) |
| fresh | 23 |
| Total slots filled | 52 |
| Total unique strings | 49 (Equip ร3 + Remake ร3 = 6 duplicate slots) |
Source
notes/arm9_overlay_translations_final.mdโ full string list + budgetssrc/translator/_patch_arm9_overlays.pyโ patchernotes/arm9_passthrough_test_RESULTS.mdโ BLZ-skip trick validationarm9_full_plaintext.binโ decompressed binary used for patching