3

私は C でゲームボーイ カラー エミュレーターを書いています。この世界に自己紹介するためだけに、それは解釈され、動的または静的な再コンパイルはありません :P

今、私はすべての CPU オペコードを C コードで実装するという退屈な作業に取り組んでいます。これらすべてを記述しなければなりません: http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.htmlそして、私はしたくないそれらを別のエミュレーターから取得します。

問題は、オペコードの書き込みを自動化する方法があるかどうかです。ばかげた質問かもしれませんし、ばかげた答えになるかもしれませんが、私はできるだけ仕事を減らしたいと思っています。:)

4

3 に答える 3

7

私は以前にこの種のことを行ったことがあり、その方法はマクロを使用していましたが、その方法で行うと、大量のコードの重複が発生し、CPU キャッシュがオーバーフローして処理が遅くなります。今日それを行うとしたら、あいまいな/まれなオペコードを除いて、「オペコード スイッチ/ジャンプ可能」イディオム全体を取り除き、いくつかの小さなルックアップ テーブルを使用して、通常の算術演算/論理演算すべてに共通のブランチレス コードを記述します。オペコード番号。次のように考えてください。

operand1 = regs[operand1_table[opcode]];
operand2 = regs[operand2_table[opcode]];
res[ADD] = operand1+operand2;
res[SUB] = operand1-operand2;
res[OR] = operand1|operand2;
/* ... */
regs[dest_table[opcode]] = res[optype_table[opcode]];

もちろん、このコードは単純化しすぎていますが、拡張してメモリ オペランドなどを処理することもできます。また、ジャンプ命令は、プログラム カウンタをオペランドの 1 つとして使用する単なる加算命令であることに注意してください。

Z80 (またはその GB バリアント) や x86 などの CISC アーキテクチャの場合、条件コード フラグも処理する必要があります。ただし、それらは上記のような計算の 2 番目のセットとして実行できますres[...] = ...;

于 2011-03-25T12:49:04.123 に答える
5

これは古い回答済みの質問であることは知っていますが、記録のために、誰かが同じ問題を抱えている場合:

このドキュメント ページを解析し、オペコードの説明を含む JSON を生成する簡単なスクリプトを作成しました。

この JSON を読み込んで、そこから GB [逆] アセンブラー コードのボイラープレートを生成するだけで、JSON はほとんどのスクリプト言語から簡単に操作できるため、明らかに時間を節約できます。

コードと結果の JSON:

于 2014-02-11T23:39:32.010 に答える
3

そのため、これまでのところ、msp430、6502、および Thumb のエミュレーターまたは静的再コンパイラーのみを行ってきました。単調さを打破するために、私がよく行うことは、動作を確認したいプログラム/ゲームを取得し、実装していないオペコードに到達するまで実行し、そのオペコードを実装して再試行することです。

さらに悪いことに、多くのタイピングを節約できた方法や、より適切に設計し直す方法についての感覚をつかむまでに、エミュレータを 2 つまたは 3 つ、またはこのエミュレータを 2 つまたは 3 つ書き直す必要がある場合があります。使用/ロジック。お気に入りの rom を実行しようとすると、ランダムな命令の組み合わせが得られ、オペコード テーブルのさまざまな部分に移動します。これらのオペコードのコードを再利用すると、少ないコストで設計を改善できる可能性があります。書き直します。

R.がおそらく説明しているように、代わりにスプレッドシートまたはその他のソフトウェア解析可能なテーブルを作成すると、そのテーブルからシミュレーターコードジェネレーターを作成および再作成できます。ここでも、完全なテーブルを作成する必要がない小さなものから始めることができます。いくつかの異なる種類のオペコードを試して、パーサーがシミュレーター用のコードを生成できるようにするテーブル形式を理解できないかどうかを確認してください。後でフラグやその他のものを追加して、プロセス全体を改善するにつれて成長させることができます。しかし、結局のところ、テーブルであろうと実際のコードであろうと、最終的にはこれらすべてのオペコードを入力する必要があります。

于 2011-03-25T18:26:28.853 に答える