目的
fpganesのPRG.ROMをDRAM化する事により、Tang-Nano-9Kの 内蔵RAM容量以上のカートリッジを動作させることは成功した。
しかし、CHR.RAMは内蔵RAMでの動作であり、RAMとして使える32KB以下でないと動作しないと言う問題が有った。
手持ちのカートリッジで動作するのは極わずか。之では寂しいな。
◆◆◆ そうだ、PPUもDRAM化しよう ◆◆◆
手持ちでは最大容量の、星のカービィを動作させたいな。
実施内容
Tang-Nano-9Kの内蔵DRAM容量は8MB、之を2分割して使用出来る事は判って居た。
今までは面倒なので、単一で使用していたが。
今回はこれを2分割する、ライブラリを交換するだけなのでこれは簡単。
次に、現行のPRG.ROMを、片方の4MBの部分で動作させる。
次に、残った4MBの部分で、CHR.ROMを動かせば完成となる。
と、書けば簡単だが問題点が有る。
※だから、手を付けなかったのだが。
DRAMのアクセス速度が足りない。
データをキャッシュする等を試みたが上手く行かない、全て徒労に終わった。
そこでDRAMのスビートアップを検討。今はPLLの都合で128MHzで動作させている。
DRAMのアクセスを166MHzに上げれば間に合うのだが、そのクロックが供給できない。
そこで、NESメインクロック21.6MHzの8倍の、172.8MHzで動作させることにした。
オーバースペックだが104%であり、問題無いだろう。
※仕様外の動作であり、動かない個体がある場合はご容赦の程。
波形で確認したが、リード完了直前にDRAMからのデータが到着している。
これで出来上がりと思ったら、CHR.ROMが書き換わるという問題点を発見。
之は何のことは無い、CHR.ROMと同じ番地(8000-FFFF)のレジスタアクセスで、書き換わっていたと言うお粗末の一席。
該当エリアを書き込み禁止にしたら、大部分のカートリッジが動作するようになった。
※そんな所にレジスタが有るなんて、思わなかったよ。
参照資料
※格納位置は前回と同じ。
※通信速度を従来の4倍に上げたので、ロードが失敗する場合は速度を下げてください。
「fpganes Tang-Nano-9K バージョン」
「fpganes Tang-Nano-9K ローダー」
「fpganes Tang-Nano-9K モニター」
機能概説
元々のfpganesはRAMリソースとして、基板PARAMに集約してアクセスしていた。
之を PRG.ROM PRG.RAM CHR.ROM CHR.RAM に再び分離。
PRG.RAM CHR.RAM は各2KBなので内蔵RAMを割り当て。
PRG.ROM CHR.ROM はDRAMを割り当てたので、4MB使えるようになる。
メモリ信号は合成される前のものを取り出し、DRAMに与えている(つもり)。
※途中から信号を取り出したものだからぐちゃぐちゃ、要らない信号の整理が必要だが。
カートリッジによっては追加のRAM(6000-7FFF)が必要なものが有るが、CPU側のDRAMを割り当てた。
※RAMの交換が出来ないので、連続して遊ぶと可笑しくなるかも。
RAMのSAVE,CLEAR,LOAD機能が必要なのだろう。
マッパーなどの一部は「NESTang」から頂いた。
元のプログラムからなにかしら良くなったのだろうが、改善点の確認はして居ない。
※良くなって居る筈という、希望的観測です。
PRG.ROMリードタイミング(psr_mt00で動作開始、ps_mdo0で読出し完了)
CHR.ROMリードタイミング(psram1_csで動作開始、ps_mdo1で読出し完了)
動作検証
手持ちのカートリッジは、全て起動とキー操作可能な事は確認した。
星のカービー(PRG:512KB,CHR:256KB)も元気に飛び回っている。
※最後まで行きつける保証は無いよ。
だからと言って、全てが動くと思わない様に。
カートリッジにはメモリ拡張の為に、マッパーと呼ばれる回路を搭載している。
fpganesが理解出来るマッパーは限られており、登録されていないマッパーでは動作しない。
※マッパー云々の前に、NES-TN9の動作タイミングを疑うべきかな。
※比較的新しめの数字の大きいマッパーは、まず動かないだろう。
NES-TN9は少々無理なタイミングで動作させている、動かないと言って文句言わないでね。
感想
Tang-Nano-9Kでも出来るものだ、出来る子なんだなと一寸感心。
でも、内蔵DRAMにダイレクトアクセスが出来たらもっと良かったのだけど。
なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。