CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

リフレッシュサイクル

ROM内だけでループするプログラムなのに時々アドレスがとんでもないところに飛ぶ・・・
一見妙な動きですが、何のことはないリフレッシュサイクルが自動挿入されていた、ってことでした。
 
ループしているときのバス状態を少し詳しく見てみます。
下位アドレスにプローブしてみると、通常のループ動作ではA1しか変化していません。
(尤もそれより下にA0がありますが今はワードアクセスなので関係なし)
 
つまり16ビット幅2ワードを繰り返しフェッチしていてJMP$の動作はうまくいっていると言えます。
・・・本当は1ワードのフェッチでいいはずだが、プリフェッチで次ワードを読んでしまっている
 
 
 
イメージ 1
 
 
ところがその繰り返し中にいきなり変なアドレスがバスに出力され、/ROMCSがディセーブルされるタイミングがあります(上図で赤丸範囲)
で、このときCPUから出力されている/REFREQをみてみると、まさにこの期間でアサートされているのでリフレッシュサイクルであることが明らかです
 
今更ですがV50のマニュアルを見たらリフレッシュコントローラの記載がちゃんとありました。そういえばZ80もリフレッシュコントローラが内蔵されていましたがZ80+DRAMというシステム作ったことないですね。複雑なDRAM周辺制御と強力な電流ノイズはちょっと手に負えません。
自分がZ80をいじっていた頃には既に大容量のSRAMがあって設計は非常に楽でした。
リフレッシュアドレスを保持しているRレジスタを乱数代わりにするなんてのがよくあった小技です
 
もう少し広い範囲を見てみると、ROMからのコードフェッチを縫うようにして/REFREQが出力されているのがわかります
 
 
イメージ 2
 
よく見ると/REFREQがアサートされているときのA1~A4のレベルを見ると1つづつインクリメントしているのが判ります。たしかにリフレッシュアドレスを出力しているようです。