2

我正在写一个chip-8解释器。我有我的模拟硬件、指令执行、UI 等。一切都很好,所以我开始实际加载和执行真正的chip8 程序。

在我在网上找到的 zip 存档中,有几款游戏似乎有非法跳转调用。

CowGod 的规范中它说:

所有指令都是 2 个字节长,并且首先存储最高有效字节。在内存中,每条指令的第一个字节应该位于偶数地址。如果一个程序包含精灵数据,它应该被填充,以便它后面的任何指令都正确地位于 RAM 中。

这似乎非常坚持,不可能有一条从奇数内存地址执行的指令,因此我将我的解释器编码为失败是我们最终试图去一个奇数内存地址(主要是因为我假设我正在读一些东西如果发生这种情况是错误的)。

然而,我包中的两个游戏(INVADERSBLITZ)似乎立即以跳转调用开始(他们用他们的名字在 ascii 中签署了 rom,所以第一条指令是在签名后调用跳转。

前者以 开头,后者以0x12 0x25开头0x12 0x17。这两个都指向对奇数地址(分别为 0x225 和 0x217)的跳转调用,然后在我的模拟器中失败。查看它们指向的那些地址,它们看起来像是包含有效指令(前者中的字节 25 包含 0x6000(LD V0, 00),而后者中的字节 17 指向 0xA341(LD I, 341)。

我是否只是过于严格地解释规范,并且预计不会填充实际应用程序并且可以在奇数地址上运行?

4

1 回答 1

2

问题的答案是(基于评论):Chip-8 规范显然打算包括指令从偶数地址开始的要求,但是,由于它没有被非常强烈地指定(规范仅在传递时提到它使用术语“应该”而不是“必须”),以及指令集可以很好地处理不在偶数地址的指令(例如,跳转指令可以跳转到任何地址,而不仅仅是偶数地址),模拟器开发人员倾向于忽略要求。因此,Chip-8 存在许多在奇数地址有指令的二进制文件,这使得未来的仿真器不太可能强制执行此要求。

于 2019-02-09T18:45:54.967 回答