ワンポイントテクニック No.005

フォント書き換えについて

 フォント書き換えとはGPRINT(E500のグラフィック命令)を使わずにPRINT文でオリジナルのグラフィックを表示するテクニック(MZやX1でいう「PCG」に近い機能)のことです。ポピュラーなテクニックなのですが、知らない人もいるかもしれないので、ここで書くことにしました。

 E500では知っての通りフォントが格納されているポインタアドレス(フォントデータが記録されている場所を示すもの)がRAM上にあります。
 そこで、まずは、E500のRAMが内部的にどのようになっているのかを知る必要があります。
 例えば、RAMが32KバイトのノーマルなE500の場合、RAM、つまり、読み書きが出来るメモリはB8000h〜BFFFFh(「h」は16進数を示す)の32Kバイトになるのです。そのうち、BFC00以降はシステムのワークエリアとして使われていますので、ユーザーが好きなように使うことはできません。したがって、自由に扱うことができるのはBFBFFhまでとなります。
 ユーザーが普段は書き換えることができないワークエリアの中に様々なものが記録されています。例えば、カナのフォントデータが入っている場所を示すアドレスはBFC93hから3バイトで下位から順に格納されています。私のE500ではカナのフォントデータがF2258hから格納されていますが、このアドレスはBFC93hから58h、25h、0Fhと格納されている(ちなみにE650ではこれがC0h、03h、03hとなりE500とは異なっている)のです。
 フォントのデータ自体はROMの中にあるので書き換えるのは不可能ですが、データが入っているポインタアドレス、つまり、BFC93hからの3バイトを書き換えることによって別のところに入っているデータがカナのフォントデータとして扱われるわけです。言い換えれば、カナを表示したときに自分で作ったオリジナルのグラフィックを表示できるのです。

 上記の説明書きを読んでも良く分からない人のために具体的にどのようなものかを書いていきます。
 まず、POKE文を使うのでマシン語エリアを確保する必要があります。例えば、BFA80hから使用する場合、384バイト(=180hバイト)確保する必要があるので、次のようにすればよいのです。

 POKE &BFE03,&1A,&FD,&B,&80,&1,0 [RETURN]
 CALL &FFFD8 [RETURN]

 あとは、適当なグラフィックエディタ(ショートプログラムの「2LINEエディタ」など)を使用してGPRINT形式と同様の16進数データを作成してPOKE文で書き込んでいきます。
 例えば「人間」(GPRINT用データ04886B3F6884)を表示するとします。これをカタカナの「ア」を使って表示するには次のようにしてください。

10 POKE &BFC93,&80,&FA,&B
20 POKE &BFAE6,&04,&88,&6B,&3F,&68,&84
30 PRINT "ア"

 試しにRUNをしてもらえたら分かりますが、「ア」が表示されずにオリジナルのグラフィックが表示されましたね。10行のPOKE文は「BFA80hから使いますよ」という感じが分かる(順番を入れ換えただけなので)と思いますが、20行のPOKE文の「BFAE6」はどこからきたのか分からないかも知れません。
 これは、カナというのは内部的にはアスキーコードでA0hから始まっており、使用したのが「ア」(アスキーコードB1h)であるために17文字分(=102バイト)開始位置からずれているからです。これが、「イ」なら18文字分(=108バイト)ずらしてBFAEChから書き込めばいいのです。
 要は、まず、初期設定としてBFC93hからの3バイトにアスキーコードA0hのキャラクタに対応したアドレス(「ア」を基準に102バイト戻しても同じことです)を2桁ずつ区切ったものを逆に書き込み(BFA80hなら80h、FAh、Bhを順に書き込む:10行参照)あとは、アスキーコードが1大きくなるごとに6バイト(文字が横6ドットで構成されているため)ずらしてグラフィックデータを書き込んでいくのです。
 このようにカナを別のグラフィックに置き換えることが出来ましたが、当然のことながら普通の文字と同様にPRINT文を使い自在に表示させることが可能になります。GPRINTよりPRINTの方が速いのでゲームなどでは高速化が出来ます。しかも、普通の文字なので扱いが楽になります。このフォント書き換えは冒頭で書いたように、E500BASICでは非常にポピュラーなテクニックなので、ぜひマスターしておくことをおすすめします。

 「簡単で速い」といいことずくめのフォント書き換えですが、注意しなければならないのは、書き換えたキャラクタを元に戻さなければいけないということです。でないとカナが使えませんね(笑)
 どうすればよいかというと

 オールリセットをしてもよいのですが・・・
[CTRL]+[+/-] または INIT "SCRN:" [RETURN]
 とすればよいです。自作のプログラムでフォント書き換えを使用するときは「自動フォント復帰」などを利用するとよいでしょう。


《注意》
 [CTRL]+[+/-]は生協のマシン(PC-1480U)では元に戻りません。
 PC-1480Uを含めた全機種でキャラを元に戻したい場合はディスプレイドライバの初期化を行うマシン語プログラムを記述してそれを実行してください。
 マシン語に関しては当サイトでは扱ってないので他所を参考にしてください。

 なお、PSSではフォント書き換えを使用した場合、プログラム内で元に戻すことが必須となっています。知らないうちに勝手にフォントが書き換わっていたら困りますよね。


カナ以外の文字を書き換えるには

上記ではカナ文字(アスキーコードA0h〜DFh)を書き換える方法を書きましたが実はすべてのフォントの書き換えが可能なのです。
アスキーコード書き換えるアドレス
20h〜7FhBFC90hから3バイト
80h〜9FhBFC8Ahから3バイト
A0h〜DFhBFC93hから3バイト
E0h〜FFhBFC8Dhから3バイト
※00h〜1Fhの文字は制御文字であるため表示することができないので省略します。

 一般的にカナ文字を書き換えることが多いのは普通にキーボードから入力できるという点と20h〜7Fhの英数字と異なり常時書き換えたままでも不都合になることが少ないという点があるからです。カナ文字をプログラム内で頻繁に使う場合は普段は使わない80h〜9FhやE0h〜FFhを書き換えるとよいでしょう。


RETURN

inserted by FC2 system