仕様は以下の通りです。
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 なしでは動作しない状態になっていました。
ロジアナで取った波形です。上が 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 では、正常なデータを取り込めなくなり、暴走しているようです。
ここで、回路図の左上のFFを見てみると、CAS 信号は4MHz の立下りで叩かれているため、この時間だけ遅れている事がわかります。
では、ここを何とかすると動くのでは?
という事でやってみました。
これは、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 と変更するだけなんですけどね(^^;
改造した結果です。
同じプログラムを動かした時のロジアナの波形(1WAIT挿入)です。上が改造前、下が改造後です。
MEMC-DR-nCAS が少し速くなっているのがわかると思います。
同じプログラムを動かした時のロジアナの波形(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関連ビットを変えなければ、(当然)今まで通りの動作をします。
※改造は自己責任で行って下さい。