グラフィックモードでオリジナルフォントを使う

グラフィックモード(SCREEN 2以上)で、PRINT#命令でオリジナルフォントが使えます。オールBASICで実現できます。

なお、この方法はディスクを使用する、しないに関わらず、フロッピーディスクドライブが必要です。

プログラム手順の例を述べてみます。

  1. あらかじめ、オリジナルフォントを作っておきます。 データ形式はSCREEN 0,1の場合と同じです(1文字当たり8バイト、計2047バイト)。
  2. オリジナルフォントデータをRAM上(8000H以上)に読み込みます。 あらかじめCLEAR命令で、オリジナルフォントデータ領域が破壊されないようにしておきます。例えば、C800H番地(からCFFFH番地)にオリジナルフォントデータを置く場合は、CLEAR文の第二パラメータをC800H - 1 (つまり&HC7FF)とします。
    ※オリジナルフォントデータは C000H番地をまたがって置いてはいけません。 C000H番地より手前か、それ以降に収まるようにしてください。 またオリジナルフォントデータは、あまり後ろに置かない方がいいでしょう。 漢字モードなどを使用していないなら、CFFFH番地位までは大丈夫だと思います。
  3. オリジナルフォントデータを8000H-BFFFH番地の間に置いた場合はF343H番地の内容を、C000H番地以降に置いた場合はF344H番地の内容を、F91FH番地に入れます。
  4. F920H番地にオリジナルフォントデータの先頭アドレスを256で割ったあまり、F921H番地にオリジナルフォントデータの先頭アドレスを256で割った商(小数点以下切り捨て)を入れます。
これで準備完了です。オリジナルフォントを使いたいスクリーンモードにして、PRINT#命令を使えば、オリジナルフォントで出力されます。

このオリジナルフォントは、スクリーンモードを変更しても有効です。

※SCREEN 0,1 のキャラクタフォントも変わります。4.までの操作の後、「SCREEN0」(「SCREEN1」)を実行してください。

※フォントを元に戻したい場合は、F91FH、F920H、F921H番地にそれぞれ、FCC1H、0004H、0005H番地の内容を入れて、SCREEN命令を実行してください。

サンプルプログラム

grfntspl.lzhダウンロード
圧縮ファイルです。MSX FAN付録ディスク収録のPMext等で解凍してください。

グラフィックモード及びテキストモードで、オリジナルフォントを使った文字を画面に出力します。

このサンプルプログラムは、フロッピーディスクドライブ(FDD)付きのMSXで実行できます。 このサンプルプログラムとデータをカセットテープにコピーして、FDDのないMSXで実行しようとしても、うまく実行できません。

※実行中、CTRL + STOPキーを押すと、フォントを元に戻してプログラムを終了します。

"GRFNTSPL.LZH"パッケージ内容

以下の3つのファイルが提供されます。
GRFNTSPL.DOC
ドキュメントファイルです。 基本的にこのページと同じ内容です。
GRFNTSPL.BAS
実行プログラムです。 BASIC上で実行してください。 実行時にはファイル"GRFNTSPL.DAT"(後述)が必要です。 同じディスク(ディレクトリ)に納めてください。
GRFNTSPL.DAT
オリジナルフォントデータです。 実は作者が昔作った「おどる文字達」のパターンの一部だったりします(^^;) このフォントデータはSCREEN1以上で使うことを前提としています。 SCREEN0だとフォントの右端が切れることがあります。

サンプルプログラム解説

オリジナルフォントデータは、C800H番地からCFFFH番地に納めるようになっています。 1090行のCLEAR命令でメモリを確保した上で、フォントデータを読み込んでいます。 CLEAR命令を実行すると、それまで使ってきた変数がリセットされてしまうので、CLEAR命令は基本的にプログラムのはじめの方に置きます。
1110行が手順3、4にあたります。 ここの操作を誤ると暴走する危険があるので、自分でプログラムを組む際は注意してください。
3000行以下のサブルーチンでは、フォントを元に戻す準備をします。 このサブルーチンから戻ってからSCREEN命令を実行すると、フォントが元に戻ります。

このサンプルではグラフィックモードとしてSCREEN2を使っていますが、もちろん他のスクリーンモード(MSX2以降ならSCREEN5など)でも同様に出力できます。 120行の「SCREEN2」の「2」を他の数字(スクリーンモード)に変えて実行してみてください。

文字フォントを変える原理を突っ込んで考える

SCREEN命令を実行するとき、システムはRAM上のCGPNTといわれる場所に納められた情報をもとに、フォントを決定します。
CGPNTには、使用するフォントデータの「スロットアドレス」と、「アドレス」が納められています。 「アドレス」はフォントデータの先頭アドレスですが、「スロットアドレス」とは何なのでしょう?
簡単に説明すると、MSXは同じアドレスに複数のメモリ(ROM、RAMなど)が存在でき、それらは「スロット」というもので管理されています。 スロットとはカートリッジスロットだけではなく、本体内部のメモリもスロットというものに存在します。 例えばあるメモリの内容を読み書きしたいとき、そのメモリがCPU から直接読み書きできないスロットにある場合は、そのスロットを表(CPUが直接読める場所)に切り替えます。
なお、アドレスは0番地から16Kバイト毎に4つに分かれており、それぞれページ0からページ3と呼びます。 スロット操作はページ別に行うことが出来ます。
で、それぞれのスロットには「スロットアドレス」(1バイト)というものがあり、フォントデータの「スロットアドレス」とは、そのフォントデータの入っているメモリのスロットアドレスということになります。
CGPNTは、F91FH番地からの3バイトのことで、順に、フォントデータの「スロットアドレス」、「アドレスの下位1バイト(アドレスを256で割ったあまり)」、「アドレスの上位1バイト(アドレスを256で割ったもの。小数点以下切り捨て)」が入っています(「スロットアドレス」「アドレス」の違いに注意)。 オリジナルフォントを使いたい場合は、この3バイトを書き換えた上で、SCREEN命令を実行すればよいわけです。
フォントデータの「スロットアドレス」をどうやって調べるかですが、オリジナルフォントデータはRAM上に置くでしょうから(え、ROMに焼き付ける?)、そのRAMのスロットアドレスが分かればよいわけです。 で、ディスクドライブがある場合は、RAMのスロットアドレスは、F341Hにページ番号(0,1,2,3)を足した番地に入っています。 オリジナルフォントデータを、8000H番地からBFFFH番地の間(つまりページ2)に置く場合は、F341H + 2 = F343H番地の内容を、C000H番地以降(つまりページ3)に置く場合は、F341H + 3 = F344H番地の内容を、CGPNTの1バイト目(F91FH番地)に納めればよいわけです。

ディスクドライブがない場合は、RAMのスロットアドレスは機械語を使わないと調べられないと思います。 具体的な方法は述べませんが、かなり複雑なことをしなければなりません。

なお、FCC1H番地にメインROMのスロットアドレス、0004H番地からの2バイトに元のフォントの先頭アドレスが入っていますから、フォントを元に戻したいときは、これらをCGPNT(F91FH、F920H、F921H)に入れてやればよいでしょう。


実はこのサンプル、ある人にグラフィックモードでオリジナルフォントを出す方法を聞かれて、考えたものです。
グラフィックモードでオリジナルフォントを出す方法は、何年か前のMSX-FAN(徳間書店)に載ってたのですが、あいにくその号を持ってなかったので、どうしようかとおもってたら、MSXテクニカルガイドブック(アスキャット)を別件で調べてて、偶然手がかりになりそうな情報を見つけ、サンプルを作ってみたのでした。
機械語とスロットの知識があれば、裏ラムにフォントデータを入れることもできるでしょう。
PMextはぺぱあみんと★すたあさん作のフリーウェアです。
MSXの適当手帳 MSX駅 西山駅