Hello, my name is pornanime.

ゼロから始めた2016年のスーファミ開発環境

去年の春に「そろそろスーファミのプログラム書いてみてえな」と思い立って

スーパーファミコンのプログラムを書きたい - ポルノアニメ

ということがあったんですが、あれから約1年半。自分なりの開発環境が固まってきて、簡単なゲームぐらいなら流れ作業的に作れる程度まで圧倒的成長したので、ここで一度、我が家のスーファミ開発環境をまとめて紹介します。

OSとPC

普通のWindows PCでよい。

make

元気よくcygwinをインストールしよう。
Windows 10Ubuntuが動くやつは私の見聞きした情報が正しければ、何の役にも立ちません。

アセンブラ

cc65/ca65 というものを使っている。名前を見るとCで書けそうだけど、それは6502(初代ファミコン)用のコードだけで、65816のコードはアセンブリで書く必要がある。つまり実際に使うのはca65の方だけ。
スーファミには、メインCPUの65816とは別にサウンド制御用のコントローラ「SPC700」が載っていて、これのアセンブラとして「bass」を使っている。本体側とSPC側で文法が変わってしまうが、SPC側はそんなに巨大なシステムを作るわけではないので、慣れない感じで書いても大丈夫。

しかし最近知ったのだけれど、WLA DXという凄いヤツがあるらしい。極めて多機能で、本体側だけではなくSPC側もこれ一本で書ける。おまけにスーファミ以外のハードも書ける。まあでも、cc65+bassで構築してしまったので今更もういいかな……
今から始める人はこっちがいいかもしれない。

デバッガ

デバッガなんてあるのかよ。あります。インターネットは凄い。
Geiger's Snes9x Debugger: Geiger's Crypt
恐らく一番使う機能はメモリダンプビューアで、メインメモリだけではなくARAM(SPC700側のRAM)やVRAMも覗ける。Printfなんてものは無いので、メモリの適当な場所にデバッグ情報を書きこんでおいてビューアで覗く。Cで言うグローバル変数にあたる情報であれば、デバッグ用のコードを入れなくても割り当てた領域を直接見れば大体のことが分かる。
↓例えば敵キャラが画面に出てこないバグが出た場合、下のようにメモリ上にちゃんと存在していれば描画関係がまずい可能性が高く、メモリ上にすら存在していなければそもそも敵を登場させる処理がコケている可能性がある。
f:id:gyuque:20161116213626p:plain

ステップ実行とかは使っていない。

グラフィックエディタ

Paintshop Pro 3.2というもの。これは確かPC-9821Ap2(途中からV200になった気がする)にWindows 95を入れていた頃から20年近く使っている。完全に手に馴染んで依存してしまいバージョンアップもできない、という話なので客観的に見て特にこれが優れているわけではないと思う。
普通は……Edgeでいいんじゃないでしょうか。豊井さんも使ってたし。

テキストエディタ

Sakura Editorを使っている。Emacsでいうところのdabbrev機能があり、自分で定義したマクロやサブルーチン名はこれで十分実用的に補完できる。素の命令はどうせ3文字なので手で打てばいい。

Visual Studio

Mac版発表で話題のVSがスーファミにも対応? などという話では勿論なくて、画像コンバータやマップエディタ等のWindowsで動く周辺ツールを必要に応じてC#で作る。
最初はこの手のツールをHTML5ベースで作っていたが、ローカルファイルを扱うのにいちいちダイアログを操作する必要があるので嫌になった。セキュリティのためとか言われても面倒なものは面倒だ。

スーパーファミコン本体

子供の頃からの物をそのまま使っているが、無くても簡単に買える。市場で最も在庫豊富なレトロハードではないかな。

アナログテレビ

ヤフオクで買った。1000円。

Flashcart

実機で動かすのに必要なもの。
Flashcartとは即ちフラッシュメモリを搭載したカートリッジ……要するにマジコンなんですが、スーファミ等レトロハードの物は合法的に入手できる筈です。すっかりダメになった秋葉原には無いと思うのでebayとかで探しましょう。DS用のものは名指しで輸入禁止なので絶対買わないように。

作業の流れ

まず前述のようにC#で作ったツールを使い、グラフィックやマップのデータ……今時の言い方だとアセットを準備。いちいちファイルを指定して読み込み、保存……なんてやるのは面倒なので、フルパスが埋め込んであり、ボタン一発で所定のファイルに上書き保存する。

プログラムに関しては、makeするとROMイメージがいきなり出力されるので、エミュレータを関連付けしておけばワン(ダブル)クリックで実行できる。正直、一度環境を作ってしまえばPCで動く普通のプログラムとそんなに手間は変わらない。

そして、たまに実機でちゃんと動くか確認する。実機登場から26年も経つと野良エミュレータの精度もかなりの物なのでそこまで心配する必要はないが、以前も書いたように以下の点で、エミュレータでは再現できないバグが出ることがある。

  • パッド入力を読むタイミング(VBLANK期間に読むということになっているが、VBLANK発生直後はまだ転送が始まっていないので、先にVRAMの更新などを済ませて時間を稼ぐとよい)
  • 乗算・除算器の結果が出るタイミング(エミュレータでは、仕様より早く結果を取得しても正しく動いてしまう)
  • データの初期化忘れ(エミュレータでは、メモリが綺麗に初期化されてしまうので気付かないことがある)

パッド入力や乗除算器を直接扱うルーチンは頻繁に書くものではないので、常に気をつける必要があるのはデータ初期化ぐらいということになる。

そして……

f:id:gyuque:20161116211035g:plain

ゲーム本体に関しては満足のいくものが出来つつある。あとは箱や説明書も作ってみたいが……うまくいったらまた報告します。