2019年5月11日土曜日

メモリ周りから

Z8010 MMUは手に入れたものの、とりあえず今回は使わないでおきます。

Z8001/2のZ-BUSは結構ややこしくて、頭がいま混乱しています。Z8000 Technical Manual を参照しながら、頭の中を整理しがてらこれを書いています。

ICのピン数を減らすためなのか、アドレスバスとデータバスが共用になっており、AD0-15にアドレスを先に出してから、AD0-15を通してデータの入出力を行います。メモリーアクセス中はアドレスを保持しておく必要があるので、ASの立ち上がりエッジでアドレスが確定後、ラッチを使い保持します。
Z8001の場合は、SN0-6もメモリアクセス中に一時的にしか出ないので保持する必要があります。

Figure 9-3 より

次は、メモリとアドレス・データバスの接続。これがややこしい。
まず、Z8001にはダイナミックバスサイジングの機能がないので、16bit分のデータバスの配線をしなければなりません。AD0-7 は奇数アドレスのメモリに、AD8-15は偶数アドレスのメモリに接続します。なんとなく逆な気がするのですが、下の図のとおりです。
Figure 9-4 より
偶数・奇数アドレスメモリの選択ですが、図にあるように(メモリ選択は正論理)、

 バイトリード : B/W = H, R/W = H で、遇奇両アドレス選択 
    バイトライト : B/W = H, R/W = L で、AD0 = 0 が偶数アドレス選択、 AD0 = 1 が奇数アドレス選択  
    ワードリードライト : B/W = L, R/W = L or H で、遇奇両アドレス選択

になります。
バイトリードが両方選択なのは、CPUがAD0-7かAD8-15を選択して取り込むからです。このあたりは 9.4.2 Memory Transactions に書いてあります。

図ではメモリアドレスにはAD0から繋ぐような印象を受けますが、実際にはAD1からつなぎます。

ここまで書いてなんとなく頭の中が整理されてきました。というか思い出してきました。
年齢のせいか理解するのに時間がかかるし、字は見づらいわで苦労します。

2019年5月6日月曜日

BUSREQの確認

昨日はCPUの起動を確認しましたが、今日はBUSREQを確認してみます。
これが効くと、CPUはバスを明け渡してくれるので、RAMにブートコードを外部から書き込めます。

ATmega328Pにコードを書き足して、BUSREQをLowにしてHighに戻す操作を繰り返してみました。CPUはBUSREQを受けると、次のサイクルでバスを手放してBUSACKをLowにしてくれるはずです。この様子をオシロで見て確認しました。


CH1(黄色)がAS、CH2(青色)がBUSACKの波形です。BUSACKがLowになりASも出なくなっています。BUSACKがHighに戻るとASが再び出ているので、うまくいているようです。
まあ当たり前の事なのですが、こんな単純な事でも意図した通りに動いてくれると嬉しいですね。
これで先に進める目処が立ちました。

今回試した回路図をつけておきます。KiCadとか使い慣れていないので変なところがあるかもしれません。なんせ、今まで方眼紙に鉛筆で書いていた人間なもんで。
GWは今日でおしまいですが、この先もぼちぼち続けます。

2019年5月5日日曜日

Z8001に火を入れる

ATmega328Pを使って、Z8001のバスをリセット後に奪えるのか確認してみます。
懲りずにブレッドボード上に回路を組んでみました。

CLOCK, *RESET, *BUSREQは328Pにつなぎ、割り込み、トラップなどはプルアップ、AD0-15はプルダウンして、常に0x0000を読み込むようにしてあります。

CLOCKは328PのPWMを使って作っています。データシートによると、Z8001の最低動作クロック周波数は500kHzのようですが、動作を確認しやすいようにもっと下げて20kHzにしてあります。

まずは、クロックを供給しながら、*RESETを L->H だけしてみました。これで、CPUにリセットがかかり、ADDB RH0, #0 がひたすら実行しているはずです。行儀のいい暴走といったところでしょうか。
オシロで、*AS と *DS を見てみます。


CH1(黄色)が*AS、CH2(青色)が*DSです。短めの*ASに続いて*DSが長めにLowになる動作を繰り返しているので、正常に動作しているようです。

次は、*BUSREQを確認してみます。

2019年5月3日金曜日

ROMをどうするか

CPUは手に入ったわけですが、起動するにはROMが必要です。残念ながら手持ちがありません。

考えられる手は、素直にUV-EPROMを購入することです。幸いまだ出回っていて買えるようですが、ROMにプログラムを書き込むライタと消去するのに紫外線ランプも必要です。以前は、どちらも持っていたのが、やはり断舎利の対象となってしまっていました。

もう一つの方法は、ネットで見つけたAtmelのマイコンチップをつかってRAMに起動用のプログラムを書き込んでスタートさせる方法です。ブートコードはチップに書き込んでおきます。
昔のトグルスイッチでぱちぱちブートコードを書き込んでいたのを高級にした感じでしょうか。情報を手繰っていくと、Z80-MBC2: 4ICs homemade Z80 computer に行き着きました。クロックやリセットの信号もチップで作っているようです。

下手したらZ8001よりAtmelのチップのほうが高速だったりするかもしれず悩みどころですが、こちらの方法のほうが時間とコストがかからなそうです。はんだ付けの量も減らせそうなので、こちらを検討してみます。

問題は、リセット後にAtmelのチップがBUSREQでバスを握れて、CPUがBUSACKを返してくれるのかどうかです。
Z8001 Technical Manual の 9.6.2 Bus Request (p.262) によると、BUSREQはマシンサイクルの最初のクロックの立ち上がりで捉えられ、次のサイクルでBUSACKが返されます。

7.5 Reset (p.239) によると、Z8001はリセット後、連続したメモリリードサイクルに入り、0x0002からFCW、0x0004からセグメント番号、0006からPCの値を読み込み、この3サイクルの後、PCの値からの命令を実行するサイクルに入ります。この時点まできてやっとBUSREQを受け付けてくれるようになるようです。

このリセット後の3サイクルのリードサイクルに、0x0000を連続して読ませても大丈夫なら、ADをプルダウンしておくだけですみます。

2.7.1 Program Status Registers (p.26)によると、FCWが0x0000だと、ノンセグメント、ノーマルモード、割り込み禁止、EPAなしの設定になるだけで特に問題はなさそうです。

最初に実行される命令は、セグメント番号:00、 PC:0x0000にある0x0000と続く0x0000なので、
  ADDB RH0, #0
が実行されます。CPUは、ずっとこの命令を実行し続けることになり、BUSREQがかかるとバスを明け渡してくれるはずです。たぶん。

石が来た

SRAMの動作チェックを数回繰り返して、最終的に4個、512kbyte分に絞りました。
外した4個は動作が不安定なので、使うことは諦めます。謎のエラーに悩まされるのは嫌ですからね。

ただ、毎回違うアドレスで違うビットでエラーがでるので、ひょっとしたら、ピンやワイヤーの接触不良なのかもしれません。ブレッドボードは、ワイヤーを差し込んで配線しているだけなので、そんなに信頼性高くないでしょう。そのうち、ちゃんとはんだ付けしたテスターを作ってみるつもりです。
外した4個も念のため捨てずに取って置きます。

そして今日、eBayで注文していた石がやってきました。


届くのはGW明けだろうと思っていたので、郵便受けに入っているのを見つけてテンション上がってます。郵便局員さん連休中の配達ありがとうございます。

届いた石は、
 Z8001A CPU   6MHz
 Z8010B MMU  10MHz
 Z8530B SCI        8MHz
 Z8536B CIO       8MHz 

MMUは、使うかどうかはわからなかったのですが、あとで手に入らなくなって悔やむぐらいならと一緒に買ってしまいました。前回、学生のときに組み立てた時は、MMUは手に入らなかったので使っていません。無くても特に問題はありませんが。
CPUが6MHz動作品なのにMMUが10MHz動作品と、チグハグになってしまいましたが、そのうちCPUも10MHz品が手に入ったら差し替えたいと思います。

石はZilog製ではなく、SGS Thomson製で、Z8536以外は刻印から韓国で製造されたものです。以前持っていたCPUはZilog製の10MHz品だったので、捨ててしまったのが本当に悔やまれます。

意外だったのは、Z8536がPLCCだったことです。てっきりDIPだと思っていたので、箱を開けたとき目が点になりました。これ用のソケットが必要ですね。それと、これはマルタで製造されたようです。



------------------
5/4 追記

SRAMのテストプログラムを見直し何箇所か修正したところ、8個とも生きていることがわかりました。未使用のピンの処理がまずかったようです。ピンを出力に変更したり、入力でプルアップに設定したりで修正しました。
以前も同じ失敗をしたような気がしますが、その時の苦労も時間が立つと忘れてしまうものですね。

2019年5月2日木曜日

手持ち部品の確認 SRAMは生きているのか 続き

SRAMの動作は、各アドレスに1,2,4,8...と各ビット立てたをデータを書き込み、同じアドレスから読み出して比較をするコードを使って、全アドレスで正常にデータを読み書きできるかで確認します。
各アドレスのテスト結果はシリアルインターフェース経由で受け取ります。


このチェック方法では、アドレスラインが壊れていても、同じアドレスを結果的に読み書きしていた場合には正常と判断されてしまう恐れはありますが、あまり考えすぎないことにします。


1個めは0x1ffff まで正常に読み書きできています。

結果がでるのにSRAM1個あたり15分程度かかりますが、youtubeでも見ながら裏で1個づつ確認していきます。結果は8個中6個生き残っていました。なかなかいい成績でしょうか。ちょっと怪しい気もしますが、これで先に進めます。他に見つけてあった高速SRAMは、配線し直しで面倒なので、確認はまた気が向いたらにします。

次は問題は、ROMをどうするかですね。

2019年5月1日水曜日

手持ち部品の確認 SRAMは生きているのか?

令和一日目です。

ジャンク品の1Mbit SRAMは生きているんでしょうか?
ソケットは使うつもりですが、はんだ付けした後で動かないと分かったら、かなりのショックです。 SRAMが何個ぐらい生き残っているのか確認します。

ブレッドボード上に、手持ちのATmega328Pを使った簡易テスターを組み立てました。

1Mbit SRAM だと、データバスに8bit分, アドレスバスに17bit分、その他の制御線も必要なので、328PだとI/Oのピン数が全く足りません。アドレスは8bitフリップフロップ 74LS273を2個使って保持するようにしました。データバス、アドレスバス、CS, OE,  WE など各線を繋いでいくと、配線が山盛りです。線が交差しまくっているので、チェックするSRAMが交換できるのか不安です。
ネットで検索すると、Z80マイコンボードをブレッドボード上に作っている例がありますが、配線のセンスがない私には無理そうです。

ATmega328Pに、フリップフロップにアドレスを保持するコードと、データバスを読み書きするコードを書いて動作することは確認しました。