在构建芯片 8 仿真器时,我遇到了芯片 8 信息的 2 个主要来源似乎不同的问题,这对整个芯片 8 解释器有影响。
一方面,我们有维基百科,它在操作码 FX65 下告诉我们
“用从地址 I 开始的内存中的值填充 V0 到 VX(包括 VX)。对于每个写入的值,I 增加 1。”
其中“对于写入的每个值,I 增加 1。” 是重要的部分。
遵循此结果会产生以下代码:
for(int i = 0; i <= ((opcode & 0x0F00) >> 8); ++i) {
V[i] = memory[I];
++I;
}
Run Code Online (Sandbox Code Playgroud)
另一方面,我们有cowgod的chip-8 参考,几乎每个教程都链接到的参考,它告诉我们以下内容
“解释器从位置 I 开始的内存读取值到寄存器 V0 到 Vx。”
应用此逻辑会产生以下代码(这也是大多数芯片 8 实现使用的实现):
for(int i = 0; i <= ((opcode & 0x0F00) >> 8); ++i) {
V[i] = memory[I + i];
}
Run Code Online (Sandbox Code Playgroud)
这两者之间的主要区别在于 I 要么递增,要么不递增。由于 I 是仿真器的寄存器索引,因此程序能否正常工作非常重要。
我想知道的是这个操作码的哪个实现是正确的。
似乎没有明确的答案,因为似乎没有明确的参考。
这个参考文献似乎有同样的问题,同样的歧义
然而,这个(当代)参考文献(第 113 页)说“I = I + X + 1”。作者是发明者约瑟夫·韦斯贝克尔(Joseph Weisbecker)——我想他会知道的。