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 在 模拟器
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。我在实现 ADC
和 SBC
操作码时遇到了很大的问题,在寻找解决方案时发现了这个仓库。我在 Retro6502 实现中使用了掩码技巧,解决了我所面临的问题。所以非常感谢。
许可协议
本仓库遵循 MIT 许可协议。希望它对某人有所帮助——我在实现过程中确实学到了很多。
依赖项
~165KB