5

在构建芯片 8 仿真器时,我遇到了芯片 8 信息的 2 个主要来源似乎不同的问题,这对整个芯片 8 解释器都有影响。

一方面,我们有维基百科,它在操作码 FX65 下告诉我们

“用从地址 I 开始的内存中的值填充 V0 到 VX(包括 VX)。每写入一个值,I 就增加 1。”

其中“每写入一个值,I 就增加 1。” 是重要的部分。

遵循这将导致以下代码:

for(int i = 0; i <= ((opcode & 0x0F00) >> 8); ++i) {
    V[i] = memory[I];
    ++I;
}

另一方面,我们有cowgod 的 chip-8 参考,几乎每个教程都链接到该参考,它告诉我们以下内容

“解释器从位置 I 开始的内存中读取值到寄存器 V0 到 Vx。”

应用此逻辑会产生以下代码(这也是大多数芯片 8 实现使用的实现):

for(int i = 0; i <= ((opcode & 0x0F00) >> 8); ++i) {
    V[i] = memory[I + i];
}

这两者之间的主要区别是 I 要么增加,要么不增加。由于 I 是仿真器的寄存器索引,因此程序能否正常运行非常重要。

我想知道的是这个操作码的哪个实现是正确的。

4

2 回答 2

3

似乎没有明确的答案,因为似乎没有明确的参考。

这个参考似乎有同样的歧义

然而,这个(当代)参考(第 113 页)说“I = I + X + 1”。作者是发明者 Joseph Weisbecker - 我想他会知道的。

于 2018-07-04T18:44:37.163 回答
1

这取决于您遵循什么实现。

这个问题已经回答了,但我会为后代提供一个更具历史意义的答案。

CHIP-8 于 1977 年在 COSMAC VIP 计算机上引入。这个原始的 CHIP-8 解释器在执行 FX55 和 FX65 指令时确实增加了 I,从这个反汇编中可以看出。对于每个写入/读取的值,I 都会增加 1。

CHIP-8 在 70 年代末和 80 年代初被移植到其他几台微型计算机上,具有相同的行为(因此 CHIP-8 游戏将是可移植的),但在具有更多内存的更先进的计算机变得流行之后几年被遗忘了(例如 IBM PC)。

1990 年,CHIP-8 被移植到 HP48 系列图形计算器中作为 CHIP-48。这个移植至少引入了三个错误: BNNN 跳转指令的行为不同(但很少使用),两个移位指令 8XY6 和 8XYE 现在移位寄存器 VX 并忽略 VY(在 COSMAC VIP 上,VY 中的值被移位并放置在 VX 中),并且与这个问题更相关,FX55 和 FX65 现在对于每个写入/读取的值将 I 增加 1,减去 1。1991 年后期对 CHIP-48 的重写和扩展,称为 SUPER-CHIP,再次改变了 FX55 和 FX65。现在,这些指令根本没有增加 I。

后两个错误意味着 CHIP-48/SUPER-CHIP 无法正常运行许多 70 和 80 年代的原始 CHIP-8 游戏,但似乎没有人注意到,可能是因为那些旧游戏在互联网。它们已印在计算机通讯和杂志上。这些现代口译员成为了对在 Internet 上传播的 CHIP-8 重新产生兴趣的基础。

人们仍然使用 Cowgod 的参考,并制作 CHIP-8 “模拟器”(解释器),依赖于 1990 年代这种改变的行为。与此同时,其他人仿效了 70 年代真正运行旧解释器的旧微型计算机,并将旧游戏放到了互联网上。

一些现代解释器具有配置设置(通常称为“怪癖”),可让您选择如何执行这些指令,可能主要的(至今仍用于创建新的 CHIP-8 游戏)是Octo

于 2020-02-27T22:20:32.590 回答