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

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

例えばカラーパレットを書き換える時は、まず$0000を設定してから$3F00を設定しろとか。他には一度に16バイト必ず続けて書きこめとか。そういう操作をする事で、初期のファミコンでも問題なく動くようになる。

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

しないとどうなるかというと、例えばゼビウス。一部の本体だと、遊んでいるうちに一部のキャラの色が真っ白に化け始める。上記の指示は多分この症状への対策と思われる。

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

で、その中に「DMAを使ってるとキー入力にノイズが入る可能性がある」というもあった。具体的に言うとコントローラーの読み取りにノイズが入ってしまうので、あらぬ操作になったりする。

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

対策手段は、2回読んで同じ値なら正常とみなすというもの。ほんとに瞬時のノイズなんだね。

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

でもってガーディック外伝なんだけど、ええとその前に、前提としてファミコンは2*2キャラ単位でパレット指定を行っているというのがある。そしてパレット指定は2bitなので、2*2キャラを4つまとめたものを1バイトで制御している。(4*4キャラになるね)

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

でもゲームは4*4キャラずつしか書き換えない訳じゃない。せめて色指定の最低単位、2*2で書き換えたい事が多い。まあ当時の話だが。

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

あとファミコンの内部画面は32*32とか32*28じゃなくて、珍しい32*30。縦に4ずつ使ってると2余る。縦スクロールのゲームは、たとえ4*4でマップを作っていても、内部的には2*2で制御しないと破綻する。

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

さて2*2だけ書き換えたい場合、他の12キャラまで巻き添えにはできない。だからZANACではメモリ上にパレット指定のコピーを作り、そこから値を読んできて部分書き換えし、コピーに書き戻しつつVRAMへ書き込んでいた。

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

ガーディック外伝ではもう一歩進め、VRAMから必要な情報を読み出し、部分書き換えして書き戻すようにした。これならわざわざメモリ上にコピーはいらない。

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

ところが何故か実機だと時々色化けする。開発機材(DICE-6502)では起きないのに。さて結論を言おう。DMAを使ってたらVRAMリードの値も時々化けるのであった。DICE-6502は純正の開発機材じゃないからDMA機能がないのじゃよ。

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

2回読んで確認する機能を追加したら化けなくなった。これ任天堂には報告したんだけど、最後まで「DMA使ってるとVRAMリードも化けるぞ」って注意書きに足されてなかった気が。VRAMをリードしようなんて奴が他におらんかったのか?

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

長くなったのでこの辺で。どっとはらい。

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

MMCはタイマ割り込みじゃなくて疑似走査線割り込みだった。まあいいや。

2014-04-16 17:53:58

ゾルゲ市蔵 @zolge1

ファミコンのレギュレーションを今更調べている。色と音のギリギリさに痺れる。よく83年の時点でこの設定にしたと思う。サバイバルキットを見るような細やかさで、こんなことをやってたメーカーは他にないと思う。ここで普通に雑なことをしたハードはしわ寄せが全部ソフトにいったんだよなあ。

2014-07-24 22:06:16
ぱんどら @kopandacco

@zolge1 ワークが・・・・っ! RAMがもうちょっと・・・どうにか・・・(でもSG1000はもっと少ないけども)と、当時の開発者として心の叫びを。ファミコンがあの時代としてはあり得ないほど高スペック(マーク3ですらあまり上回ってない)なのは激しく同意です。

2014-07-24 22:34:14

ゾルゲ市蔵 @zolge1

ファミコンでPCMドラムはどうかと言われると、それほど珍しくはなかったにせよ、やっぱりそうそう鳴っているもんじゃなかった印象がある。処理を食ったのかメモリを圧迫したのか、技法として固まった頃にはファミコンが廃れつつあったのかはよく知らない。ベースやオケヒはもっと珍しい。

2014-08-19 19:47:03
ぱんどら @kopandacco

@zolge1 ファミコンウォーズでガンガン鳴らしてた様です。あれを聞いてて「あれ? これ4音じゃ足りないんじゃ?」と疑問を感じて調べたらPCMでした。その頃のファミコン開発公式機材(音楽用)にはPCM用データも入ってたらしいんですが、うちは零細で公式機材なんかなかったもんで。

2014-08-19 20:12:20
ゾルゲ市蔵 @zolge1

おお、リアルで鳴らしていた方の貴重な情報が! そういえばガンナックは鳴らしまくりでしたね。 しかしそうか、鳴らそうにもドラムの音色データがそうそう用意できなかった、広まってなかったというのもあるかもしれませんね。

2014-08-19 20:35:34
ぱんどら @kopandacco

@zolge1 はい、割と特殊なデータなんで苦戦したところもあったのかもしれません。

2014-08-19 20:36:32
ゾルゲ市蔵 @zolge1

@kopandacco 大変勉強になりました。ちなみに、容量や処理的には負担ではなかったのでしょうか?

2014-08-19 20:39:06
ぱんどら @kopandacco

@zolge1 1bitと言っても特殊なフォーマットで、MSXのレイドックやX1のサンダーフォースみたいなガラガラ音にならないのが魅力。そして処理速度での負荷は特に感じませんでした。

2014-08-19 20:49:07
ゾルゲ市蔵 @zolge1

@kopandacco 大変貴重な話をありがとうございます。聞きたかった方も多い情報かと思います。

2014-08-19 20:55:49
ほりい なおき @hor11

@zolge1 @kopandacco よこから失礼します。まさに聞き耳を立てておりました。ありがとうございます!

2014-08-19 20:56:20