Shiren GB (不思議のダンジョン 風来のシレンGB 〜月影村の怪物〜) — ROM-hack feasibility findings
Session date: 2026-09-02. All findings verified hands-on against the ROM
(shiren_gb1.gb, 512 KB, MBC1+RAM+BATT, SGB-enhanced, Chunsoft 1996)
using PyBoy headless emulation + direct ROM analysis.
Verdict: highly feasible — everything is cracked already
Compared to the One Piece GBA attempt (2-byte codes, unfindable compressed font): this game took ~30 minutes to fully crack. Text encoding, font location/format, and script banks are all confirmed.
Text encoding (CONFIRMED via VRAM/tilemap correlation + ROM string search)
One byte per character. Byte value = VRAM tile index (signed-mode).
| Range | Meaning |
|---|---|
| 0x00 | space |
| 0x01–0x0A | digits 0–9 |
| 0x0B–0x38 | hiragana あ〜ん in gojūon order |
| 0x39–0x41 | small ぁぃぅぇぉゃゅょっ |
| 0x42–0x6F | katakana ア〜ン in gojūon order |
| 0x70–0x78 | small ァィゥェォャュョッ |
| 0x79 | dakuten ゛ (combining, follows base char) |
| 0x7A | handakuten ゜ (combining) |
| 0x7B | ー (chōon) |
| 0x7C–0x80 | + - [ ] ? |
| 0x88 | * |
| 0xB0 | / |
| 0xFF | string terminator |
Control codes observed in script: 0xEF = line break, 0xED = end of entry, 0xEE = page break, 0xF0 xx = parameterized insert, 0xA1 = name insert(?). Codes 0x81–0xEF not yet fully mapped.
Table file: shiren_gb1.tbl (this directory).
Font (CONFIRMED)
- Main text font: 1bpp, 8 bytes/glyph, at ROM 0x37680 + code×8 (bank 13). Uncompressed. Expanded to 2bpp on load (both planes get the same byte — pure black/white glyphs). Verified for 0,9,あ,し,ん,ア,レ,ン.
- Replacing kana glyphs with Latin letters = overwrite 8-byte cells. Trivial.
- A second glyph set (8×8 kanji: 化の森, オ, テ, digits etc.) sits ~0x7E600, 2bpp raw — used by credits/title(?). Not needed for a translation MVP.
Script locations (verified samples)
| Bank | File offsets | Content |
|---|---|---|
| 11 | 0x2C000–0x2FFFF | Menus/UI. Pointer table at 0x2D300 (16-bit LE, bank-local 0x4000-window). Menu strings at 0x2D33C+ |
| 13 | 0x34000–0x37FFF | Item descriptions (scrolls etc. at 0x36000+), story/help text, main font at 0x37680 |
| 14 | 0x38000–0x3BFFF | Rankings, death messages (“Xにたおされた”) at 0x3BE78+ |
| 31 | 0x7C000–0x7FFFF | Intro survey questions (0x7C271+), credits(?) |
Story dialogue is plain text, uncompressed, with 16-bit bank-local pointer tables. Bank 9-10 big “text” runs are level data (false positives).
Emulator-in-the-loop (works)
PyBoy drives the game headless: boot → Start×4 → A×6 reaches name entry.
boy.memory[...] reads VRAM/tilemaps live. This enables automated
screenshot-verification of any text edit. Screenshots + VRAM dumps in this
directory (emu_*.png, ne_*.bin).
What an English translation MVP needs
- Map remaining control codes (0x81–0xF0 region) — observe in emulator.
- Locate all pointer tables (menus done; item names, dialogue TBD).
- Replace font glyphs 0x0B–0x78 with Latin+punctuation (110 slots, plenty), OR append new codes — kana slots are easier.
- Script dump → translate → re-insert with pointer rebuild (text will be longer in English; pointer tables make reflow manageable; bank space is the main constraint, may need to use free space — ROM has padding areas).
- PyBoy screenshot regression harness to verify every screen.
Est. difficulty: standard GB translation project. No compression, no custom encodings beyond the above, small script (tens of KB).