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 次下载
73KB
2K SLoC
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 文件。