絶賛追記中
拙作「DMシステム2」の各種ドライバをオープンソースで公開する作業の一環で、「ねこいらず」というフォントドライバを公開するにあたりフォントデータの構造を理解する必要があったので、解析結果を忘れないうちにメモしておきます。
半角文字
「ねこいらず」半角フォントデータ仕様をようやく理解した。6×12pxの1文字9バイトで、6bit毎の折り返しだった(全角は12bit毎折り返しの18バイト)。8bitの折り返しでデザインを眺めてたから気が付かなかったのであった。これでようやくFONTX要町フォントでねこいらず互換フォントデータの準備が整う…😋 pic.twitter.com/fb1SAhZrHC
— Takashi Kobayashi (@nf_ban) July 27, 2020
- 文字コード 0x20~0xFF(224文字)、計2016バイト(9×224=2016)格納。
- フォントデータの0バイト目から、1文字あたり9バイト(6bit折り返し×12行)で、224文字分連続している。
- DMシステム2の日本語表示時は文字コードが「シフトJIS」で解釈されるため、本来であればシフトJISで表示できない1バイト目の領域(0x80~0x9Fと0xE0~0xFF)は使用できないが、「ねこいらず」ではMSXの半角文字のデザインが無駄に入っている(データ領域を端折ると誤動作する)。
ちなみに文字コード 0x7F も表示はできないがデータの領域は確保されている。「ねこいらず」フォントの半角文字をよく見たら、シフトJISで表示できない1バイト目の領域(0x80~0x9Fと0xE0~0xFF)にMSXの半角文字のデザインが入ってる。全角文字の0x8140のデータが先頭から2016バイト目だから、半角224文字分のデータ量(9*224=2016)と計算が合う。んー、本来は無駄データだよね… pic.twitter.com/GncqFvKY1e
— Takashi Kobayashi (@nf_ban) July 28, 2020
半角文字の計算を端折るためかな?
全角文字
旅行がなくなったので「ねこいらずフォント」の解析。全角文字は1文字18バイト。3バイトで2行分。2バイト目の左4bitと右4bitを上下に振分。FONTXのように横12pxで16bit確保する無駄が無い。シフトJISの未定義コードは除外されデータが詰められてる。半角文字はさっぱり…見えてるようで見えてない… pic.twitter.com/elS7CBOzPu
— Takashi Kobayashi (@nf_ban) July 25, 2020
- JIS第1水準の文字コード 0x8140~0x9872(「腕」)まで格納。
- JIS第2水準は含まれない。
- フォントデータの2016バイト目から、1文字あたり18バイト(12bit折り返し×12行)。
- シフトJISの領域外である文字コード(2バイト目が0x00~0x3F、0x7F、0xFD、0xFE、0xFF)はデータ領域が確保させずに詰められている。半角文字では領域があるのに!!
- 2020年現在JIS第3水準として定義されている一部のコードは意味が全く違うデザインが含まれる。
「ねこいらず」実際のシフトJIS(JIS X 0213)と字形が違う文字探し・その① pic.twitter.com/tJ7LZGGgFk
— Takashi Kobayashi (@nf_ban) July 29, 2020
「ねこいらず」フォントのデータの有無に法則性がつかめないので結局全部目視で確認することに。JIS第1水準に無い(後に第3水準として定義された)文字は基本的にデータが無いようだが、稀に全然違うデザインデータが入る。また、データは無くてデザインがループする箇所がある。この斜線は一体…謎。 pic.twitter.com/X09oDvnp5j
— Takashi Kobayashi (@nf_ban) August 3, 2020
「ねこいらず」開発当時は未定義だったものの1994年に「JIS X 0208」にて規格化された文字コード(主にJIS第3水準の部分)についてはデータ領域が確保されており適当なデザインデータが入っている。そのため、2020年現在の最新規格で作成されたシフトJISのテキストデータを「ねこいらず」で表示しようとすると違う字形になってしまう。
「ねこいらず」とは?
漢字ROM(というフォントデータを含んだIC)を搭載しないMSX2以降の機種で漢字混じりの日本語表示を行うため、JIS第1水準に準拠した12px角のフォントデータをVRAMの裏画面(10000h)へを配置し、日本語表示を行うソフトウェアです。漢字ROM要らずだから「ねこいらず」。
やってることと言えば、アメリカ産のIBM/PCで「DOS/V」として日本語表示を行う技術(メモリにフォントデータを常駐してグラフィック画面へ日本語の文字を表示する手法)とほぼ同等です。
作者はKICHIさん(お元気でしょうか?)。元々DMシステム2とは関係がなかった独立したソフトウェアでしたが、作者自らDMシステム2のフォントドライバAPIに合わせてリリースしてくださったのでした。
なお「ねこいらず」はMSX向け漢字ROM相当のハードウェアやインターフェースをソフトウェアでエミュレートするものではありません。
で、なんでこんなことが必要だったかと言うと
今ではにわかに信じがたい話ですが、MSX2のリリース時点(1985年)では漢字混じりの日本語表示をハードウェア側で行う環境が整っていませんでした。漢字ROMの部品が高価なため、コストアップを嫌ったメーカーは安価な機種で漢字ROMを搭載しませんでした。まぁMSXの場合ANKコードのGRAPH文字(日月火水木金土・大中小・年月日・時分秒)は表示できましたけど、文字数が全然足りないわけです。
1987年に29800円で発売された超低価格のMSX2(FS-A1, HB-F1)は当時爆発的に普及しましたが、もちろん漢字ROMは非搭載です。漢字ROMはMSX2の時点ではオプション(周辺機器)の扱いです。FDD搭載のモデルでも漢字ROMが搭載されないケースがあり、「VRAM 128KB搭載・FDDは利用できるが漢字ROMは利用できないMSX2」のハードウェアスペックがそれなりに溢れました。
日本産のいわゆる御三家と呼ばれた8bitPCやPC-9801は漢字ROMが当然のように搭載されていましたし、実用ではなくゲーム用途ならMSXでも漢字混じりの文字表示がほとんど限定的(メーカー側が予め制御できる程度に留め、アプリケーション毎にフォントを内蔵して解決した)ですから、MSXユーザーの中でもそんな苦労の経験ない人のほうが圧倒的に多いですが、MSXで日本語を表示しようとしたソフトウェアの開発は…それはそれはご苦労されたようです。
「ねこいらず」使用時は裏のVRAM 64KBがまるまるフォントデータで埋め尽くされるので、これをゲーム用途へ活用するのは難しいのでした。DMシステム2ではVRAMではなくMSX-DOS2のマッパーRAM(拡張メモリ)へフォントデータを配置できる「マッパーRAM版のフォントドライバ」も開発されたので、VRAMが足りない問題は多少解決しました。