3

以前、エミュレーターの書き方について同様の質問をしたことがあります。回答を見て、オープン ソースのゲームボーイ エミュレーターをいくつか調べたところ、「低レベル」言語の中級レベルの理解以上のものが必要であることがわかりました。 (すなわち C)。私が実際に知りたいのは、そのようなエミュレーターをプログラムできるようにするために、ハードウェアについて何を知る必要があるかということです。私はJavaが「かなり上手」に近づいていますが、それはあまり役に立ちません。私は C の学習を開始し、長い道のりを歩んできましたが、このようなコンソール エミュレーターを作成するには、ハードウェアで何を勉強する必要があるかを知りたいと思っています。

私がこの質問をしている理由は、エミュレーションに関する本や情報源をインターネットで探していて、エミュレーターのチュートリアルに出くわすたびに、「従うには C の基本的な理解が必要だ」というようなものだからです。このチュートリアル」を読んでいて、それに従おうとすると、何がプログラムされているのかわからないという理由だけで、従うことができません。私はハードウェアについて少しも知りませんでした。(モニターを PC に接続するのに苦労している私の父は、おそらくそれについてもっと知っています)

だから私の質問は、私は何を勉強する必要があるのですか(マイクロプロセッサ、メモリなど?)、大学に行かなくてもこのことについて教えてくれる良い情報源はありますか(すでにソフトウェアエンジニアリングを行っています)?

これが本当の質問ではない場合、または十分に明確でない場合、またはそのようなものである場合はお詫び申し上げます。私はその主題に非常に興味があります。

4

4 に答える 4

11

これはprogrammers.stackexchange.comにより適していると思いますが、とにかく:

特別な知識が必要だとは言いません。マイクロプロセッサとメモリ管理がどのように機能するかを知ることは、アセンブラーの知識と同様に非常に役立ちます (基本的に、アセンブラーのようなコードのインタープリターを作成しているため)。ターゲット ハードウェアがどのように機能するかを既に知っていると仮定すると、基本的に必要なのは次のコンポーネントを実装することだけです (つまり、実際のハードウェアを偽装し、その動作を模倣/エミュレートします)。

  • マシンコードを解析して実行する CPU をシミュレートします。
  • 入力コンポーネントをシミュレートします (キーボード、マウス、ジョイスティックなどの入力を、CPU がアクセスできる「ピン信号」に変換します)。
  • 出力コンポーネントをシミュレートします (画像と音声データを目に見えるものに変換します。たとえば、画面に何かを表示したり、実際のハードウェア コンポーネントのようにサウンドを生成したりします)。
  • メモリ パック、内蔵バッテリー、カートリッジ、拡張チップなどの他のコンポーネントをシミュレートします。

一般的なアドバイスとして、今のところエミュレーターを作成することは忘れてください。代わりに、独自のバイト コード インタープリターを作成して、簡単なことから始めてください。

例として、単純な疑似コード シーケンスを使用できます。

x = 5
y = 10
print(x + y)

擬似アセンブラで記述すると、次のようになります。

mov x, 5
mov y, 10
add x, y // to be honest, this is essentially x += y; not just x + y
prt x
end

ここで、すべての指示を (コード) 番号に置き換えます。すべての変数は数値に置き換えられます。

0x01 0x00 0x05
0x01 0x01 0x0a
0x02 0x00 0x01
0x03 0x00
0x00

これは少し奇妙に見えるかもしれませんが、上記の順序と改行を維持しています。0x01ではなく、最初の命令に使用したことに注意してください0x00。これは便宜上のものなので0x00、「NOOP/操作なし」またはターミネーターとして使用できます (この場合のように)。改行を削除するだけで、基本的にカスタムバイトコードになります。

char code[] = {0x01, 0x00, 0x05, 0x01, 0x01, 0x0a, 0x02, 0x00, 0x01, 0x03, 0x00, 0x00};

このコードを実行するには、単純な「エミュレーター」を作成します。限られた命令セットしかありませんが、動作します。私は実際にこのコードをテストしていません。ただし、どのように/何をすべきかについてのアイデアを提供するのに十分なはずです. この例では、データ メモリと命令メモリを分割していないことに注意してください。これにより、今のところ実際には必要ない複雑さが追加されます。

int pos = 0; // essentially being our "instruction pointer"
char registers[10];
while(code[pos]) { // still some instruction
    switch(code[pos++]) { // determine what to do and move the instruction pointer
    // 0x00 isn't handled here, as that's part of our loop already
    case 0x01: // mov(e)
        registers[code[pos++]] = code[pos++]; // read the value into the register
        break;
    case 0x02: // add
        registers[code[pos++]] += registers[code[pos++]];
        break;
    case 0x03: // prn
        printf("%d", registers[code[pos++]]);
        break;
    }
}

ここで私が何をしたかを理解したら、他のソースも同様に理解するのが簡単になるはずです. 面白い事実: 効率的なシミュレーターを作成するためだけでなく、教育目的でそれを行っている場合は、Java を使い始めることができます。最適ではなく遅くなりますが、本質的に同じことを行うことができ、途中で少なくともハードルを取り除くことさえできます.

簡単なメモ: 上記の例では、2 番目のスレッドが常にregisters[]画面の内容を書き込んでいる可能性があります。このようにして、基本的にいくつかのビデオ ハードウェア (テレビ画面や LED など) をエミュレートできます。

読むソースをもっと探しているなら、単純なプロセッサーを手に入れて、アセンブラー・コードの学習を開始しようと思います。可能であれば、非常に単純なアーキテクチャを選択してください。概念は常に同じですが、命令セットやアドレス空間の仮想化などの増加により、状況が複雑になる可能性があります。

于 2012-10-29T18:30:34.663 に答える
1

ここで必要な基本的な知識を得るために、アセンブリ言語を学ぶことをお勧めします。たとえば、スーパーニントネドに興味がある場合は、そのコンソールで使用されるプロセッサのアセンブリ言語である65816-アセンブリを学習してみてください。開始するには、ここから読み始めることができます:http: //en.wikibooks.org/wiki/Super_NES_Programming。他のコンソールにも同様のリソースがあります。また、Geigerのデバッグsnes9xなどのデバッグ機能を備えたエミュレーターを入手することをお勧めします。これにより、ゲームの実行をステップ実行したり、実行内容をダンプしたり、メモリを検査したりできます。ただし、コンソールの作成には直接関係しません。エミュレーター、それはあなたが探している背景のいくつかをあなたに与えるでしょう。

ただし、正直なところ、Cが完全に異質に見える場合は、組み立てを試す前に、そのいくつかを学ぶのが最善かもしれません。Cはアセンブリよりもはるかに抽象的ですが、それでも多くの重要な概念、最も重要なのはポインターの基礎を提供します。

しかし、基本的に、エミュレーターが行うことは、ゲームのマシンコードをステップ実行し、命令ごとに実行することです。コンソールはかなり複雑な獣であり、いくつかのプロセッサとコプロセッサ、および関連するハードウェアが連携して動作します。したがって、CPUのみをエミュレートし、残りを無視する、より単純なエミュレーターから始める必要があります。アセンブリの学習がこれに非常に役立つ理由は、アセンブリには、エミュレータが処理するはずのマシンコードと1:1の変換があるためです。

于 2012-10-29T18:21:01.643 に答える
1

あなたが言うように、ハードウェアについて何も知らないのであれば、エミュレーターを書くのは簡単ではありません。特定のプログラミング言語を知るよりも、ハードウェアの基本的な機能を理解する方がおそらく公平です。

Noam Nisan と Shimon Schocken の著書The Elements of Computing Systemsとそれに関連するインターネット リソース ( http://www.nand2tetris.org/ ) をお勧めします。この本では、単純な nand ゲートから、機能するコンピューターの構築、さらにはアセンブラー、コンパイラー、オペレーティング システムの作成、そして最後にテトリスのゲームへと進みます。各レベルで、「自分で作成」するか、Web で入手可能な回答を使用して次のレベルに進むことができます。

于 2012-10-30T11:05:12.470 に答える