
BASICのput kanji文では1命令でたった1文字しか表示できない…。かと言って漢字BASICを使うと確かに漢字を表示するのは簡単ですが、事実上MSX2+以降対応になってしまう…。
そこで我々は、強力な漢字表示機能を搭載、しかもノーマルMSX2から動作してしまうDMシステム2を皆さんへオススメします。DMシステム2は漢字文字列のエディットこそできませんが、表示に関してはMSX業界屈指の完成度を自負しています。
※「BASICリファレンス」も合わせてご覧ください。
ビットは0でoff、1でonになり、8ビット(1バイト)の数値で設定します。初期化するとすべて0(off)になります。
表示したい装飾機能を事前に決めてから、これを決めてください。
ビット設定は慣れるまで難しい…。慣れないうちは2進数のまま8ビットを設定すると分かりやすいと思います。
※CALL KCOLORでは以下の制限があります。
それでも_xyを使えば、点を打つ手間が省ける上(笑)、screen 5以上の画面モードでは画面外のy座標を設定することによって裏画面の座標を設定することができます。(+256ごとに次のページ)
※CALL KPRINTでは以下の制限があります。
※screen 4以下の画面モードでは無効になります。
文字の1ライン目に対して斜体テーブルが有効になるのはテーブルの先頭アドレスから32バイト先になります。32バイト目よりも前のデータは
次に、DMシステム2のインフォメーションエリアを下記のように書き換えます。
文字の1ライン目に対して色テーブルが有効になるのはテーブルの先頭アドレスから32バイト先になります。32バイト目よりも前のデータは
※「装飾単位」モードでは利用できません。
しかし日本の廉価版MSX2では漢字ROMが搭載されなかったモデルも発売され、しかもその廉価版がきっかけでMSX市場が伸びた過去がある為、結果的に漢字ROMの搭載されなかったMSXが数多く出回りました。こういったマシンでは当然のことながら漢字表示ができません。よって市販のゲームソフトでもソフトにフォントを内蔵したり、半角だけで表示するなどして苦境を乗り越えていました。
DMシステム2でもやはり漢字ROMを利用していますが、漢字ROM以外に外部(RAM、VRAM、スロット等)でフォントを用意することができれば、DMシステム2ではそのフォントを利用して漢字表示が行えます。
そういった際に必要なのがフォントドライバです。フォントドライバとは、表示したい漢字のフォントデータを漢字ROM等、既存のメモリからデータを取り出す専門のルーチンです。
フォントドライバは基本的に「16×16ドット」「12×12ドット」の2種類を登録でき、その出荷時の設定は以下の通りです。
12×12と16×16の両方のドライバが有効な場合、表示サイズによってそのとき使用するドライバが自動的に決められます。具体的には
"MSX View"はturboR専用のGUIソフトですが、付属の漢字カートリッジ自体はMSX2や2+でも利用できることから、MSX系のパソコン通信で流通しているフリーソフトではこの漢字フォントをサポートする傾向にあります。もちろんDMシステム2でもこの漢字フォントを「12×12ドットフォント」として標準でサポートする用意があります。
フォントドライバの変更は「ユーティリティーディスク」のセットアップツールで行います(自力でドライバを変更することもできます)。また、最近ではDMシステム2を搭載したソフトが、自動的にフォントドライバを変更して漢字表示できるよう作られたものもあります。
これまでの手法ではクリエイターは漢字ROMの搭載されていないMSX2ユーザーに対して「漢字ROMが無いなら諦めてください」と言うしかありませんでしたが、DMシステム2を利用すれば「なんか漢字フォントになるものを探してください」となり、あとはユーザーの努力次第ということになります。
漢字ROMカートリッジを探し出すより、現在では似非RAMカートリッジを製作したほうがてっとり早い現状を考えると、ユーザーに「使える」可能性だけでも残しておく事はとても有益ではないかと思っています。
できれば、ソフトの初期設定プログラム中に漢字表示が可能かどうかをチェックし、表示ができないようなら別のドライバに差し替えるくらいの「気配り」を作ると最高なのですが。
気になる漢字BASICからの移行は、DMシステム2上でのプログラムの表記は「漢字BASIC」と似ていることから、比較的容易に行えるはずです。漢字BASICを利用することでどうしても生じるデメリット(メモリが制限されたり、FM音源を併用すると動作不安定になる)が、DMシステム2ではまずありませんので、ぜひ漢字BASICからの移行をオススメします。
機種間・規格間の動作の違いについても、現在ギガミックスで確認できる機種についてはすべて共通した動作をしています(フォント自体のデザインによる表示の違いは考えないことにします)。MSX2、MSX2+、MSXturboR、fMSXの4規格を越えて共通した動作環境をDMシステム2では自信を持って提供します。
つまるところ、漢字ROMが無いMSX2でも、RAMさえあればなんとかなるわけです。
なお、半角に限り「第3のフォントドライバ」を登録するという裏ワザが使えます。このドライバ(とフォントデータ)を用意すれば、漢字表示で使用されるフォントデータとは別の、違うフォントで表示できたりします。
ですが、DMシステム2のインストール後に漢字BASICをインストール(CALL KANJIを実行)するとMSXが極端に不安定になり、MSX-JEで文字入力した途端いきなり暴走したり、誤動作を起こす場合があります。最悪の場合、ユーザー辞書や学習内容が消えることもあります。
安定したプログラミング環境を構築するには、以下の手順に従ってください。
※「装飾単位」モードでは利用できません。
DMシステム2の漢字表示機能では、処理の高速化の為、あえてVDPの処理終了をチェックしていません。
しかしVDPの処理終了チェックを省いたことにより、漢字表示後の処理によっては漢字表示が正常に行われない現象が生じることがあります。特に、LINE文やCOPY文などで描画を開始した(VDPコマンドを実行した)直後に、漢字表示など新たな描画命令がその描画中の領域へ上書きするような場合に、この現象が生じます。
これを未然に防ぐ為、DMシステム2にはVDPの処理中かどうかをチェックし、処理中ならウェイトがかかる CALL VDPWAIT という命令があります。もし漢字表示が崩れる場合はそれらの処理直後に CALL VDPWAIT を追加してみてください。
なお、文字列表示中、x座標が画面サイズを超えた場合は、以降の文字列は無視されますので、画面サイズを超えないような座標を指定し直してください。
第1章 概要
日本人ならメッセージは漢字混じりで伝えたい…しかしMSX2で漢字の文字列を表示するのは、実は結構大変な作業です。漢字に対するMSX自体の機能が貧弱だからです。
※ MSX2で漢字BASICを利用するには日本語MSX-DOS2カートリッジやHBI-J1等の周辺機器が必要です。しかしこれらの周辺機器は現在入手が非常に困難です。
そしてなにより、たかだか漢字を出したいが為に漢字BASICを用いることで、事実上「MSX2+以降対応のソフト」となってしまうのはヒジョーに勿体ない…MSXユーザーが減る今でこそ、MSXユーザーの共存を考える必要があるのに…。
第2章 DMシステム2からの使用方法
漢字装飾機能が豊富な為、表示する前に設定する項目が沢山あります。DMシステム2では以下の8命令で漢字表示を行います。
_ KBOLD ([文字x][,y][,縁x][,y][,影x][,y]) 太さの設定
_ KCOLOR ([文字][,背景][,縁][,影]) 色の設定
_ KINIT ([設定項目][,影x][,影y][,斜体table][,色table]) 装飾効果の設定
_ KPRINT (文字列[,制限文字数])[,TPSET] 漢字の表示
_ KPUT (文字列[,制限文字数])[,TPSET] 漢字の表示
_ KSIZE ([横][,縦][,文字間]) 表示サイズの設定
_ XY (X座標,Y座標) 表示位置の設定
2.1 漢字機能の初期化
まずこの命令でDMシステム2の各種装飾効果の設定を初期化してください。
CALL KINIT
初期化を省くと以前の設定を引きずることになります。ワザと引きずる場合は、これを実行する必要はありません。
ex.)
_kinit ← 漢字機能の初期化
2.2 各種装飾の設定
DMシステム2の漢字機能で使用できる装飾効果8項目をビット単位で具体的に設定します。
CALL KINIT(設定項目)
b7 b6 b5 b4 b3 b2 b1 b0
i C R P V I S B
~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ bit0 縁取り (0:off 1:on)
| | | | | | +--- bit1 影 (0:off 1:on)
| | | | | +------ bit2 斜体 (0:off 1:on)
| | | | +--------- bit3 方向 (0:横書き 1:縦書き)
| | | +------------ bit4 文字詰め (0:off 1:on)
| | +--------------- bit5 処理単位 (0:文字 1:装飾)
| +------------------ bit6 色変更 (0:off 1:on)
+--------------------- bit7 インターレース (0:off 1:on)
縁取り(bit0)
文字の周りに縁取りを書きます。縁取りの色と太さも変更できます。
影(bit1)
文字に影を書きます。影の位置は文字の左上を起点にします。
影の位置や色、太さも変更できます。
斜体(bit2)
文字を斜体(やや斜めに傾いた形)にします。
オリジナルの斜体を作ることもできます。
方向(bit3)
0:横書き 文字列を横書きで表示します。
1:縦書き 文字列を縦書きで表示します。
文字詰め(bit4)
文字(漢字フォント)のデザインによる空白を埋めて、文字同士がピッタリと密着します。
同じ文字数の文字列を並べて表示しても、文字詰めをonにすると文字のデザインによっては表示した文字列の長さが揃わないことがあります。
※縦書きモードでは文字詰めは無効になります。
処理単位(bit5)
後述のkprintやkputで表示する文字列に対して行う処理を文字単位で区切るか、装飾単位で区切るかを決定します。
0:文字単位 設定されたすべての各種装飾を1文字ずつ処理し終えてから次の文字を処理します。
1:装飾単位 設定された各種装飾1行分を一気に処理してから次の装飾を処理します。
装飾単位にすると、影は影で一行書いた後に文字を一行重ねる感じになります。これは、影の位置が文字の位置よりも左にあった場合、一つ前の文字を影で潰してしまうことを回避する為に用意されています。
※装飾単位では以下の制限があります。
色変更(bit6)
文字の1文字(または1ライン)ごとに色を変更します。
色を設定する色テーブルは事前に用意しておく必要があります。
インターレース(bit7)
漢字をインターレース表示にします。インターレースonにするとVRAMの次のページを使用し、縦に小さい文字が表示できます。
※インターレースはscreen 5以上のVRAMモードで使用できます。
実際の使用法:
ex.)
_kinit(1) ←縁取りだけon
_kinit(2) ←影だけon
_kinit(4) ←斜体だけon
ex.)
_kinit(&B00000001) ←縁取りだけon
_kinit(&B00000010) ←影だけon
_kinit(&B00000011) ←影と縁取りをon
_kinit(&B00000111) ←斜体と影と縁取りをon
_kinit(&B00001111) ←上のに文字詰めonを追加
_kinit(&B10001111) ←さらにインターレースonを追加

![]()
sample program
KPRINT.BAS (2KB)
2.3 文字の太さの設定
表示する漢字文字列の「太さ」を設定します。
CALL KBOLD(文字x,文字y,縁取りx,縁取りy,影x,影y)
太さはドット単位でそれぞれ1〜16を設定できます。ただしあまり太すぎると文字のサイズ(後述)によっては本来の文字が潰れて見えなくなってしまうことがありますので、ほどほどにしておきましょう(笑)。
影だけに関しては、影xか、影yに0を入れると、縁取りと文字の太さによって影の太さを自動的に計算します。不自然な影を作らない為の機能です。
ex.)
_kbold(2,1) ←文字の横への太さを2にする
_kbold(,,3,3) ←縁取りの太さをxyそれぞれ3に
_kbold(,,,,3,3) ←影の太さをxyそれぞれ3にする
※97年6月3日の時点ではまだ自動的に計算しないようです(^^;
ex.)
_kbold(2,1,3,3,0,0) ←影xの太さは2+3=5、影yは1+3=4
2.4 文字の色の設定
表示する漢字文字列の「色」を設定します。
CALL KCOLOR(文字色,背景色,縁取り色,影色)
色はMSX2のカラーコードと同等のものです。表示するスクリーンモードによってはカラーの設定が変わりますのでご注意下さい。
ex.)
_kcolor(15,0) ←文字色を15、背景色を0
_kcolor(,,3) ←縁取り色を3
_kcolor(172,,,64) ←文字色を172、影色を64 (screen 8)
2.5 文字のサイズの設定
表示する漢字文字列のサイズ(大きさ)を設定します。
CALL KSIZE(横サイズ,縦サイズ)
サイズはドット単位で1〜64で設定しますが、横サイズは「半角」単位で設定します(よって横サイズは1〜32になります)。
ex.)
_kbold(8,16) ←16×16ドットを設定
_kbold(4,12) ←8×12ドットを設定
2.6 文字の位置の設定
表示する漢字文字列の表示座標を設定します。
CALL XY(x座標,y座標)
実は、単にMSX2のシステムワークである「グラフィックアキュムレータ」を読んで、位置を設定するだけです。よって、pset文等、既存の命令で設定することもOKです。
ex.)
pset(128,64) ←表示開始座標を(128,64)に設定
draw"BM128,64" ←上に同じ
_xy(128,64) ←上に同じ
ex.)
pset(512,64) ←screen 5ではページ2の(0,64)
2.7 そしてようやく漢字表示
設定された装飾機能を用いて、漢字文字列を表示します。
CALL KPRINT("文字列")
_kprint は _k? と略すこともできます。
ex.)
_kprint("うなぎ大王") ←「うなぎ大王」を画面に表示
_k?("うなぎ大王") ←上に同じ
2.8 ロジカルオペレーション付き・漢字表示
表示したい漢字文字列に対し、MSX2以降のVDP(V9938/V9958)で対応する「ロジカルオペレーション」をかけることができます。
CALL KPRINT("文字列"),ロジカルオペレーション
ロジカルオペレーションはcopy文で使用できるものがそのまま流用できます。特に「背景との重ね合わせ(,tpset)」は多用されることでしょう。
ex.)
_k?("馬なり"),AND ←「馬なり」をANDで表示
_k?("馬なり"),TPSET ←「馬なり」をTPSETで表示
_k?("馬なり"),TXOR ←「馬なり」をTXORで表示
2.9 機能限定・高速漢字表示
装飾を簡略化し、表示を高速化します。
CALL KPUT("文字列")
装飾が簡略されるとは言いつつも、とりあえず影だけは文字の横に付きます。とにかく文書を速く表示させたい場合に用いましょう。
※CALL KPUTでは以下の制限があります。
![]()
第3章 ちょっとマニアックな活用方法
3.1 影の位置
通常、影は文字の左上の座標(0,0)に表示させており、そのままでは影が文字に潰されて、結果的に影が見えません。が、影の位置は何も(0,0)である必要はなく影の位置を自由に設定できます。
CALL KINIT(設定項目)
影の位置は文字の左上の位置から縦横それぞれ-128〜127で設定できます。
ex.)
_kinit(,3,3) ←文字の位置から(3,3)で影を表示
※ 影の位置を文字の位置より左 又は 上へ設定すると、サイズや太さによっては影で一つ前の文字を潰してしまうことがあります。
3.2 オリジナルの斜体テーブル
DMシステム2が用意している斜体以外にも、オリジナルの斜体を作ることができます。
CALL KINIT(設定項目,影位置x,影位置y)
「斜体テーブル」を事前に作成して、その先頭アドレスを代入してください。
「斜体テーブル」は1ラインごとに左端からの移動量-128〜127を設定、表示サイズy分+32を用意する必要があります。また、影や縁取りなどの装飾効果を行った際は、その太さ分だけさらにテーブルを用意する必要があります。
など、文字の1ライン目よりも上のラインへ表示を行うような装飾効果を行った際に、それぞれのラインに対して有効になります。
※ 太さ1の縁取りをかけた場合、斜体テーブル+31バイト目からデータを用意することになります。
ex.)
_kinit(,,,&HC000) ←斜体テーブルをc000hと設定
![]()
sample program
KPRINT2.BAS (2KB)
3.3 「色変更」モード用の色テーブル
_kinitには文字の色を1ラインごとに可変できる「色変更」モードがあります。その際に必要なのが「色テーブル」です。
CALL KINIT(設定項目,影位置x,影位置y,斜体テーブル)
斜体テーブルと同様、「色テーブル」を事前に作成して、その先頭アドレスを代入してください。
CALL POKE(&H4300+141,&B10001100) ← 文字に対して色変更をかける
CALL POKE(&H4300+149,&B10001100) ← 縁取りに対して色変更をかける
CALL POKE(&H4300+157,&B10001100) ← 影に対して色変更をかける
「色テーブル」は1ラインごとにカラーコードを設定、表示サイズy分+32を用意する必要があります。また、影や縁取りなどの装飾効果を行った際は、その太さ分だけさらにテーブルを用意する必要があります。
など、文字の1ライン目よりも上のラインへ表示を行うような装飾効果を行った際に、それぞれのラインに対して有効になります。
※太さ1の縁取りをかけた場合、色テーブル+31バイト目からデータを用意することになります。
色変更を終了させるには CALL KINIT を実行するか、書き換えた各インフォメーションエリアに &B10000000(128) を書き込んでください。
ex.)
_kinit(,,,,&HC000) ←色テーブルをc000hと設定
![]()
sample program
KPRINT3.BAS (2KB)
3.4 文字間
表示する漢字文字列に「文字間」を設定します。ここをいじれば文字間を詰めたり、広げたりできます。
CALL KSIZE(横サイズ,縦サイズ)
ex.)
_ksize(,,4) ←常に4ドット開けて文字列を表示する
3.5 文字表示に効果音を付ける
インフォメーションエリアの「効果音番号(KJSE:4300h+199)」へSE番号を代入することにより、1文字表示するごとに効果音が鳴るようになります。ゲームのメッセージ表示などに用いると面白そうです。
当然のことですが、これを実行する前に、事前にSEデータをメモリへ用意しておく必要があります。call setseによるSEの初期化も必要です。
ex.)
_poke(&H4300+199,3) ←1文字ごとにse #3を鳴らす
※「装飾単位」モードでは利用できません。
※ 効果音については「効果音機能(ds2se.txt)」をご覧ください。
※ 空白(半角ではCHR$(32)以下、全角は" "のみ)は効果音が鳴らないようにして欲しいですm(__)m。ふる君向け要望。
3.6 表示スピードを変える
インフォメーションエリアの「ウェイト(KJWAIT:4300h+195)」へ1/60秒単位の数値を代入することにより、文字列の表示スピードを調節できます。これもゲーム向けと言えます。
ex.)
_poke(&H4300+195,3) ←1文字ごとに3/60秒待つ
第4章 外部フォント
4.1 漢字表示とフォントドライバ
DMシステム2では通常、多くの機種に搭載されているMSX標準・16ドット漢字ROMを用いて漢字表示を行っています。
DMシステム2に対応しているフォントドライバを差し替えれば、漢字ROM以外のフォントを利用できるようになります。
16×16ドット
MSX標準・漢字ROM
12×12ドット
松下仕様・12ドット漢字ROM ※ MSXView(A1GT内蔵)12ドット漢字ROMへ変更予定
片方のドライバのみが有効な場合、すべてのサイズでその有効なドライバが使用されます。
4.2 プレイヤーから見たメリット
前述の「逃げ道」とはこのことで、漢字ROMは無くともオリジナルの漢字フォントを用意できるMSX2ユーザーは、この周辺機器に対応したフォントドライバを組み込むことで漢字ROMの搭載したハード環境とほとんど同じように漢字を表示できる仕組みです。これはDMシステム2上で動作するソフトウェアすべてに共通します。「漢字ROM(または漢字BASIC)が無いMSX2には対応しない」という、対象ユーザーを限定してしまう今までの手法では到底実現しなかった画期的なものです。
※ ハードウェア的に漢字ROMと互換になるわけではありません。put kanji文や漢字BASICによる漢字表示に効果が出ることもありません。
漢字ROMカートリッジが入手できないというアナタ、諦めないでください。最近では似非RAMカートリッジへ"要町 as MSX-View"をインストールすれば、「MSX View」互換のカートリッジを自作することができ、DMシステム2で漢字表示が可能という新たな抜け道が実現しました。
4.3 クリエイターから見たメリット
DMシステム2でソフトを構築すれば、非漢字ROMユーザーのことを意識せずに漢字ROMを使ういつもの感覚でプログラミングできます(それでいて非漢字ROMユーザーへの対応も兼ねているのですから、至れり尽くせり!!)。
※ ギガミックスのソフトでは初期設定プログラムで漢字表示をチェックし、漢字表示がどうしても行えない場合、ANKフォントドライバをインストールして、半角文字を強引に全角文字として表示させています。
4.4 マッパRAMへフォントを転送してしまう!
これらのような128KB以上のRAMを積んだMSXでは、そのマッパRAMへ漢字フォントをインストールすることにより、なんと、そのフォントをDMシステム2上で利用することができます。
※ ハードウェア的に漢字ROMと互換になるわけではありません。PUT KANJI文や漢字BASICによる漢字表示に効果が出ることもありません。
マッパRAMに対応したフォントドライバが公開されており、その利用法も公開されています。特に海外製のfMSXでは漢字ROMをサポートしていないものが多いので、これを利用すればMSX上で漢字を表示することができます。
第5章 補足
5.1 半角文字(ANK)について
基本的にフォントドライバがサポートしている漢字フォントの半角文字を使用します。半角文字が無い漢字フォントの場合は、半角文字が出ないこともあります。そんなときはドライバの作者さんにおねだりしましょう(^^;。
5.2 漢字BASICとの共存について
プログラミングは漢字BASIC、プログラムの実行(表示)はDMシステム2という、DMシステム2と漢字BASICとの共存は、実は可能です。
5.3 エスケープシーケンス(ESC)について
_kprint(_k?)の文字列中にCHR$(27)に続く以下のコードを埋めこむことにより装飾機能を一時的に変更することができます。これを使用すると突然文字を大きくしたり、色を変えたりできます。
なお、文字列表示中に文字サイズを変更した際、ベースラインは常に下になります。
[3nm ※ANSI互換
文字色 (n=0〜7)
[4nm ※ANSI互換
背景色 (n=0〜7)
[m ※ANSI互換
初期化 (文字色:7 背景色:0)
"]F"+CHR$(c)
文字色
"]B"+CHR$(c)
背景色
"]S"+CHR$(c)
影色
"]O"+CHR$(c)
縁色
"]f"+CHR$(32+x)+CHR$(32+y)
文字の太さ
"]s"+CHR$(32+x)+CHR$(32+y)
影の太さ
"]o"+CHR$(32+x)+CHR$(32+y)
縁取りの太さ
"]s"+CHR$(32+x)+CHR$(32+y)+CHR$(32+z)
文字サイズ・文字間
※ESCコードにより変更された内容はその文字列内でのみ有効です。
5.4 漢字表示が崩れるトラブルについて
MSXに搭載されたVDP(V9938/V9958)には、VDPコマンド実行直後、それを描画する領域に他のVDPコマンドを実行すると以前の処理がキャンセルされて描画が正常に行われない、という弱い仕様があります。
MSXのVDPには「VDPコマンドとI/Oアクセスは同時に実行できる」という裏技(!?)があるので、CALL KPUT に限り「画面塗りつぶしと漢字表示を同時に処理」なんてマニアックな使い方ができます。
Copyright (c) 1998 GIGAMIX, All rights reserved.