じぇみに広野氏が語るファミコンソフトの開発技術

元コンパイルの開発者、じぇみに広野氏(@jeminilog/@kopandacco)が語るファミコンソフトの開発技術に関するツイートをまとめました。
24
じぇみに @jeminilog

PC-8001版モンスターパニック(誰が知ってるんだそれは)の作者。FC版ルナボール、ZANAC、PCE版ガンヘッド、スーパーアレスタ、海外MS版パワーストライク2等のプログラマー・・・って昔のばっかで最近コレってのがないのはどうなん。このアイコンはコンパイル時代のHDDから掘り出したんだけど描いたのダレでござるか。

ぱんどら @kopandacco

趣味はPCのジャンクいじり。組んだりバラしたり壊したり(おい)エロねたもRTするのでフォローしてくださる方はご注意を。絵描きは最近復活したけど技量的にはうんまあほら。ですのでこの可愛いアイコンはのとすさん(https://t.co/5AtdySPD9l)制作なのです。


ぱんどら @kopandacco

久々に過去のゲーム機ネタ。こないだ話してて出た。前に書いてたらごめんって事で。

2014-04-16 17:45:21
ぱんどら @kopandacco

ファミコンは、基本的なハード操作法以外の触り方をして、それで面白い事が出来た場合、そんな使い方は保証しないとかなるべく言わないで、その後のバージョンの機械でも同じ動作を保証しちゃうベクトルだった。

2014-04-16 17:45:28
ぱんどら @kopandacco

別に任天堂が至高の会社だとかいう訳じゃないけど、この方針は実りが多かった。本来のハード仕様書では不可能なはずだった縦2分割スクロール(画面の上と下で違う縦スクロールを設定する)なんて、終盤は普通にそこらのゲームでやってたもんね。

2014-04-16 17:45:34
ぱんどら @kopandacco

軽く説明すると、ファミコンはVRAMに読み書きするためのアドレス設定を行うと、何故か画面のスクロール値(表示オフセット値)がそれに影響されて変わってしまう、という仕様書にはない挙動がある。どっちかというとこれはバグに近い挙動ではある。

2014-04-16 17:45:42
ぱんどら @kopandacco

ところが、縦スクロール用のレジスタは表示期間中に触っても無効(どうしてそんな仕様にしたかは謎だけど)なんだけど、アドレス設定でのスクロール変化は表示期間中でも有効。だからそれを利用する。

2014-04-16 17:45:50
ぱんどら @kopandacco

本来のスクロール設定と違って半端な位置にしかならないとか、8dot単位でしか設定できないとか制約はあるけど。だから画面下部にウインドウを切るのに使ってるだけってソフトもある。

2014-04-16 17:46:04
ぱんどら @kopandacco

ガルフォースとかファンタジージーンとかガーディック外伝とか。あとスクロールに利用してるのはデビルワールド。あれ縦は8dot単位でしか動かない。初代ゼルダも使ってるんじゃないかなこれ。

2014-04-16 17:46:15
ぱんどら @kopandacco

ところがファミコンの、この「アドレス設定でスクロール値を指定」する機能にはもう1つの性質があり、画面表示中だった場合、アドレスを書きこんだ時点のラスタ以後が、そのアドレスに対応した表示内容になる。

2014-04-16 17:46:25
ぱんどら @kopandacco

つまり同じアドレスを書き込んでも、書き込んだラスタにより、事実上の縦スクロール位置が変わる。だからアドレスを設定する位置自体も制御すれば、見かけ上は完全な画面途中からのスクロール変更ができてしまうのであった。ゴジラとかこれ。

2014-04-16 17:46:33
ぱんどら @kopandacco

しかし色々面白い機能が積まれてるファミコンも穴はある、てか穴は多い。その1つが画面の任意の位置で割りこませるための機能がない事。走査線割り込みとかタイマ割り込みとか無いのだ。ウインドウ切るのにこれがないのは辛い。

2014-04-16 17:46:43
ぱんどら @kopandacco

走査線自体を知る方法もないので、おそらくだが使われていたのがBG-OBJ衝突検出。これはOBJ(他社で言うスプライト)とBG(背景)とが重なったら特定のステータスが変化するというもの。走査線単位で判定される。

2014-04-16 17:46:52
ぱんどら @kopandacco

OBJを、ウインドウを切りたい位置に置いておいて、ステータスをCPUがじっと監視する。衝突が発生したらステータスが変わるので、後は前述のスクロール設定をするだけ

2014-04-16 17:47:01
ぱんどら @kopandacco

でも「だけ」つーてもこれやらせてる間はCPUがあまり他の事ができない。させると反応できないのでウインドウがずれたりする。処理に余裕があるゲームなら、メイン処理が終わったら監視だけさせればいいんだけど。

2014-04-16 17:47:10
ぱんどら @kopandacco

ファンタジーゾーンは処理落ちするとウインドウ位置がずれるので、もろにそれをやってるのかも。なおMMC3とかディスクシステムはタイマ割り込みが搭載されてるので、あまり変な事をしなくても自然にウインドウは切れる。

2014-04-16 17:47:20
ぱんどら @kopandacco

さてガーディック外伝では、あんまり走査線監視だけにCPUを使いたくなかったので、一計を案じた。DMA終了割り込みを使ってやろうと。

2014-04-16 17:47:34
ぱんどら @kopandacco

ファミコンにはサンプリング音源が積んである。制限が多いので当時は全然利用する気がなかったんだけど、この音源はデータ再生終了時に割り込みが発生可能になっていた。

2014-04-16 17:47:45
ぱんどら @kopandacco

なら短い無音データを作り、低いレートで再生させれば、画面中のウインドウを切りたい位置の近くで割り込みも起こせるはず。あとは走査線監視を普通にやらせればいい。これで無駄な時間を軽減できるはずだ!

2014-04-16 17:47:53
ぱんどら @kopandacco

実際うまくいった様に見えたんだが・・・リリース後、一部のファミコン(ツインファミコンだけ?)で激しい処理落ちが起きるようになった。なんでかというと、一部の本体ではDMA終了割り込みが起きないのですよ先生

2014-04-16 17:48:01
ぱんどら @kopandacco

それまでDMA終了割り込みを使おうと考えた人がいなかったらしく、出荷時の動作チェックに含まれてなかった模様。つまり世界にはDMA終了割り込みが発生しない本体がどれだけあるか不明。

2014-04-16 17:48:10
ぱんどら @kopandacco

ガーディック外伝では割り込み後にどれだけ待たされたかに動的に追随する機能があり、DMA割り込みが発生しないと自動的にワースト設定が選ばれる。つまりCPUパワーを無駄に時間待ちで浪費している状態になっておる。あーあ。

2014-04-16 17:48:19
ぱんどら @kopandacco

まだゲームが動かないよりはましだけどさー。なお、それ以後ファミコンの開発者向けの注意書きに「DMA終了割り込みは使うな(要約)」の一文が足されたのであったのであったのであったった。ええい。

2014-04-16 17:48:26
ぱんどら @kopandacco

上で出たけど、ファミコンには、一部の動作に難のある本体でもゲームを正常に動かすための開発者向けの注意書き集があった。その中には「何このおまじない」みたいな内容のものが多々ある。

2014-04-16 17:48:35