#解释器 #模拟器 #摩托罗拉 #高级 #m68k #68000

nightly bin+lib m68000

摩托罗拉68000解释器、反汇编器和汇编器(代码生成器)

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次下载

MPL-2.0 许可证

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_ifbigint_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 文件。

无运行时依赖

功能