BAKUTENDOさんの情報を参考にkazzo互換のtunaを作りました。老眼に手半田はきついです。組み立て後に全然動かない(0xffのデータだけ返ってくる)ので回路を一本一本調べたらやっぱりブリッジがありました。それを治すとmapper0はちゃんと吸い出せる。
でもmapper3が吸い出せない。手元にあるのはグラディウス、スターソルジャー、テトリス。使っていたcnrom.adは下記の通り。
board <- { mappernum = 3, cpu_rom = { size_base = 0x8000, size_max = 0x8000 banksize = 0x8000 }, ppu_rom= { size_base = 0x8000, size_max = 0x8000, banksize = 0x2000 }, ppu_ramfind = false, vram_mirrorfind = true }; function cpu_dump(d, pagesize, banksize) { cpu_read(d, 0x8000, 0x4000); cpu_read(d, 0xc000, 0x4000); } function ppu_dump(d, pagesize, banksize) { for(local i = 0; i < pagesize; i++){ cpu_write(d, 0x8000, i); ppu_read(d, 0, banksize); } }
webの検索では、cnrom.adで吸い出せたというものしか見つけることができない。でも自分の環境ではプログラムROMは吸い出せている(CRCがwebの情報と一致)けどキャラクターROMはダメ。エミュレータで起動してみると、ゲームは動いているけれどもちゃんと(w)キャラクターが化ける。
mapper3のバンク切り替えの仕組みをきちんと理解していなかったということもあるし、anagoのスクリプトの仕様もよくわからない。キャラクターROMのバンク切り替えを自動でしてくれるくらいに思っていたので、ソフトウェアの問題なのかハードウェアの問題なのか切り分けができず悩みました。まだどこかにブリッジやハンダ不良があるかもしれないとか。
吸い出したバイナリを見てみると0x8000~と同じデータが0xc000~に出てきている。これはバンク切り替えができていないですね。mapper3のバンク切り替え周りの回路は下記のような感じとのこと。ここらへんの信号を見ることにする。
anagoにはtuna_canという簡易デバッガがついているのでビルドして実行。writeやdumpが個別にできるんですね。これは良い。単発でwriteができる。オシロをつないで書き込み時のD4やD5を見るとROMSELが来たあとにデータが変化しているんです。本来Highのデータwriteなのにレベル的にHighとLowの中間(自分の環境では)Low寄りが見える。カートリッジを外してみるとちゃんとHighで安定。あーこれはプルアップが足らないの?と最初は思ったけど、ROMSELが来てからレベルが落ちるのでコンフリクトですね。
A11、A12に正しいアドレスがいくためにはD4とD5に正しいデータが出てくるアドレスにwriteしないと書き込みのデータとROMから出てくるデータとが衝突しちゃうと。cnrom.adが何か自動でやってくれるわけではないとそういうことですね。