6个版本 (破坏性更新)
0.6.0 | 2024年7月29日 |
---|---|
0.5.0 | 2023年10月31日 |
0.4.0 | 2023年4月20日 |
0.3.0 | 2023年4月20日 |
0.0.1 | 2017年11月13日 |
#19 in 仿真器
每月下载量227
用于 strop
370KB
2K SLoC
mos6502
使用Rust编写的MOS 6502 CPU仿真器。
由 solid65 测试和验证。
它基于稳定的Rust并支持 #[no_std]
目标。
什么是MOS 6502?
MOS Technology 6502(通常发音为“sixty-five-oh-two”或“six-five-oh-two”)是由Chuck Peddle领导的小团队为MOS Technology设计的8位微处理器。 [...]
1975年推出时,6502是市场上 最便宜的微处理器,比大型公司如Motorola的6800或Intel 8080的竞争设计便宜得多。它的推出导致整个处理器市场的价格迅速下降。 与Zilog Z80一起,它引发了80年代初家用电脑革命的一系列项目。
来源: 维基百科
如何使用此库
use mos6502::memory::Bus;
use mos6502::memory::Memory;
use mos6502::instruction::Nmos6502;
use mos6502::cpu;
fn main() {
// Calculate the greatest common divisor of 56 and 49
// using Euclid's algorithm.
let zero_page_data = [56, 49];
let program = [
// (F)irst | (S)econd
// .algo
0xa5, 0x00, // Load from F to A
// .algo_
0x38, // Set carry flag
0xe5, 0x01, // Substract S from number in A (from F)
0xf0, 0x07, // Jump to .end if diff is zero
0x30, 0x08, // Jump to .swap if diff is negative
0x85, 0x00, // Load A to F
0x4c, 0x12, 0x00, // Jump to .algo_
// .end
0xa5, 0x00, // Load from S to A
0xff,
// .swap
0xa6, 0x00, // load F to X
0xa4, 0x01, // load S to Y
0x86, 0x01, // Store X to F
0x84, 0x00, // Store Y to S
0x4c, 0x10, 0x00, // Jump to .algo
];
let mut cpu = cpu::CPU::new(Memory::new(), Nmos6502);
cpu.memory.set_bytes(0x00, &zero_page_data);
cpu.memory.set_bytes(0x10, &program);
cpu.registers.program_counter = 0x10;
cpu.run();
// The expected GCD is 7
assert_eq!(7, cpu.registers.accumulator);
}
可以通过自己编译euclid示例来实现相同的功能。
首先安装一个6502汇编器和链接器,例如 cc65.
brew install cc65
然后编译和链接汇编文件
cd examples/asm/euclid
ca65 euclid.a65
ld65 -C ../linker.cfg -o euclid.bin euclid.o
这将创建一个二进制文件 euclid.bin
,您可以将它加载到仿真器中
use mos6502::memory::Bus;
use mos6502::memory::Memory;
use mos6502::instruction::Nmos6502;
use mos6502::cpu;
use std::fs::read;
fn main() {
// Calculate the greatest common divisor of 56 and 49
// using Euclid's algorithm.
let zero_page_data = [56, 49];
// Load the binary file from disk
let program = match read("examples/asm/euclid/euclid.bin") {
Ok(data) => data,
Err(err) => {
println!("Error reading euclid.bin: {}", err);
return;
}
};
let mut cpu = cpu::CPU::new(Memory::new(), Nmos6502);
cpu.memory.set_bytes(0x00, &zero_page_data);
cpu.memory.set_bytes(0x10, &program);
cpu.registers.program_counter = 0x10;
cpu.run();
// The expected GCD is 7
assert_eq!(7, cpu.registers.accumulator);
}
致谢
这最初是 amw-zero/6502-rs 的分支,目前看起来 未维护。