Translating Fermion

Catgirls, time travel, and recovering a PC-98 script engine

reverse engineering
game
translation
Author

banteg

Published

September 4, 2026

Fermion is a 1995 PC-98 eroge with time travel, an extensive ventilation maze, and a menu for renaming your genitals. Translating it into English meant figuring out how all three worked.

We found Fermion in YFI Anime, our anime chat, in August 2022 while looking for PC-98 artwork for an Ethereum graffiti wall. By the next morning we were playing it, drawing vent maps by hand, and using Google Translate to work out where to go. Four years later, I came back to make a proper English translation.

The graffiti project had an unexpected consequence. I ran 2,000 Görli validators to draw the picture1, and that Erigon/Lighthouse setup exposed a rare block-validation bug ahead of the Merge. The graffiti effort helped developers identify my validators and track down the client combination responsible.

This post outlines my work with Codex on an archival English translation of Silky’s Fermion: Mirai kara no Houmonsha, or Visitor from the Future. Along the way we’ve had to recover the previously undocumented script language, reconstruct the story’s branching structure, and teach the build tools how to put the English back onto a disk the original game can read.

The translated title menu, captured in the emulator during development.

The Half-Life of hentai

In 2296, centuries of pollution have damaged humanity’s genetic inheritance. Connie, a mutant hunter who can turn into a cat, travels three hundred years into the past to collect healthy genetic material. She arrives in 1996 and finds a home with the Takano family.

For a while this is about what you would expect: a catgirl from the future discovering domestic life, family, and sex. Then you’re trapped in a research facility, and a substantial stretch of the game becomes an escape puzzle built around an extensive network of ventilation ducts. Connie’s cat form lets her squeeze through the vents, scout rooms, and work out a route through the facility. We ended up reconstructing maps of the whole thing.

Underneath that premise is a story about family, illness, and the fear of being left behind. Those themes become more significant as you play, and the game is stranger and sadder than its setup suggests. I’ll leave the central reveal alone here.2

2 For the full story, see the translation brief. Full spoilers, including the ending.

Dr. Marie Procyon and Dr. Kaori Kanzaki discussing the project. Scientific workplace relations are going well.

Four floppies and the wrong parser

We started from a preservation dump of the original four floppy disks, checked against MAME’s recorded hashes.

Inside the disks are FAT12 filesystems. Inside those are Silky’s installer archives named DISKA through DISKD. Inside the archives are the .MES scripts.

These scripts contain dialogue alongside the instructions that display it, move between scenes, and manipulate game state. Their dictionary headers look enough like another engine’s format to invite a bad assumption.

The tool we built on is lime-juice, FuzionCD’s C++ port of tomyun’s juice, originally written in Racket. It decompiles MES bytecode from several old visual-novel engine families into readable Lisp-style expressions that you can edit and compile back into game scripts.

Our early compatibility test used lime-juice’s AI5 parser. Four plausible configurations all reported success, and all reduced the 7,310-byte MAIN.MES to the same 207-byte remnant. The dictionary was recognizable. The instruction stream after it wasn’t.

The repeating system.mll reference immediately after the dictionary was one clue. Analysis of the original SIL.EXE established the instruction grammar: this release uses General Message, or GM. We added support for that dialect to lime-juice.

That extension grew from preserving instructions we couldn’t yet explain into recovering meaningful operations: text, assignments, calls, loops, and scene transitions. The readable script is what lets us make changes like the keyboard patch below. Our GM work also covers the PC-98 release of Be-Yond, another game using the same engine family. Fermion provided a reason to improve a tool other translation projects can use.

Replacing Japanese with English changes script lengths. A jump that used to land on an instruction can end up in the middle of a sentence. The compiler has to adjust those jumps before we can put the translated scripts back into the game.

Our first two letters

The first visible breakthrough was much smaller than a translated scene. We changed two spaces to A.

The original menu’s exit-to-DOS label mixes full-width Japanese-font letters with single-byte spaces: D O S. We replaced those two spaces with ASCII As. The entire disk image differed by just two bytes, so we could test the renderer without moving any script instructions or resizing a file.

DAOAS: our first mixed-width rendering proof. Fresh emulator capture of the preserved two-byte probe image.

It worked. The As appeared at half the width of the letters around them: eight logical pixels instead of sixteen. The selection highlight stayed aligned and nothing clipped. Two changed bytes had proved that the original engine could render English.

The next experiment replaced the visible menu labels with START NEW GAME, LOAD, and CHANGE NAME. This time the strings had different lengths, so local jump targets had to move. We shortened other menu labels to keep the overall file size unchanged, separating the relocation test from the later work of growing archives and disk files. One small question at a time: can it draw the letters, can we move the code, can we make the files bigger?

Reading a graph

File order is another tempting shortcut. It puts the scripts in a convenient sequence, but that sequence isn’t the game.

Choices branch and rejoin. The facility section revisits rooms under different conditions. A repeated description can belong to a different state of the same room. Translating a dump from top to bottom can hide all of this.

The GM instructions that load or call another scenario give us a transition graph. We use it to follow the story through its branches and to understand where a line occurs. Recovering the facility’s room connections also produced a pair of escape maps, which contain facility spoilers.

The Japanese and English live together in a translation catalog, with notes about speakers and scene context. Repeated lines can share a translation, but identical Japanese may need different English depending on who is speaking and what just happened.

The story alone comes to roughly 12,500 translated entries and 83,000 English words, spanning dialogue, narration, and choices. That counts each catalog entry once, even when several places in the game share it. There is quite a lot of game on those four floppies.

Who is speaking?

Getting the text out exposes another problem: a list of strings is a poor representation of a conversation.

Fermion often prints a speaker’s name inside brackets. Sometimes the name is literal text. Sometimes the player chose it in the title menu, so the game assembles the label at runtime. And sometimes there is no label at all.

The customizable version looks roughly like this:

print "【"
copy the selected name into a scratch string
print the scratch string
print "】...dialogue..."

If you extract only literal strings, you get a lonely opening bracket and another record beginning with a closing bracket. The name that connects them is an instruction sequence.

We recovered that sequence from the executable. It tells us who is speaking when the game displays a name; an unlabeled exchange still needs someone to read the surrounding scene.

The same issue appears in the middle of sentences. The translator needs to see a complete thought, but the game may store it as several text fragments separated by name insertions. We join them for translation, then split the English back around the inserted names.

This constrains the English. You can’t casually move a name to the end of a sentence when the original script prints it first. You have to find wording that works with the actual sequence of operations.

The genital keyboard

Fermion lets you rename the characters. It also lets you rename the genitals.

There are two editable terms, whose English defaults are pussy and penis. The Japanese originals contain censor circles: おま○こ and お○んち○. The game inserts your chosen words into dialogue just like character names. Preserving that feature meant making the original on-screen keyboard work in English.

The translated term editor.

An earlier approach had replaced free-form editing with invented presets. I pushed back on that: the original lets you type your own words, so the translation should too.

The first useful discovery was that inserted names could use the engine’s half-width English font too. A small change to the string’s header was enough to select it.

But drawing an English alphabet over the Japanese keyboard would only change what you saw. Selecting a cell would still enter the old Japanese character. We rebuilt the keyboard so its visible letters and the characters they entered came from the same table: 54 cells containing uppercase and lowercase letters, a hyphen, and an apostrophe.

The original editor also assumed each character occupied two bytes and two columns. English needed one of each, so typing, cursor movement, and backspace all had to change together.

Both editors share a 14-byte buffer. Once the engine’s string header and end marker take their share, there’s room for ten English characters.

The same patch handles the five editable character names. A surprisingly large amount of ordinary software engineering went into letting a 1995 eroge remember what you want to call a penis.

Drop the “Miss”

Even a simple introduction needs more than translating each line in isolation. When the girl who rescued Connie learns her name, they have this exchange:

Japanese Our translation
じゃ・・・コニーさん・・・。 Then… Miss Connie…
さんはいらない。 Drop the ‘Miss.’

The second line literally says that the -san isn’t needed. If we simply removed Japanese honorifics from the English, the girl would say “Connie” and the reply would have nothing left to correct. “Miss” gives Connie a small formality to brush aside. The point of the exchange is the change in how they address each other.

Preserving the original Engrish

The opening terminal prints Target Dimention Space. That spelling stays.

Some of the game’s text was already English in 1995. We keep phrases like All system and System Close, along with the wide lettering and the way it appears one character at a time. An earlier pass corrected “Dimention”; the archival policy brought the original spelling back.

This doesn’t require preserving every demonstrable transcription error in the translated prose. A speaker label missing its opening bracket can be restored when the surrounding records establish exactly what belongs there. A clearly recoverable Japanese typo can be translated according to its intended reading, with the source and explanation retained.

But if a character gives an inconsistent number, we don’t silently repair the arithmetic. If the time-travel chronology is compressed or ambiguous, the translation keeps that ambiguity. The notes are where we explain the problem.

The aim is to let an English reader encounter this particular work, with its peculiarities still attached. That takes editorial restraint as well as technical accuracy.

Getting the words onto the screen

Most dialogue has to fit into a 61-column, three-row box. We wrap the English at word boundaries, with separate layouts for the narrower cards and panels.

We use NP2kai to replay selected scenes automatically and compare screenshots after translation changes. That catches problems a text check can miss: a missing third row, a menu that no longer lines up, or dialogue appearing on the wrong screen.

Play it

You can build the English version and play it in a PC-98 emulator. You’ll need the original game data; the repository supplies the translation and tools to put it back into the game.

The translation is still being reviewed and playtested, and contributions are welcome. If you read Japanese, help us make the English better. If you just want to play, tell us where you get stuck or find a line that sounds wrong. I’d like more people to meet this strange little game.