2013.1.7
前へ
次へ
ホームページトップへ戻る

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第286回]


●ロジアナでとらえたアドレスセットの誤動作波形

前回説明をいたしました、Z80で追加された命令が原因で発生した、E−80(仮称)ミニコンのアドレスセット(READ操作)で実際に誤動作している様子をロジアナで観測いたしました。
今回はその記録波形をお見せします。
なおここで使いましたロジアナにつきましては「TTLだけでCPUをつくろう[第374回]」でご紹介いたしました。
超ローコストですぐれもののロジアナ(カメレオンUSB+ロジアナキット)です。

ロジアナのプローブを接続して観測をおこなった信号は[第276回]と同じです。
下図はそのときにお見せした、プローブの接続ポイントをプロットした回路図です。



こちらが誤動作している様子をとらえた波形の記録です。

[第276回]でお見せした正常動作しているときの波形と比べてみてください。
両者の違いがよりはっきり分かるように、[第276回]の説明を下敷きにして説明をすることにいたします。

アドレスセット+メモリリードの操作はREADスイッチをONにすることで行われます。
READスイッチは中点復帰式(momentaly。押している間だけ接点が閉じ、離すと元に戻る)のスイッチです。
そのスイッチ信号によって74HC123から出力されたワンショットパルスによって回路動作がスタートします。
74HC123のQ出力にロジアナのプローブ00を接続し、その立ち上がりを測定開始トリガとしました。
READスイッチをONにする前に、STOPスイッチをONにしてCPUをM1のタイミング(命令OPコード読み込み)でウェイトさせてあります。
そのときのアドレス表示は××3AHで、データバスにはメモリのそのアドレスの値78Hが出力されています。
ここにはアドレスの上位8ビットは(プローブを接続していませんので)表示されていませんが、073AHであることがわかっています。

今までのところではフロントパネルの操作についてしか説明してきませんでしたが、E−80(仮称)ミニコンはもっともっと大きな機能をもっていて、当記事に先行してその機能についての各種動作テストも行っております。
実は現在デバッグ中のE−80(仮称)ミニコンのRAMにはND80ZV(ND80Z3.5)のROMの中身がすでに移植済みになっています。
ですのでパワーONしますと、その移植しましたND80Zモニタが動作して、USB接続待ちになります。
そこでは以下のプログラムが実行されます。

              ;
0726 41       SOUTSB:LD B,C
0727 0EFE     	LD C,FE
0729 3E06     	LD A,06
072B D3FB     	OUT (FB),A
072D ED78     SOUTSB2:IN A,(C)
072F F22D07   	JP P,SOUTSB2
0732 78       	LD A,B
0733 D3FC     	OUT (FC),A
0735 3E08     	LD A,08
0737 D3FE     	OUT (FE),A
0739 ED78     SOUTSB3:IN A,(C)
073B FA3907   	JP M,SOUTSB3
073E AF       	XOR A
073F D3FE     	OUT (FE),A
0741 3E07     	LD A,07
0743 D3FB     	OUT (FB),A
0745 C9       	RET
              ;

リストからお分かりいただけますように、上のロジアナ波形で最初のスタートポイントでCPUが停止しているのはアドレス073AHですから、まさに前回説明をいたしました、Z80で追加された命令IN A,(C) 命令コードED78 の2番目のOPコードフェッチサイクルでRAMから2番目の命令コード78Hを読み込もうとしているところです。

READスイッチをONにすると74HC123のpin13からHパルスが出力されます。
これがプローブ00の信号です。
この信号(正確にはpin4からの出力信号)はメインボードに送られて、メモリアクセスの禁止信号になります。
そうしてメモリからの出力を禁止するとともに、同時にプローブ05の信号をアクティブにすることによってデータバスにコードC3Hを出力します。
データバスの信号がメモリの値78HからC3Hに変わる様子がはっきりとわかります。
このC3Hがデータバスに乗るまで十分な時間を稼ぐために遅延回路が使ってあります。
この遅延回路はIMSAI8080にはありませんが、必要と判断して入れてあります。
その遅延によって、ゆっくりとWAIT信号(プローブ01)がOFFになります(8200nsあたりです)。
するとCPUが動き出し、データバスのコードC3Hを読み取ってM1が終了します。
MREQ(プローブ24)の@のところです。
MREQ(プローブ24)とM1(プローブ25)がHになります。

このあと[第276回]の説明では、

CPUはコードC3Hを解読して、その結果、次にデータバスからジャンプ先アドレスの下位8ビットを読み込みます(A)。

と書いているのですが、今回のロジアナ波形ではそのようにはなっていません。
実はAはすこし後ろの10000nsから始まっています。
その代わりにDEの2つのマシンサイクルが実行されています。
Dではアドレス下位8ビットにB1H、データバスには07Hが出力されています。
そしてEではアドレス下位8ビットにB0H、データバスには3AHが出力されています。
Eのアドレスの値がDのアドレスの値−1であることと、それぞれのデータバスの値から、これはその直前にウェイトしていたアドレス073AHがスタックにプッシュされているところだと推測できます。
CALL命令や割り込みなどでスタックにアドレスがプッシュされるときは、最初に上位アドレス、次に下位アドレスの順に行われます。

MREQ信号(プローブ24)を見ますとDとEの間でも1回アクティブになっています。
このときはDRAMのためのリフレッシュが実行されているのだと思います。
データバスを見るとその期間だけC3Hになっています。

実はこのD〜Eの期間を通してデータバスにはC3Hが出力されているのです。
そのC3HとCPUから出力された07H、3AHがショートしていると考えられます。
しかしC3H出力のうちのD0,D1,D6,D7のH出力は、何も出力しないことでプルアップ抵抗によって消極的にHとしているだけですから、ここはCPUからの出力が勝ってしまいます。

ロジアナの入力はアナログではなくてデジタルなのでショートの状態を直接見ることはできません。
信号がぶつかっていて中途半端な電圧値になっていても入力の閾値より上ならばH、下ならばLとして取り込まれます。
D2,D3,D4,D5のLはダイオードを介してLに引っ張っていることと、1つのゲート出力で最大4本の信号ラインからのHの流れ込みを受けていることから、ダイオードのアノード側がH出力であった場合には、やはりHの影響を受けてしまうと考えられます。
そのような理由からだと思いますがDEの期間のデータバスの出力からはC3Hは消えてしまっています。
しかしCPUからデータが出力されないDとEの間のリフレッシュの期間中はデータバスにC3Hが現れています。

DとEの期間にデータがぶつかっている影響は意外なところに現れています。
プローブ05を見てください。
プローブ05はC3コードをデータバスに出力するために、ダイオードを介してデータバスのD2〜D5をLにしている74HC10のゲート出力信号です。
ここは本来は200nsから10000nsまでずっとLのはずなのですが、途中FGの2回Hになっています。
FGはちょうどCPUからデータが出力されている期間に重なっています。

プローブ05は上の回路図の74HC10pin8の出力信号(C3)ですが、その先は下図のようになっています。


CPUから07H、3AHが出力されているとき、74HC10のpin8にはダイオードを介してCPUからのH出力信号が流入します。
その結果、74HC10のpin8出力が浮き上がって、ロジアナではHレベルとして認識されたのだと思われます。
うーん。
HCMOSの出力ゲートをHに引き上げるほどの出力がZ8S180のバス出力にあるとは思えないのですけれど…。
ま。
でも現実にはそういうことがおきています。
しかし。
これはCPUにとって余りよいことではないですねえ。
このプローブ05の信号を見ているとちょいと心配になってしまいます。

それはともかくとしまして、やっとAのところでデータバスにはパネルスイッチの下位8ビットの値ABHが出力されました。
このときのアドレスバスの値を見ると下位8ビットが00Hになっています。
前回説明しましたように、CPUは先に読み込んでいたEDHに続いてC3Hを読み込んだため、そこで未定義命令割込みが発生し、そのときのアドレスをスタックにプッシュしたあと、アドレス0000Hにジャンプしたことが読み取れます。
フロントパネルの回路ではこのタイミングはC3Hに続くジャンプ先アドレス値の読み込みですから、ただのメモリリードサイクルのはずなのですが、CPUのロジックではメモリアドレス0000Hにあるはずの命令コードを読み込む動作になりますから、ここでM1(プローブ25)がアクティブになり、それがOPコードフェッチサイクルであることを示しています。

つまりここでCPUはデータバスに置かれたABHをJP命令のジャンプ先下位アドレスとしてではなく、命令コードとして解読してしまいます。
命令コードABHは XOR E です。
これはただちに実行され、その結果アドレスバスには次のアドレス0001Hが表示されます。
Bのタイミングです。

回路からはパネルスイッチの上位8ビットの値がJP命令のジャンプ先アドレスの上位8ビットとしてデータバスに出力されます。
その結果データバスの値は89Hになっています。
しかしCPUはさきほどのコードABHを XOR E として実行して、次のアドレス0001Hに進んだため、ここでもメモリアドレス0001Hに置かれているはずの命令コードを読み取ろうとします。
そのためBでもM1(プローブ25)がアクティブになり、それがOPコードフェッチサイクルであることを示しています。

つまりここでもCPUはデータバスに置かれた89HをJP命令のジャンプ先上位アドレスとしてではなく、命令コードとして解読してしまいます。
命令コード89Hは ADC A,C です。
これはただちに実行され、その結果アドレスバスには次のアドレス0002Hが表示されます。
ここでやっとCのタイミングになって、WAIT(プローブ01)がアクティブ(L)になりCPUが停止します。

前回説明しましたようにZ80で追加された2バイト命令コードの2番目のM1でウェイトしたところから、アドレスセットの動作が開始されたために、本来ならばアドレスLEDにはパネルスイッチの値89ABHが表示されるべきところ、予期しない値0002Hが表示されてしまう結果になりました。

今回ロジアナでの観測記録を見ていただきました通り、この現象は状況によって発生頻度はいろいろ変わるものの、いつかは必ず遭遇するものと覚悟しておかねばなりません。
それを避けるためには、前回書きましたように、STOPしたあと、すぐにREADスイッチの操作にいくのではなくて、必ず先にRESETすることをルールとしておく必要があります。
先にリセットしなければならないというルールにすれば、前回および今回書きましたような不都合な現象は避けることができます。

やれやれ。やっと。
これにて一件落着です。

と、まあ、そういうことでもよいと思うのですけれど。

でも。
なんとなく、面白くないのですよねえ。
せっかくM1で停止するところまで考えてあるのに、Z80に拡張命令があるのはわかりきったことじゃありませんか。
であるのに、それに全く対応していない、つまり旧8080回路のままで、「じゃあ、そういうことですので、あしからず」って、それってちょっと面白くないのじゃありませんか。
ねえ。

ということになりますと。
そこのところをなんとかしたくなってしまうじゃありませんか。

wwひとのやれないことをやれぇーw

困った性分なのですよ。まったく(また納期が遅れてしまいますぅ)。

あ。
皆様も、それじゃあどうすればよいのか、ちょいと考えてみてください。

ワンボードマイコンでCP/Mを![第286回]
2013.1.7upload

前へ
次へ
ホームページトップへ戻る