Mecha-9: Japanese translation for an old 8-bit platform

I always have liked to develop games. It is a way to free my creative side and allows me to try different things as an alternative to the games I've played.
I had success with Mecha-8 for MSX in 2012 after releasing it on physical cartridge, and people liked the gameplay and the final bosses. The MSX version of Mecha-8 was also ported to Colecovision and later to the Sega Master System.
Encouraged by the good reception, I decided to develop Mecha-9 in 2015 as a game happening at the same time as Mecha-8. I took the character of Ryan Rock and made him the main character, he is lost in Mecha-8, and for Mecha-9 I decided to justify it *spoiler here* making him travel space and time inadvertently.
Mecha-9 game for MSX. 2nd edition by Matra
I feel proud of my advances in the enemy waves, the different levels, the final bosses, and of course the addictiveness of the main gameplay. While in the first game, the secondary weapon was akin to a mega bomb, in Mecha-9 the secondary weapon slows down time so you can react to the very fast bullet rain of final bosses and some sections of final levels.
Just as I was improving the game, I had both English and Spanish translations ready, and I had a thought. The title screen small letters already had Japanese characters to say Mecha-9, could this game be translated into Japanese?
The answer was pretty obvious: yes. The MSX is a Japanese computer and most of its first games used the internal Hiragana/Katakana font. As only 256 characters were available, almost half of these are for the Hiragana/Katakana font. This font was replaced in European computers with generic graphic characters, so the games show the Japanese text mistakenly as graphic characters.
Adven'Chuta running in a Japanese MSX computer. Text is correctly shown
Adven'Chuta running in a Japanese MSX computer. Text is correctly shown. Adven'Chuta running in a Spanish MSX computer. Text is trash.
Adven'Chuta running in a Spanish MSX computer. Text is wrong.
But as I wasn't proficient in Japanese then it means I had to look for help, and I turned to my good Twitter friend @gcshigeru for help. In Sep/02/2015 I wrote him a message asking for help with translation to Japanese, and soon I was lucky to have a positive answer from him.

I had no clue

My first idea was that Shigeru would translate the English story of Mecha-9 into PRINT statements of MSX BASIC that I would later convert for use in the game.
I already had some experience displaying Japanese characters, as one time I wrote a Japanese Shift-JIS conversion routine, and integrated it along a font into a Web Browser. Let us take a newspaper as an example, the Japanese language is written as Kanji characters. The Kanji are the main Japanese writing system and are heavily influenced by Chinese logographic characters. It has been simplified over the years, for example in 1942 it was published the "Standard Kanji Table" with a total of 2,528 characters for use in government communications.
Kanji character from the MSX2+ ROM
Kanji character from the MSX2+ ROM. Using CALL KANJI in BASIC, and then pressing Ctrl+Space.
These thousands of characters are typically rendered in a 16x16 pixel grid for MSX. The MSX2 and MSX2+ computers tend to contain a Kanji-ROM extension with around 3000 characters (level 1 or JIS1) or more than 4000 characters (level 1 and 2 JIS1+JIS2).
However, not every MSX contains this extension, and I didn't want to integrate 128KB of data for Kanji. So for ease of working and my resources, I had to resort to Hiragana and Katakana.
The Japanese MSX computers since its release have a keyboard showing Hiragana or Katakana characters. These characters are a syllabary of the Japanese language. Katakana means "fragmentary kana", as the katakana characters are derived from fragments of kanji characters. Hiragana is a phonetic lettering system, meaning "flowing" or "simple" kana; it is closer to the English alphabet, having the 5 singular vowels あ (a), い (i), う (u), え (e), お (o) but the consonant-vowel unions are 42.
Typing these Hiragana and Katakana characters in the MSX is just a matter of pressing the Kana key to enter in Japanese mode, and the Caps key turned off accesses the Hiragana mode while being turned on accesses Katakana mode. The characters are marked on each key.
National CF2000 Japanese MSX1 computer.
National CF2000 Japanese MSX1 computer. You can see the keyboard shows Katakana characters.
Q is カ (ka), W is キ (ki), E is ク (ku), R is ケ (ke), and T is コ (ko). Sony HB-F1XDJ Japanese MSX2+ computer.
Sony HB-F1XDJ Japanese MSX2+ computer. You can see the keyboard shows Hiragana characters.
Q is た (ta), W is て (te), E is い (i), R is す (su), and T is か (ka).

Stumbling like a rock in the river

Fortunately, Shigeru was smarter than me, and he did the translation using his modern computer. I was still trying to do the work in the real hardware and already had some attempts to type Japanese with my Sony HB-F1XDJ.
When I got the first email from Shigeru, I spent almost two hours typing the first paragraph of the story in the BASIC interpreter. I had to have my National CF-2000 at the side of my Sony HB-F1XDJ in order to have a reference of Katakana keys. After an estimation it would take me several days to get the full story written!
First version of translation by @gcshigeru:

わたしたちがはんけ゛きしなけれは゛
やられてしまうわ!
トリシアをえんこ゛します!
わたしたちにはへ゛つのハ゜イロットか゛
ひつようた゛わ!ノリコきこえてる?
The first story screen of Mecha-9 in Japanese.
The first story screen of Mecha-9 in Japanese using MSX-BASIC. Oct/09/2015.
It was sad (but pretty lucky) to discover my MSX2+ floppy disk drive failed, although it was capable of reading a disk, it trashed the disk on writing, so I was unable to save my work or read it on another computer. My plan of having the complete Mecha-9 story in MSX-BASIC was doomed to fail.

Use modern tools!

I had to rework my approach to Japanese on MSX. First consideration: I hadn't enough time to work it manually, it has to be an automatic conversion of the Shigeru's translation to MSX data.
His translation was in Shift-JIS, this was read pretty efficiently by TextEdit in macOS, I just had to open the file and select the encoding before loading it. Internally, macOS converts it automatically to Unicode. The next step was also straightforward, save it as a UTF-8 text file for my processing efforts. Why UTF-8? Because the decode subroutine is pretty simple (check the Encoding section at the UTF-8 article in Wikipedia). It saved me the whole effort of looking for the Shift-JIS standard because I'm more versed in Unicode.
Next, I got images from the Japanese characters available in the ROM of a standard Japanese MSX from msx.org, but I needed a reference for Unicode conversion that I got from Wikipedia (Hiragana and Katakana blocks in Unicode), also I found a public domain 8x8 font containing Hiragana, and it included the Unicode character number.
Having the MSX font and the public domain font, I did a manual comparison to make a conversion from Unicode to the 8-bit MSX codes for Hiragana/Katakana characters, and then I wrote the whole conversion program from Unicode to the MSX codes.

    /*
    ** Unicode conversion to MSX Hiragana/Katakana codes.
    ** by Oscar Toledo G. https://nanochess.org/
    ** Last revision: Oct/12/2015.
    **
    ** I'm thereby making this code public domain for your MSX projects.
    */
    c = 0;
    d = 0;
    switch (*unicode_pointer++) {
        /* Hiragana */
	case 0x3041: c = 0x87; break; /* ぁ small A */
	case 0x3042: c = 0x91; break; /* あ A */
	case 0x3043: c = 0x88; break; /* ぃ small I */
	case 0x3044: c = 0x92; break; /* い I */
	case 0x3045: c = 0x89; break; /* ぅ small U */
	case 0x3046: c = 0x93; break; /* う U */
	case 0x3047: c = 0x8a; break; /* ぇ small E */
	case 0x3048: c = 0x94; break; /* え E */	
	case 0x3049: c = 0x8b; break; /* ぉ small O */
	case 0x304a: c = 0x95; break; /* お O */
	case 0x304b: c = 0x96; break; /* か KA */
	case 0x304c: c = 0x96; d = 0xde; break; /* が GA */
	case 0x304d: c = 0x97; break; /* き KI */
	case 0x304e: c = 0x97; d = 0xde; break; /* ぎ GI */
	case 0x304f: c = 0x98; break; /* く KU */

	case 0x3050: c = 0x98; d = 0xde; break; /* ぐ GU */
	case 0x3051: c = 0x99; break; /* け KE */
	case 0x3052: c = 0x99; d = 0xde; break; /* げ GE */
	case 0x3053: c = 0x9a; break; /* こ KO */
	case 0x3054: c = 0x9a; d = 0xde; break; /* ご GO */
	case 0x3055: c = 0x9b; break; /* さ SA */
	case 0x3056: c = 0x9b; d = 0xde; break; /* ざ ZA */
	case 0x3057: c = 0x9c; break; /* し SI */
	case 0x3058: c = 0x9c; d = 0xde; break; /* じ ZI */
	case 0x3059: c = 0x9d; break; /* す SU */
	case 0x305a: c = 0x9d; d = 0xde; break; /* ず SU */
	case 0x305b: c = 0x9e; break; /* せ SE */
	case 0x305c: c = 0x9e; d = 0xde; break; /* ぜ ZE */
	case 0x305d: c = 0x9f; break; /* そ SO */
	case 0x305e: c = 0x9f; d = 0xde; break; /* ぞ SO */
	case 0x305f: c = 0xe0; break; /* た TA */

	case 0x3060: c = 0xe0; d = 0xde; break; /* だ DA */
	case 0x3061: c = 0xe1; break; /* ち TI */
	case 0x3062: c = 0xe1; d = 0xde; break; /* ぢ DI */
	case 0x3063: c = 0x8f; break; /* っ small TU */
	case 0x3064: c = 0xe2; break; /* つ TU */
	case 0x3065: c = 0xe2; d = 0xde; break; /* づ DU */
	case 0x3066: c = 0xe3; break; /* て TE */
	case 0x3067: c = 0xe3; d = 0xde; break; /* で DE */
	case 0x3068: c = 0xe4; break; /* と TO */
	case 0x3069: c = 0xe4; d = 0xde; break; /* ど DO */
	case 0x306a: c = 0xe5; break; /* な NA */
	case 0x306b: c = 0xe6; break; /* に NI */
	case 0x306c: c = 0xe7; break; /* ぬ NU */
	case 0x306d: c = 0xe8; break; /* ね NE */
	case 0x306e: c = 0xe9; break; /* の NO */
	case 0x306f: c = 0xea; break; /* は HA */

	case 0x3070: c = 0xea; d = 0xde; break; /* BA */
	case 0x3071: c = 0xea; d = 0xdf; break; /* PA */
	case 0x3072: c = 0xeb; break; /* ひ HI */
	case 0x3073: c = 0xeb; d = 0xde; break; /* び BI */
	case 0x3074: c = 0xeb; d = 0xdf; break; /* ぴ PI */
	case 0x3075: c = 0xec; break; /* ふ HU */
	case 0x3076: c = 0xec; d = 0xde; break; /* ぶ BU */
	case 0x3077: c = 0xec; d = 0xdf; break; /* ぷ PU */
	case 0x3078: c = 0xed; break; /* へ HE */
	case 0x3079: c = 0xed; d = 0xde; break; /* べ BE */
	case 0x307a: c = 0xed; d = 0xdf; break; /* ぺ PE */
	case 0x307b: c = 0xee; break; /* ほ HO */
	case 0x307c: c = 0xee; d = 0xde; break; /* ぼ BO */
	case 0x307d: c = 0xee; d = 0xdf; break; /* ぽ PO */
	case 0x307e: c = 0xef; break; /* ま MA */
	case 0x307f: c = 0xf0; break; /* み MI */

	case 0x3080: c = 0xf1; break; /* む MU */
	case 0x3081: c = 0xf2; break; /* め ME */
	case 0x3082: c = 0xf3; break; /* も MO */
	case 0x3083: c = 0x8c; break; /* ゃ small YA */
	case 0x3084: c = 0xf4; break; /* や YA */
	case 0x3085: c = 0x8d; break; /* ゅ small YU */
	case 0x3086: c = 0xf5; break; /* ゆ YU */
	case 0x3087: c = 0x8e; break; /* ょ small YO */
	case 0x3088: c = 0xf6; break; /* よ YO */
	case 0x3089: c = 0xf7; break; /* ら RA */
	case 0x308a: c = 0xf8; break; /* り RI */
	case 0x308b: c = 0xf9; break; /* る RU */
	case 0x308c: c = 0xfa; break; /* れ RE */
	case 0x308d: c = 0xfb; break; /* ろ RO */
/*	case 0x308e: c = 0xfc; break; *//* ゎ small WA */
	case 0x308f: c = 0xfc; break; /* わ WA */
/*	case 0x3090: c = ; break; *//* ゐ WI archaic */
/*	case 0x3091: c = ; break; *//* ゑ WE archaic */
	case 0x3092: c = 0x86; break; /* を WO */
	case 0x3093: c = 0xfd; break; /* ん N */
	case 0x3094: c = 0x93; d = 0xde; break; /* ゔ VU */
	case 0x309b: c = 0xde; break; /* ゛ voiced sound */
	case 0x309c: c = 0xdf; break; /* ゜ sound mark */

	/* Katakana */
	case 0x30a1: c = 0xa7; break; /* ァ small A */
	case 0x30a2: c = 0xb1; break; /* ア A */
	case 0x30a3: c = 0xa8; break; /* ィ small I */
	case 0x30a4: c = 0xb2; break; /* イ I */
	case 0x30a5: c = 0xa9; break; /* ゥ small U */
	case 0x30a6: c = 0xb3; break; /* ウ U */
	case 0x30a7: c = 0xaa; break; /* ェ small E */
	case 0x30a8: c = 0xb4; break; /* エ E */
	case 0x30a9: c = 0xab; break; /* ォ small O */
	case 0x30aa: c = 0xb5; break; /* オ O */
	case 0x30ab: c = 0xb6; break; /* カ KA */
	case 0x30ac: c = 0xb6; d = 0xde; break; /* カ GA */
	case 0x30ad: c = 0xb7; break; /* キ KI */
	case 0x30ae: c = 0xb7; d = 0xde; break; /* ギ GI */
	case 0x30af: c = 0xb8; break; /* ク KU */
	
	case 0x30b0: c = 0xb8; d = 0xde; break; /* グ GU */
	case 0x30b1: c = 0xb9; break; /* ケ KE */
	case 0x30b2: c = 0xb9; d = 0xde; break; /* ゲ GE */
	case 0x30b3: c = 0xba; break; /* コ KO */
	case 0x30b4: c = 0xba; d = 0xde; break; /* ゴ GO */
	case 0x30b5: c = 0xbb; break; /* サ SA */
	case 0x30b6: c = 0xbb; d = 0xde; break; /* ザ ZA */
	case 0x30b7: c = 0xbc; break; /* シ SI */
	case 0x30b8: c = 0xbc; d = 0xde; break; /* ジ ZI */
	case 0x30b9: c = 0xbd; break; /* ス SU */
	case 0x30ba: c = 0xbd; d = 0xde; break; /* ズ ZU */
	case 0x30bb: c = 0xbe; break; /* セ SE */
	case 0x30bc: c = 0xbe; d = 0xde; break; /* ゼ ZE */
	case 0x30bd: c = 0xbf; break; /* ソ SO */
	case 0x30be: c = 0xbf; d = 0xde; break; /* ゾ ZO */
	case 0x30bf: c = 0xc0; break; /* タ TA */

	case 0x30c0: c = 0xc0; d = 0xde; break; /* ダ DA */
	case 0x30c1: c = 0xc1; break; /* チ TI */
	case 0x30c2: c = 0xc1; d = 0xde; break; /* ヂ DI */
	case 0x30c3: c = 0xaf; break; /* ッ small TU */
	case 0x30c4: c = 0xc2; break; /* ツ TU */
	case 0x30c5: c = 0xc2; d = 0xde; break; /* ヅ DU */
	case 0x30c6: c = 0xc3; break; /* テ TE */
	case 0x30c7: c = 0xc3; d = 0xde; break; /* デ DE */ 
	case 0x30c8: c = 0xc4; break; /* ト TO */
	case 0x30c9: c = 0xc4; d = 0xde; break; /* ド DO */
	case 0x30ca: c = 0xc5; break; /* ナ NA */
	case 0x30cb: c = 0xc6; break; /* ニ NI */
	case 0x30cc: c = 0xc7; break; /* ヌ	NU */
	case 0x30cd: c = 0xc8; break; /* ネ NE */
	case 0x30ce: c = 0xc9; break; /* ノ NO */
	case 0x30cf: c = 0xca; break; /* ハ HA */

	case 0x30d0: c = 0xca; d = 0xde; break; /* バ BA */
	case 0x30d1: c = 0xca; d = 0xdf; break; /* パ PA */
	case 0x30d2: c = 0xcb; break; /* ヒ HI */
	case 0x30d3: c = 0xcb; d = 0xde; break; /* ビ BI */
	case 0x30d4: c = 0xcb; d = 0xdf; break; /* ピ PI */
	case 0x30d5: c = 0xcc; break; /* フ HU */
	case 0x30d6: c = 0xcc; d = 0xde; break; /* ブ BU */
	case 0x30d7: c = 0xcc; d = 0xdf; break; /* プ PU */
	case 0x30d8: c = 0xcd; /* ヘ HE */
	case 0x30d9: c = 0xcd; d = 0xde; break; /* ベ BE */
	case 0x30da: c = 0xcd; d = 0xdf; break; /* ペ PE */
	case 0x30db: c = 0xce; /* ホ HO */
	case 0x30dc: c = 0xce; d = 0xde; break; /* ボ BO */
	case 0x30dd: c = 0xce; d = 0xdf; break; /* ポ PO */
	case 0x30de: c = 0xcf; break; /* マ MA */
	case 0x30df: c = 0xd0; break; /* ミ MI */

	case 0x30e0: c = 0xd1; break; /* ム MU */
	case 0x30e1: c = 0xd2; break; /* メ ME */
	case 0x30e2: c = 0xd3; break; /* モ MO */
	case 0x30e3: c = 0xac; break; /* ャ small YA */
	case 0x30e4: c = 0xd4; break; /* ヤ YA */
	case 0x30e5: c = 0xad; break; /* ュ small YU */
	case 0x30e6: c = 0xd5; break; /* ユ YU */
	case 0x30e7: c = 0xae; break; /* ョ small YO */
	case 0x30e8: c = 0xd6; break; /* ヨ YO */
	case 0x30e9: c = 0xd7; break; /* ラ RA */
	case 0x30ea: c = 0xd8; break; /* リ RI */
	case 0x30eb: c = 0xd9; break; /* ル RU */
	case 0x30ec: c = 0xda; break; /* レ RE */
	case 0x30ed: c = 0xdb; break; /* ロ RO */
/*	case 0x30ee: c = 0xdc; break; *//* ヮ small WA */
	case 0x30ef: c = 0xdc; break; /* ワ WA */

/*	case 0x30f0: c = 0x; break; *//* ヰ WI archaic */
/*	case 0x30f1: c = 0x; break; *//* ヱ WE archaic */
	case 0x30f2: c = 0xa6; break; /* ヲ WO */
	case 0x30f3: c = 0xdd; break; /* ン N */
	case 0x30f4: c = 0xb3; d = 0xde; break; /* ヴ VU archaic */
/*	case 0x30f5: c =; break; *//* ヵ small KA not common */
/*	case 0x30f6: c =; break; *//* ヶ small KE not common */
	case 0x30f7: c = 0xdc; d = 0xde; break; /* ヷ VA */
/*	case 0x30f8: c = 0x; d = 0xde; break; *//* ヸ VI archaic */
/*	case 0x30f9: c = 0x; d = 0xde; break; *//* ヹ VE archaic */
	case 0x30fa: c = 0xa6; d = 0xde; break; /* ヺ VO */
	case 0x30fb: c = 0xa5; break; /* ・ */
	case 0x30fc: c = 0x2d; break; /* ー Prolonged sound mark*/

        /* Others */
	case 0x0020: c = 0; break;
	case 0x0035: c = 0x35; break; /* 5 */
	case 0x0030: c = 0x30; break; /* 0 */
	case 0x003f: c = 0x3f; break; /* ? */
	case 0xff1f: c = 0x3f; break; /* ? */
	case 0xff01: c = 0x21; break; /* ! */
	case 0x2026: c = 0xa5; d = 0xa5; break; /* … */
	case 0x3002: c = 0xa1; break; /* 。*/
	case 0xff65: c = 0xa5; break; /* ・ */
	case 0x3001: c = 0xa4; break; /* 、*/
        default: printf("Unhandled character 0x%04x\n", b); err = 1;
      }
      if (c) {
        fprintf(output, "$%02X", c);
        if (d) {
          fprintf(output, ",$%02X", d);
        }
    }
I saw early in the process that my Sony HB-F1XDJ rendered text on the screen in a somewhat unreadable display (in fact probably it is an ageing SMT capacitor problem in the video output), but this could be enhanced by making lines two pixels wide. Time to work, I went over the font and made it more readable, but I didn't want to use so much time. What characters were needed? It was an egg and chicken situation, so I wrote the converter, and the result was fed to the font generator to detect if some redesigned character was missing.
Font design for Mecha-9.
Font design for Mecha-9. At the left is the original MSX font, in the center the public domain 8x8 Hiragana font, and at the right my version.
I'm glad I didn't had to make the whole font because some letters have very delicate lines.

    /*
    ** Hiragana/Katakana bold 8x8 font for MSX.
    ** by Oscar Toledo G. https://nanochess.org/
    ** Last revision: Oct/13/2015. Character 0xaf was too tall.
    **
    ** I'm thereby making this code public domain for your MSX projects.
    */
    
    /*
    ** This only contains the characters used by my game Mecha-9. 
    ** You'll need to draw the few other characters not used.
    */

unsigned char hiragana_font[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  /* 0x80 */
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x40, 0xFE, 0x48, 0x70, 0x48, 0x82, 0x7C, 0x00, 
  0x00, 0x00, 0x10, 0x7E, 0x3C, 0x5A, 0x34, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x68, 0xFC, 0x66, 0x6C, 0x60, 0x00, 
  0x00, 0x00, 0x08, 0x5C, 0x6A, 0x0C, 0x30, 0x00, 
  0x00, 0x00, 0x18, 0x1E, 0x78, 0xCC, 0x7A, 0x00, 
  0x00, 0x00, 0x00, 0x3C, 0x06, 0x06, 0x1C, 0x00,

  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  /* 0x90 */
  0x20, 0xFE, 0x20, 0x7C, 0xAA, 0xB2, 0x64, 0x00, 
  0x00, 0xC0, 0xCC, 0xC6, 0xC6, 0xF6, 0x60, 0x00, 
  0x1C, 0x02, 0x7C, 0xC6, 0x06, 0x0C, 0x38, 0x00, 
  0x38, 0x00, 0xFE, 0x0C, 0x38, 0x6C, 0xCE, 0x00, 
  0x24, 0xF2, 0x20, 0x7C, 0xA6, 0xA6, 0x4C, 0x00, 
  0x20, 0x24, 0xF2, 0x4A, 0x48, 0x88, 0x30, 0x00, 
  0x10, 0x7C, 0x08, 0x7E, 0x04, 0x80, 0x7C, 0x00, 
  0x1C, 0x30, 0x60, 0xC0, 0x70, 0x18, 0x0C, 0x00, 
  0xCC, 0xCC, 0xDE, 0xCC, 0xEC, 0x4C, 0x18, 0x00, 
  0x00, 0x70, 0x1E, 0x00, 0xC0, 0xC0, 0x7E, 0x00, 
  0x30, 0x3E, 0xF8, 0x0C, 0x7E, 0xC0, 0x7C, 0x00, 
  0xC0, 0xC0, 0xC0, 0xC0, 0xC6, 0xCC, 0x78, 0x00, 
  0x18, 0xFE, 0x18, 0x38, 0x68, 0x38, 0x18, 0x00, 
  0x04, 0x64, 0xFE, 0x64, 0x6C, 0x60, 0x3E, 0x00, 
  0xF8, 0x30, 0x60, 0xFE, 0x30, 0x60, 0x3C, 0x00,

  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  /* 0xa0 */
  0x00, 0x00, 0x00, 0x00, 0x60, 0x90, 0x60, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0xC0, 0x60, 0x30, 0x00, 
  0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x60, 0xFE, 0x66, 0x6C, 0x60, 0x30, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0xac, 0xac, 0x0C, 0x18, 0x70, 0x00,  /* 0xaf TU pequeÒa */

  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  /* 0xb0 */
  0xFE, 0x06, 0x36, 0x30, 0x30, 0x60, 0xC0, 0x00, 
  0x06, 0x0C, 0x38, 0xF8, 0x18, 0x18, 0x18, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0xFC, 0x30, 0x30, 0x30, 0x30, 0xFC, 0x00, 
  0x0C, 0xFE, 0x1C, 0x3C, 0x6C, 0xCC, 0x18, 0x00, 
  0x60, 0xFE, 0x66, 0x66, 0x66, 0xC6, 0xCE, 0x00, 
  0x30, 0xFC, 0x30, 0xFE, 0x30, 0x30, 0x30, 0x00, 
  0x7E, 0xC6, 0x86, 0x0C, 0x0C, 0x18, 0x30, 0x00, 
  0x60, 0x7E, 0xD8, 0x98, 0x18, 0x18, 0x30, 0x00, 
  0x00, 0xFC, 0x0C, 0x0C, 0x0C, 0x0C, 0xFC, 0x00, 
  0x6C, 0xFE, 0x6C, 0x6C, 0x0C, 0x18, 0x30, 0x00, 
  0xE0, 0x26, 0x06, 0xE6, 0x26, 0x0C, 0xF8, 0x00, 
  0xFE, 0x06, 0x06, 0x0C, 0x18, 0x3C, 0xE6, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

  0x7E, 0xC6, 0x86, 0x3C, 0x18, 0x3C, 0x66, 0x00,  /* 0xc0 */
  0x06, 0xFC, 0x30, 0xFE, 0x30, 0x30, 0xE0, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x60, 0x60, 0x78, 0x6C, 0x66, 0x60, 0x60, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x30, 0xFC, 0x0C, 0x38, 0xFC, 0xB6, 0x30, 0x00, 
  0x06, 0x06, 0x06, 0x0C, 0x18, 0x30, 0xE0, 0x00, 
  0x28, 0x28, 0x2C, 0x6C, 0x66, 0x66, 0xC6, 0x00, 
  0xC0, 0xCE, 0xF8, 0xC0, 0xC0, 0xC6, 0x7C, 0x00, 
  0xFE, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x30, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0xFE, 0x06, 0x06, 0x06, 0x6C, 0x38, 0x0C, 0x00,

  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  /* 0xd0 */
  0x30, 0x30, 0x60, 0x60, 0xCC, 0xCE, 0xFA, 0x00, 
  0x06, 0x06, 0x26, 0x3C, 0x1C, 0x76, 0xC0, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x60, 0xFE, 0x66, 0x6C, 0x60, 0x30, 0x30, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x7C, 0x00, 0xFE, 0x06, 0x0C, 0x18, 0x70, 0x00, 
  0xC6, 0xC6, 0xC6, 0xC6, 0x06, 0x0C, 0x38, 0x00, 
  0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0xCE, 0xDC, 0x00, 
  0x60, 0x60, 0x60, 0x66, 0x6C, 0x78, 0xE0, 0x00, 
  0x00, 0xFE, 0xC6, 0xC6, 0xC6, 0xC6, 0xFE, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0xC0, 0x66, 0x06, 0x0C, 0x38, 0xE0, 0x00, 
  0xD8, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x70, 0xD8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,

  0x60, 0xFC, 0x60, 0x6E, 0xC0, 0xD8, 0xCE, 0x00,  /* 0xe0 */
  0x30, 0xFE, 0x60, 0xFC, 0x06, 0x06, 0x7C, 0x00, 
  0x00, 0x00, 0x7C, 0xC6, 0x06, 0x0C, 0x38, 0x00, 
  0x00, 0xFE, 0x1C, 0x30, 0x60, 0x60, 0x38, 0x00, 
  0x30, 0x36, 0x3C, 0x70, 0xC0, 0xC0, 0x7E, 0x00, 
  0x24, 0xF2, 0x48, 0x48, 0x9C, 0xAA, 0x10, 0x00, 
  0x60, 0xC0, 0xDE, 0xC0, 0xC0, 0xD8, 0xCE, 0x00, 
  0x44, 0x48, 0x7E, 0xB2, 0x96, 0xAA, 0x4C, 0x00, 
  0x40, 0xE0, 0x4C, 0x52, 0x66, 0xCA, 0x4C, 0x00, 
  0x00, 0x7C, 0xD6, 0x92, 0xB2, 0xA6, 0x6C, 0x00, 
  0x0C, 0x9E, 0x8C, 0x8C, 0x9E, 0xB4, 0x5C, 0x00, 
  0x48, 0xCC, 0x4C, 0x4A, 0x88, 0xD8, 0x70, 0x00, 
  0x38, 0x08, 0x20, 0x16, 0x4A, 0xCA, 0x18, 0x00, 
  0x00, 0x20, 0x70, 0xD8, 0x8C, 0x06, 0x02, 0x00, 
  0xBE, 0x8C, 0xBE, 0x8C, 0xDC, 0xAE, 0x18, 0x00, 
  0x18, 0x7E, 0x18, 0x7E, 0x38, 0x6C, 0x36, 0x00,

  0xE0, 0x24, 0x24, 0x7C, 0xA6, 0xA4, 0x68, 0x00,  /* 0xf0 */
  0x20, 0xF4, 0x22, 0x60, 0xA0, 0x66, 0x3C, 0x00, 
  0x04, 0x44, 0x7C, 0xCA, 0xAA, 0x92, 0x64, 0x00, 
  0x60, 0xF8, 0x60, 0xF8, 0x60, 0x66, 0x3C, 0x00, 
  0x00, 0x68, 0xFC, 0x66, 0x66, 0x6C, 0x60, 0x00, 
  0x88, 0xBC, 0xEA, 0x8A, 0xBC, 0x08, 0x30, 0x00, 
  0x18, 0x18, 0x1E, 0x18, 0x78, 0xCC, 0x76, 0x00, 
  0x78, 0x0C, 0xC0, 0xFC, 0xC6, 0x0C, 0x38, 0x00, 
  0x00, 0xC6, 0xC6, 0xC6, 0xE6, 0xCC, 0x18, 0x00, 
  0xF8, 0x30, 0x7C, 0xE6, 0x1A, 0x2E, 0x1C, 0x00, 
  0x20, 0xF0, 0x2C, 0x34, 0x64, 0xE4, 0x26, 0x00, 
  0xF8, 0x30, 0x7C, 0xE6, 0x06, 0x06, 0x3C, 0x00, 
  0x40, 0xE0, 0x5C, 0x76, 0x66, 0xC6, 0x5C, 0x00, 
  0x10, 0x30, 0x60, 0x70, 0xD8, 0xDA, 0x8C, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
};
Shigeru got extra help of PSS.K and both did a further two revisions of the translation. Using a conversion of the latest translation (and before sending the game to Matra for publishing), I sent Shigeru a full video of the Japanese story of Mecha-9 using my font, and fortunately, only one character was wrong (it was too tall).
Screenshot of Mecha-9 development.
Screenshot of Mecha-9 development. You can see the final Japanese data at the top-right window.
The first story screen of Mecha-9 in Japanese.
The first story screen of Mecha-9 in Japanese. The second story screen of Mecha-9 in Japanese.
The second story screen of Mecha-9 in Japanese.
After getting my copies of Mecha-9, I sent Shigeru his copy of Mecha-9 to Osaka, Japan, and I was pretty happy to know he felt honored working on the translation, and I also felt honored working with him. I wrote him about this article and the translation, and he approved of it and said "It was really fun!".
I was pretty happy to see how my game had great success in Japan. I found people waiting for it, and people playing it with pictures and videos on Twitter (now X).
Mecha-9 was published several years ago, and I released the ROM recently. You can download it here for your MSX.
Mecha-9 for MSX. 2nd edition game.
Mecha-9 for MSX. 2nd edition game. Box and cartridge.

Related links

Last modified: Jan/31/2024