Flash Cartridge Troubleshooting: Challenges and Solutions

タイトルはAIが決めた. 内容は開発日誌でローカルのテキストファイルからの抜粋.

04-30
基板 TxROM と Memory AM29F040B の組み合わせは終わったので、以前の別の flash cartridge を出して動作確認開始.
基板 VRC6B と Memory W49F002 と W29C040 をみて W49F002 の使用確認とドライバの実装. ただしこれは変則的な設定がいるので一旦保留.
基板 UOROM と Memory MX29F040 を先に試す.

05-01
基板 UOROM と Memory MX29F040 は簡単にいける予想は外れて ID を取るまでにチェックしていない部分が大量にあり実装に手間取った. UOROM の場合は単純な配線では command address A14 の都合で program できない.
device で command address A14 がある場合に途中でエラーを出して停める必要があるが今のところ簡単にできないため、 VRC6B の組み合わせの対応をみてから実装したほうがいい.
基板 VRC6B はシミュレータを dump ができるまで実装. CPU address $8000-$bfff と同 $c000-$dfff の可変バンクを2つとも有効にすると、バンクサイズがあわないのでうまくいかないことを再確認.
programming に関しては flash address A14 を計算して, 15'h2aaa と 15'h5555 を割り振るアドレスを交換する必要がある. (どちらのバンクでも可能) ただしスクリプトの実装でこれを交換するようにできていないのでこれらのパラメータをクラス化したうえで VRC6B だけの例外実装を組めるようにする必要がある.
明日あさってで実装がうまくいかない場合は当分の間保留にする.

別途 UOROM の配置について flash A14 = CPU A14 とする方法もあるが, 現状のシステムで sector erase までちゃんと動かすにはかなり難しそうである. 管理可能容量が 0x44000 bytes (17 pages) になるので nesfile format としても変になる.

05-02
基板 VRC6 の flash ID 取得について例外的なクラスを実装.

05-03
W29C040 のコードを通すが assert で止まった.

05-05
assert で止まる理由を探したところ、 1 回左シフトにすべきところを 10 回左シフトになっていて、mruby の配列から uint8_t *の変数にできないというエラーだった.
その過程で mruby, C ともに W29C040 のコードを通っていない部分が多々あり修正した. とりあえずシミュレーションは通ったが、 fifo の buffer size は 0x100 の倍数である必要があるはずでバッファサイズの確保のコードを確認する必要がある.

05-06, 05-07
バッファサイズのエラーチェックを追加.
基板 VRC6 への command address A14:0 を確保する例外的なバンクアドレスの確保について実装をするため、 class ProgrammerBase にあった変数を class CommandAddress, class CommandDestination に分離. また class DriverFlash にもメソッドを分離. 中途半端な変数を除去し、 VRC6 への command address の例外的実装を継承したクラスとして実装、動作確認.
この動作自体は問題なかったが別途問題が発生.

  • VRC6 への programming は 0x4000 bytes の bank でやっているが最小 bank 単位は 0x2000 bytes で ROM image が 0x40000 bytes 未満で layout=top だと矛盾が発生してちゃんとかけない.
  • W29C040 と W49F002U の並列 programming はできるが、 W29C040 が圧倒的に早い. W29C040 のコードが残っている関係で W49F002U の転送速度が異様に遅い.
  • programming bank size より小さい sector を持つ場合の sector erase の対応を考えていない. SST39SFxxx と W49F002U が該当する. 39SF のほうは均等な sector size に対して、 49F の不均一なそれの対応は面倒そうである. 不均一 sector size は古めの flash に多く PC の bios で使われていたのだろうか.
  • 転送 bank の末尾 data が 0xff だと MCU が deadlock する. なんでいままででなかったのか? すぐに直した. ファームウェアの実装はかなり出来上がっていると思う.

基本的な programming 機能は実装したので他の機能の実装または、ハードの実装に切り替える.