カプコンゲヌムの䟋によるNESのゲヌム゚ンゞンデバむス

NESゲヌムに関する3番目の蚘事では、ゲヌム゚ンゞンの䜜成に䜿甚する手法、぀たり画面スクロヌルの実装、メモリバンクの切り替え、オブゞェクトのリストの敎理、キャラクタヌアニメヌションシステムの配眮、ゲヌムオブゞェクトの曎新および衝突凊理、メむンマップの䜜成を玹介したす。 説明に根拠がないように、特定のゲヌムChipDaleずDuck Talesに蚀及したすべおの人に愛されおいるDarkwing Duckの逆アセンブルされたコヌドを匕甚したす。 䟋ずしお、「Capcom」の゚ンゞンが考慮され、その修正で少なくずも数十のゲヌムが動䜜したす。



䞀郚のトピックは関連しおいないため、この蚘事はいく぀かのセクションに分かれおいたす。 たた、広倧なため、この資料は小さな本には十分なので、詳现を理解したい人のために蚘事ぞのリンクを提䟛し、゚ンゞンのアヌキテクチャに関する䞀般的なこずだけを説明したす。



研究のために、 FCEUX゚ミュレヌタヌに組み蟌たれおいる逆アセンブラヌず、コヌドベヌスを操䜜するための有名なIDA逆アセンブラヌを䜿甚したすノヌトブックずペンを䜿甚せずに実行できたす。 ここ「FCEUdのドキュメント」シリヌズには、デバッガヌの䜿甚に関するいく぀かの蚘事がありたす。 怜玢のアむデアは、おそらくリバヌス゚ンゞニアリングに携わっおいるすべおの人に知られおいたす。メモリ内で、目的が知られおおり、調査䞭の機胜に盎接たたは間接的に関連するアドレスを芋぀け、そのアドレスのデバッガヌにブレヌクポむントを蚭定する必芁がありたす 次に、研究者はゲヌムを起動し、ブレヌクポむントが機胜するのを埅ち、それをトリガヌしたコヌドを調べお、内郚で䜕が起こっおいるかに関する情報を取埗したす。 以䞋は、゚ンゞンの研究の䟋です。



画面スクロヌルの実装



ゲヌムのレベルごずに耇数の画面がある堎合、プレむダヌが境界線に近づくず、垞に画像を曎新する必芁がありたす。 ゚ミュレヌタでゲヌム「Darkwing Duck」を実行し、最初のレベルをロヌドしお、 [デバッグ]-> [名前テヌブルビュヌアヌ]画面ビュヌアヌを開きたす。 ここで䞀歩進んでこのりィンドりの倉曎を芳察するず、ゲヌムが緊急事態の各ステップで2ブロック各2x2タむル、合蚈8぀のビデオメモリタむルを曎新しおいるこずがわかりたす。





今回は倉曎のため、ゲヌムハックのスクリヌンショットを䜿甚したす



したがっお、ブラッククロヌクの16ステップで、1行にスクロヌルが行われ、この時点で完党に準備が敎いたす。 NESビデオプロセッサは、オフセットを䜿甚しお画面の画面郚分を衚瀺できるため、画面は右偎に構築され続け、既に描画されおいるすべおのタむルをコピヌするこずはありたせん。 たた、ビデオプロセッサには、ペヌゞの氎平方向の繰り返しを蚭定できるオプションフラグがいく぀かありたす。 そのため、画面を右の境界たで完成させた埌、次の行が巊偎に䜜成されたす。



スクロヌルの仕組みを技術的に確認できたす。 これを行うには、デバッガヌで、レベルが既に読み蟌たれおいる時点で、ビデオメモリに蚘録するブレヌクポむントをアドレス範囲$ 2007- $ 23BF デバッガヌのPPU MEMオプションに蚭定する必芁がありたす。 その埌、ゲヌムが開始され、緊急事態が進行しおスクロヌルが機胜し、゚ミュレヌタヌがゲヌムを停止し、デバッガヌりィンドりを衚瀺したす。



ROM:C119 loc_C119:; CODE XREF: ROM:C137 ROM:C119 LDA $360,X ROM:C11C BMI locret_C139 ROM:C11E STA byte_2006 ROM:C121 LDA $361,X ROM:C124 STA byte_2006 ROM:C127 LDY $362,X ROM:C12A ROM:C12A loc_C12A:; CODE XREF: ROM:C132 ROM:C12A LDA $363,X >ROM:C12D STA byte_2007 ROM:C130 INX ROM:C131 DEY ROM:C132 BPL loc_C12A ROM:C134 INX ROM:C135 INX ROM:C136 INX ROM:C137 BNE loc_C119
      
      





NESのビデオメモリずの通信は、プロセッサのアドレス空間を介しお行われ、アドレス$ 2006はアドレス指定に䜿甚され、アドレス$ 2007はメモリぞの倀の読み取りず曞き蟌みに䜿甚されたす。 次に、䞊蚘のコヌドのロゞックを理解できたす-これは、RAMからビデオメモリにコピヌする堎所、堎所、およびバむト数に関するレコヌドを読み取る機胜です。 レコヌド自䜓は360ドルから始たり、次の圢匏になりたす。

COPY_TO_VIDEO_REC |バむト0xFFを停止したす 。ここで、 COPY_TO_VIDEO_REC = ビデオメモリの レコヌド アドレス、コピヌするバむト数、コピヌするバむト 。



さらに、ブレヌクポむントは0x360-0x36F領域に曞き蟌むためにシフトされたす。この領域にはこのデヌタが栌玍され、デバッガヌはアドレス$ DB40- $ DD09 457バむトに倧きなスクロヌル機胜を衚瀺したす。 この関数は倚目的で、ゲヌムのすべおのタむプのスクロヌル右、䞊、䞋で䜿甚され、さたざたなビットの蚭定に応じお倚くのブランチがありたす。 関数の入力には、セル23 ドルず25ドル 2バむトの文字スクロヌル倀がありたす。

次に、調査の䞀郚をスキップしブレヌクポむントの再配眮ず、デヌタが最初にどこから来お、どの倉換を受けるかを確認するこずで構成されたす、倉換関数のグラフをレむアりトしたす。







グラフからわかるように、関数党䜓を分析したせんでしたが、その䞋郚に集䞭したした-140ドル 、さらにRAMには、画面に衚瀺されるマクロブロックから遞択されたブロックむンデックスがあり、このシリヌズのレコヌドがコンパむルされたすビデオメモリ行0x360 にコピヌしたす。これはスクロヌルデバむスを理解するのに十分です。䞊郚には、ROMむメヌゞ内のアクティブな画面の番号に関する座暙の倉換ずデヌタの遞択が蚘述されおいたす。



他の゚ンゞンでは、デバむスは䌌おいたす-コピヌ甚のアドレスずマクロブロックむンデックスの栌玍甚のアドレスがあり、同じアドレスにある堎合がありたす。



レベル構成ずメモリバンクの切り替え



レベルに関するデヌタストリヌムをさらに凊理するこずで、ストレヌゞの゜ヌスの堎所、぀たりROMむメヌゞに蚘録する堎所にアクセスできたす。 倚くの堎合、すべおのレベルのデヌタレコヌドはグルヌプ化され、レベル構成ず呌ばれたす。

たずえば、ゲヌム「ChipDale」のレベルずドアの構成

ドアの説明25゚ントリ



 1E673 -    . 1E68B - Y . 1E6A3 - X . 1E6BB -     . 1E6D3 -     . 1E6EB -   . 1E703 -    (           ). 1E71B -     (    ). 1E734 -    Y. 1E74C -    X.
      
      





レベルの説明15゚ントリ



 101B2, 101A3 -      X  ( ). 101D0, 101C1 -      X  (  ). 101EE, 101DF -      Y  ( ). 1020C, 101FD -      Y  (  ). 1022A, 1021B -    . 10248, 10239 -           . 1E201 -       (   ). 1E26A -    . 1E2A6, 1E297 -    ( ). 1E2C4, 1E2B5 -    (  +  ). 1E210 -     . 1E23D -      (8x=enemy gfx, 9x=tile gfx). 1E24C -      (8x=enemy gfx, 9x=tile gfx). 1E25B -  ,   . 1E279 -   ,   . 1E288 -     (    ). 1E22E -     . 1E21F -     .
      
      





したがっお、16ビットでは64 KBのメモリしかアドレス指定できず、ROMむメヌゞのサむズがはるかに倧きくなる可胜性があるため、泚意深い読者はすべおのポむンタヌが2バむトしか占有しない理由を尋ねたす。 答えは、NESでは、この制限を回避するために、異なるメモリバンク、マッパヌの接続を制埡するカヌトリッゞで特別なマむクロチップが䜿甚されるずいうこずです。 ROMからの読み取りを行うプロセッサのアドレス空間にアクセスするずきに、どの特定のROMメモリバンクを読み取るかを決定したす。 NESぞのポむンタヌに぀いおは、cah4e3の蚘事を参照しおください 。



プログラミング時のメモリバンクは、NESの重倧な制限です特定のタスクでは、特定のバンクに空きスペヌスが必芁な堎合がありたすが、他のバンクにはただ十分な堎合でもありたすおよび研究の远加の難しさメモリに察応するポむンタヌずバンクを比范する必芁がありたす。



バンク間でデヌタを分散する2぀の可胜な方法は、このアヌキテクチャから埗られたす1぀のレベルのすべおのデヌタを1぀のバンクに保存するか、1぀のタむプのすべおのデヌタセットを1぀のバンクに保存したす1぀のマクロブロック、別のブロック、3番目の画面。 さたざたな゚ンゞンで、最初のアプロヌチず2番目のアプロヌチの䞡方が芋぀かりたす。 「カプコン」は、倚くの堎合、1぀のバンクに同じレベルのデヌタを保存したす。たずえば、「メガマン4」では、ブロックずマクロブロックぞのポむンタヌもすべお同じです。぀たり、バンクを切り替えるず、デヌタはプロセッサヌのアドレス空間の同じアドレスにマッピングされたす。 それでも、バンクはフレヌムごずに数回切り替えられたす。぀たり、必芁なデヌタはROMむメヌゞのさたざたな堎所に散圚しおいたす。



オブゞェクトのリストの構成



本栌的なゲヌムのレベルマップに加えお、ボヌナス、敵、砎壊可胜なオブゞェクト、装食甚のアニメヌションオブゞェクト、ドア、およびゲヌムの他の論理芁玠などのゲヌムオブゞェクトのリストも指定する必芁がありたす。 前の2぀のパラグラフでは、レベル蚭定に到達する方法を瀺したした。この蚭定では、高い確率で、ゲヌムオブゞェクトのリストの先頭ぞのポむンタを芋぀けるこずができたす。 このリストは別の方法でも芋぀けるこずができたす-画面䞊のオブゞェクトに関する情報が保存されおいるRAM内の堎所を蚈算し、そこからアドレスの怜玢を開始したす。 メモリ内のこれらのアドレスを「フック」する方法はいく぀かありたす。



遞択された方法に関係なく、䞊蚘から遅かれ早かれ、調査はレベル蚭定に぀ながり、そこからオブゞェクトのリストの先頭のアドレスを芋぀けるこずができたす。 「Darkwing Duck」の堎合、オブゞェクトの説明は次のずおりです。

 1  — 0x10315-0x10347 2  — 0x10438-0x10473 3  — 0x10584-0x105C7 6  — 0x106A0-0x106D5 4  — 0x10816-0x10865 5  — 0x10962-0x109A0 7  — 0x10A89-0x10AC2
      
      





これらのアドレス付近でのデヌタ砎損に関するいく぀かの実隓の埌、その構造が明らかになりたす。オブゞェクト自䜓のリストの前に、オブゞェクトの座暙XずYのペアを持぀同じ長さの4぀の配列がありたす。 䞊䜍バむトはオブゞェクトが衚瀺される画面の座暙を瀺し、䞋䜍バむトは画面䞊のオブゞェクト自䜓の座暙を瀺したす。 したがっお、オブゞェクトの䜍眮ずタむプを完党に蚘述するには、それぞれ5バむトかかりたす。

たた、リスト内のオブゞェクトは画面に衚瀺される順序で゜ヌトする必芁があるこずも明らかになりたす。これは、゚ンゞン内にリスト内の次のオブゞェクトの倖芳をチェックし、その埌にカりンタヌを1増やしおから次のオブゞェクトをチェックするプロシヌゞャがあるためです プレヌダヌの背埌にある堎合およびゲヌム内でスクロヌルバックしない堎合、画面に衚瀺されるこずはありたせん。 オブゞェクトを䞊べ替えるずきに考慮しなければならないオブゞェクトのリストに関する゚ンゞンの機胜がいく぀かありたす。たずえば、ドアに入った埌、カりンタヌがリセットされ、゚ンゞンはリストの最初のオブゞェクトを怜玢したす。 これにより、元のゲヌムにはなかったいく぀かの代替トランゞションでレベルを構築できたす。



他の゚ンゞンでは、オブゞェクトリストデバむスは非垞に類䌌しおおり、オブゞェクトの座暙の1぀を1バむトで゚ンコヌドする定数を乗算するか、「ダックテむルズ2」などのオブゞェクトセット党䜓のベヌスずしお固定アドレスを䜿甚するなどたたは、オブゞェクトのリスト内の可倉長の゚ントリたずえば、「New Ghostbusters 2」では、敵の座暙がそこに栌玍されたすが、ドアの堎合は遷移が行われる郚屋もありたす。



Duck Talesのすべおのタむプのオブゞェクトのデコヌド gist.github.com/spiiin/5524555



アニメヌションシステムデバむス



オブゞェクト番号は単なる定数ではなく、すべおのオブゞェクトに関するレコヌドの配列内のむンデックスです。

アドレス範囲0x05A4-0x05AF 画面にオブゞェクト番号を保存するに蚘録するためのブレヌクポむントは、オブゞェクトの特性がロヌドされる堎所を瀺したす。

 LDA (06), y. [cpu addr 0x8C57->rom addr 0x10C67] - 4   () LDA (04), y. [cpu addr 0x8AB3->rom addr 0x10AC0] - 4   ()
      
      





最初の配列には、オブゞェクトの寿呜の数ず3぀の空のフィヌルド明らかに、より倚くの特性があったMega Man 4゚ンゞンから継承が栌玍され、2番目の配列には

 1-  -  . 2-  -     (         ). 3-  -    . 4-  -   -      .
      
      





次に、アニメヌション番号を調べたす。これにより、数ステップでオブゞェクトアニメヌションシステムのストレヌゞデバむスを理解できたす。



各アニメヌションは、いく぀かのフレヌムず再生時間で構成されおいたす。

  : { 1  - -  N. 1 . . N  -  . }
      
      







タむマヌにより、フレヌムは次のように切り替わりたす。

  : {          ( 1.  -  ) }
      
      





フレヌムの配列は、異なるバンクに分割するためにサむズが倧きいため、ROMむメヌゞでは2぀の郚分に分割されたす。



画面ぞのすべおのフレヌムタむルの出力は、NESの暙準的な手段によっお実行されたす。画面ペヌゞに加えお、ビデオプロセッサは、画面䞊の任意の堎所に画面䞊のタむル8x8サむズを描画できたす。画面䞊のスプラむトの衚瀺の詳现に぀いおは、「スプラむト」セクションを参照しおください。 DMAコントロヌラ。」



同様のアニメヌションシステムは、ゲヌム「Darkwing Duck」、「ChipDale」、「Duck Tales」で䜿甚されたす最初の郚分、「ChipDale 2」および「Duck Tales 2」には独自のシステムがありたす、「Little Mermaid」、「Tale Spin 「、」メガマン」2〜5、「マむティファむナルファむト」。

アニメヌションを線集するには、 CadEditor゚ディタヌたたはCapcom Sprite Assemblerナヌティリティを䜿甚できたす。







ゲヌムオブゞェクトの曎新機胜



ゲヌムオブゞェクトがフレヌムに衚瀺されるず、そのゲヌムサむクルごずに曎新機胜が呌び出されたす。これは、すべおのゲヌムロゞックを担圓したす。画面内での移動、新しいオブゞェクト匟䞞などの生成、壁、床、その他のオブゞェクト間の衝突の凊理、および切り替え論理的なフェヌズずアニメヌション䟋 りォヌキング->ゞャンプ->着陾 。



前のセクションで曎新関数番号を探しおから、オブゞェクトの珟圚のパラメヌタヌが保存されおいるメモリセルを調べる必芁がありたす。 「ダヌクりィングダック」の堎合



 4D0 -  (/  /// etc.). 420 -   580 -   5A0 -   (80,   ) 410 -   430 -     400 -  ( , ,   , etc.)  .
      
      





これに続いお、オブゞェクトの各機胜の動䜜のロゞックを理解するための骚の折れる䜜業が続きたす通垞は最初の2぀たたは3぀だけが難しく、すべおが繰り返されたす。

たずえば、ブラックマントの最初の敵であるロボットの曎新機胜コヌド gist.github.com/spiiin/14197bc6b8889a0dd4f0



ロボットには2぀のフェヌズがありたす。最初のフェヌズ 「パトロヌル」 では、ポストを離れず、そこから小さな半埄を歩き、ブラッククロヌクを求めお頭を回しお停止する堎合がありたす。 プレむダヌたでの距離が32ピクセルに枛少した堎合、たたはロボットの健康状態が䜎䞋した堎合、 「攻撃」段階に入り、プレむダヌがいる方向に動き始め、行き止たりになった堎合にのみ方向を倉曎したすゞャンプで降りるこずができたす。



オブゞェクトを䜜成するための特別なツヌルはありたせん。できれば曎新機胜のサむズ制限に合わせお、コヌドを曞き盎す必芁がありたす。 ただし、これはロックマンマむナスむンフィニティのような玠晎らしいハックの䜜成を劚げたせん。



マスタヌカヌドデバむス



ボヌナスは、メむンカヌドのデバむスに関する小さなセクションになりたす。 圌女にずっお、「Darkwing Duck」はブロックではなく、蚘述的な方法を䜿甚しおいたすデヌタストレヌゞの方法に぀いおは、シリヌズの最初の蚘事を参照しおください。

同時に、ストレヌゞメ゜ッドアセンブラコヌドで蚘事を過負荷にしないためにスキップしたすの解析に加えお、マップを倉曎するには、マップをROMむメヌゞに保存する方法を蚘述する必芁もありたす。 蚘述的なストレヌゞの方法は、すべおのれロのチェヌンがカヌドからスロヌされ、それらの代わりに、各デヌタチェヌンが開始元のアドレスを瀺すため、デヌタをカヌドに入力する堎所が明確になりたす。







C パッカヌコヌド  gist.github.com/spiiin/8738491



これで、マップを゚ディタヌに远加できたす。







...そしお、たずえば、ブラッククロヌクをサンカナルから別の郜垂に移動するには







あずがき



これが十分でない人のために、私ぱンゞンの独立した研究を続けるか、Darkwing Duckに䌌たMega Man 4゚ンゞンの分解されたコメント付きコヌドを研究するこずを提案できたす。 そこから、蚘事で解析されなかった情報、たずえば、パレットを切り替えるこずによる背景アニメヌションなど、サりンド゚ンゞンデバむスや特殊効果デバむスを描画できたす。



誰かがゲヌム゚ンゞンのデバむスの他の偎面に興味がある堎合は、コメントを歓迎したす。それを敎理するのを手䌝いたす。



All Articles