Gigamix DM-SYSTEM2

拡張フォントドライバによる文字表示

updated:

第1章 概要

 DMシステム2では「16×16ドット」及び「12×12ドット」のフォントドライバによって漢字フォントを取り出し、文書表示を実現しています。

 しかし、1バイトコード(半角)の表示に限り拡張フォントドライバを登録することができ、通常用いられるフォントとは別の(半角専用の)フォントを表示することができます。

 英文のメッセージなど1バイトコードで文書を表示させたいような場合、この拡張フォントドライバと任意のフォントを用意すれば、とてもMSXとは思えないような美しい英文表示が可能となります。

第2章 拡張フォントドライバとは

 拡張フォントドライバとは、DMシステム2が半角処理を行う際、ある条件下において半角フォントの取得先を変更できる特性を利用したマシン語ルーチンです。

 ただし、これは現状単なるマシン語プログラムであり、DMシステム2のフォントドライバとして認識される形では公開されません(その予定もありません)。よって、通常のフォントドライバのエリアへこれらを配置して使用することはできません。

当クラブで配布する拡張フォントドライバ
ファイル名 用途
FNTEXT12.BIN 12×12ドット拡張フォントドライバ
FNTEXT8.BIN 8×8ドット拡張フォントドライバ
※これ以外のサイズは順次対応する予定です。
ANKSET1のサンプル画像
Download DSK(35KB)
Run ds2ank_ankset1.dsk on WebMSX

このアーカイブには以下のファイルが梱包されています。

  • 拡張フォントドライバ (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.)

第3章 DMシステム2からの使用方法

 拡張フォントドライバを用いる場合も、基本的に通常の漢字装飾機能がそのまま使えます。ただし事前に拡張フォントドライバを使用可能な状態にしておかなければなりません。

3.1 拡張ドライバをRAMへ配置する

 拡張フォントドライバを任意のアドレスへ配置します。拡張フォントドライバはリロケータブルな為、RAM内の自由な位置に配置できます。

 ただし、仕様上ページ0にはドライバを配置できません。CLEAR文でフリーエリアを確保してからドライバを配置するのが良いでしょう。

ex.)
CALL LOAD("fntext12.bin",&HC000) ← ドライバをC000hへ配置

3.2 半角フォントをメモリへ配置する

 フォントデータをRAMまたはVRAMの任意のアドレスへ配置します。拡張フォントドライバはフォントデータがRAMとVRAMのどちらに配置されていても利用できます。

 当クラブが配布しているフォントデータには0000hから始まるBSAVEヘッダが付いています。配置するには以下のように命令します。

BLOAD "ファイル名",番地[,S] または CALL LOAD("ファイル名",番地,,7)
ex.)
BLOAD "fusion.fnt",&HC000 ← フォントFusionをRAMのCOOOhへ配置
CALL LOAD("fusion.fnt",@65536!,,7) ← フォントFusionをVRAMの10000hへ配置

 フォントデータはページ0にも配置できます。3000h~3FFFhの空きエリアを有効に使えばCLEAR文でBASICフリーエリアを削る際、領域を最低限に抑えることができるでしょう。

 当クラブが配布していない既存のフォントデータも利用できる場合があります。

3.3 拡張ドライバの初期化と利用

 拡張フォントドライバの使用を宣言します。(イネーブル)

CALL CALL(ドライバの番地,動作モード,フォントの番地)
動作モード
パラメータ 用途
0 メインRAM上のフォント
1 VRAM(オフセットなし)のフォント
2 VRAM(オフセット 10000H)のフォント
255 拡張フォントドライバを無効化

 この命令以後の CALL KPRINT で半角文字のフォントが変わります。また、既存の 各種装飾機能 もそのまま利用できます。

※表示できる文字コードは20h~7Ehの95文字となります。いわゆる「半角カナ」と呼ばれる文字コードは表示できません。
※CALL KPUT は無効につき、正常に表示できません。

ex.)
CALL CALL(&HC000,0,&HD800) ← RAMのD800hに配置されたフォントを利用
CALL CALL(&HC000,2,0) ← VRAMの10000hに配置されたフォントを利用

 英文フォントの横サイズの指定は通常の「半角分として数値を半分にしたもの」ではなく実寸で指定しますので、ご注意ください。

ex.)
CALL KSIZE(12,12) ← 12×12ドットで表示

 拡張ドライバの使用中は全角文字が表示できません。通常の表示に切り替えるには、拡張ドライバを無効化してください

 また、拡張ドライバの二重イネーブル(連続する使用の宣言)は避けてください。拡張ドライバを無効化するときに フォントセレクタ を正しい値に戻せなくなり、その後のKRPINTでシステムが暴走します。一度、拡張ドライバを無効化した後に宣言をやり直してください

 ちなみに無効化は CALL SYSON でも実行できます。

ex.)
CALL CALL(&HC000,255) ← 拡張ドライバを無効化
CALL SYSON ← 同じく無効化

第4章 拡張フォントドライバの文字装飾

4.1 文字詰め(プロポーシャナル化)

 英文フォントは一般的に文字によって横幅が違っています。日本語の等幅フォントのように横幅が一定のようにデザインされていません。

 DMシステム2では文字の横幅イコール「次の文字への移動量」と定められている為、常に一定の文字間隔で表示されます(等幅化)。日本語ならこれでも必要十分なのですが、英文フォントのデザインと文字の組み合わせによっては文字間に異様な広さの空間ができてしまう場合があります。

 そこでDMシステム2の「文字詰め機能」を用いることで、文字の空間を詰める(プロポーショナル化)ことができます。文字詰めを行うと英文での表示がガラッと変わり、エレガントな英文表示を行うことができます。

CALL KINIT(設定項目+16)

※設定項目については CALL KINIT の説明もご参照ください。

ex.)
CALL KINIT(16+2) ← 影と文字詰めを併用する

※横幅が一定のような英文フォントでは文字詰めは不向きかもしれません。

4.2 文字間(カーニング)

 文字詰めを利用するとものによっては逆に「詰め過ぎ」になる場合があります。そこで次の文字への移動量を微調整する「文字間(カーニング)」を変えることで整形することができます。

CALL KSIZE(横幅, 縦幅 ,文字間)
ex.)
CALL KSIZE(12,12,2) ← 文字サイズを12×12、文字間を2ドットに設定

CALL KSIZE の説明もご参照ください。

 文字詰めと文字間の調整が美しい英文表示へのカギとなります。

4.3 8×8フォントの作成方法・リサイクル

 拡張フォントドライバで利用できるフォントデータは、当クラブが用意したもの以外に、自分で作ることもできます。

 8ドットフォントのデータ構造は、1文字8バイトの羅列です。つまり、MSXのパターンネームテーブルで定義するフォントデータが(ほぼ)そのまま利用できます。8ドットフォントは各種キャラクタエディタで作成したデータはもちろん、MSX・FAN(Mファン)の「ファンダム」などで馴染みがありますし、パソコン通信ネットでも様々なフォントデータが公開されました。

8ドットフォントのサンプル
例えば、こんな感じで

 それらのフォントをDMシステム2の装飾機能を織り交ぜて画面に表示させることができます。装飾がかかるだけで見た目は随分と変わるものです、ぜひお試しください。

 8ドットフォントデータの作成方法については 楽しいフォントいじり!MSXの8pxフォントを簡単にデータ化する方法(2021年版) - Gigamix Online をご覧ください。

 8ドットフォントデータは一般的にMSXのパターンジェネレータ・テーブルの領域をそのまま保存した2KBのファイルで構成されています。ただしDMシステム2ではフォントの先頭アドレスが20h(半角スペース)用のデータで無ければなりません。よってパターンジェネレータ・テーブルそのままのデータではコントロールコードの部分が混ざっていることで正常に表示できませんので、工夫が必要です。以下の対処法を参考にしてください。

1) 20h未満のデータを削ってRAMへ配置する。

 コントロールコードに割り当てられている32キャラ分(256バイト)を読み飛ばしてRAMへ転送する方法。CALL LOADの「オフセット指定」を利用します。

ex.)
CALL LOAD("a.fnt",&H3000,,256) ← 256バイト先から転送
CALL LOAD("a.fnt",&H3000,,256+7) ← BSAVE形式ファイルなら、更に7バイト読み飛ばす

2) 拡張ドライバのパラメータを変更する。

 フォントデータはそのままRAMへ配置して、拡張ドライバの宣言時にコントロールコードを飛ばしたアドレスで指定する方法。

ex.)
CALL CALL(&HC000,0,&H3000+256) ← 3000hに配置し、256バイト先を指定する
CALL CALL(&HC000,0,&H3000+256+7) ← BSAVE形式ファイルなら、256+7バイト先を指定する

4.4 12×12フォントの作成方法

 12×12ドットフォントのデータ構造は、1文字18バイト(2ラインで3バイト格納する手法)の羅列です。フォントの先頭アドレスが20h(半角スペース)用のデータとなり、95文字分のデータ量となります。

12ドットフォントのサンプル
例えば、こんな感じで

 現状ツールが整備できていないため、当クラブのBASICプログラムによるコンバートで実現しています。とりあえず、12×12ドットのフォントを以下のような形で左寄せに並べ、SCREEN 5のCGファイルを当クラブへ転送していただければ、フォントデータにコンバートしますので、詳しくはご連絡ください。

第5章 MSXView仕様 拡張フォントドライバの利用方法

 「MSXView仕様 漢字ROM」用のフォントドライバ(FNT-VIEW)は、通常利用時の12pxフォントに加え、拡張フォントドライバによる12×8pxの縮小フォントも表示可能です。このドライバだけの利用方法をご説明します。

縮小フォントの有効化

CALL PEEKS(&H7600,8,A$):IF A$<>"MSX-View" THEN STOP ←フォントドライバが適切にインストールされていない場合は続行不可能なので処理を中止してください
CALL BLOCK(&H7633,&H4300+187,8) ← MSXView仕様 12×8px 拡張フォントドライバを有効化します

縮小フォントの文字表示

CALL POKE(&H4300+174,3):CALL KSIZE(6, 8,0):CALL KPRINT("<文字列>") ← 縮小フォント(12×8px)で表示します
CALL POKE(&H4300+174,0):CALL KSIZE(6,12,0):CALL KPRINT("<文字列>") ← 通常フォント(12×12px)で表示します

※縮小フォントで文字表示を行う場合、CALL KPUTは利用できません。

表示サンプル
MSXView仕様 漢字ROMの通常フォントと縮小フォントを同時に表示するサンプルプログラム
Download DSK(26KB)
Run ds2kanji_fnt-view.dsk on WebMSX

[Back]トップページへ