ROM(EN29F002)ライタ完成

RubyでPC側のソフトも作って、ROM書き込み環境が整いました!

64kBまでのバイナリファイルをROMに書き込めます。64kBというのはPC側ソフトを簡単に実装にするための制限(かつ、Z80で使うには十分な容量)で、ファームウェアの方は256kBフルに利用可能です。

使い方はこんな感じで。

$ ruby romwr.rb test64k.rom
requesting connection..
connected!
erasing the chip...done in 2.7771766820078483 sec.
programming the romfile...done in 8.397580000993912 sec.
reading back the romfile to verify...done in 8.40169953199802 sec.

SUCCEEDED!!

dumped the readback image to "_test64k.rom"
$ cmp test64k.rom _test64k.rom 
$ /* ROMから読み戻したバイナリと差分なし! */

MegaのI/Oでごり押ししたパラレル制御のおかげで、64kBフルに書き込んでもベリファイ含めて20秒で終わります(ごり押してる割りには遅いのかもしれないけど…)。ピンアサインは次の通り。

Mega2560 EN29F002 用途
22-29 A0-A7 アドレスバス
37-30 A8-A15 アドレスバス
41,40 A16,A17 アドレスバス
49-42※1 DQ0-DQ7 データバス(Arduino→ROM方向)
analog 8-15 DQ0-DQ7 データバス(ROM→Arduino方向)
analog 0 RESET リセット信号
21 CE チップセレクト信号
20 OE 読み出し信号
analog 2 OE@74HC541※2 バス制御信号
18 WE 書き込み信号

※1) 74HC541を通してROMのDQ0~DQ7に接続する
※2) OE(あるいはG)は2本あるので、両方に繋ぐか、片方はGNDに落とす

f:id:marlesan:20161031075937j:plain:w400
私の手元で完成したシールドはこんな感じです。aitendoのMega用プロトタイプシールドを利用しました(リセットボタンつきなのが嬉しい)。ジャンパー配線があるのは28ピン化したEN29F002も扱えるようにするためなので、素直に32ピンDIPに変換して使うだけなら上の表通りに直結すればOK。ちなみに28ピン化は頓挫しています。

f:id:marlesan:20161031075940j:plain:w400
配線面。せっかく揃えんだし、ということで多色ふんだんに使いました。実は信号乗り移り系のバグが取れてないんですが…(指で線を弄ってたら現象が消えた)。とりあえずICにパスコンくらいはつけようか。

以上、システムとして動く初めての自作物だったので、雑ですが解説してみました。次はZ80アセンブラの準備です。ようやくCPUをまともに動かせるイメージが湧いてきています。