CPU実験室

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

I/Oアドレスデコード

Z80はI/Oアクセスの時、アドレスバス上位8ビットにはBレジスタの内容が出力されている・・というのは内部構成による副作用で仕様に明記されていない動作なのかと思っていましたがZilogのZ80マニュアルを改めて読んでみると、ちゃんと書いてありました

 

f:id:O3I:20211126230957j:plain

つまり仕様上BCレジスタペアで間接アドレッシングを使えば16ビットI/O空間が使えることになります。

(ただしブロックI/O入出力のときはBレジスタが転送カウンタに使われるのでうまくないですが)

ということで他のチップセレクトがアクティブになるか以下のプログラムを動かしてみたのですが

f:id:O3I:20211126231024j:plain

①のLEDアクセスはうまくいきましたが②,③,④のアクセスも全て①へ出力されてしまい他のデバイス(LCD,RTC,ADC)が制御できません。つまりBレジスタの内容が全く評価されてない訳でZ80のバス動作と異なっているようです。

これはかなりやばい状況でアドレスデコーダに入っているアドレス上位AB[15:12]を切断して下位AB[7:4]からジャンパか~とあきらめかけたのですが、いちおうNSC800のマニュアルで同様の記述部分を見てみると

 

f:id:O3I:20211126231047j:plain

入出力命令の時、I/Oアドレスを示すアドレス下位8ビットAB[7:0]は上位8ビットAB[15:8]へ複製されるとあります。これは考えてみるとMCS85ボードで確認した8085のバス動作と同じでした

 

ということでギリセーフ、首の皮一枚でつながりました。あたかも下位8ビットでI/Oアドレスが指定されているかのように以下のコーディングで各チップセレクトが正常に出力されました。

f:id:O3I:20211126231059j:plain

これは何もレジスタ間接で指定しなくても即値でもOKなので単純に以下のコーディングでも問題ありません。

f:id:O3I:20211126231119j:plain

まるで何も失敗してなかったようにみえますがI/Oアドレスデコードは正しくはAB[7:0]でやるべきなんでしょう。