現在地

MAA-1を小改造(復活!)


テーマ:

カテゴリー:

いろいろやって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コードの定石をもとに辻褄の合うものを探すのですが、経験と勘になってしまいますので。

Z80 SIOのTxDAにまったく信号が現れない(リセット時にメッセージを出力するはず)ので送信ステータスを待ち続けている可能性が疑われます。

一度は動いていたプログラムなのでまずはハード側を確認していきます。

送信できないときは8251だとCTSを疑います(ソフトで無視できない)が今回はZ80 SIOです。あとはクロックですがこれも問題ありませんでした。

ふと気になってZ80 SIOを交換してみたら動いてしまいました。

一つだけ死ぬなんて、壊すようなことをした心当たりはまったく無いんですけどねぇ。

これで本来やりたかったことがやっと再開できます。
そっちはもっと時間がかかりそうなので進展があったら書きますね。

参考文献・関連図書: 
額田忠之(1985)『Z80ファミリ・ハンドブック』CQ出版社.

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。