9 个稳定版本

1.1.1 2024 年 4 月 4 日
1.1.0 2024 年 4 月 3 日
1.0.7 2024 年 4 月 2 日

#33仿真器

Download history 9/week @ 2024-05-19

每月 311 次下载

Apache-2.0 OR MIT

59KB
1K SLoC

GitHub Actions Workflow Status Documentation MSRV Repository Latest version License unsafe forbidden Maintenance

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