
DMシステム2では「16×16ドット」及び「12×12ドット」のフォントドライバによって漢字フォントを取り出し、文書表示を実現しています。しかし、1バイトコード(半角)の表示に限り拡張フォントドライバを登録することができ、通常用いられるフォントとは別の(半角専用の)フォントを表示することができます。
英文のメッセージなど1バイトコードで文書を表示させたいような場合、この拡張フォントドライバと任意のフォントを用意すれば、とてもMSXとは思えないような美しい英文表示が可能となります。
拡張フォントドライバとは、DMシステム2が半角処理を行う際、ある条件下において半角フォントの取得先を変更できる特性を利用したマシン語ルーチンです。ただし単なるマシン語プログラムであり、DMシステム2のドライバとして認識される形では公開されません(その予定もありません)。よって通常のフォントドライバのエリアへこれを配置して使用することはできません。
FNTEXT12.BIN 12×12ドット拡張フォントドライバ FNTEXT8.BIN 8×8ドット拡張フォントドライバ ※ これ以外のサイズは順次対応する予定です。
このアーカイブには以下のファイルが梱包されています。
拡張フォントセット vol.1
ANKSET1.LZH (16KB)
- 拡張フォントドライバ (12ドット, 8ドット)
- ドライバのソースリスト (12ドット, 8ドット)
- サンプルプログラム 3点
- Magical Labyrinth Bold (8 pts.)
- Gigamix Small (8 pts.)
- Arial もどき (12 pts.)
- Fusion もどき (12 pts.)
- German Bold もどき (12 pts.)
- Macintoshもどき (12 pts.)
拡張フォントドライバを任意のアドレスへ配置します。拡張フォントドライバはリロケータブルな為、RAM内の自由な位置に配置できます。しかし訳あってページ0にはドライバを配置できません。CLEAR文でフリーエリアを確保してからドライバを配置するのが良いでしょう。
ex.) _load ("fntext12.bin",&HC000) ← ドライバをC000hへ配置
フォントデータをRAMまたはVRAMの任意のアドレスへ配置します。拡張フォントドライバはフォントデータがRAMとVRAMのどちらに配置されていても利用できます。ギガミックスが配布しているフォントデータには0000hから始まるBSAVEヘッダが付いています。配置するには
BLOAD "ファイル名",番地[,S]
フォントはページ0にも配置できます。3000h〜3FFFhの空きエリアを有効に使えばCLEAR文でBASICフリーエリアを削る際、領域を最低限に抑えることができるでしょう。
ex.) bload "fusion.fnt",&HC000 ← フォントFusionをRAMのCOOOhへ配置 _load("fusion.fnt",@65536!,,7) ← フォントFusionをVRAMの10000hへ配置 ギガミックスが配布していない既存のフォントデータも利用できる場合があります。が、ちょっとコツが必要です。
拡張フォントドライバの使用を宣言します。(イネーブル)
CALL CALL (ドライバの番地,動作モード,フォントの番地)
この命令以後の CALL KPRINT で半角文字のフォントが変わります。また、既存の各種装飾機能もそのまま利用できます。
動作モード 0 メインRAM上のフォント 1 VRAM(オフセットなし)のフォント 2 VRAM(オフセット 10000H)のフォント 255 拡張フォントドライバを無効化
※ CALL KPUT では正常に表示できません。
表示できる文字コードは20h〜7Ehの95文字となります。俗に言う「半角カナ」は表示できません。
英文フォントの横サイズの指定は通常の「半角分として数値を半分にしたもの」ではなく、実寸で指定します。ご注意ください。
ex.) _call (&HC000,0,&HD800) ← RAMのD800hに配置されたフォントを利用 _call (&HC000,2,0) ← VRAMの10000hに配置されたフォントを利用 拡張ドライバの使用中は全角文字が表示できません。通常の表示に切り替えるには、拡張ドライバを無効化してください。
ex.) _ksize (12,12) ← 12×12ドットで表示 また、拡張ドライバの二重イネーブル(連続する使用の宣言)は避けてください。拡張ドライバを無効化するときにフォントセレクタを正しい値に戻せなくなり、その後のKRPINTで暴走します。一度、拡張ドライバを無効化した後に宣言をやり直してください。
ちなみに無効化は CALL SYSON でもできます。
ex.) _call (&HC000,255) ← 拡張ドライバを無効化 _syson ← 同じく無効化
sample program
KPRINT5.BAS (2KB)
英文フォントは一般的に文字の横幅が不定で、文字によって横幅が違っています。漢字フォントのように横幅が一定のようにはデザインされていません。DMシステム2では文字の横幅イコール「次の文字への移動量」と定められている為、常に一定の文字間隔で表示されます。漢字ならこれでも構わないのですが、英文フォントのデザインによっては文字と文字との間に異様な空間ができてしまう場合があります。
そこでDMシステム2の「文字詰め機能」を用いることで、文字の空間を詰めることができます。文字詰めを行うと英文での表示がガラッと変わり、エレガントな英文表示を行うことができます。
CALL KINIT(設定項目)
設定項目については CALL KINITの説明を参照してください。
ex.) _kinit(16+2) ← 影と文字詰めを併用する ※ 横幅が一定のような英文フォントでは文字詰めは不向きかもしれません。
しかし文字詰めを利用するとものによっては逆に「詰め過ぎ」になる場合があります。 そこで次の文字への移動量を微調整する「文字間」を変えることで整形することができます。CALL KSIZE(横幅, 縦幅)
CALL KSIZEの説明を参照してください。文字詰めと文字間の調整が美しい英文表示へのカギとなります。
ex.) _ksize(12,12,2) ← 文字サイズを12×12、文字間を2ドットに設定
sample program
KPRINT6.BAS (2KB)
拡張フォントドライバで利用できるフォントデータは、ギガミックスが用意したもの以外に、自分で作ることもできます。フォントの作り方ですが、12×12ドットフォントは18バイト(2ラインで3バイト格納する手法です)、8×8ドットフォントは8バイトの羅列でできています。
そんなわけで8×8ドットのフォントにはMSXのパターンネームテーブルで定義できるフォントデータが(ほぼ)そのまま利用できます。8×8ドットのフォントはMSX-FAN(Mファン)の「ファンダム」などで馴染みがありますし、「自作ゲームには自作フォント」と言わんばかりに様々なフォントが公開されました。ああいったフォントをDMシステム2の装飾機能を織り交ぜて画面に表示させることができます。装飾がかかるだけで見た目は随分と変わるものです、ぜひお試しください!
例えば、こんな感じで8×8ドットのフォントデータは一般的にMSXパターンネームテーブルの領域をそのまま保存した2KBのファイルで構成されています。ただしDMシステム2ではフォントのアドレスの先頭は20hのコード(=スペース)で無ければなりません。よってパターンネームテーブルそのままのデータではコントロールコードの部分が混ざっていることで正常に表示できませんので、工夫が必要です。以下の対処法を参考にしてください。
1)20h未満のデータを削ってRAMへ配置する。
コントロールコードに割り当てられている32キャラ分、256バイトを飛び越してRAMへ転送する方法。CALL LOADの「オフセット指定」を利用します。
ex.) _load("a.fnt",&H3000,,256) ← 256バイト先から転送 _load("a.fnt",&H3000,,256+7) ← BSAVE形式なら更に7バイト削る 2)拡張ドライバのパラメータを変更する。
フォントデータはそのままRAMへ配置して、拡張ドライバの宣言時にコントロールコードを飛ばしたアドレスで指定する方法。
ex.) _call (&HC000,0,&H3000+256) ← 3000hに配置して、それから256バイト先
まだフォント生成のノウハウが溜まっていないので、今のところはBASICプログラムによるコンバートで実現しています。とりあえず、12×12ドットのフォントを以下のような形で左寄せに並べ、SCREEN 5のCGファイルをギガミックスへ転送していただければ、フォントデータにコンバートして差し上げます。
「こんなフォントが欲しい!」「使いたい!」というフォントのリクエストも募集しています。お気軽にギガミックスまでお寄せください。
(97/06/09)サンプル画を見ていただいた方はお気づきかもしれません。
フォントによっては、空白が広すぎるんですよ。特に small8 の空きかたは尋常じゃないです。これは、small8の平均的な横幅が3ドットで構成されているところに4ドットの空白(スペース)が作られるからです。さらに実際は文字間で1ドット足されるので、計5ドットの空白が幅を利かせています。文字よりも広い空白はやっぱり気になりますよね。small8の場合、空白は3ドットもあれば十分なんです。
フォントデータごとに「理想的な空白ドット」の情報を埋め込めばこのような不都合は回避されるでしょうが、はたしてそんな情報をどこに埋め込むべきでしょうか!?
今のところ、本来表示できない7Fhの先頭1バイト目に空白ドットの数値を埋め込む案が濃厚です。
(97/06/13)最新版のDMシステム2・6月11日β版のほうで解決できました。文字詰め時の文字間が横サイズの1/2に自動的に設定される、というものです。つまり8×8ドットの場合、文字間は4ドットになります。こちらで紹介されているサンプル画像は、最新のシステムを組み込むと文字間がちょうど良いくらいの間隔で表示されると思います。
Takashi KOBAYASHI (nf_ban@mic.chiba-net.or.jp)