Z80ワンボードコンピュータのレストア
はじめまして、この4月から弊社のメンバに加わりましたM.I.です。ハードウェアの開発を主に担当します。新メンバとはいえ前期高齢者年齢が目前ですのでメンバの中では最年長となります。今までは全く別の仕事をしていましたが、趣味で子供のころから続けていた電子工作を活かし世の中に貢献できる仕事を引退までの最後にしたいと思い移ってきました。今後ハードウェアネタに振った拙文を書いていきたいと思いますのでよろしくお願いします。
Z80マイコンボードとは
まず今回は、40年前に遡る社会人になったころ作ったまま埋もれていたZ80マイコンボードのレストアについてです。先日、実家の倉庫を片づけていたら出てきたものです。今では皆さんが普通に持っているスマートフォンの先祖といえるでしょうか、個人用のコンピュータのはしりとなるものです。当時製作したものの大したことができないので、すぐに飽きて、しまい込んだままになっていました。
Z80はZilog社が開発した8ビットマイコンで演算処理部のみが40ピンの1チップでできています。これにクロック発生回路、メモリIC、IOポート用ICなどを組み合わせてやっとコンピュータとして動くようになります。現代の1チップマイコンとは大違いで莫大な配線をする必要があります(完成するころにはハンダ付けがうまくなります)。データ線8本、アドレス線16本、これに加え制御線などを上記の構成部品間に張りめぐらせます。
データ入力はヘキサキーでアドレスを指定した後、データを書き込みます。表示は7セグメント表示器6個で、アドレスとそのアドレスのデータを表示します。外部記憶はカセットテープにBEEP音をデータで変調して録音することで行うようになっています。なお1kバイト程度のサイズのモニタープログラムが0h番地からのUV-EPROM(電気的に書き込んで、紫外線で消去するタイプのROM)に載っています。このモニタープログラムは既存のものをアドレス等を書き換えて移植したものだったと思います。
電源を入れたがNG!
久々に5Vを安定化電源で加えましたが表示器が点灯せず動きませんでした。電流は現代の1チップマイコンより一桁大きい500mAも流れますが、この時代のマイコンボードとしては普通の電流値です。3つあるバスバッファ(74LS245)が結構発熱しているのでこれらが電流を食っているようですが、故障ではありません。4MHzのクロックは正常に供給されいるようであり、Z80CPU自体は動作しているようでした。基板をあちこち指で押さえると時々表示されることがあるので、長年放置してできた錆によるICとソケットの接触不良か、ハンダ付け箇所の劣化であろうと思いました。
レストア作業項目
(1) 各ICピンの錆とり
ソケットから外せるICをすべて引き抜いてICのピンを念入りにヤスリがけし、さらに接点復活材を塗布しました。
(2)ハンダ付け箇所の再ハンダ
基板を指で押さえて表示器が点灯したりしなかったりする箇所の近辺にあるハンダ付け個所をすべてハンダ付けし直しました。これは結構な箇所ありますが根気よくやります。
(3)バスバッファのHCタイプへの交換
発熱の大きいバスバッファ3個をCMOSのHCタイプ(74HC245)に交換しました。これにより消費電流が300mAに下がりました。
以上の作業により何とか安定して動作するようになりました。
動作確認
簡単なLチカのプログラムをアセンブラで書いて走らせてみました。Z80のニーモニックで書いてハンドアセンブルします。
(1) 作成したコード
IOポート用ICのZ80PIOの初期化後、レジスタの値をインクリメントする毎にポートに出力する簡単なものです。インクリメントの度にレジスタの各ビットがON、OFFするので、これをポートに出力し、ポートとGND間につないだLEDを点滅させます。
(2)ハンドアセンブル
当時はハンドアセンブルでは紙と鉛筆を使っていました。まずニーモニックで(1)の処理を書き、機械語への対応表を見ながらZ80の機械語に置き換えていきます。次に機械語のバイト数を数えながら機械語の左側にアドレスを振っていきます。このボードでは1000番地からSRAMを実装しており、ユーザプログラムを書き込めるようにしていますので、1000h番地からアドレスを振ります。最後に、アドレスが決まったら、ジャンプ命令の箇所にジャンプ先のアドレスを書き込みます。
;b4での点滅間隔が最も短く、b7の点滅間隔が最も長い
;アドレス 機械語 ニーモニック
; Z80PIO初期化
1000 3E CF ld a,11001111b ; ビットモードに設定
1002 D3 02 out 2,a ; PIO Aポート制御アドレスに出力
1004 3E 00 ld a,00001111b ; 上位4bitを出力に設定
1006 D3 02 out 2,a ; PIO Aポート制御アドレスに出力
; LED点滅
1008 3E 00 ld a,0 ; AレジスタにAポートに出力する値を保持
100a 06 00 ld b,0 ; BレジスタにAレジスタのインクリメント間隔を保持
100c 3C blink: inc a
100d D3 00 out 0,a ; PIO Aポートデータアドレスに出力
100f 04 timer: inc b
1010 C2 0F 10 jp nz,timer ; Bレジスタの値が一巡し次に0に戻るまでジャンプ
1013 C3 0C 10 jp blink ; Aレジスタのインクリメントにジャンプ
(3)プログラム実行
(2)の結果をアドレス1000h番地からキー入力します。入力が終わったらプログラムの開始アドレス1000hを表示させてRUNキーを押します。ポートとGND間に4.7kΩを直列につないだLEDをつなぐと点滅を確認できます。ポートはb7~b0の8bitで構成されていますが、下位4bitのb3~b0は出力しても非常に高速に点滅するので目視では点灯したままに見えます。そこで上位4bitのみを出力に設定しており、b4の点滅が最も高速に、b7が最もゆっくり点滅します。レジスタの値がinc命令により変化していく様子が分かります。
さらに出てきたもの
実はこのボードといっしょに当時大容量メモリだと注目された64kバイトDRAMボード、ヤマハのFM音源チップを使った音源ボードも倉庫から出てきたのですがインタフェースに関する記録が残っておらず、手の付けようがない状態です。いつになるかは分かりませんが、気が向いたとき回路をトレースして調査し動かしてみたいと思っています。