スーパーファミコンのプログラムを書きたい
2016/04/06追記
はてなブックマークの「一年前の話題」だとかでやたら人が来てたので、一年前の一年後(つまり今)の状況を記しておきます。
↓
http://gyuque.hatenablog.com/entry/2016/03/28/215253
今年はSFC 25周年である。大学ではなくスーパーファミコンのことである。
@pornanime いいからスーファミでピコピコしてろよな。
— カザオカマリ (@ykzts) March 16, 2015
スーパーファミコンを買ってもらったのは小学校に上がった頃か、日焼けして真っ茶色になってはいるが未だに動作し、手元に置いてある。共に育ったマシンなので美しい思い出を語っては上のように若造に馬鹿にされているのだが、よく考えるとこれだけ思い入れの深いスーパーファミコンで動くプログラムを書いたことはなかった。プログラマーとしてこれは誠実ではない、ということで書くことにした。
https://github.com/gyuque/SNESZoi
参考サイトとしては
- SNES研究室
- SNES Graphics Information
- Super NES Programming/SNES Hardware Registers - Wikibooks, open books for an open world
などなど。普通に検索して出てくる情報を頼りにする。
任天堂公式のドキュメントではないので、同じものをサイトによって別の言葉で指していたり、欠落している情報があったり、といった難がある。まあ、試行錯誤でカバーしていきましょう。
開発言語に関しては、Cコンパイラを使う方法もあるようだけど、もちろん野良SDKだし却って泥沼にはまりそうなので、素直にアセンブリで書いていく。
スプライト/BGデータはこんな感じ。
便利なことに、makeして出てきたバイナリはもうエミュレータで起動できる状態になっている。では早速……
左右に動かせる。
Bボタンを押すと「がんばるぞい」……はい、これだけ。いや、さすがにゲームを一本作るのはね。
ちなみに、画面の左端よりもさらに左に移動できる(つまりx座標をマイナスにできる)が、これは結構面倒臭い。スーファミのゲームでこういうシーンを見つけたらプログラマーの苦労を偲ぼう。
実機起動
Windows上で動いてるだけじゃWindowsアプリと区別付かんので、やっぱり実機で動かないとねえ、ということで Super EverDrive を発注した。これはSFC本体にROMのフリをしてイメージファイルを読ませる装置で、要するにマジコンの類。なので税関に没収されないか心配だったけど、無事通過した。ちなみに後で調べたところ、輸入禁止になっているのはDS用のみ名指しで、ということらしい。
動作チェックに使ったと思われるドラゴンボールZのゲームがそのまま入っていたのは見なかったことにする。
さて、SDカードにイメージファイルを入れて、いよいよ電源投入。
あれ……
上の動画ではさもサクッと動いたかのように編集しているが、実はこんなことになっていた。これは深刻なバグではなく、BGやスプライトの管理メモリをクリアするのを忘れていただけ。エミュレータでは勝手にクリアしてくれるので見落としていた。
では再挑戦。
ムム……
静止画だと問題ないように見えるけど、動きがガクガクしている。処理落ちしているわけではなくて、パッドの入力を取りこぼしている様子。いろいろ試してみた結果、パッドからのデータ受信完了を待つ処理を1回ではなく3回に増やすと取りこぼしが無くなった。三度目の正直か。こんなんでいいのか。 →補遺
ともかく、完成形はこちら。
まあこんなわけで、かつてスーファミ少年だったおっさんの願いは叶ったわけである。
しかしまあなんですね、私のようにスーファミで育った人間が働く歳になった頃にはスーファミのソフトを作る仕事なんてもう存在せず、同様に今3DSで遊んでいる子供達が大人になる頃には3DSのソフトを作る仕事なんて無いんでしょう。ゲームの仕事は儚い。