Tamagotchi ROM Hacking
Did I ever use the Sega Saturn? Nope. Never owned one. Don’t know anyone who owns one. What on gods green earth possessed me to make a ROM hack of a Saturn game to English? In short, a very cute sonic tamagotchi and the impossibility of finding info about how to get it.
I knew it was possible to have a sega Saturn rom hack because I had seen a translation done for the revolutionary girl Utena dating sim. My experience with this game is also what first introduced me to the Saturn.
I decided to try the sega Saturn tamagotchi game out myself. I was intrigued by how little text there was. I knew some Japanese. I wondered if it would be easy to translate. There wasn’t a lot of dialogue. Most of it was really just menu text with images. I decided to give it a go.
Challenges
Step 1 was learning how to rom hack. I had done some work on the GameCube with TTYD, but that game was much more advanced. It was actually quite easy to hack the text because it had a file directory structure and the script was in text. You can open it in notepad++ and edit it yourself then repackage the game. It required little technical knowledge to make a text hack.
The sega Saturn game is not quite so forgiving. There are directories, but each one contains just compiled code with the text scattered throughout. You have to use a hexadecimal editor to make changes. This means that you have to figure out WHERE the text is to change it, and you have a very hard limit on how long it is.
And the text won’t appear nice and clear as おはよう. You need to determine what encoding is being used. If you are lucky it is shift jis. If not… god help you.
So how did it go?
Encoding
So yeah, not quite shift JIS.
I had no luck importing a shift jis table into a hex editor. This suggested a custom encoding was being used. But there was a chicken and egg question- how do I know where to look in the code without the table, and how do I find the table without finding text?
Salvation came in the form of repetition and memory dumps. This game has named characters. I named my character AAAAA and then dumped the memory at the time of name creation. I searched the dump for a repeated 5 byte sequence. And I got my first hand hold - it corresponded to shift jis.
Through this time consuming method, I was able to figure out the table used. The biggest difference to shift jis was that it did not use a 4 byte sequence for katakana. Instead it had a control code (40) that signaled “start and end katakana “. It was like parentheses for katakana. There was also an extra voicing character for characters like ご.
I had to struggle with hxd to have my table visible but once it worked, it was way easier to see what was going on.
I wrote a tool to translate text to and from the alternate encoding to make it easy to copy paste.
I also had to keep in mind a control code used for empty space and a control code that seemed to be the delimiter for strings. The latter puts a hard limit on how long the string can be since the game looks to where an address STARTS to get the text. So I can’t just scoot the delimiter over to get extra space because that messes up the next string. And of course removing the delimiter leads to text overflowing.
There were other codes I did not understand yet , especially ones related to color.
Step 1 was complete- get encoding.
Text Updating
Step 2 - find some text to alter.
ImHex has a search function but as mentioned above there were multiple files where text lived. Searching each one was tedious. A user told me of an incredible utility called byte search that could search the whole directory and return the file name and address of hits. Nice!
I found something - who knows what - and tested changing it to AAAA. I then had to learn how to repackage the game into an iso. Once I did that, I loaded the game and had success - AAAA!
I then took a step back. I wanted my translations to be consistent across the game. I also needed to take into account the space I had. I wanted to keep track of addresses in case I needed to return later for some reason.
I made a copy of the game into unedited state as a backup.
I then made a spreadsheet with the columns address, file, Japanese text, and translation. I played as much of the game as I could and noted where text appeared. I then Looked for the text in the files and filled the spreadsheet. This way I knew what the translations would be ahead of time.
I then began the tedious work of replacing the Japanese with English. Because Japanese text occupies fewer characters than English, I was very limited. For example, how do you say “discipline” in a 3 letter word? I was luckiest when something was in katakana or had lots of voicing marks because the control codes gave me a little more space to work with.
When a translation was complete, I would check the game to see it worked correctly. If it did, I checked it off in the spreadsheet.
What are the challenges preventing me from just going hard and translating everything? There are a few.
Color Codes

00 FF 4D 41 54 43 48 20 00 FF 20 00 FF FF 4C 45 46 54 00 FF 00 20 4F 52 00 FF 00 00 FF FF 52 49 47 48 54 00 FF FF 20 21 M A T C H L E F T O R R I G H T (blue) (green) (red) (red)

00 FF 52 00 00 00 3A 00 FF FF 52 49 47 48 54 20 00 FF 4C 00 00 00 00 FF FF FF 4C 45 46 54 20 20 20 R R I G H T L L E F T (green) (neutral) (green) (neutral)
There is some sort of way to change the colors of text, but it is not straightforward. It has something to do with the FF that precedes the strings, but it's not as simple as "one FF is black, two FF is red, etc." One FF preceding a string makes the string blue in the 'match left or right' but it makes the 'R' green. It's not clear if the FF are meant to surround the strings the way that the katakana control codes are.
The reason this matters is because the color codes aren't really necessary, so if we can figure out how to remove them, we can win back some text space where they appear. However, simply trying to remove them does not work. I suspect some other part of the code is fetching the strings and the FF mark the argument order or something like that, so it may be elsewhere in the code that the color is being determined. If this is true, it may not be possible right now to remove the color.
Repetition Code

0x000015A6 in mini02.bz: 00 FF FF FF 52 20 20 00 53 50 45 45 44 20 20 40 55 50 00 FF 20 4C 20 20 00 FF FF FF C0 0A 20 06 44 4F 57 4E R S P E E D U P L D O W N in Japanese: 00 FF FF FF D0 B7 DE 00 40 BD CB DF B0 C4 DE 40 55 50 00 FF CB C0 DE D8 00 FF FF FF C0 0A 20 06 44 4F 57 4E み ぎ " す ぴ () - ど " U P ひ だ " り D O W N
As you can see in the hex, the word SPEED only appears once. However, it appears twice in the UI. It seems that there is some sort of control byte causing SPEED to be repeated so that we have R SPEED UP and L SPEED DOWN, with SPEED inserted before DOWN. (Remember that 20 is space, and 00 is empty.)
There are awkward spacing issues caused by this repetition. If we could end the string for R and L early without needing the spaces (20s), then it would not fall off the screen like it does. I did a workaround taking advantage of the katakana control code to create an 'empty' string. This removes the space after the R and L. However, this does not work for the repeated SPEED text. I've decided to leave it like this for the time being to move forward with more translation.

Not Enough Space
There is simply no way to translate the names of the Tamagotchi because the romanization will exceed the length of the Japanese. I could go with abbreviations or leave them untranslated, but I would really like for players to be able to see the name of the Tamagotchi. There are two solutions - use some of the kana glyphs to make digraphs to steal some more space, or figure out a way to make the game read the name from a different memory address instead.
The first solution is elaborated on by one of the fan translaters at the Sega XTreme forums. Problems are that it would involve having to figure out which digraphs are the most common, and how to stuff them in.
The second solution would give me the freedom to write longer names. The problem is I have no clue how to do it.
I'm researching this on the side while I try to translate the rest of the game, so that this doesn't wind up blocking progress on everything else.
DevLog
Work on this translation began in March of 2025. I did not keep track of the progress until July.
July 26: "Fixed" an issue with the spacing in the racing game.
Translated the season names.
July 27: Used the above trick to shorten the "memory pak" length in opening.
4E 4F 20 4D 45 4D 4F 52 59 20 50 41 4B 40 00 00 00 00 00 00 00 00 40
Translated "cannot save without tamagotchi pak".
Translated the season names.
Solved issue with Yaba sanshiro "Cannot initialize InternalBackup." Issue due to multiple yaba sanshiro instances running after a crash. Solution is killing yaba sanshiro process in task manager.
Challenging situation in the panel de pon situation where we see both the color and the repetition. Seemingly copying from the title.
B5 C3 CE DD 00 FF FF FF C4 DE B5 D8 00 FF FF FF C6 00 C0 48 20 2A 00 FF A6 00 FF FF C5 D7 CD DE 00 FF FF FF D6 B3 21 お て ほ ん ど " お り に な ら べ " よ う ! (neutral) (green) (neutral) (blue) (MATCH) (red) (neutral)
Tools used
imhex - Hex editor
Yaba Sanshiro - emulator for testing
Sega Saturn Patcher - for putting the game back together and making the patch
Bytesearch