RETURN TO Z80

いまさら8bitマイコンを作るのだ!

Z80ブレッドボードマイコン

f:id:z80cpu:20140212222656p:plain

 

かなり月日が経ってしまったが、Z80マイコン製作の続きについて書いておこう。
実は11月の時点で現状の段階までは出来ていたのだが、もろもろ忙しくしていてブログの更新も出来ず、また製作自体も進んでいない。

 

写真のように、ブレッドボード上に組んでいる。
見事なスパゲッティ配線で、石の姿を拝むことさえ叶わない。

 

下段中央がZ80CMOSも持っているが、ここではNMOS版であるシャープのLH0080を使っている。バージョンはZ80A。4MHZで動作するのだから4MHZで動かす。クロックはZ80の右に見える水晶発振器(発振子ではなく)を使い、楽をしている。

ブレッドボード中段の中央にはSRAMがある。NECのD43100ACZという128KBのメモリだ。あまり有名ではないメモリのように思われるかもしれないが、なんのことはない、先人が使っているのを真似ただけ。


最低限、CPUにクロックとメモリがあれば一応動作させることは出来るのだけれど、命令を書き込む手段がなければ、プログラムカウンタを進めて偶発的なメモリの内容を読み込む無意味なマシンにしかならない。かといっていきなりROMを焼いたりするのも面倒だ。

というわけで旧式の8bitマイコン製作には反則的かもしれないが、AVRを加えてDMAでメモリの読み書きが出来るようにした。しかもAVRにはArduinoブートローダを書き込んである。使ったAtmega328はメモリアクセスするにはピン数が少ないから、本来ならもっと足の多い奴を使った方がいいのだけれど、最初にブレッドボードに挿してしまったらもう取り替えるのが面倒になってそのまま使っている。当然、ダイレクトにアドレスバスやデータバスに接続することは出来ないから、アドレスは74HC595を2個使ってシリアル=パラレル変換させている。この処理のせいでスピードが出ない。やはり多ピンのAVRを使った方がよかったと少し(いや結構)後悔してる。でもやり直すのも面倒だからそのまま。

AVRはシリアル通信でPC(Windows)と繋いでいて、AVRに書き込んだ簡易的なメモリ読み書きプログラムによって、PCから自由にメモリにアクセス出来る。むろん、その間はZ80に対してBUSREQを要求し、バスを礼儀正しく独占している。

AVRのコマンドとして実装しているのは次の6種類。
D    ダンプ    Dに続くアドレス以降のメモリの内容をダンプ
W    ライト    Wに続くアドレスの内容を表示し、必要ならば書き換える
C    クリア    Cに続くアドレスから256バイトの内容を0フィル
L    ロード    シリアルかSDカードからロード
S    セーブ    シリアルかSDカードにメモリ内容をセーブ
Z    Z80    BUSREQを非アクティブにしてZ80をリセット

SDカードは上段に見えている青い小基板に載っている。その左にはPIOがあり、現在は動作確認用のLEDが繋がる。ロードおよびセーブのファイル形式は、単純なバイナリとインテルHEXをサポートした。バイナリの場合はロード先アドレスを指定しなければならないデメリットがあるが、それはそのままどこにでもロード出来るというメリットでもある。一方、HEX形式では自動的にロード先アドレスが再現されるものの、たとえ相対ジャンプのみで書いたプログラムであってもセーブ時と異なるアドレスに読み込むことは出来ない。

AVRは単にメモリの読み書きだけに留まらず、Z80からI/Oアクセス出来るようにして、PCのシリアル端末を入出力として利用可能にしている。SIOを兼ねさせようということなのだが、これが面倒の始まりだった。

躓いたのはAVRとZ80の調停だ。
AVRはZ80の倍速である8MHZで動作させているが、それでは全然遅くてZ80からのIOREQを簡単に見落とす。なのでWAITを入れることしたものの、単純に数クロック入れても間に合わない時は間に合わない。結局、ロジアナで解析し、あれやこれやと試した結果、AVRから完了の信号を出してやることにした。この調停にはGALを使っている。

f:id:z80cpu:20140212221340p:plain


ここまで終わったのが昨年11月。現在、Z80の最低限のモニタを作り始めたところだ。
実装済みなのは3つのコマンド。
DUMP    ダンプ    スペースに続くアドレス以降のメモリの内容をダンプ
WRITE    ライト    スペースに続くアドレスの内容を表示し、必要ならば書き換える
GO    ゴー    スペースに続くアドレスにジャンプ

早くセーブとロードを書かなくては。
そこまで出来ればとりあえず何かしらBASICを移植したいなあと思っている。
さらにその先には、CRTCとキー入力回路をでっちあげて、PCとは独立しても動作するようにする予定。