5 个版本

0.1.4 2023 年 11 月 5 日
0.1.3 2023 年 11 月 4 日
0.1.2 2023 年 10 月 26 日
0.1.1 2023 年 10 月 25 日
0.1.0 2023 年 10 月 25 日

#55模拟器

每月 32 次下载

MIT 许可协议

73KB
2K SLoC

Rust

phakebit

这是一个用于模拟 6502 CPU 的包。

示例

use phakebit::memory::PlainMemory;
use phakebit::cpu::CPU;
use phakebit::state::CPUState;
use phakebit::state;

let memory = PlainMemory::new();
let mut cpu_state = CPUState::new(memory);
// set reset vector to program start or just point `cpu_state.sp` address
cpu_state.write_word(state::RESET_VECTOR_ADDR, 0x1234);
cpu_state.reset();

let mut cpu = CPU::new(cpu_state);
cpu.execute(100000);

内存映射

使用 Memory 特征实现内存。PlainMemory 结构体是这个特征的一个简单实现,没有映射。如果你想将内存的一部分映射到 I/O 或 ROM,你可以为你的结构体实现 Memory 特征。

示例

use phakebit::memory::Memory;

struct MemoryMappedIO {
   state: [u8; 0x10000],
}

fn read_io(address: u16) -> u8 { 0 }
fn write_io(address: u16, value: u8) {}

impl Memory for MemoryMappedIO {
   fn get(&self, address: u16) -> u8 {
      match address {
        0x0000..=0x1FFF => self.state[address as usize],
        0x2000..=0x3FFF => read_io(address),
        0x4000..=0xFFFF => self.state[address as usize],
      }
  }

 fn set(&mut self, address: u16, value: u8) {
     match address {
       0x0000..=0x1FFF => self.state[address as usize] = value,
       0x2000..=0x3FFF => write_io(address, value),
       0x4000..=0xFFFF => self.state[address as usize] = value,
     }
  }
}

仪表化

使用 Trace 结构体来仪表化 CPU。它包含执行指令后的 CPU 状态。方法 CPU::step() 返回一个 Trace

PC   Op Oper   Disassembly   |A  X  Y  SP|NVDIZC|C
---- -- ----   -----------   |-----------|------|-
33D1 A5 0E     LDA $0E       |00 0E FF FF|011010|3
33D3 F0 30     BEQ $3405     |00 0E FF FF|011010|2
3405 AD 00 02  LDA $0200     |2A 0E FF FF|011000|4
3408 C9 2A     CMP #$2A      |2A 0E FF FF|011011|2
340A D0 FE     BNE $340A     |2A 0E FF FF|011011|2
340C A9 2B     LDA #$2B      |2B 0E FF FF|011001|2
340E 8D 00 02  STA $0200     |2B 0E FF FF|011001|4

许可协议

请参阅 LICENSE 文件。

没有运行时依赖