2012年08月23日

mk2のウエイト

  WAIT 関連ですが、やはりバグがありました。


  仕様は以下の通りです。

  I/Oポート 0xF3(初期値:0xC2)

  bit7: M1 サイクルで 1WAIT 挿入(1 で WAIT 挿入)
  bit6: ROMブロックで 1WAIT 挿入(1 で WAIT 挿入)
  bit5: RAMブロックで 1WAIT 挿入(1 で WAIT 挿入)

  bit4-0 は、割り込み関連です。

  初期値が、0xC2 なので、M1サイクルとROMブロックで 1WAIT 挿入されます。

  仕様がちょっとあいまいなんですが、bit7=1 の場合は、ROMかRAMかに関わらず、M1サイクルで 1WAIT 挿入されます。
  また、bit6=1 の場合は、ROM のプログラムのM1 サイクル、オペランドのリード、ROM からのリードなどで、1WAIT挿入されます。


  例えば、bit7-5 = 110 の場合、

  3A 00 FA LD A,(FA00H)

  この命令では、4+3+3+3 ですが、このプログラムが ROM の場合は、(4+1)+(3+1)+(3+1)+3 になります。このプログラムが RAM の場合は、(4+1)+3+3+3 になります(M1 のみ 1WAIT)



  で、バグです。

  1つ目は、bit7-5 = 001 つまり、RAMブロックのみ1WAIT を挿入した場合に、ROMブロックからリードすると、なぜか1WAIT されます(M1 サイクルに関しては確認出来ていません)。


  2つ目が問題なんですが、M1 サイクルを 0WAIT に出来ません。
  詳しく言うと、bit7-5 = 000、RAM領域での bit7-5 = 001 などを設定すると暴走します。

  ROM に対しては、遅いのでダメというのは分かるんですが、RAM はそれなりに速いはずなので、ちょっとヘンです。


  で、ロジアナで調べてみました。


wait.zip

  調査したプログラムです。内容は、ROMの内容0x0000-0x7FFF の値を足し算するだけです(それを16回繰り返します)。
  このプログラムでも、bit7-5 = 000、001 と設定すると、暴走します。


  結論から言うと、RAMへのアクセスが適切ではないため、WAIT なしでは動作しない状態になっていました。



WAIT実機

  ロジアナで取った波形です。上が 1WAIT、下が0WAIT です。それぞれ左の線が M1サイクルの始まり、右の線が M1サイクルの終わり(=RAMからのデータの取り込みタイミング)になります。

  RAM(DRAM)は、RAS が L になって、その後に CAS が L になってから、データが出力されます。

  上の 1WAIT では、CAS が L になってから、4MHz で 1.5CLK 、つまり375ns あります。
  下の 0WAIT では、CAS が L になってから、4MHz で 0.5CLK 、つまり125ns あります。

  0WAIT の場合、RAMの出力遅延とZ80のセットアップ時間の和が、125ns 以下になる必要がありますが、これが不足しています。
  そのため、0WAIT では、正常なデータを取り込めなくなり、暴走しているようです。


CRTコントローラ部(mk2)

  ここで、回路図の左上のFFを見てみると、CAS 信号は4MHz の立下りで叩かれているため、この時間だけ遅れている事がわかります。
  では、ここを何とかすると動くのでは?



  という事でやってみました。


16Mクロック生成部(mk2)

  これは、16MHz から4MHz を作っている回路ですが、4MHz の立下りで叩くのではなく、この16MHz の立下りで叩くと、16MHz で 1clk分、62.5ns ほど速く出せるようになります。
  DRAMの仕様を確認してみても、RAS に対して、CAS が速すぎる事もなさそうです(50ns ほどあればいいらしい)。

  回路としては、IC2 の 3pin に、現在入力されている 4MCLK の代わりに 16MCLK を入力します。16MCLK は、IC44 の 12pin から取ります。
  上記は、mk2 の時で、66 の場合は、IC16 の 1pin に、IC60 の 10pin を入力します。

  この改造のためには、1箇所パターンカット(もしくはICの足上げ)が必要になります。


  回路図としては、4MHz と書かれている所を 16MHz と変更するだけなんですけどね(^^;




  改造した結果です。


waitあり

  同じプログラムを動かした時のロジアナの波形(1WAIT挿入)です。上が改造前、下が改造後です。
  MEMC-DR-nCAS が少し速くなっているのがわかると思います。


waitなし

  同じプログラムを動かした時のロジアナの波形(WAIT挿入なし)です。上が改造前、下が改造後です。
  同じようにMEMC-DR-nCAS が少し速くなっているのがわかると思います。
  RAMからの出力の波形を取ってなかったんですが、かなり余裕があるのがわかると思います。


  実際のプログラムでどれだけ違うのか、AX-9 のフライトシミュレータで試してみました。




  まず、何もしない状態です(M1、ROM にウエイトあり)。




  次に、WAIT を ROM のみにしました(OUT&HF3,&H42)。
  ちょっと速くなってる?

  通常は、ROM内ルーチンよりユーザプログラム上を走っている事が多いので、これでも十分効果があるはずです。




  ROM のWAIT をなくす事は出来ないので、ROM のデータをRAMにコピーして、RAMで動かしてみました。


romcpy.zip

  ちなみにこれが ROM のデータをRAMにコピーするプログラムです。


  特定の箇所で、描画時間を測定してみました(14フレーム分)。

  何もしない状態:14.1 秒
  ROMのみWAIT挿入:12.2 秒
  WAITなし:12.2 秒

  手動でストップウオッチなので、多少の誤差はありますが、ROM のみWAIT挿入でも速くなっています。
  M1サイクルのWAIT が無くなるので、当然の結果ではあります。


  ちなみに改造をしても、0xF3 のWAIT関連ビットを変えなければ、(当然)今まで通りの動作をします。

  ※改造は自己責任で行って下さい。


posted by えすび at 21:35| Comment(0) | P6解析:CPU周り | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。