HomeForumsWhat's newResources 
 
 
Translating/hacking 3x3 Eyes Seima Densetsu for Mega CD
Ginza - Aug 19, 2025
 Ginza Aug 19, 2025
Hi all!

Long time lurker. I've been doing small time rom-hacking for a while, and for some reason I just love the Mega CD. It just seems to have had a lot of potential which was unused, and/or not available to non-japanese audiences. Lately I've been researching Illusion City a bit - though I don't want to spend too much time on that, as the MSX version is just about completed by a MSX group. So, I changed over to 3x3 Eyes Seima Densetsu. It's an interesting RPG made by Sega themselves, with lots of Sega references (I even noticed the Sonic "ring" sound at one point). You can also find a Game Gear White in-game and sell it, and there are many references to contemporary games (Streets of Rage 2, Puyo Puyo etc.) and much more... It is also one of the better (the best?) 3x3 Eyes games for any console, according to some Japanese sources. So - worth investigating for any Sega fan!

My main problem is that I have a busy personal life, and progress will be very slow. It seems to be a huge game (it has 231 unique files (!) with scenario/event text, but also lots of text describing items, side quests, in-game hint system etc.). On the plus side, the scenario files seem to have lots of unused space between separate blocks of data, and should easily fit an English translation. Also they used the standard Sega LZ (Kosinski) compression for graphics and tilemaps, which is very well researched already. Status for now is

* Completed table file
* 8x16 font function assembly hacked/expanded from only numbers to complete ASCII alphabet.
* Static menu text tilemap translation underway
* Documentation of control codes underway
* Lots of research of files, functions and compressed data done

Major hurdle is that to display text the game uses a pointer table which points to one of many control codes. These control codes can do many things, including display text (not always) according to another pointer (embedded pointer I guess you could call it, though it is not neccessarily within the text data). This means you need to track pointers when you dump the script, and recalculated them when you insert (recompile?) it. I don't know any programming, but have gotten by ChatGPT programmed tools. Inserted text pointers have been hand calculated so far, but I won't finish in 100 years doing this for the whole game Also all translation is AI based for now - this is not the goal, but just to have some temp text to test with...

I try to keep things as open as possible, as there is a large chance I cannot continue researching at some point, or it will go way too slow - so I hope someone else will pick up the work and contribute. I am a huge believer in open sourcing translations. Long term goal would be to have more Mega CD games translated. Here you can find my published notes so far on Github: https://github.com/Ginza25/3x3eyesMCD/...

My hope is mostly to get others interested in contributing, so that it can become more of a collective effort - this is definitely not a project with a any deadline in mind.

 Ginza Aug 19, 2025
A side note regarding Mega CD translation/hacking is the lack of emulators with debugging features. Looking at Illusion City, I used the MAME debugger which is very powerful. Unfortunatly 3x3 Eyes is not supported by MAME (timing problems?), so I have used mostly the built-in debugger of BlastEm, which is not so user friendly, but works as expected for dynamic debugging (breakpoints, printing memory). For trace logs, I really prefer Ares, which puts the MD and MegaCD trace info in one file, and can also trace DMA-stuff. And for looking around memory and the VDP, I use BizHawk and/or Gens... Not so straightforward, but it works somehow...!

 Toppis Aug 21, 2025
Oh, this looks so good! I will definitely try it when it’s released

 Ginza Sep 2, 2025

Toppis said:

Happy to see interest, however its more "if" than "when" its released. This is basically an ad for contributors. I will keep researching it, but the pace is pretty slow unless someone else is interested to contribute. So far I've made something of a "starter kit"....

Currently I'm investigating a bit how text could be dumped/inserted. I use ChatGPT a lot, and it suggest a shared YAML schema file for the script opcodes which will be translated by the dumper and inserter, which seems to make sense, though I have never heard the word YAML before it was suggested

 Ginza Sep 22, 2025
Progressing slowly. Started to understand the "event opcodes" the game uses to move around sprites/NPCs and sprites during events/cutscenes, which are separate from the "text opcodes" which relate to which text is displayed etc (conditions) and text control codes which deal with presentation/formatting of text. There are about 80 event opcodes, which would be very tedious to try to understand, however with the wonders of ChatGPT, I just fed it all 80 opcode functions in 68000 assembly, and it analyzed and provided name suggestions for all of them. Checking a few of the manually it seems the AI hit rate was pretty OK. Hard to overestimate how useful AI can be when looking at these old games...

 Ginza Sep 23, 2025
Now thanks to ChatGPT, Ghidra and BlastEm, I have a small program which "decompiles" the text opcodes in Event files. Currently successfully decompiles the whole Hong Kong start scenario (EV00006.DAT). Opcodes are specified in a YAML file, e.g. like this:

0x56:
name: SubtractImmediateFromLastResult
arg_count: 1
arg_widths: [1]
arg_is_offset: [false]
continues: true

I know its not obvious, but this seems amazing to me, with no actual programming skills, just "Vibe coding" - first steps towards a dumper, including embedded offsets!

You can find the code on the Github repository:
https://github.com/Ginza25/3x3eyesMCD...


 derek (ateam) Sep 23, 2025
Whether you can write this code yourself or not, to have the resolve to try and use all the tools at your disposal and actually make progress deserves commending.

Best of luck in your project!

 Ginza Sep 24, 2025

derek (ateam) said:

Thanks for the encouragement! Still hoping someone interested in Sega Mega CD will want to investigate/help out. Would be fun to have the first Mega CD exclusive (not counting the Phantasy Star compilation) games being translated! Though for now I'll try to post everything on github and update along the way.

Without going into politics, I was actually encouraged by the Princess Crown translation, where someone else was able to pick up the work after it became dormant... I thought that was a great result, as long as everyone is credited, of course. I will be unhappy if all my work goes to waste, because I couldn't finish, but we'll see how far I get.

I think making a dumper is realistic with what I know now, and then a translator could go through the script. The main challenge to my abilities (remember - vibe coding) is to make a re-insertion utility, as there is a lot of offsets which needs re-calculating, but I'm kind of optimistic.

 derek (ateam) Sep 24, 2025

Ginza said:


I have written dozens of such tools for games at this point, and I honestly can't envision using an LLM to write a text injector for complicated text-heavy games with scripting engines full of control codes and pointer tables. For the sake of your project, I'd be happy to be proven wrong though!

That said, if you make really good progress, you may be able to attract the attention of some programmers/romhackers who'd be happy to step in and assist.

 Ginza Sep 24, 2025

derek (ateam) said:

I will use the opportunity to pitch the project a bit for anyone reading with experience and/or motivation to join forces!
  • Don't be fooled by the screenshot I made, the output makes it seem there are many pointer tables. There are not that many pointer tables per event file, and only one (or two if there are shops) directly related to the text.
  • Font table (1500 characters or thereabout) is done
  • I've already figured out and implemented a 8x16 font with one byte characters (see screenshot above).
  • The good thing is also that the game is CD based, and Sega left lots of empty space between the logical sections in each event/scenario file (event opcodes, text opcodes/data etc.), so expansion seems straightforward.
  • Figuring out how text is read and printed, how the major opcodes for text and events work is mostly done - this has taken most of my time, looking at Ghidra and the BlastEm Sega CD debugger - Sega CD debuggers are not that advanced yet.
  • Compression of graphics is standard Sega Kosinski LZ - lots of tools available, easy to decompress and compress.
  • Static menu graphics have been translated to a degree - the process is understood (Kosinski compression, tilemaps).
Remaining major work
  • Dumper (getting closer)
  • Proof reading the table file (not to large of a task, but needed, as I don't know Japanese and it relies on OCR)
  • Insertion tool (major hurdle in my mind, due to embedded offsets in control codes in the text data blocks, not only structured pointer tables)
  • Actual translation (lots of work - the game is chock full of text, side quests, books and more, seems they wanted to prove how much you could fit on a CD.
I haven't really spent much time on making tools yet, mostly just analyzing how the game works in Ghidra/BlastEm (debugging). When I just now started making tools in ChatGPT, things went really fast...

As a progresss update: I've asked ChatGPT to update the dumper to follow opcode jumps, and it seems to work. It still stops on unrecognized opcodes, but it's not that hard to find the arguments and add it to the YAML opcode file which the dumper reads, and then progress further. The game has 121 text opcodes and 80 event opcodes, but many overlap and most are not used often it seems. I have managed clean opcode "dumps" of some of the scenario files already.

I just feel the difficult part is to re-insert and update all these layers upon layers of offsets... Though I also was skeptical I could get this far...

UPDATE: In 15 minutes I got ChatGPT to add an "text offset" argument to the opcodes in the YAML file, and print if encountered according to the table file... It works... very nice! Basically this is a working dumper - I think. It's not designed for re-insertion, but curious if I'm missing something in the dump which is included/needed for translating. For context I guess it would be nice to have a description of each flag - not only hex values - and possibly actual graphics portraits of the relevant characters, but I think that might not be worth the effort, more quality of life than anything else...