NES(およびほとんどのSNES)については、基本的な概要を以下に示します。私はNESゲームを作成しませんでしたが、NESエミュレーター(Graybox)を作成し、古いカートのかなりの回転工学を行いました。
プログラミング言語について:はい、すべてアセンブリでした。NESのプログラミングは、ハードウェア割り込み、DMAポート、バンク切り替えなどを直接操作することを意味しました。幸いなことに、6502(または2A03)のプログラミングは非常に簡単です[1]。
- レジスタはほとんどありません:主にA、X、Y、後者の2つはインデックス付けと反復にのみ使用可能です
- 命令セットは小さく、ほとんど簡単です
- 多くのメモリではありません。メインRAMは2KBで、オプションのバッテリバックアップ付き8KB拡張があります。その2KBのうち、256バイトはスタック用に予約されており、ページ0(最初の256バイト)は、いくつかの特別なアドレス指定モードのために最もよく使用されるポインターと値を格納する場所です。
これら3つのことを組み合わせることで、作業中に暗記するのに十分簡単な環境が実現します。はい、すべてのメモリを自分で管理しますが、本質的には、すべてが先に進む完全なマップを作成することを意味し、2Kについて心配するだけでよいのでそのマップはそれほど大きくありません。グラフ用紙。少し計画を立てて、変数と定数をRAMおよびROM(カートリッジ上)の場所に静的に割り当てる必要がありました。
カートリッジのデータがCPUのアドレス可能な制限を超えると、少し巧妙になります。これは64KBで、そのうちの下位32KBは石で設定され、あらゆる種類のハードウェアポートとRAMにマップされます。これは、バンク切り替えが機能する場所です。つまり、ROMのセクションを上位32KBアドレス空間(の一部)にマッピングします。
これはプログラマーが望む方法で使用できますが、使用例としては、3レベルのゲームがあり、各レベルのすべてのレベルデータ、メタデータ、コードがカートリッジの個別の8 KBのメモリ領域に詰め込まれている場合があります。レベルには、初期化、フレームごとの更新などのコールバックが含まれる場合があります。レベルの「ロード」とは、メモリの8KBチャンクを、たとえば0xC000にマッピングすることを意味します。次に、initルーチンが常に0xC000に、フレーム更新ルーチンが0xC200に、レベルデータが0xC800に開始するように指定できます。別のメモリチャンクに格納されたゲームのメインコードは、適切なチャンクにスワップし、適切なタイミングで絶対アドレス0xC000および0xC200にジャンプするだけで、レベルの変更を制御します。
WRTグラフィカルデータ:NESのタイルデータは2ビットの8x8ピクセルマップです。背景については、1/4解像度の2ビットレイヤーと組み合わされます。これらの4ビット値は、16エントリパレットにインデックス付けされ、53の効果的な一意の色が利用できると思います。スプライトは2ビットピクセルデータも使用し、各スプライトは独自の2ビットグループインデックスを指定して、再び4ビットpalインデックスを形成しました。画面上のBG画像は、タイルインデックス番号の32x30配列です。
基本的に、大量の繰り返しとインデックスへのインデックスを作成することで、データを非常に小さく保つことができます。レベルデータは多くの場合、タイルインデックスの垂直バーとして保存されていました。これらの垂直バーも再利用されるため、インデックスも作成され、カートリッジに一度だけ保存されました。単純なデータ圧縮技術も同様に機能します。これにより、マリオ1は32KBのデータ(余裕がある)と8KBのビットマップデータになりました。
開発環境に関しては、仕事のためにEEPROMバーナーに接続された証明可能な古代のコンピューターで作業した人々の写真を見ました。ツールを使用したデバッグは、実際にはSNESの時代の後まで可能性がありませんでした[2]。これが、多くの古いゲームに「明らかな」バグがある主な理由であり、Gamesharkのようなものが何をすることができるのかという理由です。プレイヤーの体力は常にmem-location Xにあるため、常に100になるように強制できます。
これらのことがおもしろい場合は、たとえばhttp://wiki.nesdev.com/w/index.php/Nesdev_Wikiをご覧になることをお勧めします
。NESのプログラミングコースもオンラインで見つけることができます。
この簡略化された概要により、80年代のゲーム開発に関する洞察が得られることを願っています。
[1]比較的話す。また、約85%のPowerPCアセンブリでGraybox自体を作成したため、偏見があります。[2] FF6の作成に関する記事をご覧ください:http ://www.edge-online.com/features/the-making-of-final-fantasy-vi/