在构建芯片8模拟器时,我遇到了一个问题,即芯片8信息的两个主要来源似乎有所不同,这对整个芯片8解释器都有影响。
一方面,我们有wikipedia,它在操作码FX65下告诉我们
“用从地址I开始的内存值将V0填充到VX(包括VX)。对于每个写入的值,I都加1。”
其中“对于每个写入的值,我加1。” 是重要的部分。
遵循此操作将导致以下代码:
for(int i = 0; i <= ((opcode & 0x0F00) >> 8); ++i) {
V[i] = memory[I];
++I;
}
另一方面,我们有chip-8 reference by cowgod,几乎每个教程链接到的参考,它告诉我们以下内容
“解释程序从内存中的位置I开始将值读入寄存器V0至Vx。”
应用此逻辑将导致以下代码(这也是大多数Chip-8实现所使用的实现):
for(int i = 0; i <= ((opcode & 0x0F00) >> 8); ++i) {
V[i] = memory[I + i];
}
这两者之间的主要区别是我不是增加就是增加。由于我是仿真器的寄存器索引,因此对于程序正常运行非常重要。
我想知道的是该操作码的哪种实现是正确的。
答案 0 :(得分:2)
似乎没有确定的答案,因为似乎没有确定的参考。
This reference似乎有相同的模棱两可的问题
This (contemporary) reference(第113页)说“ I = I + X + 1”。作者是发明家约瑟夫·魏斯贝克(Joseph Weisbecker)-我想他会知道的。
答案 1 :(得分:1)
这个问题已经回答了,但我将为后代提供一个更历史性的答案。
CHIP-8于1977年在COSMAC VIP计算机上引入。此原始的CHIP-8解释器在执行FX55和FX65指令时确实使I递增,如this disassembly所示。对于每个写入/读取的值,我加1。
在70年代末和80年代初,CHIP-8被移植到其他几台微型计算机上,具有相同的行为(因此CHIP-8游戏是便携式的),但是在更先进的计算机和更多的内存之后被遗忘了几年。变得流行(例如IBM PC)。
1990年,CHIP-8 was ported to the HP48 series of graphing calculators为CHIP-48。此端口至少引入了三个错误:BNNN跳转指令的行为有所不同(但很少使用),两个移位指令8XY6和8XYE现在将寄存器VX移位而忽略了VY(在COSMAC VIP上,VY中的值已移位并放置在VX中),并且与此问题更相关,现在FX55和FX65对于每个写入/读取的值减1 将I加1。 1991年后期对CHIP-48的改写和扩展,称为SUPER-CHIP,再次改变了FX55和FX65。现在,这些指令根本没有增加I。
后两个错误意味着CHIP-48 / SUPER-CHIP无法正常运行70年代和80年代的许多原始CHIP-8游戏,但似乎没有人注意到,可能是因为那些旧游戏没有随时可以在Internet上获得。它们被印在计算机通讯和杂志上。这些现代的口译员成为了人们对CHIP-8的新兴趣的基础,而CHIP-8则在互联网上传播。
人们仍然使用Cowgod的参考文献,并使CHIP-8成为“仿真器”(解释程序),该程序依赖于1990年代这种变化的行为。与此平行的是,其他人模仿了实际运行旧解释器的70年代的旧微型计算机,并将旧的游戏发布到Internet上。
某些现代口译员具有一些配置设置(通常称为“怪癖”),可让您选择如何执行这些指令,主要的指令(迄今为止用于创建新的CHIP-8游戏)为{{3} }。