機種毎に異なる半角罫線コード [DOS]
DOSBox-Xに私の成果物であるJEGA (AX) エミュレーション機能が組み込まれたことは、割と早い段階で知ってて嬉しかったんだけど、ぶっちゃけ使う機会がなかった。今日JEGAがちゃんと機能するか試していたんだけど、VZ EditorのAX版を使ってみたら、半角罫線や改行記号が文字化けしていることに気付いた。
今AXの資料が手元にないのであやふやな記憶に頼ってみたが、これについては資料に記述がないから実機を調査するしか方法ないな、と諦めて放置していた部分だったと思う。あの天下のマイクロソフトとアスキーが主導し、三菱、日立、シャープ、沖電気、三洋と今でも日本を代表する電機メーカーが参画したAX規格の話だから、コード表くらいあるだろうと色々資料を探したが、出てきそうにない。
それでもなお色々探した結果、テキストビューワーのMIELの設定ファイルに各機種の半角罫線素片・矢印のコードを見つけた。以下に16進数で示す。なお、MIELではデザイン上の理由から二重罫線や丸角罫線を使用しており、下の表とは一部異なる。
機種\記号 | ↵ | ← | → | ─ | │ | ┌ | ┐ | └ | ┘ | ↓ | ↑ |
---|---|---|---|---|---|---|---|---|---|---|---|
98, FMR | 1F | 1D | 1C | 95 | 96 | 98 | 99 | 9A | 9B | 1F | 1E |
DOS/V | 1B | 1F | 1E | 06 | 05 | 01 | 02 | 03 | 04 | 07 | 1C |
AX | - | 07 | 06 | 08 | 09 | 0A | 0B | 0D | 0C | 05 | 04 |
J-3100 | - | 1B | 1A | C4 | B3 | DA | BF | C0 | D9 | 19 | 18 |
これは酷い。JISコード以外は合わせる気はないと言わんばかりに、見事にバラバラだ。富士通FMシリーズが日電98と同じというところが唯一の救いか。
しかしこのコード表。数字をじっくり見てみると非常に興味深い。
まず、98の半角罫線は9x番に配置されているが、MS-DOSが用いるシフトJISコードでは2バイト文字と重複するため表現できず、DOS標準出力関数を通して画面に表示することはできない。CRT BIOSやビデオメモリへの直接アクセスで書き込むしかなく、機種依存の原因となる。しかし、98は元々88上位互換のBASICマシンであり、そのN88-BASIC(86)ではシフトJISではなくSI/SO付きJISコードを用いるため問題にならない。このコード割り当てはPC-8001から使われているものであり、互換性を優先したと考えられる。
DOS/Vのコード割り当てはDOS/V登場前からPS/55の日本語DOSで使われていたものである(5550は不明)。いずれもC0制御コードの範囲と重複するが、該当する箇所は通信制御用のコードであり専ら表示に用いる分には無視されるので問題ないだろう。実際、このコードはDOS標準出力関数を通して画面に表示できる。これをテキストデータで扱うと通信時に問題を起こす恐れがあるが、プログラム内部でCUIのために用いる分には問題ない。
AXのコード割り当てもC0制御コードの範囲と重複するが、DOS/Vと違うのは改行コード (CR=0x0D, LF=0x0A)の部分も割り当てている点だ。これではDOS/Vのように標準出力関数を通すことができない。JEGAはビデオメモリの内部表現でもシフトJISを用いるため、PC-98と同じコードにすることはできないが、なにゆえPS/55とも異なるコードを割り当てたのだろう。コンソーシアムのメンバーには日立や三菱など業務用コンピューターで一定のシェアを持つメーカーがいたことから、統一仕様の策定に一悶着あったに違いない。
J-3100の半角罫線はIBM PCの文字セット、いわゆるコードページ437と一致する。シフトJISコードでは半角カタカナと重複するため、PC98と同様、内部表現を変えるなどの工夫をしているはずである。
肝心の文字化けの解決方法だが、DOS/Vで作成したFONTX2ファイルを上記の表に従って字体をAXのコードポイントに置き換え、これをDOSBox-Xで使うように設定するだけ。