キャラクタディスプレイ考

1文字8*8pxを256*192のスクリーンに敷き詰めると32*24文字。1文字(の1ラスタ)のデータを用意するのに使える時間は16MHz/8の逆数で500ns。85nsのSRAMで3メモリサイクルはいける?

  1. VRAMから文字コード読み込み
  2. キャラクタROMからシフトレジスタへ8bitのラスタを読み込み
  3. 色などの指定を読み込めそう

色指定するならDACの経路をスイッチして、そこへラスタデータをピクセルクロック(16MHz)で押し出す。てな感じでしょうか。 走査が始まるまでに押し出し準備完了している必要があるので、データ読み込みは走査タイミングより先行しないとですね。 そう考えると水平同期や垂直同期のタイミングって色々工夫ができそうな期間に思えます。でもまぁ、とりあえずシンプルに。

次の問題はVRAMからデータを読み込む方法です。これはDMA(グラフィック回路が直接RAMにアクセス)になると思います。 この時VRAMがメモリ空間にあるならCPUを止めないとなんですが、4MHzで動作してるところに2MHzのタイミングでバス権取ったらかなり遅くなりそう。 というか都度BUSRQする方式ではCPUの状態次第で走査タイミングに間に合わない場合も出てくるのでは?

  • VRAMをIO空間に置く
  • VRAMをメモリ空間に置くが、メイン空間と別バンクにする

単純に思いつく別解は以上で、どちらもCPUからのアクセスが明示的になるので、それ以外の期間はCPUバスから切り離しておいてグラフィック回路が自由にアクセスできるようにする方法です。 今度はCPUからVRAMに書き込むタイミングが難しくなりますね。IO方式だとさらにCPUからVRAMへのアクセスが遅くなるし、使える命令も限られてきそうです。 どうするのがいいかなー。

サイクルスチールというキーワードが気になったので調べてみます。

追記

85nsのSRAMで3メモリサイクルはいける?

むりかも。バスにデータが出てくるまでに16MHzの1クロックじゃ足りないので2クロック待って、3クロック目で出力先がホールド、なので1メモリサイクル=3クロック。65ns*3クロック*3サイクル=585ns。oh…

  • A案:色を諦める。もともとオプションだからこれでいいけども。
  • B案:色情報だけ1文字4bitとすれば2文字分取ってこれる計算になる。ただ2文字処理ごとに3サイクル目を入れて結果をラッチするという回路がめちゃめんどくさいはず。
  • C案:データ待ち130ns・ホールドに65nsどっちも無駄があるので、ベースクロックを32MHzとかもっと細分化して、RAMアクセスはそっちで動かす。現実的。

追追記

いや、VRAMとキャラROMにアクセスするためのアドレスはHD6445が生成するから、そのタイミングも合わせて考えないと何ができるか確定しない…。