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