C言語でスーファミ用のソフト開発(1)PVSnesLibの導入

「PVSnesLib」という開発環境を使うと、C言語スーパーファミコンのソフトが作れるようです。PVSnesLibの公式ページはこちらです。特に新しい話題というわけではないのですが、最近になって知ったので触ってみました。

github.com

PVSnesLibという名前からして、ライブラリを連想しますが、実際にはCコンパイラアセンブラ、変換ツールも付いてきます。ただしmakeが付属していません。

 

公式のWikihttps://github.com/alekmaul/pvsneslib/wiki/Installation)によると、「Windows環境では、MSYS2 UCRT64 などのツールが必要」らしいので、「devkitPro」(https://devkitpro.org/)というツールチェインをインストールします。devkitProのインストーラを実行すると、「Switch」とか「NDS」とか「3DS」の名前が出てくるのですが、こんな新しいハードもソフトが作れるんでしょうか? これは危なそうなので、自分はチェックを全部外してインストールしました。大量のツールがインストールされるのですが、その中にmakeが含まれています。

 

PVSnesLibのreleasesのページからビルド済みのファイルをダウンロードして、展開します。自分の場合、展開した「pvsneslib」フォルダを「C:\devkitPro」の下に置きました。

 

システム環境変数に「PVSNESLIB_HOME」の項目を追加します。パスは「C:\~」じゃなくて、「/C/~」と書くようです。

 

    

PVSnesLibにはサンプルプログラムが60種類以上も収録されています。グラフィック表示、サウンド再生、マウス入力、SRAMバックアップなど一通り網羅してます。著作権的に問題ありそうな素材が混ざっているのが困りもの。

 

たとえば、「hello_world」というサンプルをビルドしたい場合、MSys2を起動して、、、

cd $DEVKITPRO/pvsneslib/snes-examples/hello_world
make

と入力します。これだけで、ROMイメージ(sfc)のファイルが出来上がります。MSys2じゃなくて、コマンドプロンプトPowerShellでも実行可能ですが、「$DEVKITPRO」という表記が使えません。

 

Visual Studio Code(VS Code)」を使って開発することも可能です。ここでは例として「Waves」というサンプルをビルドします。Wavessnes-examples\graphics\Effectsフォルダの中にあります。

VS Codeを起動したら、「フォルダを開く」を選択して、Wavesフォルダを開きます。もし、VS Codeのメニューが英語表記の場合は「Japanese Language Pack」の拡張機能を入れておきましょう。

Wavesフォルダ内にあるファイルは次の通りです。

・data.asm:リソースの割り付け設定のコード。アセンブラ

hdr.asm:ROMの情報。アセンブラ

Waves.c:メインのソース。C言語。プロジェクトによってファイル名が違う。

・pvsneslib.png:BG画面のリソース。256×256ピクセル

Makefile:メイクファイル。

続いて、次のページから3つのjsonファイルを入手します。

https://github.com/alekmaul/pvsneslib/tree/master/vscode-template

jsonファイルを「.vscode」フォルダに入れた状態で、作業用のファイルと同じ階層に置きます。

 

「.vscode」フォルダの「c_cpp_properties.json」内で設定しているパスを修正します。自分の場合はこうなりました。

 "pvsneslibPath": ["C:/devkitPro/pvsneslib/pvsneslib/include/**","C:/devkitPro/pvsneslib/devkitsnes/include"],

これで設定は終わりです。

 

続いて、ビルドをします。VS Codeのメニューから「ターミナル」→「新しいターミナル」を選択すると、ターミナルが表示されますので、「make」のコマンドを入力します。

makeを実行すると、変換ツールやCコンパイラが呼び出されて、最終的にROMイメージ(sfc)が出来上がります。ビルド中、画像から3つのバイナリファイルが生成されます。

・pvsneslib.pal:BGのパレット。バイナリ。1色あたり2バイトなので、16色で32バイト。
・pvsneslib.pic:BGのパターン。バイナリ。カラーモードは16色。
・pvsneslib.map:BGのタイルマップ。バイナリ。256×256ピクセル=32×32セルぶん。

バイナリファイルをどう生成するかという設定はMakefileに書いてあります。

 

Waves.sfc」の中身をRomビューアでチェックしてみました。容量2メガビットですが、ほとんど「0」が書き込まれていて真っ黒です。

 

Waves.sfc」をエミュレータで実行してみました。ラスタースクロールしてます。Aボタンを押すと揺れが止まります。Bボタンを押すと揺れが再開します。

ビルドするには毎回「make」と打たないといけません。これはカーソルキーの上を押せばいいだけですが、動作チェックで毎回エミュレータを実行しないといけないのが、面倒です。

思い付いた対策としては、拡張子の「sfc」をエミュレータに関連付けしておいてから、

make
IF %ERRORLEVEL% EQU 0 (
    start Waves.sfc
)

こういう「run.bat」というバッチファイルを作っておいて、「.\run」と入力すれば、makeに成功した時だけ、エミュレータが自動的に呼び出されます。

 

(以下、番外編)

6年近く前に作ったフラッシュROM搭載のカートリッジ基板とライターです。

DIY SFC CARTRIDGE」と呼んでいます。これを使ってROMイメージ(sfc)が実機のスーファミで動くか確認してみます。

 

ライターでフラッシュROMにROMイメージを書き込みます。以前はライターのプログラムは「PI STARTER」で作ったのですが、もう入手が難しいので、Pythonで書き直しました。

 

実機でも問題なく動きました。シェルは3Dプリンタで作りました。

プリント基板のデータと書き込み用のプログラムはGitHubで公開してます。

github.com

続き

nicotakuya.hatenablog.com

nicotakuya.hatenablog.com