2

SNESエミュレーター(またはその他のゲームシステムエミュレーター)とシステムのゲームROMからソースコードを取得し、その特定のROMを必要とせずに再生できる単一の自己完結型実行可能ファイルを何らかの形で作成することは可能でしょうか?個々のROMまたはエミュレーター自体のどちらでプレイしますか?ROM とエミュレータのソース コードが既にあると仮定すると、難しいでしょうか?

4

2 に答える 2

3

エミュレータのソース コードがあれば、それほど難しくありません。イメージを c ソース ファイルに格納するためによく使用される方法を使用できます。

基本的に必要なことはchar *、ヘッダー ファイルに変数を作成し、その変数に rom ファイルの内容を格納することです。これを自動化するスクリプトを作成することもできます。

次に、ファイルから rom を読み取る代わりに、変数に格納され、ヘッダー ファイルからインクルードされたメモリ内バージョンの rom を使用するように、ソース コードを変更する必要があります。

ファイルポインタなどをエミュレートする必要がある場合は、少し作業が必要になる場合があります。運が良ければ、ROM ロード機能がファイル全体を一度にロードするだけであることに気付くかもしれません。この場合、ファイル ロード関数をポインタを返す関数に置き換えるのと同じくらい簡単でしょう。

ただし、ライセンスの問題には注意してください。エミュレーターが GPL の下でライセンスされている場合、実行可能ファイルにプロプライエタリ ファイルを保存することは法的に許可されていない可能性があるため、特にリリース/配布する前に確認する価値があります (そうする予定がある場合)。

于 2010-06-14T01:28:12.950 に答える
1

はい、可能な限り、何度も行われました。Google: 静的バイナリ翻訳。Graham Toal は、このテーマに関する優れたハウツー ペーパーを持っています。そこにいくつかのコードがあるかもしれませんが、そこにいくつかのコードを残したかもしれません。

ROMを完全に削除するのは、思ったよりも少し手間がかかるかもしれませんが、エミュレーターを使用しなければ、間違いなく可能です. 実際には、両方の要件が可能であり、ハンドヘルド コンソール ゲームやセット トップ ボックス ゲームの多くが翻訳され、エミュレートされていないことに驚くかもしれません。リアルタイムでエミュレートするのに十分な処理能力がない任天堂のような ESP プラットフォーム。

リファレンスとして優れたエミュレーターが必要であり、リファレンスとして独自のエミュレーターを作成する必要があります。次に、逆アセンブラを作成する必要があり、その逆アセンブラに C コードを生成させます (別のターゲットに直接変換しようとしないでください。私は一度その間違いを犯しました。C は移植可能であり、コンパイラは多くのデッド コードの除去を処理します。あなた)。したがって、ごっこ遊び命令セットの命令は次のようになります。

r0、r0、#2 を追加

そして、それは次のように翻訳できます:

//r0,r0,#2を追加
r0=r0+2;
do_zflag(r0);
do_nflag(r0);

SNES は、Asteroids が使用した 6502 に関連しているように見えます。これは、私が趣味としてしばらくの間断続的に取り組んできた翻訳です。使用しているエミュレーターは、おそらくランタイム パフォーマンス用に作成および調整されているため、参照として使用したり、翻訳されたコードでロック ステップをチェックインしたりすることは、せいぜい難しいかもしれません。6502 は、z80 と比べて実際にはそれほど多くの命令がないため、優れています。可変語長命令セットと同様に、逆アセンブラが最初の大きなハードルです。直線的に考えないでください。実行順序を考え、エミュレーターのように考えてください。命令をゼロから N または N からゼロに直線的に変換することはできません。ROM 内のバイトを命令の最初のバイトではなく、命令の最初のバイトとしてマークし、可能なすべての実行パスに従う必要があります。一部のバイトはデータとしてデコードできます。選択した場合はそれらをマークし、そうでない場合は他のすべてのバイトがデータまたはフィルであると想定します。このデータをどう処理してロムをなくすかを考えるのが、ロムをなくすときの問題です。一部のコードはデータを直接アドレス指定し、他のコードはレジスタを間接的に使用します。変換時に、そのデータがどこにあるのか、どれだけあるのかわかりません。命令の開始バイトをすべてマークしたら、ROM を 0 から N まで逆アセンブルまたは変換するのは簡単な作業です。一部のコードはデータを直接アドレス指定し、他のコードはレジスタを間接的に使用します。変換時に、そのデータがどこにあるのか、どれだけあるのかわかりません。命令の開始バイトをすべてマークしたら、ROM を 0 から N まで逆アセンブルまたは変換するのは簡単な作業です。一部のコードはデータを直接アドレス指定し、他のコードはレジスタを間接的に使用します。変換時に、そのデータがどこにあるのか、どれだけあるのかわかりません。命令の開始バイトをすべてマークしたら、ROM を 0 から N まで逆アセンブルまたは変換するのは簡単な作業です。

頑張ってください、楽しんでください、それは経験する価値があります。

于 2010-06-15T01:45:37.410 に答える