5

チップ 8 エミュレーターを構築しているときに、チップ 8 情報の 2 つの主要なソースが異なるように見えるという問題に遭遇しました。これは、チップ 8 インタープリター全体に影響を与えます。

一方では、ウィキペディアがあり、オペコード FX65 の下で次のことがわかります。

「V0 から VX (VX を含む) を、アドレス I から始まるメモリの値で埋めます。I は、値が書き込まれるたびに 1 ずつ増加します。」

ここで、「書き込まれた値ごとに I が 1 増加します。」重要な部分です。

これに従うと、次のコードになります。

for(int i = 0; i <= ((opcode & 0x0F00) >> 8); ++i) {
    V[i] = memory[I];
    ++I;
}

一方、cowgodによる chip-8 リファレンスがあります。これは、ほぼすべてのチュートリアルがリンクしているリファレンスであり、次のことがわかります。

「インタープリターは、位置 I から始まるメモリーから V0 から Vx までのレジスターに値を読み取ります。」

このロジックを適用すると、次のコードが得られます (これは、ほとんどのチップ 8 実装で使用される実装でもあります)。

for(int i = 0; i <= ((opcode & 0x0F00) >> 8); ++i) {
    V[i] = memory[I + i];
}

これら 2 つの主な違いは、I がインクリメントされるかどうかです。I はエミュレータのレジスタ インデックスであるため、プログラムが正しく動作することは非常に重要です。

私が知りたいのは、このオペコードのどの実装が正しいかということです。

4

2 に答える 2