ABCDEFGHIJKLMNOPQRSTUVWXYZ
1
2
ファミコン開発トラップ!逆引きQ&A
3
4
←じゃまな前文は[ー]ボタンで閉じられます...かね?リードオンリーでは出来ないのかな?
12
※2024.02.17 6~7割くらいの進捗。ひきつづき制作過程を見ておたのしみください。
 記載:二天一流ore(@ore57436902)
13
※追加情報やご意見も随時、このファイルへのコメントで受け付けています。
14
15
症 例参 考 URLて が か り・あ し が か り
16
17
▼BGスクロール
18
・スクロールがうまくいかないNesDevWiki/PPU スクロール/スクロール ($2005) >> 書き込み x2BGNameTableをPPUCTRL($2000)のbit0~1で選択します。
19
・ときおりスクロール挙動がおかしいNesDevWiki/PPU スクロール/よくあるケースYスクロール値は0~239の範囲です。
分割スクロール
20
PPUSCROLL($2005)への2回セットについて「今何回目なのか?」を示す内部カウンターは、PPUSTATUS($2002)を読み取ることで1回目にリセットできます。
https://note.com/karu_gamo/n/n39ff34d14298
21
NesDevWiki/PPU スクロール/よくある落とし穴V-Blankが終わる前に、スクロールレジスタの設定を済ませてください。
https://tyfkda.github.io/blog/2019/07/07/nes-scrolling.html
22
PPUADDR($2006)に値がセットされると、スクロール値が壊れます。V-Blank内で必要な$2006へのアクセスをすべて済ませてから、スクロールレジスタをセットしてください。
23
24
▼カラー・背景色
25
・背景色が意図しない色になることがあるNesDevWiki/PPUパレット/メモリマップVRAM $3F00,$3F10にセットされた色が背景色となります。
26
VRAM $3F00,$3F10の、「あとから書き込みされたほう」の色が背景色として採用されます。$3F00に背景色をセットしたつもりが、ついでに全パレットを転送している過程で$3F10に別のカラーがセットされていて上書き採用されてしまうケースなどにご注意ください。
27
28
・バースト画面が真っ暗にならず、真っ赤とか真っ青とか全面に色がつくNesDevWiki/PPUパレット/背景色 (パレット インデックス 0) の使用
29
・バースト画面中に一瞬ノイズのようなものが走るNesDevWiki/PPUパレット/背景パレットのハックバースト時は必ず「真っ暗」になるのではなく、「バーストカラー(背景色)」で全画面が満たされます。
30
(※バースト=スプライトもBGも非表示にして、PPUへ常時アクセスできる状態。強制ブランキング。)バースト中に限り、PPUADDR($2006)にパレット アドレス($3F00 ~ $3FFF) がセットされていると、そのパレット色がバーストカラーに採用されます。この特性が原因で、不用意なタイミングにパレットカラーを設定すると、その瞬間だけノイズが走ったように見えます。
31
32
・意図しないカラーが発生する(カラーパレットの破損)NesDevWiki/PPUレジスタ/パレットの破損VRAM $3F00~$3F1Fへ値をセットした場合(もしくはその可能性のある処理の後は)、即座にPPUADDR($2006)へ「$3F,$00,$00,$00」をセットしてください。これはファミコン実機の不具合を回避するためのおまじないです。
33
34
・パレットデータのPPU読み取りに失敗するRAMに専用のワークを4色x8パレット分用意し、そこからカラー転送する機構の実装をしておくことでPPUリードが不要になります(推奨)。
35
nesdevだち「一部のPPUで読み取れる」と書いてあるけど、意味不明。google誤訳か?PPUリードによるカラー読み取りを必要とする場合、いくつかの問題を回避する必要があるようです。
36
DPCMを止めておかないと失敗することがある、とも書かれているような"前期FCだと2度読み、後期FCだと1度読み。

前期後期の判別方法はパレットを書き込んで、1回読みして成否で判別。"
37
38
▼フレーム
39
・PPUSTATUS($2002)のビット 7によるV-Blank検出が不安定NesDevWiki/正誤表/ビデオ/垂直ブランキングの開始時にPPUSTATUSビット 7 が High になるのとまったく同じタイミングで...フレームレートの同期には、NMI割り込み(V-Blank割り込み)をご利用ください。
40
ギコ猫でもわかるファミコンプログラミング/第10章VBlank割り込み/VBlank割り込みハンドラ
41
42
▼スプライト
43
・スプライトのオーバーフロー(8枚を超える横並び)の検出がうまくいかないNesDevWiki/正誤表/スプライト オーバーフローは、実装にエラーがあるため信頼性が低くなります...残念ですが...PPUSTATUS ($2002) のビット 5 スプライトオーバーフローフラグは、「死に機能」だと考えていただいて差し支えございません。
44
45
・0ボムが不安定、検出してくれないNesDevWiki/PPU OAM/スプライト 0 ヒット意図せず高い処理コストが発生した場合、スプライト0ヒット検出待ちの処理開始タイミングが遅れて「時すでに遅し」となってしまう可能性があります。基本的には、処理コストの100%保証を実現することが必要です。
46
(※一般には0爆弾。スプライト0ヒット。)(※上級者向け:初代グラディウスでは、各フレームごとに処理コスト予測を行うことでスプライト0ヒット検出ミスを回避するテクニカルな手法が実装されているそうです)
47
処理コスト以外にも、様々な制約があります。左記の参考URLに記載された内容を一通り見直すことをおすすめいたします。
48
・バーストモード中などで、OAM転送しているのにスプライト表示が乱れる・崩壊する OAMADDR($2003)に0をセットして下さい。
49
50
▼バンク切り替え(MMC1以降のマッパー)
51
・意図しないCHR-ROMバンク切り替えが発生して、キャラクターが瞬時に壊れてしまう?ゲームのメイン処理プロセスと、NMIやIRQなどの割り込み処理内のそれぞれでバンク切り替えを行っている場合、以下のような対策が必要です。
52
・意図しないPRG-ROMバンク切り替えが発生して、ゲームがクラッシュする?NesDevWiki/UNROM のプログラミング/バンクスイッチングメイン処理でのバンク切り替え処理では、切り替え先のバンク番号をRAMへ保存するように処置します。
53
割り込み処理内でバンク変更した場合は、必要な処理を終えたあとに必ずもとのバンク番号に戻すように設計します。RAMに保存されたバンク番号を参照して変更前のバンクへ切り替えを実行し、割り込み処理を終えます。
54
ゲームのメイン処理にて、バンク切り替え実行直後にRAMへ番号を保存する、といった順番でコーディングすると、クリティカルな割り込みタイミング限定で起こる究明困難なバグの原因となり得ますのでご注意ください。割り込みによって意図しないキャラクターROMバンクに戻されたり、誤ったプログラムROMに戻されることによりクラッシュする、といった問題の可能性をはらんでしまいます。
55
バンク番号をRAMに保存する処理は、実際のバンク切り替え実行の直前に行ってください。
56
57
▼コントローラー・ゲームパッド操作
58
・ゲームパッド操作が不安定NesDevWiki/コントローラの読み取り/DPCM の競合DPCMを利用している場合、コントローラーの読み取り情報が破損する場合があります。
59
NesDevWiki/コントローラー読み取りコード/DPCM の安全性左記URLを参考に、コントローラー入力情報の2度読みチェックを行ってください。
60
NedDevWiki/コントローラ読み取りコード/反復読み取りを使用した DPCM の安全性(※更に高度なアプローチも発見されていますが、割愛します。)
61
62
・十字ボタン(方向キー)の入力が不安定十字ボタンが物理的に酷使されている場合、予期せぬ方向情報が得られるケースがあります。
63
十字ボタン入力による方向判定処理は、上と下、右と左などの相反する方向同士の「同時押し」を無効化するようにプログラムしてください。
64
コントローラーが物理的に劣化している場合、
if (<左入力>){ 処理A }
if (<右入力>){ 処理B }
と書くと、処理Aと処理Bの両方が実行されてしまう場合があります。
65
if (<左入力>){ 処理A }
else if (<右入力>}{ 処理B }
とプログラムして、十字ボタン酷使による誤判定にも耐えうる設計にしておくことをおすすめいたします。
66
(※この考え方はファミコンソフト制作に限りません。)
67
68
▼オーディオ・サウンド
69
70
71
意図せずIRQ割り込み
72
73
サウンドどう作れば良い?
74
75
処理落ちでサウンドもスローになる工事中
76
77
・DPCM割り込みがうまく動作しない▼ファミコン実機・互換機・ロット違い/ツインファミコンでDPCM終了割り込みが発生しない?をご参照ください。
78
79
80
▼MMC3(マッパー4)
81
・IRQラスター割り込み処理がうまくいかない
82
工事中
83
84
BG,SPRテーブル設定、表示オフだとA12が動かない等
85
86
BGキャラをROM$0000~SPRキャラをROM$1000~に配置することを推奨します。
87
8x16サイズのスプライトを使用する場合でも、キャラROMは$1000~を参照するほうが
88
安定します。
89
本体によって動作が異なるケースが有り、これを回避するために$C001への書き込みを
90
避けて、$C000への書き込みで実装します。
91
92
93
94
▼ファミコン実機・互換機・ロット違い
95
・実機だと動かないNesDevWiki/初期化コードエミュレーターとは異なり、実機起動直後は、RAM・VRAMの内容が不定となります。
96
・実機だけ一部の挙動がおかしいNesDevWiki/PPU 電源投入状態リセット直後にはRAM・VRAMのゼロクリア処理などを設けてください。
97
NesDevWiki/PPU 電源投入状態/ベストプラクティスエミュレータによっては、起動直後のRAM・VRAMのランダムな値を疑似再現するオプション設定が備わっているので、活用してみてください。
98
実機起動直後からCPU29658サイクルの時間帯では、レジスタ PPUCTRL($2000)、PPUMASK($2001)、PPUSCROLL($2005)、PPUADDR($2006)への書き込みが無効化されます。そのため、29658 サイクル経過を待つ処理・もしくはその間にPPUアクセスを行わないほかのセットアップ処理を実行する、などの対処が必要となります。
99
100
・互換機によっては一部の音の音色が違う気がするNesDevWiki/APUパルス/デューティサイクルシーケンスファミコン互換機の多くは、矩形波チャンネル(ch1、ch2)のデューティ比25%と50%がハード的に入れ替わってしまっています。
101
102
・初期ロットなど特定の本体バージョンで、意図しないカラーパレットが発生してしまう(カラーパレットの破損)NesDevWiki/PPUレジスタ/パレットの破損▼カラー・背景色/・意図しないカラーが発生する(カラーパレットの破損)をご参照ください。
103
104
・マイク入力情報が実機本体によって異なる?本体の種類によっては、0/1情報の意味が逆になっているそうです ※未検証です。詳細募集中※
105
106
・ツインファミコンでは、DPCM終了割り込みが動作しない?残念ながらツインファミコンではDPCM終了割り込みが機能しないそうです。
107