早速動作させようと、X68kの移植を始めましたが、早速つまずいています。
DE0とDE0-CVの大きな違いは2つ、パラレルFlashが無くなった事とSDRAMの容量が8MB→64MBに
なったことです。
パラレルFlashが無くなった事はConfig用AS(SPI)Flashの空き領域で代替が利きます。
PC-88の1chipバージョンでSPIからSDRAMにコピーする回路は書けているので
バスの違いだけ対処すれば問題ないでしょう。
SDRAMの容量の違いが結構、頭を悩ませています。容量が増えただけなら簡単に対処
できそうな気がしますがなかなかそうはいきません。
実はX68k用に書いたSDRAMコントローラはキャッシュ回路と密接につながっており、
RASとCASのアドレスを別々に引っ張っています。さらに、キャッシュもページ単位で
行っています。
DE0のSDRAMの1ページは256x16bit、対して-CVの1ページは1024x16bitです。
(RASはどのページを選択するか、CASはページ内のどのアドレスを選択するか
を示すアドレスだと思ってください)
実はこのDE0の256x16bitというのが実に都合の良い容量で、テキスト画面・
グラフィックス画面ともに、1ラスタ(水平1ライン)がこの256x16bit分の
容量になります。単一ページ内であれば、SDRAMはバースト読み書きで
連続読み書きが1クロック1ワード(16bit)でできるので高速にできます。
であれば、ページサイズが大きくなったのであれば特に害はなさそうですが、
連続読み出しでページ境界をまたいだ時に、0xfe→0xffの次が同じページの0x00番地
へのアクセスとなります。そこが-CVの場合は0x0fe→0x0ff→0x100になってしまうので
アクセスするアドレスが変わってしまいます。
現時点で、リードキャッシュの動作はリード命令が来たときに、0xfe番地のリード
だった場合、先読みで0xfe,0xffと読んだ後、同じページの0x00と続き、0xfdまで
キャッシュに入れます。こうすることでキャッシュの動作を簡略化させていますが
回路を変えずに-CVに適用すると、0x00番地は次のページのデータになってしまいます。
各キャッシュには上位アドレスを示すレジスタ(TAG)が1個しかなく、アドレスの上位だけを
保存するようにしかなっていませんので0xfe番地を読んだ後で0xfd番地を読むとCPUは
同じページの0xfdと0xfe番地だと思っていますがキャッシュ内データは次ページの
0xfd番地と元ページの0xfe番地のデータになってしまいます。
これを対処するために、0xffの次のクロックの時に再度リードコマンドを正しいアドレスで
送信すれば済むだけの話なのですが、キャッシュコントローラとSDRAMコントローラの
間のアドレスバスが今まではRASとCASで分けられていたものがRAS+CAS上位とCAS下位、という
格好悪い分け方になってしまい、設計的に美しくありません。
まぁ、美しいか美しくないか、だけの話ですが。
キャッシュコントローラを大きく変更すれば綺麗にできなくもなさそうですが、
キャッシュコントローラは複雑すぎて、下手に直すとバグだらけになりそうなので
あまり手を付けたくありません。