Making「ちび文字PUT」

Home PC-6001mkII Program etc

関連リンク ちび文字PUT ちび文字PUT mkII

最新の画面 更新日:2012/08/18
作成日:2012/07/26

「ちび文字PUT」の作成過程を以下少しずつ書き綴っていこうと思います。

2011/02/07〜12:色付け
 次に、左半分が白,右半分が灰になるように色を分けて表示する処理を追加する。

 まず、mkIIで表示する色を2進数化する。色1の黒が0000B, 色2の青紫が0001B … というように2進数にすると、色8の灰は0111B, 色16の白は1111Bとなる。
 これを2ビットで分割する。なぜ分割するかというと、前半の2ビットと後半の2ビットは異なるアドレスに書き込むからだ。

 mkIIのグラフィック画面(16KB)は、内部的に8KBのプレーン2つに分割されている。
 下位2ビットをプレーン1に、上位2ビットをプレーン2に書く事で、下表のように対応する色が画面表示される。
プレーン青紫
プレーン1(0000H〜1F3FH)00011111
プレーン2(2000H〜3F3FH)00000111

 つまり、「月」のキャラクタを右半分が白、左半分が灰になるように表示しようと思ったら、以下のようなプレーンの重ね合わせになる。
プレーン1プレーン2
11 11 11 11
11 00 00 11
11 11 11 11
11 00 00 11
11 11 11 11
11 00 00 11
11 00 11 11
00 00 00 00
01 01 01 01
01 00 00 01
01 01 01 01
01 00 00 01
01 01 01 01
01 00 00 01
01 00 01 01
00 00 00 00

 プレーン2では、ビット7,5,3,1が必ず0となる。論理演算で考えると、プレーン1に出力する8ビットデータと01010101BとのANDを取る事で、プレーン2に出力する8ビットデータとなる。

 ここまで出来れば、あとは「でか文字PUT」の時に作った文字列受け渡しの処理を組み合わせるだけだ。
 …おっと忘れてた。今回は縦が25行表示になるので、通常のLOCATE文ではY座標が20以上だと範囲エラーになるんだった。まあ、ここは「LOCATE@」という命令を作るか。

 LOCATEの後ろに「@」があれば、その後に続く2つの数字をX座標とY座標として設定する。範囲外の値だったら、とりあえず0にしておくか。

 こうして、「ちび文字PUT」の初期バージョンができた。

2006/02/06:データ構造
 さて、キャラクタも作成したし満足だ...ではなくて、表示方法を考える事にする。

 まず、フォントのファイルサイズはなるべく小さくしたい。まず色は表示処理時に付ければ良いので、フォントデータに色情報は不要だろう。
 ドットの情報も、4x8=32bit、つまり1文字で4バイトあれば事足りるだろう。

 データ構造だが、1バイト当たり横4ドットx2行とする。
例えば「月」のキャラクタでいうと、
  ■A■ ■B■ ■C■ ■D■
  ■E■ □F□ □G□ ■H■
  ■I■ ■J■ ■K■ ■L■
  ■M■ □N□ □O□ ■P■
  ■Q■ ■R■ ■S■ ■T■
  ■U■ □V□ □W□ ■X■
  ■Y■ □Z□ ■a■ ■b■
  □c□ □d□ □e□ □f□
 なので、1バイト目は「ABCD EFGH」→「1111 1001」、にはしなかった
 もちろん、データ形式としてはこの方がシンプルで良いのだが、これだと「ABCD」→「AABBCCDD」と横倍にするときの処理が複雑になる分遅くなる。

 では、結局どうしたか?今回は「AE BF CG DH」→「11 10 10 11」とした。これだと、横倍の処理が以下のようにシンプルになる。
操作1行目2行目
1行分のマスキングAND AAH
→ A0B0C0D0
AND 55H
→ 0E0F0G0H
値の退避LD B, ALD B, A
値のシフトRRCA
→ 0A0B0C0D
RLCA
→ E0F0G0H0
退避値とのOROR B
→ AABBCCDD
OR B
→ EEFFGGHH

 これを元に、キャラクタデータを作成した。

2006/02/05:キャラクタ作成
 マニュアルのキャラクタコード表と見比べつつ、ペイントブラシにて1つずつ4x8キャラを作っていく。

 心配だったひらがなもそれなりに見れるようになった...気がする。「秒」やトランプマークは流石に無理があるけど、この辺りは目を瞑ってもらうことにしよう。

フォント

 一通り描き終わってから のりさん考案のフォントと若干違うことに気づいたが、まあいいか。このままいこう。

2006/02/xx:命令のっとり
 処理方式は、「でか文字PUT」と同様にする。

 大まかにどのような処理にしたかというと、BASICインタプリタで「PRINT」「LOCATE」を実行する処理へのポインタを書き換える事で、処理を一部乗っ取っている。

 BASICの各命令に対応したポインタ群より、FAA3H-FAA4H(PRINT),FA8BH-FA8CH(LOCATE)の値を、今回作成するプログラムの開始位置に設定する。プログラム内で次の1文字のキャラクタを見て、「@」以外の場合は、本来のPRINT,LOCATEの処理にジャンプする。

 プログラム内では、BIOSルーチンを利用して値の切り出しを行い、この値を使用して処理を行う。
 072AH(次の文字取り出し?), 0DE4H(次の値取り出し?), 0B09H(文字列の展開?), 0AFAH(???), 31FCH(文字列の取り出し?)を使っているが、正直BIOS内の細かい処理内容はよくわかっていない。

 という事で、プログラムは後回しにしてまずは文字キャラクタを作っていくか。

2006/02/xx:きっかけ
 きっかけは、のりさんのHPだった。

 当時のりさんが作成中だった某ゲーム、着々と出来上がる画面やキャラクタに感嘆としていたのだが、とある日に追加されたアイテム名表示が個人的に印象に残った。

 アイテム名は横4ドットのフォントを使っているのだが、フォントの右半分を灰色にしているため、文字同士がくっつく位に表示してもそれぞれの文字が認識できる。

フォント

 ひょっとして、この手法を使えばPC-6001mkIIでも擬似的に40桁x25行表示が出来るのではないか?
 よし、試してみよう!


PC-6001mkII