ROMライタ製作中

オーソドックスなROMライタというのがどんなものか分からないまま作ってます。データシートのタイミング通りに「コマンド書き込み→データ書き込み→書き込み完了をポーリング(異常検出したらリトライor終了)」を繰り返せばいいとは思うのですが。

  • ターゲットROM EN29F002T-70JI
  • PCからArduinoバイナリを送信→ArduinoがI/Oを通してROMに書き込む
  • PC側はRubyで通信ソフトを自作(serialportというgemでなんとかなりそう)
  • ArduinoはMega2560を使う(バスと制御信号を自前のI/Oで全てカバー可能)

Z80基準で考えるとどれもこれもオーバーテクノロジーですね…。現在はArduino側のコーディング中で、バスと制御信号を操作するところまでできています。

f:id:marlesan:20161019021532p:plain:w500
Analog Discovery 2 のロジックアナライザーで信号をキャプチャしたものです(線が足りないのでバスはそれぞれ下位4bit)。

  1. アドレス・データバスにそれぞれ 5555H, AAH の書き込みコマンドを出力
  2. WE#のアクティブパルスを入れてROMにコマンド書き込み
  3. 書き込み先アドレス、書き込みデータをバスに出力
  4. WE#のアクティブパルスを入れてROMにデータ書き込み

なんとなくなんとかなってる雰囲気あります。2回目のWE#が短いのが謎ですが…。まぁ最適化で何か起こってるんでしょうね。これはこれで興味深いトピックですが、Z80のシステムを作ってZ80アセンブラを書いていこうという時にAVRのバイナリコードに執着するのはやめておきます。

ちなみにタイミングについて。Arduinoが16MHz動作なので何をするにも1クロック周期の62.5nsはかかります。これだけでEN29F002T-70JIの書き込みに関わる主要なタイミング30~40nsより十分長いので、特に何も考えなくても(NOPを入れて動作を遅延させたりしなくても)書き込みは可能という見込みです。

f:id:marlesan:20161019024934j:plain:w400
便利です Analog Discovery 2。ほんとうに買っててよかった。