開発日記

2022-09-19 の続きです. 4個目の 74595 を追加する回路は10月の時点で完成*1、その後3か月間諸事情により停止、思い出すのに2週間というところで新しいハードウェアの対応が必要最小限でできたのが先週半ばです.

今回の対応で 4 spi cycles = 1 memory cycle ができるようになりました. これで memory cycle の種別を切り替えるときに CPU を呼び出す必要がなくなり、 flash programming の効率化が期待できます. 従来どおり memory dump は 2 spi cycles = 1 memory cycle でできるので、種別を切り替える必要がない場合はこのほうが早くできます.

前回のハード設計でできなかった VRAM A10 と VRAM CS# の取得もできるようになりました. これは MCU の接続端子の削減のため 74240 → 外部CPU+PPUデータバス → シフトレジスタを通っています. これで nametable 制御レジスタのあるハードは自動検出する仕組みが作れそうです.

別の問題は 4 spi cycles を実現するのに DMA channel が最低4個、 read data の取得が必要だと channel 数が 5 個になります. 複雑な memory cycle の組み合わせを素直に組むと DMA descriptor が 5 x (種別数+1) 必要になります. DMA descriptor は 1 個 16 bytes で RAM 容量がしょぼい MCU にとっては結構大きな領域になってしまいます.

効率よく DMA descritpor を利用するとなると channel 別に線形にデータを並べることがいいです. 下記の順の cycle が必要だとします.

種別      addr   data-write
CPU-WRITE 0xaaaa 0x55
CPU-WRITE 0xf555 0xaa
CPU-WRITE 0xaaaa 0xa0
CPU-WRITE 0x8000 0x01
PPU-WRITE 0x02aa 0x55
PPU-WRITE 0x0555 0xaa
PPU-WRITE 0x02aa 0xa0
PPU-WRITE 0x0000 0x23
CPU-READ  0x8000
CPU-READ  0x8000
PPU-READ  0x0000
PPU-READ  0x0000

この場合、memory cycle 種別で 1 group のデータとすると種別の切り替えで descriptor が必要になり 5x4 descriptors (=0x140 bytes)も消費します. 一方、address だけ, data-write だけで線形に並べるとこの場合だと 5 descriptors ですみます. read cycle に data-write の data は dummy を4 byte として並べておいたほうが結果としてよいという話にもなります. 実際の運用では速度優先、容量優先などを組み合わせる必要がありますか基本的な考えはこの通りです.

そんな感じでデータの並べ替えが必要になりました. 最初は CPU 側でやろうとしたのですが C で書くのと RAM 管理が面倒になったので PC 側(ruby)でやることにしました. 面倒な処理は PC でやってもらうほうが楽です. また転送のための仕様変更もあり、仕様を決めるのに2日間、仕様に準拠したコードを書いて実際にシミュレータで動かしてみるのに2日間、大したコードの量は書いてないのにとても疲れてしまいました.

9月時点であった CPU での種別切り替えのコードはすべて削除するのですがどこを残していいのか、とりあえずで動かしたいけどリンクを通すにはどうすればいいのかそういうことを考えてるだけでも大変です.

*1:三菱?と書いた 74240 は三菱ではなく松下のようです.