aboutsummaryrefslogtreecommitdiff

nes emulator in go

im trying to make it somewhat commented so yeah :D

TODO:

emulator base

  • [x] cpu passing nestest
  • [x] cart package (iNES parser, mapper 0)

system bus (nes package)

  • [/] Bus type: 2KB RAM mirrored through $1FFF, PPU regs $2000-$3FFF (mirrored every 8), APU/IO $4000-$4017, cart $4020+ (APU still missing)
  • [x] OAM DMA at $4014 (stalls CPU 513/514 cycles)
  • [x] reuse it in nestest_test.go instead of the test-only bus
  • [/] CPU stall hook (done) and proper IRQ/NMI line (polled between instructions) - PPU currently fires NMI straight from Console.Step, see its doc comment

ppu, background

  • [x] registers $2000-$2007 and v/t/x/w latch logic
  • [x] nametables with mirroring, palettes, buffered $2007 reads (pattern tables go through the mapper already)
  • [x] 341 dots x 262 lines timing, 3 dots per CPU cycle, odd-frame skip dot
  • [x] vblank flag and edge-triggered NMI, including the $2002 set-dot race window (see ppu/registers.go's readStatus)
  • [x] background shift-register pixel pipeline, PPUMASK clipping
  • [x] 256x240 framebuffer and RGB palette

frontend and input

  • [x] cmd/gones sdl2 gui (veandco/go-sdl2): window, framebuffer texture, one frame per 1/60s, vsync
  • [ ] sdl2 audio output (queue or callback)
  • [x] controller $4016/$4017 strobe and shift register, keyboard mapping

ppu, sprites

  • [x] OAM, per-scanline evaluation, 8-sprite limit, 8x8 and 8x16, flip, priority (overflow flag is the simple version, not the buggy hardware one)
  • [x] sprite-0 hit

more mappers

  • [ ] MMC1 (1), UxROM (2), CNROM (3), AxROM (7)
  • [ ] MMC3 (4) with scanline IRQ
  • [ ] battery-backed save files

apu

  • [ ] pulse x2, triangle, noise, DMC, frame counter, mixer
  • [ ] resampling and audio output

accuracy

  • [x] implement all unofficial instructions
  • [ ] run accuracycoin and blargg's CPU, PPU, APU and MMC3 test ROMs

polish

  • [ ] save states, pause/reset, fullscreen, gamepad
  • [ ] headless mode with framebuffer-hash regression tests
  • [ ] movie support
  • [ ] (maybe) tas tools

testing:

run go test ./... to run all tests

tests/testdata/nestest.nes and tests/testdata/nestest.log are by kevin horton (kevtris), included for testing only.