CのNESのゲーム開発。第22〜23章。 付録1-マッパーとデジタルサウンド

ここに、メインサイクルには含まれていないが、無視できないほど貴重な情報があります。







<<<前 次>>>







画像

出所







マッパーのトピック-カートリッジ内のコプロセッサー-は、ほぼ完全に議論から外れました。 ゲームのサイズを0x8000バイトより大きくする必要がある場合、これには標準のコンソール機能では不十分です。 マッパーを使用すると、ゲーム内のメモリバンクを切り替えることができ、cc65はそれを使用できます。 最も人気のあるマッパーはMMC3です。 メモリバンクの切り替えに加えて、ラインカウンタがあります。







実際のコンソールで独自のゲームをプレイするには、EverdriveやPowerPakなどのフラッシュカートリッジを使用できます。 EPROMチップをフラッシュして独自のボードを作成するか、別のカートリッジを犠牲にすることはできますが、これには特定のスキルが必要であり、現在は利用できません。







2001年のレジスタの最上位3ビットには、カラーチャネルの輝度向上が含まれています。 ビットが反転されます-すべてのビットを設定して、画面全体の輝度を均等に下げます。 画像内のすべてのパレットオプション。







画像







標準ライブラリC



Ulrich von Bassewitzは、C標準ライブラリ全体と他のものをcc65に移植しました。 現在、非常に遅いものの、数字の除算と乗算があります。 表計算の高速化

#include “..\include\stdlib.h”





これで、calloc、malloc、free、およびreallocのメモリを使用して作業を行うことができます。 これらの機能をテストすると、いくつかの問題が見つかりました-構成で__STACK_SIZE__と__STACKSIZE__の両方を決定する必要がありました。 ライブラリのタイプミスに非常に似ていますが、両方のオプションがドキュメントにあります。 アロケーターを使用するには、HEAP定義する必要もあります







このすべてを台無しにしないことを強くお勧めします。メモリが静的に割り当てられるCコードと比較しても遅いです。 ライブラリ関数で興味深いのは、擬似乱数用のrandとsrand、およびソート用のqsortです。

#include “..\include\cc65.h”





インポートされたcc65_sinとcc65_cos-サインとコサイン

#include “..\include\zlib.h”





そして-圧縮を使用します。 まったく経験していません。







割り込み-IRQ



動作の原理は、NMIと同じです。トリガーされると、制御が割り込みハンドラーに転送されます。 ハンドラポインタは、アドレス$ FFFE- $ FFFFの割り込みベクトルにあります。 割り込みを発生させる方法は3つあります。









3番目の方法だけが便利に見えます。フレームをレンダリングするプロセスでPPU設定を実際に変更できます。背景とすべてを組み合わせることができます。







一部のエミュレーターは、画面の上下で8ピクセルをカットします。 NESは240行を生成しますが、その時代のテレビでは画面の端が失われることがよくありました。 要するに、この領域にゲームにとって重要なものを置かないでください。







PPUデータの読み取りと書き込みはほぼ同じように機能します。 アドレスの上位バイトを$ 2006に書き込み、次に下位バイトをそこに書き込み、$ 2007から読み取ります(LDA $ 2007)。 ただし、PPUからの最初の読み取りでは常にゴミが発生します。 $ 3F00- $ 3FFFのアドレスでパレットを操作することに加えて、最初の読み取りで正しいデータが得られます。 したがって、2回読む必要があります。 私はNES開発者ではなく、なぜこのように機能するのかわかりません。 PPUのすべての作業はVブランクの間に行われなければならないことをもう一度思い出させてください。







DMCを使用する



Famitone2とFamitrackerを使用してゲームに音楽を追加する方法についてもう少し詳しく説明します。 ライブラリなしで実行する場合、アクションのシーケンスは次のようになります。







メモリからサンプルを再生する方法
 *((unsigned char*)0x4015) = 0x0f; //  DMC //    , DMC   0x10 *((unsigned char*)0x4010) = 0x0f; //  , 0x0f -  ADDRESS = 0xf000; //  DMC-  ROM //       $C000-$FFFF  ROM *((unsigned char*)0x4012) = (ADDRESS & 0x3fff) >> 6; // 0xf000 => 0xc0 LENGTH = 0x0101; //   *((unsigned char*)0x4013) = LENGTH >> 4; // 0x0101 => 0x10 *((unsigned char*)0x4015) = 0x1f; //   DMC //     
      
      





Famitone2はそれをすべて自分で行います。 いずれにせよ、サンプルは短くする必要があります-私は通常0.1〜0.5秒を使用します。 長さを増やす必要がある場合は、周波数を下げる必要があり、これにより品質が劇的に損なわれます。 また、DMCチャネルは他のチャネルの約2倍静かであることに留意する必要があります。







これらすべてをゲームに追加してみましょう。 古いコレクションからの非営利的な使用サンプルのライセンスを使用します。 私はそれらの長さを切り取り、Famitrackerにインポートしました:







画像







次に、DMCファイルとして保存する必要があります。 各サンプルはインストゥルメントキーにアタッチされており、DPCM列のトラックにそれらを作成できます。 次に、.txtにエクスポートする必要があります。 Famitone2 / toolsのtext2dataプログラムは、それを.sおよび.dmcファイルに変換します。

text2data DMCmusic.txt -ca65









次に、Famitone2でDMCおよびSoundFxチャンネルをオンにします。 これは、reset.sファイルの.defineセクションにあります。 サンプルは、アドレス$ F000から始まるメモリに配置されます。これはオプションFT_DPCM_OFFです。 サンプル自体は、reset.sファイルの末尾の.segment“ SAMPLES”ファイルにあります。 彼の住所も.CFGで指定する必要があります。 その後、Famitone2は独自の処理を行い、famitone.sファイルの手順でサンプルを切り替えます。 また、ジャンプの音声演技に非DMC効果を追加し、famitone2 / tools / nsf2dataを介して変換しました-この手法はすでに説明しました。







Dropbox

Github







そして、DMCエフェクトを追加できるようになりました。 私は同じトラックを離れますが、ドラムをノイズチャンネルに転送します-エフェクト中に中断されることはありません。 Famitone2では、これはほぼ同じ方法で行われます。







画像







コードからこれらのエフェクトを呼び出すには、fastcall関数を使用して、ラベルによってfamitone2.sからプロシージャを呼び出す必要があります。

void __fastcall__ DMC_PLAY(unsigned char effect);









エフェクト番号は1バイトに埋め込まれ、DMCサンプルの番号と一致する必要があります。 生成されたDMCmusic2.sファイルでそれらを確認する必要がありますが、驚くかもしれません:







画像







サンプルが行の25番目と27番目のノートに結び付けられているため、25と27が判明しました。

そしてそれは非常に簡単です:

DMC_PLAY(27);









1つはジャンプ時に再生され、2つ目はジャンプ時に再生されます。







Dropbox

Github








All Articles