在 chip-8 操作码 FX65 中递增 I
increment I in chip-8 opcode FX65
在构建 chip-8 模拟器时,我 运行 遇到了 chip-8 信息的两个主要来源似乎不同的问题,这对整个 chip-8 解释器都有影响。
一方面我们有 wikipedia,在操作码 FX65 下它告诉我们
"Fills V0 to VX (including VX) with values from memory starting at address I. I is increased by 1 for each value written."
其中 "I is increased by 1 for each value written." 是重要的部分。
执行此操作会生成以下代码:
for(int i = 0; i <= ((opcode & 0x0F00) >> 8); ++i) {
V[i] = memory[I];
++I;
}
另一方面,我们有 chip-8 reference by cowgod,这是几乎每个教程都链接到的参考,它告诉我们以下内容
"The interpreter reads values from memory starting at location I into registers V0 through Vx."
应用此逻辑会产生以下代码(这也是大多数 chip-8 实现使用的实现):
for(int i = 0; i <= ((opcode & 0x0F00) >> 8); ++i) {
V[i] = memory[I + i];
}
这两者之间的主要区别在于 I 是否递增。由于I是模拟器的寄存器索引,所以对于程序能否正常运行是相当重要的。
我想知道这个操作码的哪个实现是正确的。
似乎没有明确的答案,因为似乎没有明确的参考。
This reference好像有同样的问题,同样的歧义
然而,This (contemporary) reference(第 113 页)显示 "I = I + X + 1"。作者是发明人约瑟夫·魏斯贝克 - 我想他应该知道。
这取决于您遵循的实施方式。
这个问题已经有人回答了,但我会为后代提供一个更具历史意义的答案。
CHIP-8 于 1977 年在 COSMAC VIP 计算机上引入。这个原始的 CHIP-8 解释器在执行 FX55 和 FX65 指令时确实增加了 I,如 this disassembly 所示。我为每个值增加 1 written/read.
CHIP-8 在 70 年代末和 80 年代初被移植到其他几台微型计算机,具有相同的行为(因此 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 现在为每个值 written/read、减 1 将 I 递增 1。 1991 年晚些时候对 CHIP-48 的重写和扩展,称为 SUPER-CHIP,再次改变了 FX55 和 FX65。现在,这些指令根本没有增加 I。
后两个错误意味着 CHIP-48/SUPER-CHIP 无法 运行 70 年代和 80 年代的许多原始 CHIP-8 游戏,但似乎没有人注意到,可能是因为那些旧的游戏在互联网上并不容易获得。它们被印在计算机通讯和杂志上。这些现代解释器成为人们对 CHIP-8 重新产生兴趣的基础,并在互联网上传播开来。
人们仍然使用 Cowgod 的参考,并制作依赖于 1990 年代改变的行为的 CHIP-8“模拟器”(解释器)。与此同时,其他人模仿了实际上 运行 老式解释器的 70 年代的老式微型计算机,并将老式游戏放到了互联网上。
一些现代解释器具有配置设置(通常称为“怪癖”),让您选择如何执行这些指令,可能是主要的(至今用于创建新的 CHIP-8 游戏)Octo.
在构建 chip-8 模拟器时,我 运行 遇到了 chip-8 信息的两个主要来源似乎不同的问题,这对整个 chip-8 解释器都有影响。
一方面我们有 wikipedia,在操作码 FX65 下它告诉我们
"Fills V0 to VX (including VX) with values from memory starting at address I. I is increased by 1 for each value written."
其中 "I is increased by 1 for each value written." 是重要的部分。
执行此操作会生成以下代码:
for(int i = 0; i <= ((opcode & 0x0F00) >> 8); ++i) {
V[i] = memory[I];
++I;
}
另一方面,我们有 chip-8 reference by cowgod,这是几乎每个教程都链接到的参考,它告诉我们以下内容
"The interpreter reads values from memory starting at location I into registers V0 through Vx."
应用此逻辑会产生以下代码(这也是大多数 chip-8 实现使用的实现):
for(int i = 0; i <= ((opcode & 0x0F00) >> 8); ++i) {
V[i] = memory[I + i];
}
这两者之间的主要区别在于 I 是否递增。由于I是模拟器的寄存器索引,所以对于程序能否正常运行是相当重要的。
我想知道这个操作码的哪个实现是正确的。
似乎没有明确的答案,因为似乎没有明确的参考。
This reference好像有同样的问题,同样的歧义
然而,This (contemporary) reference(第 113 页)显示 "I = I + X + 1"。作者是发明人约瑟夫·魏斯贝克 - 我想他应该知道。
这取决于您遵循的实施方式。
这个问题已经有人回答了,但我会为后代提供一个更具历史意义的答案。
CHIP-8 于 1977 年在 COSMAC VIP 计算机上引入。这个原始的 CHIP-8 解释器在执行 FX55 和 FX65 指令时确实增加了 I,如 this disassembly 所示。我为每个值增加 1 written/read.
CHIP-8 在 70 年代末和 80 年代初被移植到其他几台微型计算机,具有相同的行为(因此 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 现在为每个值 written/read、减 1 将 I 递增 1。 1991 年晚些时候对 CHIP-48 的重写和扩展,称为 SUPER-CHIP,再次改变了 FX55 和 FX65。现在,这些指令根本没有增加 I。
后两个错误意味着 CHIP-48/SUPER-CHIP 无法 运行 70 年代和 80 年代的许多原始 CHIP-8 游戏,但似乎没有人注意到,可能是因为那些旧的游戏在互联网上并不容易获得。它们被印在计算机通讯和杂志上。这些现代解释器成为人们对 CHIP-8 重新产生兴趣的基础,并在互联网上传播开来。
人们仍然使用 Cowgod 的参考,并制作依赖于 1990 年代改变的行为的 CHIP-8“模拟器”(解释器)。与此同时,其他人模仿了实际上 运行 老式解释器的 70 年代的老式微型计算机,并将老式游戏放到了互联网上。
一些现代解释器具有配置设置(通常称为“怪癖”),让您选择如何执行这些指令,可能是主要的(至今用于创建新的 CHIP-8 游戏)Octo.