首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据规范,我的chip8实现与互联网上的开源代码不同。需要澄清

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

Stack Overflow用户
提问于 2013-06-29 19:57:13
回答 1查看 710关注 0票数 2

我正在从事CHIP8实现的工作,我正在阅读

代码语言:javascript
复制
    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“的操作码。

代码语言:javascript
复制
7xkk - ADD Vx, byte
Set Vx = Vx + kk.

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

这是我的代码

代码语言:javascript
复制
 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对它有完全不同的实现

代码语言:javascript
复制
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++实现

代码语言:javascript
复制
case 0x7: {
  V[opCode2] = (char)((V[opCode2] + opCode & 0x00FF) & 0x00FF);
  IP = IP + 2;
  break;
}

//此人添加了"opCode & 0x00FF“和"0x00FF”的apply and操作。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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作为跳转偏移量,因为它将跳转到比预期更远的地方。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17379918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档