根据规范,我的chip8实现与互联网上的开源代码不同.需要澄清
My chip8 implementation according to specification is different than open source code on internet. Need a clarification
我正在研究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]作为跳跃偏移量,因为它会跳得比预期的更远。
相关文章:
- 在Linux中哪里可以找到互斥、未来等的源代码
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 难以理解某些人解决IOI问题的源代码
- 使用g++编译hdf5源代码
- 如何使用C++读取另一个程序中的源代码输出
- Poco FindMySql.cmake 无法找到 MySQL 源代码
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- C++出现控制台错误.我无法识别源代码的问题
- Qt Quick,如何更改 Ui 源代码?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 从macOS Catalina上的源代码编译LLVM(如何解决未找到"stdio.h")
- 如何使用QT创建器获取网页源代码?
- 从源代码构建 gRPC C++
- 如何创建一个使用开源c项目的c++控制台应用程序
- 如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
- 如何在使用 LLVM 编译时获取部分源代码的二进制代码
- 如何在源代码中包含外部库的头文件?
- 开源C或c++嵌入式关系数据库(复制源代码以部署)
- 分析我的代码(开源)和第三方代码(封闭源代码)的内存使用情况的最佳策略