我正在从事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”的apply and操作。
如果我看到的是一个太旧的规范,或者我做得正确,我会感到困惑。
发布于 2013-06-29 21:15:17
Chip-8寄存器仅包含一个8位字节。单个字节只能包含介于0和255之间的值。
如果一个操作给你的值超出了8位字节的范围,你只需要保留低8位。这就是这两个实现都在做的事情,尽管方式略有不同: Javascript实现显式地检查大于255的值,而C++实现只是丢弃任何额外的位(即末尾的& 0x00FF )。
你的实现是错误的,因为你没有考虑到这一点:如果V包含值255,并且你有操作码0x7001 (将1加到寄存器0),那么你的实现将得到256,它不能存储在8位字节中-正确的值是0,这是256的低8位。例如,这将导致操作码0xB出现问题,该操作码将V作为跳转偏移量,因为它将跳转到比预期更远的地方。
https://stackoverflow.com/questions/17379918
复制相似问题