2018-12-09 15:54 — asano
カテゴリー:
いろいろやってMAA-1は復活しました。今回はその経過を書いてみたいと思います。
最初、Z8613を動かす (その3:苦戦中...)のようにアドレスバスの周波数をみようとしたのですが、リフレッシュアドレスやI/Oアクセスなどの命令フェッチ以外のアドレスが混じってしまいます。たとえテスト用に短いループにしてもリフレッシュアドレスは排除できません。
仕方ないのでアドレスは諦めて他から動きを推測することにします。
まずROMの先頭から C3,00,00 とJP nn命令による無限ループを書いてM1の周波数を測ると400kHzでした。M1は一周に1回(C3をフェッチ直後に)出るので、4MHz÷400kHz=10となって一周10クロックとなりJP nn命令のステート数と一致します。
同様に 18, FE とJR e命令にすると333kHz、4MHz÷333kHz≒12となってやはりJR e命令のステート数に一致します。
続いて D3,00,C3,00,00 とOUT命令も加えたループにしてみます。M1は380.9kHzとなりましたが、D3とC3のフェッチ時に出るので一周で2回、一周のステート数は4MHz÷ ( 380.9kHz÷2 ) ≒21となります。内訳はOUT (n),A命令が11とJP nn命令が10です。
上の式は21÷ ( 4MHz÷380.9kHz ) ≒2 とも変形でき、一周に出力される回数を求められます。これを利用していくつかの信号を見ていきます。
信号 | 周波数 | 回数 | 備考 |
---|---|---|---|
M1 | 380.9kHz | 2 | D3とC3のフェッチ時なので2回 |
IORQ | 190.4kHz | 1 | OUT (n),A命令によるI/Oライトで1回 |
MREQ | 1.332MHz | 7 | OUT (n),A命令のフェッチに2回、JP nn命令のフェッチに3回、リフレッシュ2回 |
RD | 0.952MHz | 5 | OUT (n),A命令のフェッチに2回、JP nn命令のフェッチに3回 |
WR | 190.4kHz | 1 | OUT (n),A命令によるI/Oライトで1回 |
ここまでを前提として(長かった)本来のROMを乗せて同様に測ってみました。回数が整数になるためには一周が30ステート(あるいはその整数倍)でループしている可能性が高いです。
信号 | 周波数 | 回数 | 備考 |
---|---|---|---|
M1 | 399.8kHz | 3 | |
IORQ | 133.2kHz | 1 | IN A,(n)命令によるI/Oリードで1回 |
MREQ | 1.199MHz | 9 | |
RD | 0.932MHz | 7 | |
WR | 0 | 0 | メモリ・I/Oともにライトせずにループしている |
これを満たす合理的なコードとして浮かぶのは、IN A,(n)でステータスを読み、AND nで1ビットを取り出し、JR Z,eあるいはJR NZ,eでループするというZ80 SIOのステータス待ちです。
Z80 SIOのTxDAにまったく信号が現れない(リセット時にメッセージを出力するはず)ので送信ステータスを待ち続けている可能性が疑われます。
一度は動いていたプログラムなのでまずはハード側を確認していきます。
送信できないときは8251だとCTSを疑います(ソフトで無視できない)が今回はZ80 SIOです。あとはクロックですがこれも問題ありませんでした。
ふと気になってZ80 SIOを交換してみたら動いてしまいました。
一つだけ死ぬなんて、壊すようなことをした心当たりはまったく無いんですけどねぇ。
これで本来やりたかったことがやっと再開できます。
そっちはもっと時間がかかりそうなので進展があったら書きますね。
コメントを追加