;+--------------------------------------------------------------+以上がGRCGを使用したキャラクタPUTルーチンです。指定されたレジスタとメモリ領域に値を設定してCALLすると、マスクパターンにしたがってグラフィックキャラクタをバックグラウンド画面にPUTします。その際、スタックポインタとセグメントレジスタを除く全レジスタを破壊します。これは不必要なプッシュ/ポップを避けるためで、決して手抜きではありません。通常のアプリケーションプログラム用のサブルーチンであればレジスタを保存するのが妥当ですが、この場合はまずゲーム専用といってよいでしょうから、“スピード”に最重点を置いています。コーリングシーケンスについてですが、不用意に何でもかんでもレジスタを通して引数を渡さずに、メモリインタフェースを利用してるところに注目してください。実用を考えると、レジスタインタフェースの方が手間が多くなることになります。引き渡すパラメタは、結局メモリに格納されているのですから。データ域先頭の「X座標バイト数」から説明していきます。これは、PUTするキャラクタの横方向のドット数÷8が入ります。「Y座標ライン数」は縦方向のドット数がそのまま入ります。この値は最大256(=設定値が0のとき)で、これによってPUTできるキャラクタの最大は640×256に制限されます。「1プレーンあたりのバイト数」は、以上の2つの値の積が入ります。このパラメタを設けた理由は、定数から定数を求めるといった無駄なかけ算を省くためです。除積算の高速なV30とはいえ、この場合、30クロック程度の無駄が生じることになります(8086だと80クロックにもなります)。その次からがキャラクタデータです。この領域の最初は「マスクパターン」です。これは四角いデータの中で実際に表示したい部分のみを抽出するためのものです。右図のAの部分のみを表示したいわけですから、Bの部分にマスクをかける必要があります。通常は単純にORをとる手法がとられるようですが、これではキャラクタの黒の部分が透明になってしまいますから、キャラクタは7色表示になってしまいます。黒を発色させるにはパレットの切替えがどうしても必要になってしまいます。その点、マスクをかける手法をとれば、手間は若干かかりますがパレットも意識しなくてすみますし、色も8色使えます。GRCGを使用した場合は手間もかかりません。次からの「各色プレーンデータ」はBASICのPUT@のデータ形式と同様、まったくノーマルな形式です(リストを見れば一目瞭然ですね)。指定された通りパラメタを設定してサブルーチンに飛んでくると、各パラメタをレジスタに設定し、グラフィックチャージャにRMWモードを設定しています。各データをタイルレジスタに設定します。最後のダミー出力というのは明度(インテンシティー)プレーン用のタイルレジスタで、16色モードを使用するときのみパターンデータを設定します。それほど難解な部分はありませんね?!今度はハードウェアスクロールルーチンです。画面表示オフセットは自動的に更新される。;‘SCROLL’GDCコマンド設定。;スクロールライン数から加算オフセット算出。;新画面オフセットアドレス算出。;画面表示オフセットアドレスをGDCに設定。;表示ライン数をGDCパラメタに変換。;表示ライン数をGDCに設定。;+------------------------------------------------------------------+このスクロールルーチンは一応下方向スクロール専用です。上スクロールにしたい人は、リストの下線行の“SUB”を“ADD”に替えてください。せこい話ですが、スクロールルーチンというのもコール頻度の比較的高いものですから、上下の判断をするのがもったいなかっただけです。パラメタの説明をしておきます。「スクロール対象画面スイッチ」とは、スクロールさせる画面の選択スイッチです。通常は画面分割などしませんから、サブルーチン内で0に固定してもよいでしょう。「スクロールライン数」は1回のコールでスクロールさせるライン数です。「現在画面表示オフセット格納域オフセットアドレス」と長たらしくわかりにくい名前ですが、これはGDCに設定するための表示画面のオフセットアドレスのメモリ格納域のアドレスです。セグメントはDSです。次の「現在表示ライン数格納域オフセットアドレス」は、スクロール画面の縦方向の大きさのメモリ格納域アドレスです。これも通常は変化しないでしょうから、サブルーチン内で固定してよいと思います。セグメントはDSです。それではプログラムの説明に入ります。GDCの‘SCROLL’コマンドのフォーマットを示します。ライン数(H)SCROLLコマンドフォーマットCはコマンドで、GDCのコマンドポートに与えます。P0~P7はパラメタで、パラメタポートに与えます。「パラメタアドレス」には0~7(P0~P7)が入ります。ここに6(0110)を設定すると、次にパラメタポートに設定した値はP0ではなくP4に設定されたことになります。画面1の情報を設定する場合は0を、画面2の場合は4を設定します。GDCがテキストモードであれば画面が4分割できる関係上、設定できる値は0~15となります。「表示開始アドレス」は(L),(M),(H)の3つのビット領域に分かれています。このうち(H)の領域は、μPD7220が256KW(=512KB)の表示メモリを持てるのに対して、PC-9801シリーズでは48KWしか使用していないので、ここは常時00に固定されることになります。この領域は早い話が表示画面のオフセットアドレスです。ここに設定されている値に40(10進)を加算すると、グラフィック画面が見かけ上1ライン下スクロールすることになります。ここで注意することはVRAMはCPUからアクセスする場合は、0A8000H~0BFFFFHに存在しますが、GDC側からだと004000H~00FFFFH(ライト時)になるということです。GDC内部ではデータはすべてワード単位で処理されるため、1アドレス=16ビットです。40ワード加算することで1ライン(80バイト)スクロールするのです。勘違いなさらないように。GDCの内部表示オフセットアドレスは、各プレーンとも0となっており、先に示したライト時のアドレスとは異なっています。よって、ここの値を書き換えると、4画面同時にスクロールするのです。最後に「ライン数」ですが、これはスクロールエリアのライン数(幅)です。1~400までの任意の値が設定できます。以上のことを踏まえた上でリストを追ってみてください。前編はとりあえずこんなところで。