CPU実験室

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

I/Oアドレス

配線の追加でたぶんROMのアクセスができるようになったので最小ループのプログラムを動かしてみます。

ただし今回はすでに74HC574でラッチするパラレルLEDも実装済みなのでついでにLEDチカチカも入れてみようと思います。

ということでLEDをラッチするI/Oアドレスはいくつだったっけかと回路図を見直していたらエラいことに気付きました・・・

 

f:id:O3I:20211125215912j:plain

アドレスバスをデコードして各ペリフェラルのチップセレクトを生成する74HC139ですが引き込んでいるアドレス線が最上位のA15~A12になってしまっています。NSC800はI/Oアドレス空間が256バイトしかありませんから有効なアドレス線はA7~A0しかないはずです。そのため本来はデコードに供するのはこのうちA7~A4でなければなりません。最近は広大なアドレス空間を持つCPUにメモリマップドのI/Oを接続するという作例が多かったので8ビットCPUのことをすっかり忘れていました。

 

それにしてもこれは完全にやっちまったパタンです。I/O空間ではDon't careな上位8ビットをどうやって指定するか、ということになりますがNSC800と機能コンパチのZ80においてはレジスタ間接OUT命令OUT(C),AのときBレジスタの内容がアドレス上位A15~A8に乗ることを思い出しました。

 

書いたプログラムはこうなりました。

16ビット転送LD BC,0000HでBレジスタ、Cレジスタ同時にセットしてしまいます。先頭のNOPのリピートは書込み済EPROMのコードを潰しながら上書きするためのもので、ついでに先頭に戻ることでループの時の時間稼ぎにもなります。

NSC800Z80とソフトコンパチのためPROASMⅡで記述しています

f:id:O3I:20211125215925j:plain

 

いちおうこのプログラムは動作しました。ch1はパラレルLEDの最下位ビット、ch2は速すぎて見えませんがアドレスバス最下位A0です。

NOP約2000個の時間待ちのためLEDのチカチカは目に見える速さで最下位ビットで約126Hzとなりました

f:id:O3I:20211125230412j:plain