チップ 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 はエミュレータのレジスタ インデックスであるため、プログラムが正しく動作することは非常に重要です。
私が知りたいのは、このオペコードのどの実装が正しいかということです。