ゼロから始めた2016年のスーファミ開発環境
去年の春に「そろそろスーファミのプログラム書いてみてえな」と思い立って
ということがあったんですが、あれから約1年半。自分なりの開発環境が固まってきて、簡単なゲームぐらいなら流れ作業的に作れる程度まで圧倒的成長したので、ここで一度、我が家のスーファミ開発環境をまとめて紹介します。
OSとPC
普通のWindows PCでよい。
make
元気よくcygwinをインストールしよう。
Windows 10でUbuntuが動くやつは私の見聞きした情報が正しければ、何の役にも立ちません。
アセンブラ
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で言うグローバル変数にあたる情報であれば、デバッグ用のコードを入れなくても割り当てた領域を直接見れば大体のことが分かる。
↓例えば敵キャラが画面に出てこないバグが出た場合、下のようにメモリ上にちゃんと存在していれば描画関係がまずい可能性が高く、メモリ上にすら存在していなければそもそも敵を登場させる処理がコケている可能性がある。
ステップ実行とかは使っていない。
グラフィックエディタ
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の更新などを済ませて時間を稼ぐとよい)
- 乗算・除算器の結果が出るタイミング(エミュレータでは、仕様より早く結果を取得しても正しく動いてしまう)
- データの初期化忘れ(エミュレータでは、メモリが綺麗に初期化されてしまうので気付かないことがある)
パッド入力や乗除算器を直接扱うルーチンは頻繁に書くものではないので、常に気をつける必要があるのはデータ初期化ぐらいということになる。
そして……
ゲーム本体に関しては満足のいくものが出来つつある。あとは箱や説明書も作ってみたいが……うまくいったらまた報告します。
現況
ゲーム中に登場するオブジェクト(プレイヤー、敵、自弾、敵弾)に関わるルーチンが全て実装できた、ということで動きはほぼ完成品と同等。
あとは文字表示とか細かい所が終わったら、いよいよサウンドドライバの組み込み。しばらく触ってなかったからリハビリが必要かも。まあそんな大規模なものではないが……
SHENZHEN I/O
話題のあのゲーム
Shenzhen I/O はまじでやったほうがいいですよ
— ラ・バンダ (@ssig33) 2016年10月24日
@pornanime 中国へようこそ!!
— ラ・バンダ (@ssig33) 2016年10月24日
ということで購入して一通り終えたので、無事に深圳工作を退職することができた。パズル性を高めるために現実のMCU(CPU)ではちょっとあり得ないような仕様になっている部分があって、教育用ソフトとしてはどうかな……と思った。
現況
猫4匹を同時に動かす負荷のテスト。スーパーファミコンのプログラムを書く場合、テレビ画面の走査線が一巡する時間を基準に処理負荷を考える。前提知識として、SFCのプログラムは以下のようなサイクルで動いている。
- 走査線の位置がY=224(画面の下端)に達するとVBLANK割り込みが呼ばれる
- 224から、255に達するまでの間は画面上に走査線が無く、CPUからVRAMにアクセスして描画処理が可能になる。逆にこれ以外のタイミングではPPU(今で言うGPUのようなもの)がVRAMを占有しておりアクセスに失敗する。
- 255の次は0に戻って、画面の上端から走査が始まり、再び224に達すると最初に戻る
<注>
- ここで言う「描画処理」は現代のPCとは違って「描画処理に使う設定情報の更新」と言った方が正確。実際の1ピクセル単位の描画はPPUが行う(だから超低性能のCPUでもゲームを動かすことができる)
- 本物のテレビはインターレース・スキャンだけど、プログラムを書く上ではプログレッシブ・スキャンのイメージで大丈夫
ということで、つまり走査線の位置が次に224に達するまでの間に当たり判定などの処理が終わらないと描画処理に入れなくなり「処理落ち」の状態になってしまう。SFCではプログラムから走査線の位置を取得できるので、これを見ればどれくらい処理に余裕があるかベンチマークを取ることができる。
猫4匹が走っている+自弾を撃っている状態で3Ah(58)ということでかなり余裕があり、猫3匹で処理落ちしていた以前のプログラムより随分進歩した。自弾と敵の衝突判定などもこれから入ってくるが、この様子だと大丈夫かな、多分。
スーファミ進捗
Windows上で作ったプロトタイプをスーファミに移植していく。
一番面倒な衝突判定のコアが意外と早く移植できたので、それなりのデモとして動く感じになった。
↑ スーファミ実機でテスト中の様子
↑ こんな感じでCのソースを見ながらアセンブリに写経していく。アルゴリズムはC版を作った時点で固めてあるので、この時点ではもう何も考えることがなくなっており、効率が良い。急がば回れということ。
ニンテンドークラシックミニ ファミリーコンピュータ
ボーっとしてたら一瞬で完売していた。年末までに復活してほしいが……
ハードの中身を一切変えずにスーファミ版が出来ると思うんだけど、食い合うような製品を同時に出すわけはないね。来年かなあ。せめて半年で、なんとか。
近況
DORANEKO SLAYER
タイトル → メイン(本編) → エンディング までが一通り揃った形に。来週余裕があれば本番実装(SFC版)に入れるかな、というところ。
PAのロゴはコナミ+コンパイルのつもりで作ったんだけど「データイーストみたい」と言われてしまった。
ロゴがメタリックならデータイーストか?
Humble Bundle の NeoGeo Classics Pack 4 を買った
はい。殺すはよくない。
別に格闘ゲームは得意じゃないんだけど、真サムは出た当時ベーマガが(どう考えてもライターの趣味で)プッシュしまくっていたので、ゲームセンターなんて一切行かないのに内容はよく知っていた。そういえば闘技場のタイトルも「真」になってたっけ。今から考えると「BASIC」マガジンに延々とサムスピの話が載っているのは完全に意味が分からないけど、皆さんいつかこういうプログラムが作れるようになるといいね、という目標として載せていたのかもしれない。まあ趣味だろうけど……
ドット絵を描いた
NEW GAME! 最終回記念にドット絵を作ったのでどんどん承認してください
— 涼風青葉は私たちに微笑みかける死体 (@pornanime) 2016年9月20日
(劣化無し) https://t.co/QR93wwTfQl pic.twitter.com/UctRq3EjYU
絵自体は猛暑の頃からダラダラ描き溜めてたんだけど、気付いたら最終回の時期になっていたのでモーションを2日集中でガッと付けた。おかげで寝不足になったので本業圧迫で怒られないように頑張って平静を装っている。