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

Hello, my name is pornanime.

近況

毎年、ベーマガのライターや読者だった人が都内某所で適当に飯食ったりゲームしたりする会というのがあって

f:id:gyuque:20161223021531j:plain

スーファミゲーをお披露目。と言っても、効果音だけでBGMは無し。グラフィックは前も書いた通り全取っ替えの予定ですが、知らなければ完成しているようには見えます。

新しいグラフィックの制作は新年ぐらいの見込みなので、その間にMMLコンパイラのパーサを書き直す予定。というのも、もうC++で普通に正規表現を使える時代になっていたのを知らなくて「極めて野蛮なコード」を書いてしまったので、std::regexに直していこうかと、思うんですよ。


その他、松原社長(d:id:nicotakuya)に見せていただいたもの

f:id:gyuque:20161223001504j:plain

学研のLSIゲーム「パックモンスター
見ての通りパックマンのパクリなんですが、本物と似てるようで違う気がする間抜けな音楽が流れます。青色LEDなんて製品レベルでは無い時代なので、これは蛍光表示管。明るくて見やすいのはいいけどガンガン電池を食います。

f:id:gyuque:20161223001551j:plain

キラキラスターナイトDX
DXじゃない方をCDで持ってるので、ゲーム内容よりカセットや説明書を観賞。右に写っているファミコンのコントローラーは勿論、ミニじゃなくてオリジナルの方。なんだけど、これは確か起動しないやつで、直ちに奥から出てきた2台目で動かした気がします。

スーファミゲーム進捗

効果音関連の処理(S-CPU側からの指令+SPC側のドライバ実装)ができたので、ゲーム本体に入れていこうかと。1UPは冗談なので勿論使わないけど……
とりあえず、二宮さんからいただいている効果音のうち、豊井さんに依頼するグラフィックの刷新(多分年末ぐらいから)の影響を受けなさそうな物を先に入れるかな。

BGM用とは別仕様の簡易なシーケンサを回す感じの実装になっているんだけど、どうなのかなあ。フル装備のシーケンサを何本も走らせるのは不安だったのでこうしてしまった。ああ、計測せずに最適化しちゃったよ。まあいいか。

1円の本を買ったのでレビューします

普段スーパーファミコンのプログラミングをする時に見ている資料の一つに、下の日本語のサイトがあります。

Console/Emulator Programming Resource in Japan

基本的な仕様は海外のサイトを探したほうが揃うんですが、そういう所で抜け落ちる「隙間の」情報がうまいこと載ってるのでよく見てるんですね。
普段はGoogleの検索から直接資料に飛んでしまう(最近はもうローカルに落としてしまった)ので上のページをよく見ていなかったんですが、改めて見ると

裏ゲーム読本 オークラ出版 ¥1714
※添付CD-ROMの文書を許可をもらって公開しています。

え、何?紙の書籍なの?というか出版年が1998年ってまだスーファミがギリギリ現役だし訴えられるリスクがあるのでは? ようやるわ。
しかも

…………。興味が湧いてきたので、Amazonで買ってみました。本体1円+送料257円。代金の実に99.6%が送料であり、無を運ぶヤマト運輸。ご苦労様です。
ちなみに「SM調教師瞳」って何?という方は下のサイトを見て下さい。頭を抱えながら読みましょう。

2日後。はい、届きました。

f:id:gyuque:20161209200111j:plain:w300

CD欠品の注記が無かった業者から買ったのに、CDが付いてないな……まあスーファミの資料は上のサイトにあるからいいか。MSXのゲームとかが入っているらしいので、できればそれも欲しかったんですけど。

内容は「薄い本の厚いやつ」というか、コミケの評論本ノリで各ライターが好き勝手に書く、という雰囲気です。エミュレーター、マジコン、改造……と、この手の本なら定番の内容でしょうか。海外で海賊版を漁る話なんかも出てきますが、韓国が「電脳のイメージが無い国」という扱いなのは時代ですね。ちなみにマニアから見て韓国は言うほど海賊版天国というわけではなく「オススメ」はタイだそうです。98年の話ですが。
さて、プログラミング関係。ゲームボーイは割と丁寧に解説されているのですが、スーパーファミコンに関してはおざなりというか、CDに収録されているサンプルを見て頑張れ、とでも言わんばかりで、うーん、本気で信じて買った人はどう思ったんだろうか。

(30頁より)
この本さえあれば、スーパーファミコンのソフトを作ることも可能になっていますが、

いやいやいや……
基礎知識がある人間であっても、この本だけ見てソフトを作るのは厳しいと感じましたが、インターネットが普及した今となってはもうどうでもいいことではあります。というか16進数の説明とかこの本でしなくてもいいでしょ。
開発環境が古臭いのでN64の仕事はもうしたくないという愚痴とか、橋本氏が万世橋署に引っ張られた(逮捕ではない)話とか、そういう読み物は面白いので、マケプレで他の本を買うついでぐらいなら買ってもいいんじゃないでしょうか。ちなみに、カーリルで探したところ図書館には全然無いようですね。アングラ系を扱った本は絶対図書館に入らないというわけでもないんですが。

↓欲しいという方はマケプレから適当に選んでください。1円のやつは私が買ったので、これを書いている時点で72円が最安になっています。
https://www.amazon.co.jp/dp/4872782852

試していなかったテクニックのテスト

ゲーム本体の実装が落ち着いたので、今まで手を付けていなかったラスタスクロールとスプライトの動的転送について調べていた。

ラスタスクロール

↓ラスタスクロールというのはお馴染みのこれですね。ゲームに使うかどうかはともかく、定番のテクニックなので一応押さえとこうと
f:id:gyuque:20161121014533g:plain

初代ファミコンのソフトはこれを裏技的に、強引に実装していたそうだけど、スーパーファミコンは最初からこのためのHDMAという機能を搭載しているので、実機でうまく動かない、といった理不尽な苦労はない。

参考:

1番目のページは頻繁に見ているのにHDMAの説明がしっかり入っていることに気付かなかった。灯台下暗しというか……

スプライトの動的転送

これはアニメーションのパターンを増やすための技術。

例えば、主人公の歩行アニメーションが4コマで構成されているとしたら、4コマ全てをVRAMに転送しておいて切り替えながら表示する、というのが最も単純な実装なのだけれど、VRAMは64KBしかないのでこれだとあまりパターン数を豊富にできない。
そこで、VRAM上には主人公キャラ用のエリアを1コマ分だけ確保しておいて、随時そこをROMから転送して書き換えることで、少量のVRAMで大量のパターンを使えるようになる。今風の言葉で言うと、ストレージからストリーミングするという感じか。

↓ちなみに他機種(メガドライブ)だけど、これの実装を指示している仕様書というのが見られる。
Ancient-blog 3Dベア・ナックルII配信記念特別企画【パート1】

市販のゲームなら間違いなく使われているテクニックだけど、今までは「まあ、そこまでしなくていいかな」と思って実装していなかった。ただ、豊井さん(ドッター)のスケジュールが12月まで空いていないということなので「じゃあ、その間にやりますか」という話になった。

で、増えたパターンで何をしたいかというと、所謂spawn(登場)の演出に充てたいなと。例えば「星のカービィ」だと、開始時にカービィが星に乗って飛んでくるでしょう。

星のカービィ 夢の泉の物語

あと、ロックマンだと空からスーッと降りてくるやつ。

f:id:gyuque:20161121202500j:plain

こういうのが欲しいよね、ボーッと突っ立った状態からスタートするのダサいでしょ、と。
とりあえず転送用のルーチンは作ったので、従来のものと入れ替える作業を今から。

ゼロから始めた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匹で処理落ちしていた以前のプログラムより随分進歩した。自弾と敵の衝突判定などもこれから入ってくるが、この様子だと大丈夫かな、多分。