漢字 ROM の調査


img
mk2 以降、漢字 ROM が標準搭載になったことで「読ませる」ゲームが増えた気がします。
この辺りから通信ソフトやワープロもかなり実用的になりましたね。

割と遊べる機能なのですがアクセス方法についての資料が無さそうだったので
実験がてら一通りのプログラムを書いてみました。

ついでに新しい描画方法も思いついたので、実機でのテストも行っています。



■ 漢字を表示してみる・概要

・ソースコードとサンプル kanji88_20140224.zip

漢字を表示するだけのプログラムです。


表示できる漢字の種類については、マニュアルに載っていたように思いますが、
マニュアルの無い人には収録されている漢字の種類などが分からないと思うのでおおざっぱにまとめておきます。


実際に目で見た方が早いと思うので、フォント ROM から一覧画像を作るツールも同梱しておきました。
> fontbmp.exe kanji1.rom(または kanji2.rom) で bmp 画像を出力します。

1/4 角フォントは M88 で ANK フォントとして使われていますね。
実際の ANK フォントは CRTC 直結?

個人的におもしろいと思ったのが半角ひらがなフォントで、ASCII コードの0x80-0xA0,0xE0-0xFF 辺りに配置されています。
PC-6001 シリーズと共通?と思ったのですが、微妙に違うようです。



ちょうどシフトJIS の 1 バイト目にあたる部分なので、シフトJIS ベースのシステムでは共存が難しいでしょう。

自前でフォント用意して漢字かな混じりを実現していたソフトもありましたっけ。根性ですなぁ。


■ 具体的なアクセス方法について

関連する I/O ポートと使い方について挙げておきます。
「漢字 ROM がマシンに装備されているか」を調べる際にも、とりあえず読み出してドットパターンが正常かどうか調べるのが手っ取り早いです。

I/O ポート $E9 【入力】
bit7-0第一水準漢字フォントデータ読み出し 左半分

I/O ポート $E8 【入力】
bit7-0第一水準漢字フォントデータ読み出し 右半分
I/O ポート $E9 【出力】
bit7-0第一水準漢字フォントアドレス指定 H

I/O ポート $E8 【出力】
bit7-0第一水準漢字フォントアドレス指定 L

漢字のドットパターンデータを読み出すためには、まずフォントデータが格納されているアドレスを
指定しなければなりません。それが I/O ポート $E8 と $E9です。
このアドレスは漢字 JIS コードを元に算出しますが、コレが非常〜に面倒くさいです。
サンプルプログラムの中にシフトJIS -> JIS -> アドレスへの変換ソースが含まれているので参考にしてください。

http://www.maroon.dti.ne.jp/youkan/pc88/index.html
参考になる。変換の仕組みが図解されています。

I/O ポート $EA 【出力】
bit7-0漢字ROM読み出し開始サイン

I/O ポート $EB 【出力】
bit7-0漢字ROM読み出し終了サイン

$EA,$EB いずれも書き込む値は何でもいいです。
FR 以降の機種では不要にになったそうです。
読み出しは書き込んだ後に 8 ステートのウェイトをとります。8MHz 機種でも 2 倍せずこのままで大丈夫そうです。

I/O ポート $ED 【入力】
bit7-0第二水準漢字フォントデータ読み出し 左半分

I/O ポート $EC 【入力】
bit7-0第二水準漢字フォントデータ読み出し 右半分
I/O ポート $ED 【出力】
bit7-0第二水準漢字フォントアドレス指定 H

I/O ポート $EC 【出力】
bit7-0第二水準漢字フォントアドレス指定 L

第二水準なことを除けば、$E8,$E9 と同じです。
第二水準漢字ROM は MR,FH,MH 以降のシリーズに標準搭載されているほか、マルチボードA(PC-8801-20)で拡張できます。




読み出しは、以下の手順を縦ドット数分繰り返します。
念のために漢字処理を行う前の初期化時にでも「読み出し終了サイン」を出力して、以下の手順が確実に実行できるようにした方が良さそうです。
  1. アドレス H を $E9 に書き込み
  2. アドレス L を $E8 に書き込み
  3. $EA に読み出し開始サインを書き込み。値は何でも良い。(FR 以降の機種は不要)
  4. CPU 8 ステート分ダミー命令で待つ
  5. $E9 から 1byte = 8 ドット分のデータ(左半分)を読み出し
  6. $E8 から 1byte = 8 ドット分のデータ(右半分)を読み出し
  7. $EB に読み出し終了サインを書き込み。値は何でも良い。(FR 以降の機種は不要)
以上が 1 セット分のデータ読み出しです。全角フォントはこれを 16 回、半角フォントは 1 セットで縦 2 行分読み出せるので 8 回、
1/4 角フォントも縦 2 行分読み出しなので 4 回繰り返します。

図の [ ] 内の数字がセット。必ず $E9,$E8 の両方を読みます。
手順 1. のアドレス H は、一番最初に一回書き込むだけでも大丈夫です。繰り上がりはしないので、下位アドレスだけの書き込みでも可。
サンプルプログラムに読み出しと描画のソースが含まれているので参考にしてください。

半角と 1/4 角文字は第一水準 ROM に格納されています。第二水準 ROM は漢字のみです。

200 ラインモードだと縦長になりますが、400 ラインモードにすると大変見栄えがよくなります。
PC88 でもワープロが結構実用的に動いていたので、ユーザーによっては最も活用された機能の一つではないでしょうか。


■ 表示例あれこれ



通常の縦16ライン描画。
横640 * 縦 200 ラインなので文字は縦長になります。
縦に 12.5 文字しかおけないのでワープロなどは相当きつかった。
数字とアルファベットのバランスが今ひとつですね。
中段の小さな文字は 1/4 角文字。


1ライン飛ばし。
使いものにならないことの確認。


縦8ドット圧縮方式。
当時のゲームでよくあった、2ラインを OR 合成して表示する方式。
見ての通りかなり潰れます。これはこれで味があるというか「コレでないと!」という向きもあるでしょう。
同様に縦 12 ドット方式もありましたね。


疑似アンチエイリアス方式。
16 のスキャンラインを VRAM 2 プレーンに交互に描画し、vblank 毎にパレットを切り替えます。
某携帯ゲーム機向けエミュレータでこの方式を初めて見たとき、その発想(とマシンパワー)に驚かされました。
当時 88 でこの方式を使ったアプリケーションは無かったはず。

文字によっては多少ちらつきが気になりますが、割と視認性は良好です。
エミュレータのスクリーンショットでは正常に撮影できないので実機で撮りました。暗闇に光るキャッキャウフフの文字。

CRT か液晶かでも見え方は変わるので今更って気もしますが。

▲ TOP