10周年のSPコンテンツ!
15
じぇみに @jeminilog

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

ぱんどら @kopandacco

趣味はPCのジャンクいじり。組んだりバラしたり壊したり(おい)エロねたもRTするのでフォローしてくださる方はご注意を。絵は描いてた事もあるけど微妙。ですのでこの可愛いアイコンはのとすさん(@PalePink_Notos)制作なのです。ありがとー


ぱんどら @kopandacco
久々に過去のゲーム機ネタ。こないだ話してて出た。前に書いてたらごめんって事で。
ぱんどら @kopandacco
ファミコンは、基本的なハード操作法以外の触り方をして、それで面白い事が出来た場合、そんな使い方は保証しないとかなるべく言わないで、その後のバージョンの機械でも同じ動作を保証しちゃうベクトルだった。
ぱんどら @kopandacco
別に任天堂が至高の会社だとかいう訳じゃないけど、この方針は実りが多かった。本来のハード仕様書では不可能なはずだった縦2分割スクロール(画面の上と下で違う縦スクロールを設定する)なんて、終盤は普通にそこらのゲームでやってたもんね。
ぱんどら @kopandacco
軽く説明すると、ファミコンはVRAMに読み書きするためのアドレス設定を行うと、何故か画面のスクロール値(表示オフセット値)がそれに影響されて変わってしまう、という仕様書にはない挙動がある。どっちかというとこれはバグに近い挙動ではある。
ぱんどら @kopandacco
ところが、縦スクロール用のレジスタは表示期間中に触っても無効(どうしてそんな仕様にしたかは謎だけど)なんだけど、アドレス設定でのスクロール変化は表示期間中でも有効。だからそれを利用する。
ぱんどら @kopandacco
本来のスクロール設定と違って半端な位置にしかならないとか、8dot単位でしか設定できないとか制約はあるけど。だから画面下部にウインドウを切るのに使ってるだけってソフトもある。
ぱんどら @kopandacco
ガルフォースとかファンタジージーンとかガーディック外伝とか。あとスクロールに利用してるのはデビルワールド。あれ縦は8dot単位でしか動かない。初代ゼルダも使ってるんじゃないかなこれ。
ぱんどら @kopandacco
ところがファミコンの、この「アドレス設定でスクロール値を指定」する機能にはもう1つの性質があり、画面表示中だった場合、アドレスを書きこんだ時点のラスタ以後が、そのアドレスに対応した表示内容になる。
ぱんどら @kopandacco
つまり同じアドレスを書き込んでも、書き込んだラスタにより、事実上の縦スクロール位置が変わる。だからアドレスを設定する位置自体も制御すれば、見かけ上は完全な画面途中からのスクロール変更ができてしまうのであった。ゴジラとかこれ。
ぱんどら @kopandacco
しかし色々面白い機能が積まれてるファミコンも穴はある、てか穴は多い。その1つが画面の任意の位置で割りこませるための機能がない事。走査線割り込みとかタイマ割り込みとか無いのだ。ウインドウ切るのにこれがないのは辛い。
ぱんどら @kopandacco
走査線自体を知る方法もないので、おそらくだが使われていたのがBG-OBJ衝突検出。これはOBJ(他社で言うスプライト)とBG(背景)とが重なったら特定のステータスが変化するというもの。走査線単位で判定される。
ぱんどら @kopandacco
OBJを、ウインドウを切りたい位置に置いておいて、ステータスをCPUがじっと監視する。衝突が発生したらステータスが変わるので、後は前述のスクロール設定をするだけ
ぱんどら @kopandacco
でも「だけ」つーてもこれやらせてる間はCPUがあまり他の事ができない。させると反応できないのでウインドウがずれたりする。処理に余裕があるゲームなら、メイン処理が終わったら監視だけさせればいいんだけど。
ぱんどら @kopandacco
ファンタジーゾーンは処理落ちするとウインドウ位置がずれるので、もろにそれをやってるのかも。なおMMC3とかディスクシステムはタイマ割り込みが搭載されてるので、あまり変な事をしなくても自然にウインドウは切れる。
ぱんどら @kopandacco
さてガーディック外伝では、あんまり走査線監視だけにCPUを使いたくなかったので、一計を案じた。DMA終了割り込みを使ってやろうと。
ぱんどら @kopandacco
ファミコンにはサンプリング音源が積んである。制限が多いので当時は全然利用する気がなかったんだけど、この音源はデータ再生終了時に割り込みが発生可能になっていた。
ぱんどら @kopandacco
なら短い無音データを作り、低いレートで再生させれば、画面中のウインドウを切りたい位置の近くで割り込みも起こせるはず。あとは走査線監視を普通にやらせればいい。これで無駄な時間を軽減できるはずだ!
ぱんどら @kopandacco
実際うまくいった様に見えたんだが・・・リリース後、一部のファミコン(ツインファミコンだけ?)で激しい処理落ちが起きるようになった。なんでかというと、一部の本体ではDMA終了割り込みが起きないのですよ先生
ぱんどら @kopandacco
それまでDMA終了割り込みを使おうと考えた人がいなかったらしく、出荷時の動作チェックに含まれてなかった模様。つまり世界にはDMA終了割り込みが発生しない本体がどれだけあるか不明。
ぱんどら @kopandacco
ガーディック外伝では割り込み後にどれだけ待たされたかに動的に追随する機能があり、DMA割り込みが発生しないと自動的にワースト設定が選ばれる。つまりCPUパワーを無駄に時間待ちで浪費している状態になっておる。あーあ。
ぱんどら @kopandacco
まだゲームが動かないよりはましだけどさー。なお、それ以後ファミコンの開発者向けの注意書きに「DMA終了割り込みは使うな(要約)」の一文が足されたのであったのであったのであったった。ええい。
ぱんどら @kopandacco
上で出たけど、ファミコンには、一部の動作に難のある本体でもゲームを正常に動かすための開発者向けの注意書き集があった。その中には「何このおまじない」みたいな内容のものが多々ある。
残りを読む(25)

コメント

コメントがまだありません。感想を最初に伝えてみませんか?

ログインして広告を非表示にする
ログインして広告を非表示にする