杉之原名人~1988年頃の月刊絵夢絶党より厚顔にも絵夢絶党で新日本電気製品の講座を始める私をお許しください。掟破りであることは重々存じております。これも新時代への布石、「花の色はうつりにけりないたずらに............」と小野小町も詠んでおります。このところストロボ・浦城氏に日曜日ごとに発破をかけられ、MS-DOSのマクロアッセンブラ(MASM)をほぼ使えるようになりました。片足をどぶに突っ込んだ心境の今日このごろです。この講座は、私の開き直りと受け取っていただいて結構です。80286)の両方から(同時には無理ですが)アクセスできることは周知の通りです。ここでVM以降の機種では、GRCG(グラフィック・チャージャー)と呼ばれるグラフィック画面に関する特殊なハードウェアが追加されています。Write)モードと名付けられています。今回、この中のTDWモードを使用した超高速タイルパターン塗りつぶしルーチンを紹介します。(今のところどういうわけかGRCGを使用したユーティリティーを見たことがないので.........)TDWモードというのは、予め専用のタイルレジスタにR,G,B,Iのタイルパターン(8bit)を設定しておき、CPUがグラフィックVRAMをアクセスしたとき、CPUがライトしたデータを無視して、予め設定しておいたタイルパターンを4画面同時に書き込むという機能を持ったモードです。CPUは単色画面1枚分のアクセス(640×400で32KB)をするだけで済みます。この機能を使えば、容易に理論上従来の4倍の高速化が可能になることがわかると思います。要するにTDWモードというのは、1画面分のアクセスで4画面(輝度画面[インテンシティー]がないときは3画面)分がアクセスできるんだと考えて差し支えありません。GRCGの制御ポートを示します。タイルパターンM:“0”でTDW、“1”でRMWモード。I:“1”でIプレーンが無効。G:“1”でGプレーンが無効。R:“1”でRプレーンが無効。B:“1”でBプレーンが無効。TDWモードで使用するには、I/Oポートの7CHに80Hを出力したのちに、7EHにB→R→G→Iの順にタイルデータを出力すれば設定完了です。Iプレーンが無い場合は3回の出力のみで問題ありません。次回モードレジスタに書き込みが発生した地点でタイルレジスタが初期化されるからです。タイルレジスタは8bitですが、VRAMに対してワードアクセスすると、自動的に16bitに拡張されるので感心してしまいます。リストを見れば一目瞭然ですので、よくわからなければそちらの方を参照してみてください。GRCGのTDWモードの使用方はこれで大体わかっていただけたと思います。ちなみにVM21以降の機種でもGRCGは当然使用できます。Charger)が搭載されているので、GRCGの上位機能コンパチであるとともに、以上の機能がGDCからも使用できるようになっています(VM以前はGDCからは不可能)。第2話:GDCの悪用(1)GRCGを使用することにより、CPUから見た処理は約4倍は高速化したことになりますが、これで満足していたのでは欲がありません。今度はGDCをいじってみることを考えてみます。(※ただし、実際の実行速度は4倍にはなりません。見かけ上は4プレーン同時書き込みしているように見えますが、ハード的にはプレーンを切り替えて4回V-RAMメモリへの書き込みを行っているからです。)ここにCSRFORM(カーソル・フォーム)コマンドがあります。このコマンドはテキストモードではカーソルの表示形態を定義するために用いるものですが、他に1行中のライン数を決定する機能も有しています。このライン数は1~32本までリニアに変更することができるのです。グラフィックGDCでは、通常この値は1本になっていますが、例えばこれを4本にすると、VRAM上の横1ラインがディスプレイ上では4ラインになって表示されます。垂直方向の解像度が4分の1になったことになります。PC-9801のグラフィック画面が640×100×8面(カラー)になったわけです。ここまで書けば利用法は想像できますね。1行のライン数を最大の32本に設定すれば、垂直解像度は12.5になったことになりますから、13×40=520で、GRCGの4画面同時書き込み(TDWモード)と組み合わせることにより、わずか520ワードのライトで任意のタイルパターン(8bit)でカラー1画面が塗りつぶせることになります。ちなみに同じクロックでも、ノーマルなPC-9801F/Mのルーチンと比較して、8色モードで約90倍のスピードアップを実現します。右にCSRFORMコマンドの実際の使用法について説明します。フォーマットを以下に示します。A0H)をあらわします。これらを順に指定ポートに出力すればそれでおしまいです。P2以降は特に設定しなくても構いません(次のコマンドが設定された時点でキャンセルされます)。0CSRFORMコマンドフォーマット以下にアッセンブルリストを掲げます。最初に簡単に述べましたが、単にグラフィック画面を指定パターンで塗りつぶすものです。ものは使いようで、MS-DOS上においてこのプログラムを走らせると、スクロールエリアを暗い青で、ファンクション表示エリアを暗い赤で塗ります。テキスト画面の方がプライオリティーが高いため、この上にテキストが表示されて見えます。これによって、好みもあるでしょうが非常に画面が華やかに、かつ、見やすくなります。短いプログラムですから、とりあえず打ち込んでみてください。そのときの速度も見物です。;GDC画面表示開始コマンド設定。;指定パターンで塗りつぶす。;ターンで塗りつぶす。;CSRFORMコマンド設定。;CSRFORMパラメータ設定。;MS-DOSに復帰。START開発はMIFES98のV1.0とMASMのV3.0です。仰々しくアッセンブラなんぞで作ってありますが、この程度であればBASICでもできます。逆にその方が「講座」という点からいけば意に沿うかもしれません。ま、TDWモードとGDCのCSRFORMコマンドが実感できれば十分だと思います。いつになるかわかりませんが、次回はグラフィックチャージャのRMWモードを利用したスクロールゲーム用超高速グラフィックキャラクタPUTルーチンを紹介する予定でいます。この方式を使用した市販ソフトはないようですが、クロック計算では既存の最適ルーチンを使用したものよりも速くなります。(8086だともっと比率が上がります。)第3話:GRCGの悪用(2)グラフィックチャージャ(GRCG)の概要についてはこれまで述べました。ライト)モードを利用したグラフィックキャラクタ表示ルーチンです。RMWモードというのはその名の通り、読み込んで(Read)適当にいじくって(Modify)、書き込む(Write)という機能です。GRCGは、VRAMに対してライト(書き込み)された1バイトデータの各ビットが、“1”の部分は対応するタイルレジスタの値が、“0”の部分は書き込み前のVRAMのデータがそのまま、それぞれ(VRAMに)書き込まれます。具体例を下図に示します。1新VRAMデータRMWモードの動作ご覧のように描画データのビットが“1”の部分はタイルレジスタのデータが、“0”の部分は旧VRAMデータが新VRAMデータとしてグラフィック画面に書き込まれます。この動作がたった1回のライト動作で各プレーン(B,R,G,I)に対して自動的に行われます。俗に言うところの4画面同時アクセスというやつです。一見しただけでは何のための機能なのかピンとこないと思いますが、例えばBASICのLINE文を考えてみてください。BASICは無造作にカラーのラインを引いてくれますが、実際には既存のデータに余計な影響が及ばないように、(ラインを構成する)ドットを書き込みたい部分を含む1バイトをプレーンごとに取り込み、書き込むデータとORをとり、書き込み直すという途轍もなく面倒な作業をしているのです。これをGRCGを利用するならば、RMWモードを選択し、表示したいラインの色に合わせて各タイルレジスタに00HかFFHを予め設定しておき、あとはデータの重なりや色情報をまったく意識せずに描画することができます。ま、倍は速くなります。この機能に使用用途の制限などあるはずもなく、これをマウスカーソルやゲームのキャラクタ表示に使用しても誰も文句は言いません。プログラムの詳細は、後ほどリストを追いながら説明していくことにします。第4話:GDCの悪用(2)キャラクタのPUTルーチンのめどがつくと、何かリアルタイムのゲームを作りたくなるのは、ごく自然な感情であると思われます。リアルタイムゲームといえばシューティングゲーム。シューティングゲームといえば画面スクロール。画面スクロールといえばハードウェアスムーススクロール......ときたもんだ。最近の98のゲームを見ていても、他機種からの移植であったり、あるいは移植を考えたプログラム構成になっていたりで、ハードウェアスクロールを用いたものは稀有です。98(というかμPD7220)の持つスクロール機能は、画面を上下にしか分割できず、シューティングゲームに応用しようとするとプレイ画面が横長になってしまうという制限があります(下図に示します)。スクロール画面1このようには分割できない→スクロール画面2(もちろん固定画面にもなる。)通常はこれを回避するため、画面の右または左をインフォーメション画面として単一色で埋めてプレイ画面の形を整えます。これではインフォーメーション画面はキャラクタで表示することになり、画面全体が味気ないものになってしまいます。(初期の98専用ゲームやゼビウスがそれです。)このため、最近のように画面の凝ったものが流行るようになると、ますますこの機能は使用されなくなったようです。(発想力の不足だと思うのですが.........)そんなわけで、最近流行らない汎用ハードウェアスムーススクロールルーチンを考えます。これもリストを参照しながら説明することにします(後述)。キャラクタPUTルーチンのリストです。MASMで記述してあります。SP以外の全汎用レジスタ破壊。キャラクタパターンデータの先頭にはX座標バイト数とY座標ライン数及び;1プレーン当たりのバイト数が格納されている必要がある。フォーマットは;次の通り。;BP=1プレーン当たりのバイト数。;AHに次ライン先頭アドレス算出用オフセットを設定。;データポインタ補正。;グラフィックチャージャにRMWモード設定。;X座標バイト数設定。;BX=1プレーン当たりのバイト数。;青パターンデータ1バイトをタイルレジスタに出力する。;ベースアドレス更新(BX=BX*2)。;赤パターンデータ1バイトをタイルレジスタに出力する。;緑パターンデータ1バイトをタイルレジスタに出力する。;ダミー出力(明度タイルレジスタにライト)。;1ライン分のデータを転送。;全データ転送終了チェック。;次ライン先頭アドレス算出。;次ラインデータ転送へ。;グラフィックチャージャモード解除。