#emulation #gba #arm

armv4t_emu

ARMv4t指令集的模拟器

1个不稳定版本

0.1.0 2020年5月2日

156模拟器 中排名 #156

Download history 106/week @ 2024-03-13 66/week @ 2024-03-20 109/week @ 2024-03-27 23/week @ 2024-04-03 20/week @ 2024-04-10 24/week @ 2024-04-17 46/week @ 2024-04-24 51/week @ 2024-05-01 47/week @ 2024-05-08 97/week @ 2024-05-15 105/week @ 2024-05-22 105/week @ 2024-05-29 33/week @ 2024-06-05 38/week @ 2024-06-12 109/week @ 2024-06-19 39/week @ 2024-06-26

232 每月下载量
用于 gdbstub

MIT 许可证

4MB
2K SLoC

armv4t_emu

ARMv4T指令集的模拟器,使用Rust编写。

最初作为 iburinoc的Gameboy Advance模拟器 的一部分编写,现在是一个独立的库,可用于任何可能需要它的项目中!

目前,该软件包的功能几乎完整,可以成功运行大型程序。请参阅问题跟踪器以获取缺失/不完整功能的列表。

示例

use armv4t_emu::{reg, Cpu, ExampleMem, Mode, Memory};

let prog = &[
    0x06, 0x00, 0xa0, 0xe3, //    mov r0, #6
    0x01, 0x10, 0xa0, 0xe3, //    mov r1, #1
    0x01, 0x10, 0x81, 0xe0, // l: add r1, r1, r1
    0x01, 0x00, 0x50, 0xe2, //    subs r0, #1
    0xfc, 0xff, 0xff, 0x1a, //    bne l
    0x01, 0x6c, 0xa0, 0xe3, //    mov r6, #0x100
    0x00, 0x10, 0x86, 0xe5, //    str r1, [r6]
    0xf7, 0xf0, 0xde, 0xad  // ; trigger undefined instr exception
];
let mut mem = ExampleMem::new_with_data(prog);
let mut cpu = Cpu::new();
cpu.reg_set(Mode::User, reg::PC, 0x00);
cpu.reg_set(Mode::User, reg::CPSR, 0x10);

while cpu.step(&mut mem) {}

assert_eq!(64, mem.r32(0x100));

可选功能

有几个可选功能您可能想启用,提供各种功能/调试增强。这些功能默认禁用,因为它们会增加编译时间。

功能 描述
advanced_disasm 使用 capstone 反汇编并记录指令。警告:会显著增加编译时间。
serde 在重要的类型/结构上添加了 SerializeDeserialize 衍生。

* 考虑使用 gdbstub 软件包来调试模拟代码,而不是创建一个专门的应用程序调试器。

缺失的功能

目前,该软件包的功能主要取决于其依赖项目的功能。因此,ARMv4T指令集的几个功能目前尚未实现。

  • 自定义协处理器支持(见 #3
  • 大端支持(见 #4
  • 对“周期精确”模拟的支持
    • 由于 armv4t_emu 不是针对任何特定ARMv4T CPU的模拟器,因此实现起来可能很困难。
    • 理论上,可以通过修改公共API以接受某种平台特定的定时信息来实现这一点。

依赖项