phakebit

Crates.iophakebit
lib.rsphakebit
version0.1.4
sourcesrc
created_at2023-10-25 22:21:25.758932
updated_at2023-11-05 16:51:30.987692
descriptionA 6502 CPU emulator
homepagehttps://github.com/jukeks/phakebit
repositoryhttps://github.com/jukeks/phakebit
max_upload_size
id1013691
size73,303
Jukkis Virtanen (jukeks)

documentation

README

Rust

phakebit

This is a crate for emulating a 6502 CPU.

Examples

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 maps

The Memory trait is used to implement memory. The PlainMemory struct is a simple implementation of this trait without any mappings. If you want to map parts of the memory to IO or ROM, you can implement the Memory trait for your own struct.

Example

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,
     }
  }
}

Instrumentation

The Trace struct is used to instrument the CPU. It contains the state of the CPU after executing the instruction. The CPU::step() method returns a 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

See LICENSE file.

Commit count: 61

cargo fmt