#chip8 #architecture #toolchain #emulate #rust-based #assembly #interoperate

bin+lib emul8

一个简单的基于Rust的工具链,用于交互和模拟CHIP-8架构

3个版本

0.1.2 2020年3月10日
0.1.1 2020年3月8日
0.1.0 2020年3月8日

#204模拟器

MIT 协议

78KB
2K SLoC

CHIP-8 工具链

免责声明:这个项目的动机是为了让我在处理相对有意义的事情的同时熟悉Rust。在idiomatic rust、功能完整的工具或其他方面,它并不是一个好的例子。不要期望它能完全工作。

CHIP-8 平台

CHIP-8 是一种主要用于教育的人工架构。
它是作为一种与一些其他旧架构兼容的解释器而编写的。
该平台有大量的程序(游戏、演示)以及关于该架构的大量其他文档。

工具

emul8 - CHIP-8 解释器

这是这个crate提供的主要工具。它用于模拟CHIP-8架构和指令。
它能够运行网络上可用的多个应用程序,但可能遇到问题或不支持的OpCodes。
如果遇到这种情况,请联系我们并在GitHub上提出问题。

除了简单的指令模拟之外,emul8还具备调试模式,其中每个指令都被反汇编,可以像在您最喜欢的IDE中逐步执行代码一样执行。请参阅:cargo run --bin emul8 -- --help

disasm - CHIP-8 反汇编器

这个工具允许您将二进制文件反汇编为其助记符,以便查看它们包含的指令。
这个反汇编器是一个 线性 反汇编器,而不是 递归 反汇编器。这意味着它在能力上非常有限,并且特别容易混淆。

问题来自这个反汇编器期望指令对齐到每个第二个字节的事实。大多数应用程序在所有代码指令之后添加数据,但也可以在指令之间直接嵌入随机数据。
当发现随机数据时,反汇编器会尝试反汇编无效的指令码,但更重要的是:它失去了对齐。没有指示下一个指令发生在何处。

我们试图通过简单地跳过无效的指令码来解决这个问题。然而,这意味着当指令码在奇数内存地址开始对齐时,反汇编器将找不到任何后续指令。

一个聪明的反汇编器(递归)基于线性方法,但一旦遇到分支,就会创建一个新的线性反汇编器实例,该实例开始反汇编直到遇到下一个分支。这确保了只要指令具有可到达的地址,就会反汇编每个潜在的指令。由于有很多可能影响分支的方法,而且模拟器无论如何都会跟随分支,所以我还没有尝试实现递归反汇编。相反,只需逐步执行程序。

请参阅 cargo run --bin disasm -- --help

asm - CHIP-8 汇编器

如果您想开始为 CHIP-8 编写程序,可以使用这个非常简单的汇编器来生成二进制文件,这些文件应该与其他 CHIP-8 模拟器兼容,但最好通过此工具链来处理。

目前这个汇编器非常有限,因为到目前为止只实现了最简单的指令码。还缺少更高级的功能,如链接或包含其他文件。

要了解语法,最好查看 grammar/asm.pest,但它应该与反汇编器的输出相对应。

请参阅 cargo run --bin asm -- --help

将此存储库用作依赖项

只需查看二进制文件的源代码,它们都使用相同的内部数据结构和方法。具体来说,是 emul8::internals::opcodeemul8::internals::processor

版权所有 2019 - 2020 Marc Streckfuß,许可:MIT

依赖项

~4MB
~74K SLoC