MBM29F800 が動かない理由(憶測あり)

アドレスバスとデータバスの基礎知識

データバスが 8bit/16bit が切り替えられるようになっています。各モードは下記となっています。

size       Address  Data
----------------------------
0x40000*16 A[17:0]  DQ[15:0]
0x80000*8  A[17:-1] DQ[7:0]

コマンドアドレス

16bit mode なら A[10:0] に 0x2aa, 0x555 をいれればよいのですが、これに加えて、A[-1] にも値を入れる必要があります。

16bit: A[10:0] = 11'h2aa;
8bit:  A[10:-1] = {11'h2aa, 1'b1};
のときに、ファームウェアからは下記になってしまう。
A[10:-1] = {1'b1, 11'h2aa} //(= 12'haaa)

このため、mask_get の引数を11にしろとか、本来の ROM と MBM29F800 の address を Rotate しろと書いています。この部品は dip ではなく、address bus の配置もことなるのでどちらでもよいかもしれませんが、将来的な対応としては FLASH_A[17:-1] = ROM_A[18:0] とするのがスマートと考えています。

対処手順は client だけで済みますが、残念ながらスクリプトではなくメインプログラムの修正が必要です。

Toggle Bit

flash memory はデータを書き込んだ後にデータが安定するまで待てという信号を出力します。これの判定方法が Toggle Bit, Polling Bit と呼ばれています。データの出し方は一見問題ないようにみられますが、データシートを見る限り CPU 側の read のやりかたに現在のファームウェアでは問題があるように見えます。PPU 側は無難な波形を出してるのでもしかするとそのままいける気がします。

AM29F040B は CE# ベースで Toggle Data をだしていたのですが、 MBM29F800 では OE# ベースでやらないとだめなようです。そのためロジックアナライザで詳しく解析をして、ファームウェアを更新する必要があります。

というわけで、作業工数や個人的優先度観点から私からはすぐに対応できません。