マイコン工作実験日記

Microcontroller を用いての工作、実験記録

Doom Player -- QSPI Flashについて

2022-02-25 21:36:49 | DoomPlayer

Doom Playerでは、次の目的でQSPIフラッシュを使用しています。

  1. ゲームデータであるWADファイルの格納
  2. ゲームの設定データの格納
  3. Music Player機能で表示に使用する円形の画像データの格納

このQSPIフラッシュとしては、WinbondのW25Q128JVとW25Q256JVを使っています。シェアウェア販であるDOOM1.WADであれば、およそ4MBのサイズなので64Mbitのフラッシュでも足りるのですが、正規ゲーム版のDOOM.WADになると10MB越えになるので128Mbitが必要となります。PLUTONIA.WADTNT.WAD になると16MB越えなのでW25Q256JVを使っています。

W25Q128JVは安価でSOIC-8パッケージもあるのでアマチュアにとっても使いやすいデバイスです。W25Q256JVはパッケージがWSON-8になってしまい幅広なので、秋月のSOP8 DIP変換基板に載らないのが残念なところ。

どちらもWinbondの製品ですので、QSPIフラッシュのコマンド体系は同じなのですが、128Mbitまでは3バイトのアドレスで足りたのが、256Mbitになると4バイトアドレス指定が必要になります。したがって、容量の違いを判別して、適切な長さのアドレスを送る必要があります。容量の判定するには、Read Manufacturer/ Device IDコマンドでデバイスのIDを読んで判定することもできますが、今回はRead SFDP registerコマンドを使ってSFDP情報に含まれる容量情報を参照することにしました。

SFDPには、読み出しに使用するコマンドや、セクターのサイズ等の情報も含まれているので、これらを参照して動くようなコードを用意することも可能なように思われますが、使うデバイスによってはベンダー固有情報も参照しないとならなくなる場合もあるようなので、どんなベンダーのどんなデバイスでもサポートするドライバを作るためには、ノウハウの蓄積が必要そうです。Winbondの場合には、基本パラメータテーブルだけしか持っていないようなので、複数デバイス対応も難しくなさそうです。

写真のように複数のフラッシュを用意したので、それぞれに別のWADファイルを書き込んでおき、フラッシュの差し替えでゲームを切り替えることが可能です。以下、オープニングの画面だけですが、紹介しておきます。

上に示したWADファイルは、いずれもゲームを起動できデモを一巡することができるのですが、一部のファイルではゲーム開始時やステージの切り替わり時にメモリが不足してリブートしてしまう場合があります。画面切り替わり時に画面が崩れ落ちるように切り替わるワイプ表示効果でメモリが消費されるのが原因なので、ゲーム開始時にこのワイプ表示を行わないようにするボタンを用意してあります。

ソースファイルのf_wipe.cで処理されているのでwipeボタンにしたのですが、Doom用語では "Screen Melt" と呼ばれているようなので、そのうちに修正するつもりです。

手持ちのWADファイルのデモは、この対処でいずれも内蔵メモリだけでも一巡できるようになったのですが、どうもギリギリで動いている箇所もある気配です。実際にゲームをすると、メモリが不足するステージもあるに違いないでしょう。やはり、実際にゲームをプレイして楽しむためには、PSRAMを積んで動かした方が良さそうです。