根据规范,我的chip8实现与互联网上的开源代码不同.需要澄清

My chip8 implementation according to specification is different than open source code on internet. Need a clarification

本文关键字:源代码 开源 互联网 我的 实现 chip8      更新时间:2023-10-16

我正在研究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

作为参考。我确信这是一个percise规范,因为它是由几个谈论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"进行应用和操作。

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

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

如果一个操作给您的值超出了8位字节的范围,您只需要保留较低的8位。这就是这两种实现的作用,尽管方式略有不同:Javascript实现显式地检查大于255的值,而C++实现只是丢弃任何额外的位(即末尾的& 0x00FF)。

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