じぇみに広野氏が語るファミコンソフトの開発技術
例えばカラーパレットを書き換える時は、まず$0000を設定してから$3F00を設定しろとか。他には一度に16バイト必ず続けて書きこめとか。そういう操作をする事で、初期のファミコンでも問題なく動くようになる。
2014-04-16 17:48:46しないとどうなるかというと、例えばゼビウス。一部の本体だと、遊んでいるうちに一部のキャラの色が真っ白に化け始める。上記の指示は多分この症状への対策と思われる。
2014-04-16 17:48:53で、その中に「DMAを使ってるとキー入力にノイズが入る可能性がある」というもあった。具体的に言うとコントローラーの読み取りにノイズが入ってしまうので、あらぬ操作になったりする。
2014-04-16 17:49:00でもってガーディック外伝なんだけど、ええとその前に、前提としてファミコンは2*2キャラ単位でパレット指定を行っているというのがある。そしてパレット指定は2bitなので、2*2キャラを4つまとめたものを1バイトで制御している。(4*4キャラになるね)
2014-04-16 17:49:20でもゲームは4*4キャラずつしか書き換えない訳じゃない。せめて色指定の最低単位、2*2で書き換えたい事が多い。まあ当時の話だが。
2014-04-16 17:49:33あとファミコンの内部画面は32*32とか32*28じゃなくて、珍しい32*30。縦に4ずつ使ってると2余る。縦スクロールのゲームは、たとえ4*4でマップを作っていても、内部的には2*2で制御しないと破綻する。
2014-04-16 17:49:43さて2*2だけ書き換えたい場合、他の12キャラまで巻き添えにはできない。だからZANACではメモリ上にパレット指定のコピーを作り、そこから値を読んできて部分書き換えし、コピーに書き戻しつつVRAMへ書き込んでいた。
2014-04-16 17:49:50ガーディック外伝ではもう一歩進め、VRAMから必要な情報を読み出し、部分書き換えして書き戻すようにした。これならわざわざメモリ上にコピーはいらない。
2014-04-16 17:49:57ところが何故か実機だと時々色化けする。開発機材(DICE-6502)では起きないのに。さて結論を言おう。DMAを使ってたらVRAMリードの値も時々化けるのであった。DICE-6502は純正の開発機材じゃないからDMA機能がないのじゃよ。
2014-04-16 17:50:052回読んで確認する機能を追加したら化けなくなった。これ任天堂には報告したんだけど、最後まで「DMA使ってるとVRAMリードも化けるぞ」って注意書きに足されてなかった気が。VRAMをリードしようなんて奴が他におらんかったのか?
2014-04-16 17:50:13ファミコンのレギュレーションを今更調べている。色と音のギリギリさに痺れる。よく83年の時点でこの設定にしたと思う。サバイバルキットを見るような細やかさで、こんなことをやってたメーカーは他にないと思う。ここで普通に雑なことをしたハードはしわ寄せが全部ソフトにいったんだよなあ。
2014-07-24 22:06:16@zolge1 ワークが・・・・っ! RAMがもうちょっと・・・どうにか・・・(でもSG1000はもっと少ないけども)と、当時の開発者として心の叫びを。ファミコンがあの時代としてはあり得ないほど高スペック(マーク3ですらあまり上回ってない)なのは激しく同意です。
2014-07-24 22:34:14ファミコンでPCMドラムはどうかと言われると、それほど珍しくはなかったにせよ、やっぱりそうそう鳴っているもんじゃなかった印象がある。処理を食ったのかメモリを圧迫したのか、技法として固まった頃にはファミコンが廃れつつあったのかはよく知らない。ベースやオケヒはもっと珍しい。
2014-08-19 19:47:03@zolge1 ファミコンウォーズでガンガン鳴らしてた様です。あれを聞いてて「あれ? これ4音じゃ足りないんじゃ?」と疑問を感じて調べたらPCMでした。その頃のファミコン開発公式機材(音楽用)にはPCM用データも入ってたらしいんですが、うちは零細で公式機材なんかなかったもんで。
2014-08-19 20:12:20おお、リアルで鳴らしていた方の貴重な情報が! そういえばガンナックは鳴らしまくりでしたね。 しかしそうか、鳴らそうにもドラムの音色データがそうそう用意できなかった、広まってなかったというのもあるかもしれませんね。
2014-08-19 20:35:34@zolge1 1bitと言っても特殊なフォーマットで、MSXのレイドックやX1のサンダーフォースみたいなガラガラ音にならないのが魅力。そして処理速度での負荷は特に感じませんでした。
2014-08-19 20:49:07