Chip-8程序可以跳转到奇数地址吗?

时间:2019-01-30 03:39:32

标签: chip-8

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

在网上找到的zip档案中,有几款游戏似乎存在非法跳转请求。

CowGod's specification中说:

  

所有指令的长度为2个字节,并且先存储最高有效字节。在存储器中,每条指令的第一个字节应位于偶数地址。如果程序包含Sprite数据,则应对其进行填充,以便其后的所有指令均正确地位于RAM中。

这似乎非常坚持认为不可能有一条从奇数个存储器地址执行的指令,因此我对解释器进行编码失败,因为我们最终试图去到一个奇数个存储器地址(主要是因为我认为我“如果发生这种情况,我会读错东西。

但是我的背包中的两个游戏(INVADERSBLITZ)似乎立即以跳转指令开始(它们以ASCII的名称在rom上签名,因此第一个指示是调用在签名后跳。

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

我只是对规范进行了过于严格的解释吗,期望真实的应用程序不会被填充并且可以在奇数地址上运行?

1 个答案:

答案 0 :(得分:0)

该问题的答案是(基于评论):Chip-8规范显然旨在包括对指令从偶数地址开始的要求,但是,由于未对它进行非常严格的指定(该规范仅提及它)使用术语“应该”而不是“必须”进行传递,并且指令集可以与不在偶数地址处的指令配合使用(例如,跳转指令可以跳转到任意地址,而不仅仅是偶数地址) ,仿真器开发人员倾向于忽略该要求。因此,Chip-8存在许多二进制文件,这些二进制文件的指令位于奇数地址,这使得将来的仿真器不太可能执行此要求。