今月頭くらいから I-O DATA の C バスグラフィックアクセラレータの GA-98NB2 での256色表示の実験をやっていて、なんとか256色表示ができるようになりました。 が、作成した256色ルーチンを使って作成するつもりだったプログラムの方の予定が雲散霧消してしまったので、供養がてら初期化+αの範囲のプログラムだけでも放流することにしました。

参考文献は以下の辺りです。

CL-GD5434 の設定のためにレジスタに書かなくてはいけない値の一覧は本記事の後ろの方に貼ってあるテストプログラムを参照してください。

絵を描くにはパレットに色を設定して VRAM に値を書く必要があります。 256色では 8bpp なので VRAM の1バイトで1ドットの色を指定することになります。

パレットの設定は以下2つのレジスタで行います。

  • Pixel Address Register (3c8h)
    • 設定をする LUT のエントリを指定する。
    • Pixel Data Register に3回アクセスすると index が勝手に1進む。
  • Pixel Data Register (3c9h)
    • 書き込む時は RGB の順で3回書き込む。
    • 読み出す時も RGB の順で3回読める。
    • 256色モードでは RGB の範囲は 00h ~ 3fh の模様。

VRAM へはバンク切り替えでアクセスできます。 描画したい画素に対応する VRAM のアドレスが入っているバンクを出して、VRAM のアドレスに対応したバンク内のアドレスに値を書きます。

  • GRB (Graphics Controller Mode Extensions) でバンクの設定がちょっとできる。
    • バンクの粒度 (4KiB または 16KiB)
    • アクセス可能なバンクの個数 (1 または 2)
  • GR9 (Offset Register 0)、GRA (Offset Regisster 1) でバンクを選択する (GRA は2バンクアクセス有効時のみ)。
    • バンクサイズ 16KiB かつ2バンク設定の場合以下のようになった。
      • 0e000:0000-3fffh に GR9 で指定したページが出る。
      • 0e000:4000-7fffh に GRA で指定したページが出る。
  • 0e000:0000-7fffh は PC-98 の VRAM のプレーンと重なっているため、8色モードにしないと C バス側の VRAM に書くことはできても読むことはできない(WABTECH.LZH の WABTECH4.DOC)。

実際に256色表示を行うテストプログラムはこちら → nb256col.asm からどうぞ。 このテストプログラムによって生じたいかなる損失についても責任を負いかねます。 ご利用は自己責任でお願いします。 GA-98NB2 でしか動作確認していないのと、画面設定は 1024x768 60Hz 固定ですが、初期化処理とテスト描画の処理が入っており、正しく動けば以下のような表示が得られる筈です。

また、テストプログラムを作成していて思ったことですが、CPU による1ドットずつの転送では画面の広い範囲の描画を行おうとするとやはり遅く、速くするには BitBLT や color expansion をちゃんとやらないといけなさそうな感じでした。