読者です 読者をやめる 読者になる 読者になる

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

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

現況

ゲーム中に登場するオブジェクト(プレイヤー、敵、自弾、敵弾)に関わるルーチンが全て実装できた、ということで動きはほぼ完成品と同等。

あとは文字表示とか細かい所が終わったら、いよいよサウンドドライバの組み込み。しばらく触ってなかったからリハビリが必要かも。まあそんな大規模なものではないが……

SHENZHEN I/O

話題のあのゲーム


ということで購入して一通り終えたので、無事に深圳工作を退職することができた。パズル性を高めるために現実のMCU(CPU)ではちょっとあり得ないような仕様になっている部分があって、教育用ソフトとしてはどうかな……と思った。

f:id:gyuque:20161106214213p:plain

現況

f:id:gyuque:20161031192445p:plain

猫4匹を同時に動かす負荷のテスト。スーパーファミコンのプログラムを書く場合、テレビ画面の走査線が一巡する時間を基準に処理負荷を考える。前提知識として、SFCのプログラムは以下のようなサイクルで動いている。

  • 走査線の位置がY=224(画面の下端)に達するとVBLANK割り込みが呼ばれる
  • 224から、255に達するまでの間は画面上に走査線が無く、CPUからVRAMにアクセスして描画処理が可能になる。逆にこれ以外のタイミングではPPU(今で言うGPUのようなもの)がVRAMを占有しておりアクセスに失敗する。
  • 255の次は0に戻って、画面の上端から走査が始まり、再び224に達すると最初に戻る

<注>

  • ここで言う「描画処理」は現代のPCとは違って「描画処理に使う設定情報の更新」と言った方が正確。実際の1ピクセル単位の描画はPPUが行う(だから超低性能のCPUでもゲームを動かすことができる)
  • 本物のテレビはインターレース・スキャンだけど、プログラムを書く上ではプログレッシブ・スキャンのイメージで大丈夫

ということで、つまり走査線の位置が次に224に達するまでの間に当たり判定などの処理が終わらないと描画処理に入れなくなり「処理落ち」の状態になってしまう。SFCではプログラムから走査線の位置を取得できるので、これを見ればどれくらい処理に余裕があるかベンチマークを取ることができる。

f:id:gyuque:20161031192240p:plain

猫4匹が走っている+自弾を撃っている状態で3Ah(58)ということでかなり余裕があり、猫3匹で処理落ちしていた以前のプログラムより随分進歩した。自弾と敵の衝突判定などもこれから入ってくるが、この様子だと大丈夫かな、多分。

スーファミ進捗

f:id:gyuque:20161016150140p:plain

Windows上で作ったプロトタイプをスーファミに移植していく。
一番面倒な衝突判定のコアが意外と早く移植できたので、それなりのデモとして動く感じになった。


スーファミ実機でテスト中の様子

f:id:gyuque:20161016150425p:plain
↑ こんな感じでCのソースを見ながらアセンブリに写経していく。アルゴリズムはC版を作った時点で固めてあるので、この時点ではもう何も考えることがなくなっており、効率が良い。急がば回れということ。

ニンテンドークラシックミニ ファミリーコンピュータ

f:id:gyuque:20161016151304j:plain
ボーっとしてたら一瞬で完売していた。年末までに復活してほしいが……
ハードの中身を一切変えずにスーファミ版が出来ると思うんだけど、食い合うような製品を同時に出すわけはないね。来年かなあ。せめて半年で、なんとか。

近況

SFC

背景グラフィックをプロトタイプ版からSFC版に移植する作業。
実は厳密に制限を考えながら描いていなかったので不安だったけど、ギリギリ16色×7パレットに収まった。ハードの仕様上、BGは8パレットまで使えるが、1つはテキスト表示に使うので、背景の絵は7パレットで描く必要がある。ただし、スプライトはこれらと別にパレットを持つのでさらに表示色数を増やせる。スーファミ凄い。

f:id:gyuque:20160929011109p:plain

似たような色が重複していてあまり上手い使い方ではないんだけど、技が極まるのを待ってると人生終わりそうなんで、これで行きます。

その他

実際問題、いまさらメガドラ新作ソフトを作れるのか?セガにぶっちゃけ聞いてみた!【いまさらメガドラソフト開発計画】

実はさ、任天堂じゃこの手の話は絶望的なのでメガドラで作ればよかったかな?とちょっと思ってたんですよ。でもセガもダメか、残念。日本のセガがダメでも欧州とかアメリカに持っていけば、みたいな話にはならないんだろうか。

ところでブラジルではメガドライブがまだ現役なんでしょ?という有名な話があるが、正規販売元(Tectoy)のサイトを見たらメガドライブが消えて8bit機のマスターシステムだけになっていた。なんで退化しとんねん。

f:id:gyuque:20160928200211p:plain:w243

近況

DORANEKO SLAYER

f:id:gyuque:20160922214650p:plain f:id:gyuque:20160922214658p:plain
f:id:gyuque:20160922214705p:plain f:id:gyuque:20160922214711p:plain

タイトル → メイン(本編) → エンディング までが一通り揃った形に。来週余裕があれば本番実装(SFC版)に入れるかな、というところ。
PAのロゴはコナミコンパイルのつもりで作ったんだけど「データイーストみたい」と言われてしまった。
f:id:gyuque:20160922235324g:plain
ロゴがメタリックならデータイーストか?

Humble Bundle の NeoGeo Classics Pack 4 を買った

f:id:gyuque:20160922235419j:plain
はい。殺すはよくない。

別に格闘ゲームは得意じゃないんだけど、真サムは出た当時ベーマガが(どう考えてもライターの趣味で)プッシュしまくっていたので、ゲームセンターなんて一切行かないのに内容はよく知っていた。そういえば闘技場のタイトルも「真」になってたっけ。今から考えると「BASIC」マガジンに延々とサムスピの話が載っているのは完全に意味が分からないけど、皆さんいつかこういうプログラムが作れるようになるといいね、という目標として載せていたのかもしれない。まあ趣味だろうけど……

ドット絵を描いた

絵自体は猛暑の頃からダラダラ描き溜めてたんだけど、気付いたら最終回の時期になっていたのでモーションを2日集中でガッと付けた。おかげで寝不足になったので本業圧迫で怒られないように頑張って平静を装っている。

状況

Windows上で動くプロトタイプが8割ぐらい完成状態

そろそろ本番(SFC版)の実装に行っても……と勇み足をするとグダグダになりそうなので、99%ぐらいまで作り込んで素材を全部揃えてからにしようかと思う。

グラフィックも実機と同じ構成(背景BG2面+テキスト用BG1面+スプライト)で作ってあるのでそのまま再現できると思うんだけど、スプライトの横並び制限に引っかかったら優先順位のローテーションを入れる必要がある。