我正在写一个chip-8解释器。我有我的模拟硬件、指令执行、UI 等。一切都很好,所以我开始实际加载和执行真正的chip8 程序。
在我在网上找到的 zip 存档中,有几款游戏似乎有非法跳转调用。
从CowGod 的规范中它说:
所有指令都是 2 个字节长,并且首先存储最高有效字节。在内存中,每条指令的第一个字节应该位于偶数地址。如果一个程序包含精灵数据,它应该被填充,以便它后面的任何指令都正确地位于 RAM 中。
这似乎非常坚持,不可能有一条从奇数内存地址执行的指令,因此我将我的解释器编码为失败是我们最终试图去一个奇数内存地址(主要是因为我假设我正在读一些东西如果发生这种情况是错误的)。
然而,我包中的两个游戏(INVADERS
和BLITZ
)似乎立即以跳转调用开始(他们用他们的名字在 ascii 中签署了 rom,所以第一条指令是在签名后调用跳转。
前者以 开头,后者以0x12 0x25
开头0x12 0x17
。这两个都指向对奇数地址(分别为 0x225 和 0x217)的跳转调用,然后在我的模拟器中失败。查看它们指向的那些地址,它们看起来像是包含有效指令(前者中的字节 25 包含 0x6000(LD V0, 00
),而后者中的字节 17 指向 0xA341(LD I, 341
)。
我是否只是过于严格地解释规范,并且预计不会填充实际应用程序并且可以在奇数地址上运行?