9 个稳定版本
1.1.1 | 2024 年 4 月 4 日 |
---|---|
1.1.0 | 2024 年 4 月 3 日 |
1.0.7 | 2024 年 4 月 2 日 |
#33 在 仿真器
每月 311 次下载
59KB
1K SLoC
r6502
另一个 MOS 6502 仿真器。
设计用于支持 无 std
,不需要分配器或任何不安全代码,并且运行速度合理。
此 crate 的 API 避免实现中断处理,
而是让您逐个指令步进仿真器并自行处理。
请注意,这并不按周期仿真,因此可能不是 100% 准确。
特性标志
存在以下特性标志
名称 | 描述 |
---|---|
bcd | 启用二进制编码的十进制算术。 默认启用。如果您正在编写 NES 仿真器,请禁用。 请注意,无效的 BCD 未经过测试,并且不会按照 MOS 6502 准确运行。 |
bytemuck | 启用 bytemuck 支持。 |
arbitrary | 启用 arbitrary 支持。这将引入 std 。 |
serde | 启用 serde 支持。 |
示例
extern crate std;
use std::eprintln;
use r6502::{Emulator, FunctionReadCallback, FunctionWriteCallback};
fn main() {
let mut emu = Emulator::default()
.with_read_callback(FunctionReadCallback(|state: &mut State, addr| {
// Log reads
eprintln!("Read from #${addr:04x}");
state.memory[addr as usize]
}))
.with_write_callback(FunctionWriteCallback(|state: &mut State, addr, byte|
// Don't write to ROM
if addr < 0xFF00 {
state.memory[addr as usize] = byte
})
)
.with_rom(include_bytes!("rom.bin"))
.with_program_counter(0x200);
loop {
let interrupt_requested = emu.step()
.expect("found an invalid opcode (only MOS 6502 opcodes are supported)");
if interrupt_requested { // Go to IRQ interrupt vector
let vector = u16::from_le_bytes([
emu.read(0xFFFE),
emu.read(0xFFFF)
]);
emu.state.program_counter = vector;
}
}
}
许可
此软件可能根据 MIT 或 Apache-2.0 许可证进行许可,由您选择。
依赖项
~79–520KB
~11K SLoC