ようやくファミコンテレビC1が安定してくれた!
じつは、手持ちのファミコンテレビC1について、2年くらい悩まされていることがあった。それは、「ファミコンプレイ中に突然リセットがかかったり、バグったり、ファミコンの電源が落ちたりする」という症状。叩いたりするとすぐ発症したりした。
さすがにこれはまずい、ということで、何度も修理を試みていたのだった。
そのため、いろいろと試行錯誤しつつ、あちこち補修にかかるも、大して状況は変わらなかった。
・コネクタの接触を疑い、ファミコン基板への電源供給コネクタに、直接線を伸ばして半田付けしました。
→状況変わらず
・電源不安定を疑い、ファミコン基板のあちこちのVCC・GND間に電解コンデンサを付けまくりました。
→状況変わらず
・ソケットの接触を疑い、ファミコン基板のAPU・PPUのソケットを丸ピンのに取り替えました。
→状況変わらず
・電源不安定を疑い、ブリッジ回路のダイオード4つを新品のに交換しました。
→状況変わらず
・基板クラックを疑い、一部基板パターンに沿ってジャンパさせました。
→状況変わらず
・・・という苦労もむなしく、プレイ中に突然リセットがかかるという症状に悩まされていました。
そして今日、ようやく原因を突き止めました。
その原因は、これ。

R653の半田クラックでした。
その箇所に半田を流し込んでクラックを無くしたところ、無事安定してファミコンが動くようになりました。もう、叩いても揺すっても大丈夫です。
(叩いたりすると画面が暗くなったり若干吸い寄せられたりはするが、そんなひどくもないし、これはどっかのコネクタの接触だろうし、別問題だからまあいっか。)
今の俺のC1は、ほとんどのコンデンサが新品になってたり、ジャンパしまくりーの丸ピンーのコンデンサぶら下がりーのブリッジダイオード4つぶら下がりーの状態などで、だいぶ手が加えられまくってます。もしC1を手に入れたなら、ここまでやる覚悟はしておいた方が良いかもしれません。なにせ31年前のブラウン管テレビですから…
なお、ブラウン管の分解・補修は、よーく勉強した上で、感電しないよう細心の注意を払いながらやること。 それが無理なら、業者に頼みましょう。それが無難。
というわけで、今だから言える。3年前にヤフオクで167000円も出して手に入れたファミコンテレビC1は、
未だ現役で、元気に動いております!
最近、ヤフオクでC1がやたら出てくるようになったけど、基本15万くらいで安定している感じだね。専用キーボード・BASICカセット付のが37万したという例外はあったが。
さすがにこれはまずい、ということで、何度も修理を試みていたのだった。
そのため、いろいろと試行錯誤しつつ、あちこち補修にかかるも、大して状況は変わらなかった。
・コネクタの接触を疑い、ファミコン基板への電源供給コネクタに、直接線を伸ばして半田付けしました。
→状況変わらず
・電源不安定を疑い、ファミコン基板のあちこちのVCC・GND間に電解コンデンサを付けまくりました。
→状況変わらず
・ソケットの接触を疑い、ファミコン基板のAPU・PPUのソケットを丸ピンのに取り替えました。
→状況変わらず
・電源不安定を疑い、ブリッジ回路のダイオード4つを新品のに交換しました。
→状況変わらず
・基板クラックを疑い、一部基板パターンに沿ってジャンパさせました。
→状況変わらず
・・・という苦労もむなしく、プレイ中に突然リセットがかかるという症状に悩まされていました。
そして今日、ようやく原因を突き止めました。
その原因は、これ。

R653の半田クラックでした。
その箇所に半田を流し込んでクラックを無くしたところ、無事安定してファミコンが動くようになりました。もう、叩いても揺すっても大丈夫です。
(叩いたりすると画面が暗くなったり若干吸い寄せられたりはするが、そんなひどくもないし、これはどっかのコネクタの接触だろうし、別問題だからまあいっか。)
今の俺のC1は、ほとんどのコンデンサが新品になってたり、ジャンパしまくりーの丸ピンーのコンデンサぶら下がりーのブリッジダイオード4つぶら下がりーの状態などで、だいぶ手が加えられまくってます。もしC1を手に入れたなら、ここまでやる覚悟はしておいた方が良いかもしれません。なにせ31年前のブラウン管テレビですから…
なお、ブラウン管の分解・補修は、よーく勉強した上で、感電しないよう細心の注意を払いながらやること。 それが無理なら、業者に頼みましょう。それが無難。
というわけで、今だから言える。3年前にヤフオクで167000円も出して手に入れたファミコンテレビC1は、
未だ現役で、元気に動いております!
最近、ヤフオクでC1がやたら出てくるようになったけど、基本15万くらいで安定している感じだね。専用キーボード・BASICカセット付のが37万したという例外はあったが。
スポンサーサイト
ファミコン音源 三角波の鳴らし方・止め方について その2
まずは「ファミコン音源 三角波の鳴らし方・止め方について その1」をご覧下さい。
三角波の鳴らし方の仕組みが分かったところで、ここからは各ドライバがどんな使い方をしているのかを解説します。主に止め方で。
素直に三角波カウンタを使って止める方式
最も素直でマメな方式です。主に初期のゲームでよく使われました。トーセドライバ・マイクロニクスドライバとか、ドラクエ1とか、任天堂のゲームでもマリオ1,2,3,USAらの全部がこれです。
キーオンしとけば、あとは指定した時間にハードウェアが音を止めてくれるので、ドライバを書くプログラマには最も楽な方式です。
しかし、簡単なドライバでは三角波の音長をいちいち変えたりと曲を書く側には大変で曲データも大きくなるし、自動計算など凝ったことをしようとするとプログラムがめんどくさくなります。そのためか、後期のソフトではあまり使われなくなったり、カウンタ0にされて音を止められたりなどソフト制御と併用するパターンになりました。
なお、この方式では、先に$4008を書いてから$400Bを書かないと、後記のカウンタ更新割り込みの罠にはまります。
カウンタ0でキーオンして止める方式
少々荒っぽいが妥当という感じの方式です。
$4008に0を書いてキーオンすることで、三角波を止めるというやり方です。さっきのカウンタを使う方式と併用されたりします。
ただ、これも鳴らすときに$4008を書いてから$400Bを書くように気をつけないと、後記のカウンタ更新割り込みの罠に…。
$81以上/$00方式
まだまだだなぁ…という方式です。ソフトウェアエンベロープを使うドライバの半分くらいはこれです。ドラクエ2,3もこれです。
$4008に$81以上を指定してキーオンし、音を止める場合は$4008に$00を書くだけで止めるやり方です。
ただ、この方式より、すぐ下の$81以上/$80方式の方がより賢く、より扱いやすいです。詳しくはそちらに書きます。
そして、この方式もカウンタ更新割り込みの罠に注意です。
$81以上/$80方式
ちゃんと理解してるなぁという感じの方式です。ソフトウェアエンベロープを使うドライバのもう半分くらいはこれです。ドラクエ4やFFシリーズ全てもこれです。
$4008に$81以上を指定してキーオンし、音を止める場合は$4008に$80を書くだけで止めるやり方です。
すぐ上の$81以上/$00方式よりもこちらが良い理由はいろいろあります。まず、音を止めた時でもカウンタが動かないため、止めた後に$4008に$81以上を再度書くだけで音が再び鳴り始めます。いちいち$400Bにも書いてキーオンさせる必要がないのです。そして、カウンタ更新割り込みの罠もありません。とにかく扱いやすく、安全に制御できるのです。
$4015の三角波ビットを下ろして止める方式
意表を突いた感じの実装方法でかつ安全な方式です。この方法のドライバは少ないです。野球拳のできないやつとかざんねん!!とかその辺。
$4008に音長を指定するか$81以上を書いた状態でキーオンし、任意のタイミングで止めたいときに$4015の三角波ビットを下ろして音を止めます。下ろすのは一瞬だけでも大丈夫です。カウント中だろうがカウンタ無効だろうが簡単に止められて、$400Bを書くだけで再キーオンできますから、案外制御も楽です。
周波数レジスタ$000にして擬似的に止める方式
これ実装したやつ表に出ろと言いたくなる方式です。この実装のドライバもよく見られ、初期HAL研ドライバやロックマン2までの初期カプコンドライバ、りりなどの3流メーカーのドライバがこれです。
周波数の値を$000にして超音波状態にして聞こえないようにすることで、音が止まったように見せかける愚かな方式です。パルス波なら周波数$008未満が指定されるとキーオフするので良いのですが、三角波はそうはいきません。ずーっと音が鳴ったままの状態です。
実際の出力波形は超音波は通らないため、三角波16段階の半分くらいの位置での横線となるのですが、この方式で音を止めるときに波形が急激に変わるので、プチノイズがよく出てしまうのです。
重低音を出力して擬似的に止める方式
漢だなぁ…と感じる方式です。この実装のドライバはあまり見られませんが、あの烈火とかに使われてる後期KIDドライバがこの方式です。
周波数の値を$7FFとかの重低音状態にして聞こえにくくすることで、音が止まったように見せかける方式です。なので、よく聞けば「ビーー」という音が聞こえます。
考えればこれも愚かな実装とはいえ、烈火とかは他のchがそれをカバーできるレベルの音圧や曲構成だったりするので、この方式を使いこなせるかは曲次第。
あ、BPSテトリスとかは「$81以上/$00方式」の方に分類されるもので、休符部分が「ビーー」ってなってるだけだから、この方式には分類されません。
・・・と主なモノだけでもこんな感じでしょうか。結構いろいろやり方があります。そして、ドライバ制作者の苦労も見えてくるかもしれません。
カウンタ更新割り込みの罠
先ほどから何度も出てきた「カウンタ更新割り込みの罠」ですが、これはカウンタ有効中に$400Bでキーオンさせてから$4008を更新する処理において、処理中にカウンタ更新がかかったときに$4008の値が正常に反映されない現象のことです。
以下の図は、$81以上/$00方式でこの現象が起こってしまうまでの流れを図にしたモノです。

上部分が正常な例、下部分がカウンタ更新割り込みの罠発動時の例です。説明すると、
0:$4008に$00を書いて音を止める。
1:周波数レジスタを更新するために、$400A,$400Bを書く。ここでキーオンされる。
2:<ここでハードウェアのカウンタ更新処理が走る!>
このときの$4008の値($00)がカウンタにロードされる。
カウンタ有効・カウンタ0のため音は鳴らない。
3:カウンタ更新処理が走ったとも知らず、$4008に$81以上の値を書く。
しかし、カウンタ有効なため、この値は無視される。
4:音を鳴らすべきところで音が鳴らない!
という事が起こっているのです。
これは、先に$4008を書くというかんたんな事で回避できますが、これをやらずに愚かな実装をしてしまったドライバはいくつかあります。どろぴ~とかのアイコムドライバとか、ジョイメカファイトとか…
そして、実はドラクエ2,3もこの実装なのです!
…でも、ドラクエ2,3は三角波が途切れたりたまに鳴らなかったりはしません。その理由は、ドライバを回すのにサウンドのカウンタ更新時に出るIRQを使っているからです。よく互換機で正常に曲が鳴らない原因の理由にされているアレです。このおかげで、ドライバが回るのが必ずカウンタ更新直後であるために、重たい処理をしない限りカウンタ更新が割り込むことはないのです。
ppmckは「$81以上/$00方式」、nsd.libは「$81以上/$80方式」、FamiTrackerは「$81以上/$00方式と見せかけてカウンタ0でキーオンして止める方式」かな。ふむふむ。
おまけ:OFGSでの三角波の止め方
自作のサウンドドライバであるOFGSでは、上記のいかなる方式にも該当しないへそ曲がりな実装方法で三角波を鳴らしたり止めたりしています。ファミコン音源を熟知してないと理解できない、エミュレータ作者泣かせな方式です。(もちろんエミュレータ作者とは自分も含むので自滅となる場合も…)
なお、制御方法は旧型と新型とで2タイプあります。
(以下、$4017の7bit目の仕様を理解してなければ理解できない内容です。)
カウンタ4方式
OFGS Ver1はこの方式です。$4008に$04を書いて以降一切触らず、鳴らすときは毎フレームキーオンして、鳴らさないときはほったらかすやり方です。三角波はどんなにキーオンしても波形が乱れないからこそ使える方法です。
カウンタ4というのはVSync割り込みの間隔とほぼ同じで、1F待てば音が止まる間隔です。そこで毎フレームドライバ処理終了後$4017に$C0を書くことでカウンタ処理の同期を取ると同時に、音を止める場合はそのタイミングでぴったり止まるようになります。
ただ、この方式ではドライバに重い処理がかかったときに三角波が一瞬止まってしまうため、Ver2では次の方式に切り替えたのです。
オフ・アップデート・オン方式
OFGS Ver2はこの方式です。$4008に$81以上をあらかじめ書いておき、キーオン時は$400Bに書くだけ、音を止めるときは$4008に$00を書く(ゼロ)→$4017に$C0を書いてカウンタ即時更新(アップデート)→$4008に$81以上を書く(オン)と処理していくやり方です。
実際の実装では、$4017への書き込みもあるために、処理の簡略化で$4008には$C0を書いています。
三角波の鳴らし方の仕組みが分かったところで、ここからは各ドライバがどんな使い方をしているのかを解説します。主に止め方で。
素直に三角波カウンタを使って止める方式
最も素直でマメな方式です。主に初期のゲームでよく使われました。トーセドライバ・マイクロニクスドライバとか、ドラクエ1とか、任天堂のゲームでもマリオ1,2,3,USAらの全部がこれです。
キーオンしとけば、あとは指定した時間にハードウェアが音を止めてくれるので、ドライバを書くプログラマには最も楽な方式です。
しかし、簡単なドライバでは三角波の音長をいちいち変えたりと曲を書く側には大変で曲データも大きくなるし、自動計算など凝ったことをしようとするとプログラムがめんどくさくなります。そのためか、後期のソフトではあまり使われなくなったり、カウンタ0にされて音を止められたりなどソフト制御と併用するパターンになりました。
なお、この方式では、先に$4008を書いてから$400Bを書かないと、後記のカウンタ更新割り込みの罠にはまります。
カウンタ0でキーオンして止める方式
少々荒っぽいが妥当という感じの方式です。
$4008に0を書いてキーオンすることで、三角波を止めるというやり方です。さっきのカウンタを使う方式と併用されたりします。
ただ、これも鳴らすときに$4008を書いてから$400Bを書くように気をつけないと、後記のカウンタ更新割り込みの罠に…。
$81以上/$00方式
まだまだだなぁ…という方式です。ソフトウェアエンベロープを使うドライバの半分くらいはこれです。ドラクエ2,3もこれです。
$4008に$81以上を指定してキーオンし、音を止める場合は$4008に$00を書くだけで止めるやり方です。
ただ、この方式より、すぐ下の$81以上/$80方式の方がより賢く、より扱いやすいです。詳しくはそちらに書きます。
そして、この方式もカウンタ更新割り込みの罠に注意です。
$81以上/$80方式
ちゃんと理解してるなぁという感じの方式です。ソフトウェアエンベロープを使うドライバのもう半分くらいはこれです。ドラクエ4やFFシリーズ全てもこれです。
$4008に$81以上を指定してキーオンし、音を止める場合は$4008に$80を書くだけで止めるやり方です。
すぐ上の$81以上/$00方式よりもこちらが良い理由はいろいろあります。まず、音を止めた時でもカウンタが動かないため、止めた後に$4008に$81以上を再度書くだけで音が再び鳴り始めます。いちいち$400Bにも書いてキーオンさせる必要がないのです。そして、カウンタ更新割り込みの罠もありません。とにかく扱いやすく、安全に制御できるのです。
$4015の三角波ビットを下ろして止める方式
意表を突いた感じの実装方法でかつ安全な方式です。この方法のドライバは少ないです。野球拳のできないやつとかざんねん!!とかその辺。
$4008に音長を指定するか$81以上を書いた状態でキーオンし、任意のタイミングで止めたいときに$4015の三角波ビットを下ろして音を止めます。下ろすのは一瞬だけでも大丈夫です。カウント中だろうがカウンタ無効だろうが簡単に止められて、$400Bを書くだけで再キーオンできますから、案外制御も楽です。
周波数レジスタ$000にして擬似的に止める方式
これ実装したやつ表に出ろと言いたくなる方式です。この実装のドライバもよく見られ、初期HAL研ドライバやロックマン2までの初期カプコンドライバ、りりなどの3流メーカーのドライバがこれです。
周波数の値を$000にして超音波状態にして聞こえないようにすることで、音が止まったように見せかける愚かな方式です。パルス波なら周波数$008未満が指定されるとキーオフするので良いのですが、三角波はそうはいきません。ずーっと音が鳴ったままの状態です。
実際の出力波形は超音波は通らないため、三角波16段階の半分くらいの位置での横線となるのですが、この方式で音を止めるときに波形が急激に変わるので、プチノイズがよく出てしまうのです。
重低音を出力して擬似的に止める方式
漢だなぁ…と感じる方式です。この実装のドライバはあまり見られませんが、あの烈火とかに使われてる後期KIDドライバがこの方式です。
周波数の値を$7FFとかの重低音状態にして聞こえにくくすることで、音が止まったように見せかける方式です。なので、よく聞けば「ビーー」という音が聞こえます。
考えればこれも愚かな実装とはいえ、烈火とかは他のchがそれをカバーできるレベルの音圧や曲構成だったりするので、この方式を使いこなせるかは曲次第。
あ、BPSテトリスとかは「$81以上/$00方式」の方に分類されるもので、休符部分が「ビーー」ってなってるだけだから、この方式には分類されません。
・・・と主なモノだけでもこんな感じでしょうか。結構いろいろやり方があります。そして、ドライバ制作者の苦労も見えてくるかもしれません。
カウンタ更新割り込みの罠
先ほどから何度も出てきた「カウンタ更新割り込みの罠」ですが、これはカウンタ有効中に$400Bでキーオンさせてから$4008を更新する処理において、処理中にカウンタ更新がかかったときに$4008の値が正常に反映されない現象のことです。
以下の図は、$81以上/$00方式でこの現象が起こってしまうまでの流れを図にしたモノです。

上部分が正常な例、下部分がカウンタ更新割り込みの罠発動時の例です。説明すると、
0:$4008に$00を書いて音を止める。
1:周波数レジスタを更新するために、$400A,$400Bを書く。ここでキーオンされる。
2:<ここでハードウェアのカウンタ更新処理が走る!>
このときの$4008の値($00)がカウンタにロードされる。
カウンタ有効・カウンタ0のため音は鳴らない。
3:カウンタ更新処理が走ったとも知らず、$4008に$81以上の値を書く。
しかし、カウンタ有効なため、この値は無視される。
4:音を鳴らすべきところで音が鳴らない!
という事が起こっているのです。
これは、先に$4008を書くというかんたんな事で回避できますが、これをやらずに愚かな実装をしてしまったドライバはいくつかあります。どろぴ~とかのアイコムドライバとか、ジョイメカファイトとか…
そして、実はドラクエ2,3もこの実装なのです!
…でも、ドラクエ2,3は三角波が途切れたりたまに鳴らなかったりはしません。その理由は、ドライバを回すのにサウンドのカウンタ更新時に出るIRQを使っているからです。よく互換機で正常に曲が鳴らない原因の理由にされているアレです。このおかげで、ドライバが回るのが必ずカウンタ更新直後であるために、重たい処理をしない限りカウンタ更新が割り込むことはないのです。
ppmckは「$81以上/$00方式」、nsd.libは「$81以上/$80方式」、FamiTrackerは「$81以上/$00方式と見せかけてカウンタ0でキーオンして止める方式」かな。ふむふむ。
おまけ:OFGSでの三角波の止め方
自作のサウンドドライバであるOFGSでは、上記のいかなる方式にも該当しないへそ曲がりな実装方法で三角波を鳴らしたり止めたりしています。ファミコン音源を熟知してないと理解できない、エミュレータ作者泣かせな方式です。(もちろんエミュレータ作者とは自分も含むので自滅となる場合も…)
なお、制御方法は旧型と新型とで2タイプあります。
(以下、$4017の7bit目の仕様を理解してなければ理解できない内容です。)
カウンタ4方式
OFGS Ver1はこの方式です。$4008に$04を書いて以降一切触らず、鳴らすときは毎フレームキーオンして、鳴らさないときはほったらかすやり方です。三角波はどんなにキーオンしても波形が乱れないからこそ使える方法です。
カウンタ4というのはVSync割り込みの間隔とほぼ同じで、1F待てば音が止まる間隔です。そこで毎フレームドライバ処理終了後$4017に$C0を書くことでカウンタ処理の同期を取ると同時に、音を止める場合はそのタイミングでぴったり止まるようになります。
ただ、この方式ではドライバに重い処理がかかったときに三角波が一瞬止まってしまうため、Ver2では次の方式に切り替えたのです。
オフ・アップデート・オン方式
OFGS Ver2はこの方式です。$4008に$81以上をあらかじめ書いておき、キーオン時は$400Bに書くだけ、音を止めるときは$4008に$00を書く(ゼロ)→$4017に$C0を書いてカウンタ即時更新(アップデート)→$4008に$81以上を書く(オン)と処理していくやり方です。
実際の実装では、$4017への書き込みもあるために、処理の簡略化で$4008には$C0を書いています。
ファミコン音源 三角波の鳴らし方・止め方について その1
ファミコン音源と言えば、三角波。 その16段階のギザギザした三角波は、ファミコン音源を象徴する音です。
しかし、その三角波をちゃんといじるには、ファミコン音源の仕様を熟知している必要があり、当時のサウンドドライバ制作者も頭を悩ませていたのか、お粗末な止め方をしているドライバもいくつかあります。
三角波のキーオン/キーオフについて
(ここでは、16進数を「$80」のように表記します。)
三角波には、パルス・ノイズchにもあるキーオフカウンタ($4003とかの上位5bitで指定するやつ)の他に、$4008で指定する三角波専用のカウンタがあり、どちらかのカウンタが0になると三角波は止まります。この三角波にしかないカウンタの仕様がやたらとくせ者なのです。
三角波カウンタは240Hz($4017の7bitが1の場合は192Hz)くらいの間隔で更新されます。VSyncやキーオフカウンタよりも細かく指定できます。そのカウント値は下位7bit(0-127)で指定します。カウンタを無効にする場合は7bit目を立たせます。ずっと鳴らしたい場合は$81以上の値を書きます。$80では音は鳴りません。$81以上を指定してキーオンさせた場合は、$80か$00を書くことで音を止められます。
・・・と、ここまでは普通のよくある一般的な解説です。ここからドライバ制作者とエミュレータ制作者が頭を抱える内容になってきますよー…
こっからは図を使います。上から下へと時間が流れていく感じ。キーオフカウンタは考えないものとします。
各部分の意味は、
EVENT: ハード・ソフトウェアによるイベント
FREQ : 周波数レジスタの値
$4008: $4008に書かれた値
COUNT: 三角波カウンタ。「--」はカウントが始まってないことを示す。00でキーオフ。
UPDATE FLAG: $400Bが書かれ、次のカウンタ更新周期に$4008の値をロードするフラグ。
TRI-WAVE PLAYING: 三角波が実際に発声されてるか。

まず、$400Bライトによってキーオンした後、実際に三角波が発声されるのは、240Hz/192Hz位で回っているハードウェアのカウンタ更新処理直後です。もちろん、$4008だけ更新して音を鳴らす場合も同じです。

カウンタ無効フラグを立たせてキーオンした後は、カウンタ部分はまだロード待ちの状態となっており、$00-$7Fの値を今か今かと待っている状態です。そして、$00-$7Fを書いて周期が来た瞬間からその値でカウントが始まります。なお、カウンタが有効の間は、これ以降どんな値を$4008に書いても、キーオンするまで一切無視されます。もちろん、$80や$81以上を書いても無駄です。

ちなみに、三角波がキーオフするとき、波形はこんな感じになります。周波数0Hzのような状態となり、現在の波形値をずーっと維持する形で音を止めるのです。確かにこれなら、簡単な実装でノイズを出すことなく音を止められますね。
さーて、ここまで分かったかな? 理解できたら、次はいよいよ各ドライバでの音の鳴らし方・止め方を見てみます。
次:「ファミコン音源 三角波の鳴らし方・止め方について その2」
しかし、その三角波をちゃんといじるには、ファミコン音源の仕様を熟知している必要があり、当時のサウンドドライバ制作者も頭を悩ませていたのか、お粗末な止め方をしているドライバもいくつかあります。
三角波のキーオン/キーオフについて
(ここでは、16進数を「$80」のように表記します。)
三角波には、パルス・ノイズchにもあるキーオフカウンタ($4003とかの上位5bitで指定するやつ)の他に、$4008で指定する三角波専用のカウンタがあり、どちらかのカウンタが0になると三角波は止まります。この三角波にしかないカウンタの仕様がやたらとくせ者なのです。
三角波カウンタは240Hz($4017の7bitが1の場合は192Hz)くらいの間隔で更新されます。VSyncやキーオフカウンタよりも細かく指定できます。そのカウント値は下位7bit(0-127)で指定します。カウンタを無効にする場合は7bit目を立たせます。ずっと鳴らしたい場合は$81以上の値を書きます。$80では音は鳴りません。$81以上を指定してキーオンさせた場合は、$80か$00を書くことで音を止められます。
・・・と、ここまでは普通のよくある一般的な解説です。ここからドライバ制作者とエミュレータ制作者が頭を抱える内容になってきますよー…
こっからは図を使います。上から下へと時間が流れていく感じ。キーオフカウンタは考えないものとします。
各部分の意味は、
EVENT: ハード・ソフトウェアによるイベント
FREQ : 周波数レジスタの値
$4008: $4008に書かれた値
COUNT: 三角波カウンタ。「--」はカウントが始まってないことを示す。00でキーオフ。
UPDATE FLAG: $400Bが書かれ、次のカウンタ更新周期に$4008の値をロードするフラグ。
TRI-WAVE PLAYING: 三角波が実際に発声されてるか。

まず、$400Bライトによってキーオンした後、実際に三角波が発声されるのは、240Hz/192Hz位で回っているハードウェアのカウンタ更新処理直後です。もちろん、$4008だけ更新して音を鳴らす場合も同じです。

カウンタ無効フラグを立たせてキーオンした後は、カウンタ部分はまだロード待ちの状態となっており、$00-$7Fの値を今か今かと待っている状態です。そして、$00-$7Fを書いて周期が来た瞬間からその値でカウントが始まります。なお、カウンタが有効の間は、これ以降どんな値を$4008に書いても、キーオンするまで一切無視されます。もちろん、$80や$81以上を書いても無駄です。

ちなみに、三角波がキーオフするとき、波形はこんな感じになります。周波数0Hzのような状態となり、現在の波形値をずーっと維持する形で音を止めるのです。確かにこれなら、簡単な実装でノイズを出すことなく音を止められますね。
さーて、ここまで分かったかな? 理解できたら、次はいよいよ各ドライバでの音の鳴らし方・止め方を見てみます。
次:「ファミコン音源 三角波の鳴らし方・止め方について その2」
ニューファミコンの基板ロット(HVCN-CPU-01,02)
AV出力ファミコン(ニューファミコン)について書いてみるかー。

ニューファミコンとは、93年~03年の間に発売されていたファミコンで、無改造でも、縦縞のない、きれいなコンポジット出力のできる純正ファミコンです。(S端子・RGBは出ないよ!)
ニューファミコンには基板ロットが2種類ありますが、部品の位置がわずかに変わってるくらいで、さほど違いは無い感じ。拡張音源のバランスがつがうとかどうかそんな話もあるが、なかなか違いがよく分からない。
なお、ニューファミコンは裏面のシールを見れば基板ロットが分かります。左がHVCN-CPU-01、右が02。

基板はこんな感じ。
こちらは、HVCN-CPU-01。ICの数字を見ると、94年製造かなぁ。

製造番号:HN10345018
CPU:2A03H
PPU:2C02H
こちらは、HVCN-CPU-02。こっちは、2001年製造かなぁ。

製造番号:HN10882168
CPU:2A03H
PPU:2C02H
(基板の色が違うぞ…?これは基板リビジョンと関係してるのか、それとも別なのか)
基板の後ろ側はこうなってます。左が02、右が01。

C14が01基板では後ろにいたのが、02ではRAMの横に出てきた、って感じですね。放熱によるコンデンサ寿命の影響を考慮したのかな…?
ちなみに、こちらは今自分が持ってるニューファミコンで一番新しいもの。

ラストファミコンの400番違いという、むっちゃ新しいニューファミコンなのですが、

製造番号:HN11032909
CPU:2A03H
PPU:2C02H
基板は02でした。きっと02が最後なんでしょうね。
ICも2003年製造っぽいかんじ。てか、よく2003年まで2KBのRAM作っていたなぁ…。

ニューファミコンとは、93年~03年の間に発売されていたファミコンで、無改造でも、縦縞のない、きれいなコンポジット出力のできる純正ファミコンです。(S端子・RGBは出ないよ!)
ニューファミコンには基板ロットが2種類ありますが、部品の位置がわずかに変わってるくらいで、さほど違いは無い感じ。拡張音源のバランスがつがうとかどうかそんな話もあるが、なかなか違いがよく分からない。
なお、ニューファミコンは裏面のシールを見れば基板ロットが分かります。左がHVCN-CPU-01、右が02。

基板はこんな感じ。
こちらは、HVCN-CPU-01。ICの数字を見ると、94年製造かなぁ。

製造番号:HN10345018
CPU:2A03H
PPU:2C02H
こちらは、HVCN-CPU-02。こっちは、2001年製造かなぁ。

製造番号:HN10882168
CPU:2A03H
PPU:2C02H
(基板の色が違うぞ…?これは基板リビジョンと関係してるのか、それとも別なのか)
基板の後ろ側はこうなってます。左が02、右が01。

C14が01基板では後ろにいたのが、02ではRAMの横に出てきた、って感じですね。放熱によるコンデンサ寿命の影響を考慮したのかな…?
ちなみに、こちらは今自分が持ってるニューファミコンで一番新しいもの。

ラストファミコンの400番違いという、むっちゃ新しいニューファミコンなのですが、

製造番号:HN11032909
CPU:2A03H
PPU:2C02H
基板は02でした。きっと02が最後なんでしょうね。
ICも2003年製造っぽいかんじ。てか、よく2003年まで2KBのRAM作っていたなぁ…。
「サマーカーニバル'92烈火」についていろいろと
あのプレミアソフトが、3DSのVCで配信だと…!?
せっかくなので、ファミコンの市販ソフトの中で一番プレミアの付いてる「サマーカーニバル'92烈火」について、自分なりにいろいろ書いたりしてみる。

サマーカーニバル'92烈火とは、1992年にファミコンで出たスーパーハードシューティングゲームですが、発売当初は雑誌等で超冷遇扱いされるなどしてあまり売れなかったようです。んで、2000年以降になって、その無茶ぶりが再評価され、裸ソフトでも15,000円以上の値が付くまでのプレミアソフトとなったわけですね。 自分も16,700円で手に入れました。
難易度はよく檄ムズと言われますが、実はパターンや攻略法が分かれば簡単です。表はね。裏はワカンネ。
烈火のスゴイところ
このソフトの凄いところと言えば、画面を覆うほどの敵の量、アームやボムの表現、そしてファミコンとは思えないほどの爽快感など、ファミコンの性能を限界まで引きだしたところでしょう。 そして、自分が本当に凄いと思うのは、どれだけ処理落ちしたりチラツキまくっても、それを感じさせないほどのスピード感が出ているところです。
背景のスクロール等を見れば分かるのですが、このゲーム、あのエグゼドエグゼス以上に処理落ち・チラツキが激しいです。
敵や自機弾などのオブジェクトが大体12~16個くらいあると処理落ちしてくるようですが、そんなことお構いなしに敵や敵弾がものすごい量で飛んでくるため、通常時でも60fpsから25fpsくらいに落ち込んだり、アーム系の敵が現れると15fps以下にまで遅くなります。
しかし、敵の動きが基本的に非常に速かったりと、処理落ちするぐらいがちょうど良い速さに設定されているようで、処理落ちしてもスピード感は十分に感じます。
また、スプライトのチラツキによって敵などが非常に見づらくなりますが、敵弾を溜めボム等で消せたり、ほとんどの敵が弾1発で倒せたり、自機だけはスプライトを重ねてちらつきにくくなっているため、これもさほど問題にはなりません。

こういったシステムのおかげで、スーパーハードシューティングを名乗れるほどのスピード感・爽快感が出るわけですね。(ファミコンのエグゼドエグゼスとは大違いだわ…)
ROM内に封印された没デモプログラム
これについてはニコニコ動画に上げているのですが、このソフトには没デモが残っています。
プログラムを見ると、ナグザットロゴからタイトル切り替え前にSTARTが押されていたら没デモを流そうとしたと思われる箇所があります。
----
D4B9: A5 20 LDA $20
D4BB: 29 10 AND #$10
D4BD: F0 00 BEQ
D4BF: 4C D0 D3 JMP $D3D0
D4C2: 68 PLA
D4C3: 68 PLA
D4C4: 4C D0 D3 JMP $D3D0
D4C7: (以下、没デモプログラム)
----
$20 = コントローラ1のボタン押下ステータス
$D3D0~ = タイトル画面へ
----
というわけで、これを書き換えてやれば、没デモが復活します。
たとえば、PRG-ROMの$1D4BE、.nesでは$1D4CEの「00 4C D0 D3」→「05 4C C7 D4」、PARなら「F2FFC586 C90CC758 6389D338」とやれば裏技仕様で復活します。でもこれだとタイトル画面がバグるけど。
んで、どんな没デモプログラムなのかというと、

「?ーガー!」(音も流れる)

豪快に、?ガ爆発!

その後、上から任?堂ロゴが「ピコン」と音を立てて降りてくる。
・・・という内容。没になってなかったら、どうなってたんだろう…?
3DSのVCで配信だと…!?
2012/12/12に、3DSのバーチャルコンソールでこいつが配信されたようです。たった500円で、15,000円もするソフトが遊べるわけです。 カセットの中古価格どうなっちゃうんだろう…?
さっそく配信日に落として、触ってみた。

うーん、やっぱVCって2フレームくらいの遅延があるような。
とりあえず、フラッシュ対策としてボムの点滅が遅くなったのと、ボスにダメージを与えてるときの背景フラッシュが「高速に赤黒赤黒」→「ゆっくり青赤黒青赤黒」に変わったくらいで、他は変わってない。ちゃんとサウンドテスト等もあって、「?ーガー」や「ピコン」の音も残ってる。
んで、DPCMのエミュレートにバグがあるようだ。表2面の曲とかで、DPCMが鳴り止まずにループする箇所がある。サウンドテストで「?ーガー」を鳴らしながら曲番号12を連打すれば、その症状が一番わかりやすく聞けると思う。
…でも、このバグが作用することでオケヒのリズムがちょっと良い感じに聞こえるかも…?
でも、あちこち行ってもその場で気軽に烈火ができるなんて、非常に素晴らしいことです。しかもたったの500円で。3DS本体価格と合わせても、裸カセット以下の価格で烈火が楽しめますよ…!
でも、本気で楽しみたいのなら、やっぱ実機だよねー! プロアクションロッキー使って没デモも楽しめるし。
せっかくなので、ファミコンの市販ソフトの中で一番プレミアの付いてる「サマーカーニバル'92烈火」について、自分なりにいろいろ書いたりしてみる。

サマーカーニバル'92烈火とは、1992年にファミコンで出たスーパーハードシューティングゲームですが、発売当初は雑誌等で超冷遇扱いされるなどしてあまり売れなかったようです。んで、2000年以降になって、その無茶ぶりが再評価され、裸ソフトでも15,000円以上の値が付くまでのプレミアソフトとなったわけですね。 自分も16,700円で手に入れました。
難易度はよく檄ムズと言われますが、実はパターンや攻略法が分かれば簡単です。表はね。裏はワカンネ。
烈火のスゴイところ
このソフトの凄いところと言えば、画面を覆うほどの敵の量、アームやボムの表現、そしてファミコンとは思えないほどの爽快感など、ファミコンの性能を限界まで引きだしたところでしょう。 そして、自分が本当に凄いと思うのは、どれだけ処理落ちしたりチラツキまくっても、それを感じさせないほどのスピード感が出ているところです。
背景のスクロール等を見れば分かるのですが、このゲーム、あのエグゼドエグゼス以上に処理落ち・チラツキが激しいです。
敵や自機弾などのオブジェクトが大体12~16個くらいあると処理落ちしてくるようですが、そんなことお構いなしに敵や敵弾がものすごい量で飛んでくるため、通常時でも60fpsから25fpsくらいに落ち込んだり、アーム系の敵が現れると15fps以下にまで遅くなります。
しかし、敵の動きが基本的に非常に速かったりと、処理落ちするぐらいがちょうど良い速さに設定されているようで、処理落ちしてもスピード感は十分に感じます。
また、スプライトのチラツキによって敵などが非常に見づらくなりますが、敵弾を溜めボム等で消せたり、ほとんどの敵が弾1発で倒せたり、自機だけはスプライトを重ねてちらつきにくくなっているため、これもさほど問題にはなりません。

こういったシステムのおかげで、スーパーハードシューティングを名乗れるほどのスピード感・爽快感が出るわけですね。(ファミコンのエグゼドエグゼスとは大違いだわ…)
ROM内に封印された没デモプログラム
これについてはニコニコ動画に上げているのですが、このソフトには没デモが残っています。
プログラムを見ると、ナグザットロゴからタイトル切り替え前にSTARTが押されていたら没デモを流そうとしたと思われる箇所があります。
----
D4B9: A5 20 LDA $20
D4BB: 29 10 AND #$10
D4BD: F0 00 BEQ
D4BF: 4C D0 D3 JMP $D3D0
D4C2: 68 PLA
D4C3: 68 PLA
D4C4: 4C D0 D3 JMP $D3D0
D4C7: (以下、没デモプログラム)
----
$20 = コントローラ1のボタン押下ステータス
$D3D0~ = タイトル画面へ
----
というわけで、これを書き換えてやれば、没デモが復活します。
たとえば、PRG-ROMの$1D4BE、.nesでは$1D4CEの「00 4C D0 D3」→「05 4C C7 D4」、PARなら「F2FFC586 C90CC758 6389D338」とやれば裏技仕様で復活します。でもこれだとタイトル画面がバグるけど。
んで、どんな没デモプログラムなのかというと、

「?ーガー!」(音も流れる)

豪快に、?ガ爆発!

その後、上から任?堂ロゴが「ピコン」と音を立てて降りてくる。
・・・という内容。没になってなかったら、どうなってたんだろう…?
3DSのVCで配信だと…!?
2012/12/12に、3DSのバーチャルコンソールでこいつが配信されたようです。たった500円で、15,000円もするソフトが遊べるわけです。 カセットの中古価格どうなっちゃうんだろう…?
さっそく配信日に落として、触ってみた。

うーん、やっぱVCって2フレームくらいの遅延があるような。
とりあえず、フラッシュ対策としてボムの点滅が遅くなったのと、ボスにダメージを与えてるときの背景フラッシュが「高速に赤黒赤黒」→「ゆっくり青赤黒青赤黒」に変わったくらいで、他は変わってない。ちゃんとサウンドテスト等もあって、「?ーガー」や「ピコン」の音も残ってる。
んで、DPCMのエミュレートにバグがあるようだ。表2面の曲とかで、DPCMが鳴り止まずにループする箇所がある。サウンドテストで「?ーガー」を鳴らしながら曲番号12を連打すれば、その症状が一番わかりやすく聞けると思う。
…でも、このバグが作用することでオケヒのリズムがちょっと良い感じに聞こえるかも…?
でも、あちこち行ってもその場で気軽に烈火ができるなんて、非常に素晴らしいことです。しかもたったの500円で。3DS本体価格と合わせても、裸カセット以下の価格で烈火が楽しめますよ…!
でも、本気で楽しみたいのなら、やっぱ実機だよねー! プロアクションロッキー使って没デモも楽しめるし。