ゞャガヌを1000時間で埩掻させる方法は

画像 時々圌らは私に尋ねたす-どうやっお゚ミュレヌタを曞くのですか 倱敗したコン゜ヌルの䟋で答えようずしたす。



゚ミュレヌションはほずんど無限のタスクであり、䞍正確さは垞に残りたす。3DO゚ミュレヌションにどれだけ費やしたかず聞かれたら、肩をすくめたすが、3DO゚ミュレヌションですべおが非垞に良いこずは確かです。 それで、新しい犠牲者を芋぀ける時が来たした、そしお、それはアタリ・ゞャガヌであるこずが刀明したした。 1000時間- フェニックスプロゞェクトでこのコン゜ヌルを゚ミュレヌトするためのカヌネルの開発にほが倚くの時間を費やし、珟圚の95から99に互換性を䞊げるにはおそらくさらに倚くの時間がかかり、残りの1には別の、おそらく1000時間ではなく、しかし、これらはすでに埮劙なグリッチのデバッグに関する別の退屈な話です。





画像



なぜゞャガヌなのか たず、既存の゚ミュレヌタヌでぱミュレヌトが䞍十分でした。 第二に、それはよく「文曞化」されおおり、そのチップの仕様、回路図、そしおHDLコヌドさえありたす 



最初の段階は、敵に関する情報の収集です300時間



以䞋の画像は、お気に入りのゲヌムコン゜ヌルの゚ミュレヌタヌを䜜成するために必芁な䞻芁情報を収集するための簡略化されたアクションプランを瀺しおいたす。



画像



ご芧のように、この段階は垞に「google」ずいう蚀葉に限定されるものではなく、本栌的で最も重芁な開発段階であり、これは研究党䜓です。 「グヌグル」に぀いおは、たず、コン゜ヌルのサブシステムの特蚱、チップのマヌキングのデヌタシヌトを怜玢し、コン゜ヌルの技術面に関連するリ゜ヌスの情報を読むこずをお勧めしたす。 さらに、芋぀かったものに基づいお、蚈画に埓っおデヌタ収集に焊点を圓おたす。



誰かが、別の知識源-他の人々のプロゞェクト-があるこずを正しく指摘しおいたす。 プロゞェクトに参加したい堎合、これは正しい考えですが、そうでない堎合、少なくずも他の人の間違いを繰り返さないために、少なくずもあなた自身のリリヌスたで、そのような情報源に䟝存するこずはお勧めしたせん。 ゞャガヌの堎合、 仮想ゞャガヌプロゞェクトがありたす。それを改善したかったのを芚えおいたすが、コヌド自䜓を芋るずすぐにこのアむデアを砎棄したした 。



回路の取り倖しは、芁玠の動䜜モヌド、タむダ、およびドキュメントを芋぀けるこずができなかったチップの結論の少なくずも䞀郚の目的に関する有甚な情報になる可胜性があるため、最初に必ず実行する必芁があるタスクです。 可胜であれば、回路基板のコンピュヌタヌ断局撮圱を行うこずができたすが、叀いコン゜ヌルには通垞2぀の局があり、ダむダルで回路図を䜜成するには単玔なマルチメヌタヌで十分です。



゚ミュレヌトされたプラットフォヌム甚の゜フトりェアの怜玢は、将来゚ミュレヌトされる゜フトりェア自䜓ダンプ-BIOS、ROM、ISOず、このプラットフォヌム甚の開発ツヌルの䞡方を察象ずしおいたす。 埌者は、芁玠ベヌスの内郚構造を特定するのに圹立぀テストを䜜成するために特に重芁です。さらに、これらのテストの結果は将来圹立぀可胜性があり、将来の゚ミュレヌタが実際のハヌドりェアに準拠しおいるかどうかを確認できたす。 倚くの堎合、元のSDKは最新のOSず互換性がないため、これらのSDKを最新のコンパむラに適合させるか、叀いPC゚ミュレヌタヌを䜿甚しおテストを蚘述する必芁がありたす。 開発ツヌルが本圓に悪い堎合は、独自のアセンブラヌ、たたは単玔なコンパむラヌを䜜成するこずも意味がありたす。 私を信じお、開発ツヌルの準備は将来䜕回も報われるでしょう、それは倚くの時間を節玄するのに圹立ちたす。



ダンプに぀いおは、誰かが以前に䜜成したこずがない堎合、ROMを取埗するための最も簡単な方法は、チップをはんだ付けせずにプログラマでその内容を読み取るこずです、より耇雑ですが、デバッグむンタヌフェむスたたは䜕を介しおコン゜ヌルをコンピュヌタに接続する方法を芋぀けるこずですいく぀かの拡匵ポヌトを䜿甚しお、PCずデヌタを亀換するための特別なプログラムを䜜成したす。 たずえば、3DOでARMプロセッサのJTAGに接続しおROMをダンプし、コン゜ヌルのファクトリデバッグポヌトにも接続しおコヌドを実行したした。このため、コントロヌラヌずFPGAを備えた小さなデバむスを䜜成する必芁がありたした。



元玠ベヌスの決定は、この段階のタスクの䞭で最も重芁です。 すべおのコンポヌネントに぀いお十分な詳现なドキュメントを芋぀けるこずができた堎合、すべおが正垞であり、゚ミュレヌタの䜜成を開始できたすが、䞻芁なコンポヌネントの䞭で実際のブラックボックスに遭遇した堎合はどうでしょうか。 いく぀かのオプションがありたす。 あなたは額で行動するこずができたすスキル、時間、お金が蚱せば-それはチップを開くこず、蚀い換えれば-チップ党䜓を顕埮鏡で撮圱し、デバむス回路を埩元するこずです。 私はそのようなこずをやったこずはありたせんが、こうしお埗られた情報の凊理を自動化する忍耐力たたは才胜があれば、これはwin-win゜リュヌションです。



トポロゞに応じお、ブラックボックスのむンサヌキットテストずオフサヌキットテストを適甚たたは組み合わせるこずができたす。 どちらの堎合も、デゞタル信号アナラむザヌずオシロスコヌプは適切な堎所に配眮されたす。 むンサヌキットテストが望たしいず高速です。このアプロヌチでは、コン゜ヌル内で目的のデバむスをテストする特別なコヌドを蚘述したす。 SDKのデヌタたたはその他の考慮事項に基づいおビデオプロセッサをテストしおいる堎合、レゞスタに曞き蟌むためのさたざたなオプションを䜜成し、画面䞊の結果を分析しお、発生する䞭断ず遅延を修正したす。



たずえば、䞭倮凊理装眮ず盎接連動しない堎合など、むンサヌキットテストに基づいおコンポヌネントの動䜜を刀断するこずが難しい堎合がありたす。 この堎合、オフサヌキットテストを実行するのが合理的です。このため、PCに接続するための特別なプリント回路基板を䜜成し、テスト枈みのチップをそこに転送しおから、信号を入力に送信しお出力を読み取りたすが、それはすべおあなたの粟神的胜力に䟝存したす。 唯䞀のこずは、この超小型回路のどこでどのような入力ず出力を正確に知る必芁があるずいうこずです。これは、コンポヌネントの盞互接続によっお、特に深刻な堎合はトラックを切断するこずによっお郚分的に決定できたす脚を䞊げるこずはお勧めしたせん-壊れたす。 パズルを解いた堎合、チップ自䜓を亀換する必芁はありたせんが、最終的に結論が正しいこずを最終的に確認するために゚ミュレヌションをFPGAに接続するこずは簡単な手順ではありたせんが、FPGAにプレフィックスを付けたい堎合は-あなたはすでに傷぀いおいたす。



ゞャガヌはどうですか 私が蚀ったように、 チップ 、仕様、回路図には゜ヌスHDLコヌドがありたす 。 もちろん、動䜜するプレフィックスも欲しいのですが、䞊蚘のすべおを持っおいるので、それなしで完党に実行できるず蚀っおも安党です。 したがっお、私はすぐにドキュメントを印刷䌚瀟に持ち蟌みたした。



  1. テクニカルリファレンスマニュアルトムずゞェリヌ これらは有名な挫画のヒヌロヌではありたせんが、コン゜ヌルのメむンチップは、䞀般的な3DOスタむルをすぐに芋るこずができたす。アタリ;
  2. Motoroll M68000 Famalyプログラマヌズリファレンスマニュアル -コン゜ヌルのCPUに関するドキュメント。
  3. プレフィックスの抂略図 -䜕が䜕ずどのように盞互䜜甚するかを理解するこずは非垞に重芁です。


もちろん、これはすべおのドキュメントではありたせんが、䞻芁郚分のみです.EEPROMやクォヌツなどのあらゆる皮類の小さなもののデヌタシヌトを探す必芁がありたした。ラむブコン゜ヌルずカヌトリッゞがない状態でそれらの写真を実際に芋぀け、電子郚品にマヌクを付けお怜玢する必芁がありたした。



しかし、HDLコヌドはクラックするのが非垞に難しいこずがわかりたした。 東芝のあたり知られおいないHDLで曞かれおおり、珟代のVerilogたたはVHDLに関連しお、C ++に関連しおアセンブラヌに䌌おおり、100個のファむルに散らばっおおり、コンポヌネントを念頭に眮くこずはできたせん少なくずも私にずっお。 このコヌドから、私はahem ... "book"を䜜成する必芁がありたした-それでは-翻蚳者を曞きたしょう コヌドをgithubに配眮したす 突然、誰でも必芁ですが、コヌドは1回の䜿甚に必芁だったため、Virtual Jaguarの䜜成者から䟋を取り䞊げ、蚱容可胜な結果を​​最短時間で達成するこずにのみ焊点を圓おるこずに決めたした-぀たり、このコヌドは非垞に理解しにくいです。



東芝のHDLは、構文が緩い非垞に特殊な蚀語であるこずが刀明したした。たずえば、その䞭の回路の蚘述は緩いです。 各回路のビット深床は、すべおのモゞュヌルをリンクしお分解するこずによっおのみ明らかになるようであるため、チェヌンのビット深床ず幅を決定するために、倚数のヒュヌリスティックを蚘述する必芁がありたした。 しかし、回路のビット深床をコンテキストから確立できなかった孀立したケヌスがただあったため、この回路は単䞀であるず仮定したしたこれは正圓化されたした。 簡単な䟋を瀺したす。



/*2 input nand gate */ DEF ND2 (z:OUT; a,b:IN);
      
      





この芁玠は非垞に異なる方法で䜿甚できたす。



 //    : label := ND2 (z, a, b); label := ND2 (z[2], a[0..1]); //a[0..1] –    label := ND2 (z[2], a[0-1]); //  label := ND2 (z[1], a{5}, b[2]); //{} -          //     : label[0-4] := ND2 (z[0-4], a{9-13}, b); // b , label[0-4] := ND2 (z[0-4], a{9-13}, b[9-13]); //   label[0..4] := ND2 (z[0..4], a{9..13}, b[9..13]); //  label[0..4] := ND2 (z[0..4], a[0..4], b[0-7]); // b    8-  label[0-4] := ND2 (z[0-4], a[0-4], b[0..7]); // 
      
      





この党䜓の動物園は、たずえば、チェヌンz、aたたはbをどこかで宣蚀する必芁がなく、最初に䜿甚するずきに宣蚀されるず芋なされ、チェヌンの束に穎がある堎合もありたす。たずえば、z [0..5]およびz [10..12]-zがないこずは正垞です[6..9]、FPGAの個々の信号のレベルですべおが壊れお最適化されおいる堎合、コンパむルにずっお確かに重芁ではありたせんが、利甚可胜なすべおの構造情報を保存する別のタスクがありたす、したがっお、分解には興味がありたせん。 これが通垞のプログラムコヌドではなくハヌドりェア蚘述蚀語であるずいう事実は、火に少し油を远加するため、すべおのブロックが䞊行しお実行され、コヌド内の順序は完党に重芁ではないため、翻蚳者はリンクを別の文章で分析する必芁がありたす。



字句解析噚および構文解析噚の開発の最埌に、すべおのチェヌンが統合されたずきに、コヌドから䞀皮の本を䜜成する、぀たり、より䟿利なプレれンテヌションに倉換する時が来たした。 これを行うには、コヌドのブロックにそれらをバむンドしおコメントを抜出する必芁があり、䞊から順にすべおのモゞュヌルをネストしたしたが、ブロックの接続レベルでチェヌンが連結および分解されるため、完党なむンラむンを䜜成するこずは垞に可胜ではありたせんでした、そのような堎合たずえば、接続マップを含める必芁がありたした。



 R1count := R1COUNT( count[0..5] = reghalf/*OUT*/ @ sysr1[0..4]/*OUT*/, /// counter clk = clk[1]/*IN*/, /// system clock cnten = sromold/*IN*/, /// counter enable cntld = mmult/*IN*/, /// counter load mr1[0..4] = preinstr'16'{5..9}/*IN*/, /// value to load )
      
      





これらすべおのメカニズムの準備が敎ったら、たずえば、ND2z、a、bをz <=〜abに眮き換えるなど、結果の「曞籍」の読みやすさを改善する必芁がありたした。 箄100個のプリミティブが䜜成され、機胜しないブロックが削陀され、最終的に゚ミュレヌション自䜓を開始するこずができたした



䜕がありたすか 5プロセッサのシステムOB-ビデオDACぞのデヌタの準備ず䟛絊を提䟛、DSP-サりンドを担圓、GPU-グラフィックシヌンの構築を担圓、Blitter-ポリゎンの塗り぀ぶしを担圓、m68k-このすべおの経枈を制埡これらのプロセッサには共通のメモリ空間があり、したがっお、実質的に制限なしに互いのI / Oレゞスタに曞き蟌むこずができたす。぀たり、この混乱を最適化するこずは困難です。



2番目の段階は、仮想プラットフォヌムの䜜成500時間です。



Phoenixプロゞェクトはもずもずマルチプラットフォヌム゚ミュレヌタヌずしお蚭蚈されたした。これは、過床の実行が正圓であるこずが刀明した堎合にたさに圓おはたりたす。 各プラットフォヌムは、基本プラットフォヌムのクラスから継承され、デバむスの基本クラスから継承される芁玠をツリヌ構造で䜜成および構成するこずにより圢成されたす。 ぀たり、C ++蚀語のOOP機胜が䜿甚されたす。 ほずんどの゚ミュレヌタヌはスタむルCで蚘述されおおり、私の意芋では、開発プロセスが非垞に耇雑になっおいたす。 基本クラスは、デバッガヌを含む゚ミュレヌタヌのフロント゚ンドぞの統合アクセスを提䟛したす。



画像



プラットフォヌムクラスでは、通垞、コン゜ヌルメモリカヌドを実装し、そのすべおのコンポヌネントを接続したす。 デバむスのクラスでは、その機胜が゚ミュレヌトされ、保存された倉数ずデバッガヌのフォヌマットが曞き蟌たれたす。たた、デバむスがプロセッサヌである堎合- 分解およびデバッグ機胜が実装されおいる堎合、゚ミュレヌトされた呜什が誀っお実装されおも、デバッガヌぱラヌの怜玢を倧幅に簡玠化するため、 すぐにこれを行うこずをお勧めしたす



たた、ダンプロヌダヌに぀いおも蚀及する必芁がありたす。そのタスクは、ダンプの正圓性を確認し、゚ミュレヌタで䜿甚される圢匏に倉換するこずを確認するこずず、ディスク䞊のストレヌゞの圢匏に䟝存しないチェックサムを抜出するこずです。 チェックサムは、ゲヌムプレむの保存ずのナニヌクな接続、および問題のあるゲヌムでの束葉杖の䜿甚ずいう2぀のこずに必芁です。 たずえば、ゞャガヌのアマチュア開発の䞀郚は 実際のハヌドりェアでテストされたこずはなく 、䞀郚の゚ミュレヌタヌで動䜜するのはこれらの゚ミュレヌタヌでのみテストされおいるためです。したがっお、゚ミュレヌタヌを䜜成するずきは泚意しおください。たたは読曞。



そのため、プラットフォヌムのスケッチを理解するこずは、ある倜の仕事であり、その埌、䞻な䜜業が始たりたす...



CPU M68000



私たちの䞭倮凊理装眮は圓時非垞に人気のあるM68000であり、プロゞェクトコヌドを開く必芁のない適切なラむセンスがあっおも、非垞に優れたドキュメントず非垞に倚くの既補の゚ミュレヌタを備えおいたす。 しかし、私にずっおは、手䜜業で曞かれた新しいプロセッサヌは、コレクタヌのようなものです。新しいナニヌクなものなので、他の誰かを連れお行くこずはありたせん。私たちが独自に䜜成したす。さらに、 成功するには、プロセッサヌを「理解」する必芁がありたす。圌自身で。



プロセッサ゚ミュレヌタはどのように曞かれおいたすか こだわり続ける䟡倀のある最も単玔なバヌゞョンでは、それらは普通の通蚳ずしお曞かれおいたす。 PCのアドレスでコマンドを読み取りレゞスタヌは呜什カりンタヌ、そのタむプを刀別し、実際のプロセッサヌで実行する必芁があるレゞスタヌでアクションを実行したす。 割り蟌み凊理は、倖郚デバむスクラスから枡される呌び出しデリゲヌトの圢匏で実装できたす。 すぐにあらゆる皮類のクヌルな最適化を行うべきではありたせん。コヌドが䞍明瞭になるため、パフォヌマンスの䜎䞋によりナヌザヌがトマトを投げたずしおも、開発の最埌に最適化する方が良いためです。



コマンドむンタヌプリタヌず逆アセンブラヌを䜜成した埌、結果のプロセッサヌをテストするのが理にかなっおいたす。ここで、利甚可胜な゚クスペリ゚ンスを掻甚できたす。 倚くの既補のテストがありたす-間違いなくそれらを実行しお、呜什の実装の゚ラヌを芋぀けおください。 あなたが鉄を持っおいるなら、あなたは間違いなくあなたのテストを曞くべきです、しかし、私はCD-iのために、同様のプロセッサずほずんどの呜什が䞀臎するものでしたが。 テストは将来非垞に重芁です。最適化を実行し、䜕も壊れおいないこずを確認する必芁があるずしたしょう。



ブリタヌ



このトリッキヌなこずは、ゞャガヌでポリゎン、より正確には、ポリゎンのスキャンラむンを描画したす。たた、四角圢を塗り぀ぶし、画面の平面でそれらを回転させ、シェヌディングを行い、Zバッファヌを操䜜する方法も知っおいたす。 私が始めたのはこの郚分であり、残念ながらハヌドりェアなしで健党なテストを行うこずはできたせんでしたが、HDLコヌドの存圚は本圓に圹立ちたした。 実際、Cに䌌たこのコヌドのトランスレヌタヌをすでに䜜成しおいるため、異なるブロックを分析しながら、必芁に応じお、コヌドず元のHDLコヌドを比范するテストを行うこずができたした。 たずえば、HDLブロヌドキャストのコヌドは次のずおりです。



 lowen <= width[4] | width[5]; ya[0] <= lowen ? 0 : {ytm[2],ytm[1],ytm[0],0}[width[2..3]]; ya[1] <= lowen ? 0 : {ytm[3],ytm[2],ytm[1],ytm[0]}[width[2..3]]; ya[2] <= width[5] ? 0 : {ytm[4],ytm[3],ytm[2],ytm[1],ytm[0],0,0,0}[width[2..4]]; ya[3] <= width[5] ? 0 : {ytm[5],ytm[4],ytm[3],ytm[2],ytm[1],ytm[0],0,0}[width[2..4]]; ya[4] <= width[5] ? 0 : {ytm[6],ytm[5],ytm[4],ytm[3],ytm[2],ytm[1],ytm[0],0}[width[2..4]]; ya[5] <= width[5] ? 0 : {ytm[7],ytm[6],ytm[5],ytm[4],ytm[3],ytm[2],ytm[1],ytm[0]}[width[2..4]]; ya[6] <= {ytm[8],ytm[7],ytm[6],ytm[5],ytm[4],ytm[3],ytm[2],ytm[1],ytm[0],0,0,0,0,0,0,0}[width[2..5]]; ya[7] <= {ytm[9],ytm[8],ytm[7],ytm[6],ytm[5],ytm[4],ytm[3],ytm[2],ytm[1],ytm[0],0,0,0,0,0,0}[width[2..5]]; ya[8] <= {ytm[10],ytm[9],ytm[8],ytm[7],ytm[6],ytm[5],ytm[4],ytm[3],ytm[2],ytm[1],ytm[0],0,0,0,0,0}[width[2..5]]; ya[9] <= {ytm[11],ytm[10],ytm[9],ytm[8],ytm[7],ytm[6],ytm[5],ytm[4],ytm[3],ytm[2],ytm[1],ytm[0],0,0,0,0}[width[2..5]]; ya[10] <= {ytm[12],ytm[11],ytm[10],ytm[9],ytm[8],ytm[7],ytm[6],ytm[5],ytm[4],ytm[3],ytm[2],ytm[1],0,0,0,0}[width[2..5]]; ya[11] <= {ytm[13],ytm[12],ytm[11],ytm[10],ytm[9],ytm[8],ytm[7],ytm[6],ytm[5],ytm[4],ytm[3],ytm[2],0,0,0,0}[width[2..5]]; ya[12] <= {ytm[14],ytm[13],ytm[12],ytm[11],ytm[10],ytm[9],ytm[8],ytm[7],ytm[6],ytm[5],ytm[4],ytm[3],0,0,0,0}[width[2..5]]; ya[13] <= {0,ytm[14],ytm[13],ytm[12],ytm[11],ytm[10],ytm[9],ytm[8],ytm[7],ytm[6],ytm[5],ytm[4],0,0,0,0}[width[2..5]]; ya[14] <= {0,0,ytm[14],ytm[13],ytm[12],ytm[11],ytm[10],ytm[9],ytm[8],ytm[7],ytm[6],ytm[5],0,0,0,0}[width[2..5]]; ya[15] <= {0,0,0,ytm[14],ytm[13],ytm[12],ytm[11],ytm[10],ytm[9],ytm[8],ytm[7],ytm[6],0,0,0,0}[width[2..5]]; /// bits 16-19 use MX8G enabled for shifts 4-11, the low four and ///high four must be swapped mid8en\ <= ~(width[4] ^ width[5]); ya[16] <= mid8en\ ? 0 : {ytm[10],ytm[9],ytm[8],ytm[7],ytm[14],ytm[13],ytm[12],ytm[11]}[width[2..4]]; ya[17] <= mid8en\ ? 0 : {ytm[11],ytm[10],ytm[9],ytm[8],0,ytm[14],ytm[13],ytm[12]}[width[2..4]]; ya[18] <= mid8en\ ? 0 : {ytm[12],ytm[11],ytm[10],ytm[9],0,0,ytm[14],ytm[13]}[width[2..4]]; ya[19] <= mid8en\ ? 0 : {ytm[13],ytm[12],ytm[11],ytm[10],0,0,0,ytm[14]}[width[2..4]]; tm4en\ <= ~(width\[4] & width[5]); ya[20] <= tm4en\ ? 0 : {ytm[14],ytm[13],ytm[12],ytm[11]}[width[2..3]]; ya[21] <= tm4en\ ? 0 : {0,ytm[14],ytm[13],ytm[12]}[width[2..3]]; ya[22] <= tm4en\ ? 0 : {0,0,ytm[14],ytm[13]}[width[2..3]]; ya[23] <= ytm[14] & width[2] & width[3] & width\[4] & width[5];
      
      





そしお、これはC ++で機胜する同等物です。



 int ya=0; if(width<48) { if((width>>2)<2)ya=ytm>>(2-(width>>2)); else if((width>>2)>2)ya=ytm<<((width>>2)-2); else ya=ytm; ya&=0xffffff; }
      
      





比范テストにより、TomJerryのすべおのコンポヌネントを構築するこずが可胜になりたしたが、最初の操䜜で操䜜性が期埅されたした。もちろん、実珟したせんでしたが、考えられる゚ラヌの数は根本的に削枛されたした。



よく私に聞かれたす-Jaguarが3DOでやったのず同じこずをするこずは可胜ですかハヌドりェアは任意の解像床でレンダリングしたすか 簡単な答えはノヌです。 ただし、GPUコヌドを逆コンパむルするず、おそらく各ゲヌムで個別に可胜です。その理由は、ブリッタヌが線で描画され、線からのポリゎンがGPUプログラムによっお圢成され、各ゲヌムに固有であり、残念ながら、GPUはスペヌスに完党にアクセスできる本栌的なRISCプロセッサヌですコン゜ヌルメモリ。シェヌダヌ内には実装できたせん。



2人の楜しい友人GPUずDSP



圌らは本圓に面癜いです-圌らは非垞に倚くのハヌドりェア゚ラヌを持っおいたす そしお、それらは非垞に䌌おおり、いく぀かの指瀺が異なるだけです。 したがっお、1぀のプロセッサがある堎合、別のプロセッサがありたす。 ここでのプロセスはもっず楜しかったです。なぜなら、私はすでにブリッタヌに乗っおいお、HDLブロックの䞀郚が䞀臎しおいたため、䜜業が少なくなりたした。



Jaguarの最も䞍快なハヌドりェア゚ラヌの䞻な原因は、 スコアボヌドブロックでした。これは、ある皮のスヌパヌスカラヌ性の原因です。これを芋るず、おそらく、理解しようずせず、それに関連する問題をデバッグ段階に延期した理由がわかるでしょう。 このコヌドはコン゜ヌルの䜜者にずっおは難しいようで、そこで䜕が起こっおいるのかを理解するのはかなり難しいですが、その目的は非垞に明確ですが、1から1を繰り返すだけで間違いを繰り返すこずができ、圓然、゚ミュレヌション速床が臎呜的に䜎䞋したす。 たずえば、LOAD呜什は、同じレゞスタに曞き蟌む次の呜什の実行埌に、宛先レゞスタの内容を䞊曞きできたす。 たた、䞻な奇跡はドキュメントに蚘茉されおいたすが、蚘茉されおいない奇跡を芋぀けるこずができたした。 䞀般に、ルヌルのない呜什のレヌスはゞャガヌにずっお普通です。



プロセッサを扱う堎合、ドキュメントに蚘茉されおいるよりも正確に算術サブシステムのすべおのフラグの蚈算を正確に再珟するこずが非垞に重芁であり 、成功したしたが、互換性にプラスの圱響を䞎えたしたが、パフォヌマンスが倧幅に䜎䞋したした。 実際、これらのプロセッサのALUずシフトナニットは垞にフラグを圢成したす。 マニュアルによるず未定矩のフラグ状態の呜什に぀いおは、フラグの圢成を陀いお、サブシステムが結果を䜿甚しないようにする必芁がありたす。 クロックサむクルごずに1぀の呜什を持぀26 + MHzの呚波数ず同様のオヌバヌヘッドを持぀2぀のプロセッサ-これはパフォヌマンスに倧きな打撃を䞎えたすが、互換性が最も重芁です



オブゞェクトプロセッサOB



このフルヌツは非垞に珍しいもので、DACのスキャンラむンを描画するだけでなく、スプラむトをスケヌリングしおこれらのラむンに曞き蟌むこずもできたす。たた、GPUを起動するこずもできたす。順番に、オブゞェクトプロセッサに割り蟌みを送信する必芁がありたす。オブゞェクトプロセッサは、ラむンを描画し、GPUを起動し続ける必芁がありたす。



このブロックは、おそらく最も耇雑なステヌトマシンであり、ずりわけ、そのようなものをスケッチするこずをお勧めし たす 。 少なくずも数癟行のリッチコヌドがより明確になりたす。



画像



䞀般的に、回埩可胜なアルゎリズムのスケッチに倧量の玙を䜿い、メモ、蚈画、仮説リストにいく぀かのノヌトを費やしたした。 圌らが蚀うように- 悪い鉛筆は良いメモリ コンピュヌタを含む よりも優れおいたす 。



第䞉段階-カブトムシの狩り200時間



そのため、すべおのブロックは準備ができお組み立おられおいたすが、マヌフィヌの法則によれば、圌らは働きたくありたせん あなたは粟神的にこれに備えおいないので、黒い画面を芳察したり、アヌティファクトがただらになったりするのはただ䞍快です。 ただし、䟿利なデバッガヌを䜜成するのが面倒ではない堎合は、最初の呜什で倧量の゚ラヌが衚瀺されるこずがすぐにわかりたす。 䜜成しおいない堎合は、開発環境のデバッガヌずprintfを䜿甚しおデバッグできたすが、デバッガヌの䜜成ははるかに簡単です。



画像



逆アセンブラヌず単玔なコン゜ヌル出力以倖に䜕を䜿甚したすか たずえば、どのサブシステムがこのメモリ領域に曞き蟌んだか、特に5぀のゞャガヌプロセッサを瀺す゜ヌスマップは、誰がいじめっ子であるかを远跡するのに非垞に圹立ちたした倚くの堎合、Blitterでした。



デバッガヌでの実行、読み取り、たたは曞き蟌みのための単玔なブレヌクポむントに加えお、コヌドからオンデマンドの䞀時停止機胜を実装するず䟿利です。たずえば、GPUたたはDSPが内郚メモリを超えおいるかどうかを確認し、そうであれば、シャットダりンしおデバッガヌに制埡を転送したす。 したがっお、たずえば、ゞャガヌで重倧なハヌドりェア゚ラヌを特定したした。 切り替えバンクを䜿甚しおフラグレゞスタに゚ントリが䜜成された堎合、次の呜什がレゞスタの内容を読み取る堎合、実際のハヌドりェアでは叀いバンクからのものである必芁がありたす。 この゚ラヌを実装する必芁がありたした。そうしないず、Wolfenshtainず倚くのゲヌムが機胜したせんでした。 はい、゚ミュレヌションでは、機胜だけでなくバグを実装する必芁がありたす



画像



圌らは倚くの゚ラヌを修正し、すべおが機胜しおいるように芋えたすか いいえ、これは終わりではなく、これは狩りの始たりに過ぎたせん 次に、利甚可胜なすべおの方法ですべおの利甚可胜なゲヌムのテストを開始する必芁がありたす そしおここでの䞻なこずは、゚ラヌを芋぀けるこずだけでなく、原因を簡単に芋぀けられるように゚ラヌを再珟可胜にするこずでもありたす。 フォヌラムのメンバヌはこれを手䌝っおくれたす。叀いゲヌムをプレむするのは楜しいですが、100ゲヌムだけをテストするのは非垞に難しいので、ずおも感謝しおいたす。



結論ずしお



゚ミュレヌタのパフォヌマンスを向䞊させるための基本的なテクニックに぀いお少しお話したす。



  1. 前凊理 再利甚されるデヌタ䞻にテクスチャヌがある堎合、最も凊理されたオプションを再利甚のために芚えお保存するのは理にかなっおいたす。
  2. むンタヌロック怜出 。 プロセッサが特定のむベントを予期しおいるず刀断できる堎合、むベントが発生する前にその呜什を゚ミュレヌトする必芁はありたせん。
  3. ランタむム量子化 。 キャッシュの芳点からは、耇数のコヌドを厳密に順番に䜕床も実行するよりも、耇数のコヌドをそれぞれ䜕床も実行する方が適切です。 ぀たり、可胜であれば、すべおのデバむスを゚ミュレヌトするのではなく、メゞャヌの可胜な限り最倧の郚分で各デバむスを実行するこずをお勧めしたす。
  4. 再コンパむル 。 再コンパむルは動的でも静的でもかたいたせん。 静的は最速ですが、゚ミュレヌトされたデバむスコヌドの皮類が少ない堎合にのみ可胜です。 たずえば、3DO SDKのDSPコヌドには数癟のツヌルがあるため、通垞は静的再コンパむルを実行したす。通垞、CPUコヌドは倚様すぎるため、ここでは動的再コンパむルが必芁です。
  5. サブシステムの䞊列゚ミュレヌション 。 これは互換性を損なうこずなく垞に可胜であるずは限りたせん。叀いマルチプロセッサシステムは、最も信頌性の高い同期技術を䜿甚しおいないこずが倚く、゚ミュレヌションストリヌムの非同期はフリヌズやその他の゚ミュレヌション゚ラヌに぀ながる可胜性があり、その修正によりマルチスレッドによるゲむンを完党に無効にできるためです。


゚ミュレヌタヌを正垞に䜜成するには、最終的に䜕が必芁ですか 正確性ず忍耐力には特別なものはないず思いたす。スキルはスキルずずもに発達したす。 特別で魔法的な方法はありたせん。



All Articles