🥔 MOS-6502 and NES emulator in Rust (SDL/WebAssembly/Android/Embedded/Cloud)
Find a file
Henrik Persson 3b36000fa3 8x16 sprites
2022-12-30 16:04:15 +01:00
common WASM! 2022-10-04 14:29:38 +02:00
mos6502 Loopy PPU! 2022-12-29 16:32:59 +01:00
nes 8x16 sprites 2022-12-30 16:04:15 +01:00
nes-sdl Add some tests 2022-11-08 11:35:44 +01:00
nes-wasm Loopy PPU! 2022-12-29 16:32:59 +01:00
screenshots 8x16 sprites 2022-12-30 16:04:15 +01:00
test-roms "First" commit 2022-09-27 21:30:23 +02:00
.gitignore "First" commit 2022-09-27 21:30:23 +02:00
.gitmodules "First" commit 2022-09-27 21:30:23 +02:00
Cargo.lock fps_max 101 2022-10-31 10:14:55 +01:00
Cargo.toml WASM! 2022-10-04 14:29:38 +02:00
README.md 8x16 sprites 2022-12-30 16:04:15 +01:00

🥔 Potatis

smbz bbdr

  • /mos6502 - Generic CPU emulator. Passes all tests, including illegal ops. (No BCD mode).
  • /nes - A very incomplete NES emulator.
  • /nes-sdl - Native target using SDL.
  • /nes-wasm - Browser target using WASM.

/mos6502

let load_base = 0x2000;
let mem = Memory::load(&program[..], load_base);
let cpu = Cpu::new(mem);
let mut machine = Mos6502::new(cpu);

loop {
  machine.tick()
  println!("{}", machine); // Will print nestest-like output
}

Debugging

let mut debugger = machine.debugger();
debugger.verbose(true); // Trace, dumps disassembled instructions to stdout
debugger.add_breakpoint(Breakpoint::Address(0x0666));
debugger.add_breakpoint(Breakpoint::Opcode("RTI"));
debugger.watch_memory_range(0x6004..=0x6104, |mem| {
  // Invoked when memory in range changes
});

/nes ⚠️ WIP ⚠️

Supported mappers:

  • NROM (mapper 0)
  • CNROM (mapper 3)
  • MMC3 (mapper 4)
impl nes::HostSystem for MyHost {
  fn render(&mut self, frame: &RenderFrame) {
    // frame.pixels() == 256 * 240 * 4 RGBA array
  }

  fn poll_events(&mut self, joypad: &mut Joypad) {
    // pump events and forward to joypad
  }
}


let cart = Cartridge::blow_dust("path/to/rom.nes")?;
let mut nes = Nes::insert(cart, MyHost::new());

loop {
  nes.tick();
  println!("{:?}", nes); // Complete nestest formatted output
}

/nes-sdl

cargo run --release path/to/rom.nes

cargo run -- --help for options

/nes-wasm

  1. cd nes-wasm
  2. wasm-pack build --release --target web
  3. npm install
  4. npm run dev

Test

Run all unit and integration tests (for all crates):

cargo test

TODO

  • More mappers
  • APU

Thanks