2

我正在研究 CHIP8 的实施,我正在阅读

    Cowgod's
    Chip-8
    Technical Reference v1.0
http://web.archive.org/web/20130401182240/http://devernay.free.fr/hacks/chip8/C8TECH10.HTM#3.0

作为参考。我确信这是一个精确的规范,因为它也被几个讨论 CHIP8 的博客推荐。我的问题是,我已经实现了用于处理代码“7xkk”的操作码

7xkk - ADD Vx, byte
Set Vx = Vx + kk.

Adds the value kk to the value of register Vx, then stores the result in Vx. 

这是我的代码

 case 0x7:
   log(this.logging, "0x7xkk: Setting Vx = Vx + kk.");

   var result = this.registers.V[(opcode & 0x0F00) >> 8] + (opcode & 0x00FF);
   this.registers.V[(opcode & 0x0F00) >> 8] = result;

 break;

但其他开源 CHIP8 有完全不同的实现

case 0x7000:
            // Set Vx = Vx + kk.
            this.register[vX] += opcode & 0x00FF;

            if(this.register[vX] > 255){
                this.register[vX] -= 256;
            }
            break;

//这个人也检查Vx是否大于255,规范中没有描述。

链接 - https://github.com/loktar00/chip8/blob/master/chip8.js#L181

和我在网上找到的 C++ 实现

case 0x7: {
  V[opCode2] = (char)((V[opCode2] + opCode & 0x00FF) & 0x00FF);
  IP = IP + 2;
  break;
}

//此人添加“opCode & 0x00FF”并应用和操作“0x00FF”。

如果我正在查看一个太旧的规范或者我做得正确,我会感到困惑。

4

1 回答 1

4

Chip-8 寄存器仅包含一个 8 位字节。单个字节只能保存 0 到 255(含)之间的值。

如果一个操作给你一个超出 8 位字节范围的值,你只需要保留低 8 位。这就是这两个实现都在做的事情,尽管方式略有不同:Javascript 实现显式检查大于 255 的值,而 C++ 实现简单地丢弃任何额外的位(这是& 0x00FF最后的)。

您的实现不正确,因为您没有考虑到这一点:如果 V[0] 包含值 255 并且您的操作码为 0x7001(寄存器 0 加 1),那么您的实现将给出 256,它不能存储在 8 -bit byte - 正确的值是 0,它是 256 的低 8 位。例如,这会导致操作码 0xB 出现问题,它将 V[0] 作为跳转偏移量,因为它会比它跳得更远本来应该。

于 2013-06-29T13:15:16.877 回答