#模拟器 #汇编 #模拟 #6502

rs6502

6502 微处理器工具套件。包括反汇编器、汇编器和模拟器。

7 个版本

使用旧的 Rust 2015

0.3.4 2017 年 1 月 7 日
0.3.3 2017 年 1 月 3 日
0.3.0 2016 年 12 月 27 日
0.2.0 2016 年 12 月 21 日
0.1.0 2016 年 12 月 19 日

#184模拟器

MIT 许可证

175KB
4K SLoC

rs6502 构建状态

6502 微处理器的 crate。

本 crate 包括

  • 6502 反汇编器。
  • 6502 汇编器。
  • 6502 模拟器。

反汇编器

反汇编器非常基础,支持一些选项。它可以输出基本的 6502 汇编,也可以包括内存偏移和字节码。例如

let dasm = Disassembler::new();
let code: Vec<u8> = vec![0xA9, 0x00, 0xA8, 0x91, 0xFF, 0xC8, 0xCA, 0xD0, 0xFA, 0x60];
let asm = dasm.disassemble(&code);

产生以下输出

0000 A9 99 LDA #$00
0002 A8    TAY
0003 91 FF STA ($FF),Y
0005 C8    INY
0006 CA    DEX
0007 D0 FA BNE $0003
0009 60    RTS

反汇编器自动调整相对分支偏移为内存偏移。

汇编器

汇编器是一个非常基础的汇编器,目前仅支持一些基本功能。

变量

汇编器愉快地支持地址变量。它目前不支持将立即值作为变量。

示例

MEMORY_ADDRESS = $0100
LDA #$FF
STA MEMORY_ADDRESS

将编译为 A9 FF 85 00 10

段划分

您可以通过 .ORG 指令指定代码段的内存布局。

例如,以下代码在地址 0x2000 生成一个 CodeSegment,并在地址 0x4000 生成另一个。

.ORG $2000

    LDA #$FF
    STA $00

.ORG $4000

    LDX #$AA
    STX $01

模拟器

模拟器支持所有 支持的 6502 微处理器指令。目前不支持任何非文档化/不支持的指令。

计时

模拟器目前不包含任何计时代码。这是一个留给消费者的练习。就目前而言,模拟器会尽可能快地执行尽可能多的代码。

贡献

我会热情地接受任何贡献者。无论您是想要添加文档、修复代码、编写测试,甚至将解析器转换为基于解析器组合库。欢迎所有建议。所以,请随时提出您的想法,并打开一个 issue 进行讨论!

特别提及

特别要提一下 Retro6502。我在实现 ADCSBC 操作码时遇到了很大的问题,在寻找解决方案时发现了这个仓库。我在 Retro6502 实现中使用了掩码技巧,解决了我所面临的问题。所以非常感谢。

许可协议

本仓库遵循 MIT 许可协议。希望它对某人有所帮助——我在实现过程中确实学到了很多。

依赖项

~165KB