4个版本
0.2.1 | 2023年8月28日 |
---|---|
0.2.0 | 2023年8月28日 |
0.1.1 | 2022年8月29日 |
0.1.0 | 2022年8月29日 |
#260 在 编程语言
每月46次下载
1MB
12K SLoC
m68000
m68000是使用Rust编写的摩托罗拉68000解释器、反汇编器和汇编器(代码生成器)。
此库模拟了M68k ISA的常用用户和监督指令。它可以配置成模拟指定的CPU类型(见下文),改变指令的执行时间和异常处理。
此库设计用于在两个不同的环境中使用
- 它可以用来模拟整个CPU,此库的用户只需调用解释器方法,当发生中断或复位时处理异常。这是模拟器的典型用例。
- 它还可以用作M68k用户模式解释器来运行M68k程序,但不需要将操作系统编译成二进制M68k。在这种情况下,应用程序会运行程序,直到发生异常(系统调用为TRAP,零除等),这些异常可以在Rust代码(或任何使用C接口的其他语言)中处理,因此应用程序可以使用高级语言而不是M68k汇编来实施M68k程序所需的周围环境。
支持的CPU
通过主结构上的泛型参数指定CPU类型。特质CpuDetails
包含模拟CPU的所有详细信息
- 指令执行时间
- 异常处理时间
- 异常堆栈格式
m68000为以下CPU提供CPU详细信息
- MC68000(如M68000 8-/16-/32位微处理器用户手册第9版中所述)
- SCC68070微控制器
如何使用
m68000需要一个nightly编译器,因为它使用了std的btree_extract_if
和bigint_helper_methods
特性。
首先,由于内存映射是应用程序相关的,因此用户负责通过在他们的内存结构上实现MemoryAccess
特质并传递它到核心在每个指令执行时来定义它。
其次,通过指定实现CpuDetails
特质的实例来选择CPU行为,无论它是您自己的还是在该包中提供的。
文件 src/bin/scc68070.rs
是一个实现 SCC68070 微控制器的使用示例。
Rust 基本示例
const MEM_SIZE: u32 = 65536;
struct Memory([u8; MEM_SIZE as usize]); // Define your memory management system.
impl MemoryAccess for Memory { // Implement the MemoryAccess trait.
fn get_byte(&mut self, addr: u32) -> Option<u8> {
if addr < MEM_SIZE {
Some(self.0[addr as usize])
} else {
None
}
}
// And so on...
}
fn main() {
let mut memory = Memory([0; MEM_SIZE as usize]);
// Load the program in memory here.
let mut cpu: M68000<m68000::cpu_details::Mc68000> = M68000::new();
// Execute instructions
cpu.interpreter(&mut memory);
}
FFI 和 C 接口
请参阅 CINTERFACE.md。
许可协议
m68000 根据 Mozilla 公共许可证版本 2.0 进行分发。有关更多信息,请参阅 LICENSE 文件。