README.md

October 30, 2018 ยท View on GitHub

Summary

This is an NES emulator library written in D. It started as a port to D from Go of github.com/fogleman/nes. It's pure D & has no dependencies.

Installation

Just add "nes": "~>0.2.0" or "nes" version="~>0.2.0" to the dependencies section of your dub.json or dub.sdl file.

Usage

See github.com/blahness/nes_test for an example usage.

Mappers

The following mappers have been implemented:

  • NROM (0)
  • MMC1 (1)
  • UNROM (2)
  • CNROM (3)
  • MMC3 (4)
  • AOROM (7)
  • 255

Test ROM Results

CPU Tests

NameResults
branch_timing_tests
3/3 Pass1.Branch_Basics :heavy_check_mark:
2.Backward_Branch :heavy_check_mark:
3.Forward_Branch :heavy_check_mark:
cpu_interrupts_v2
6/6 Passcpu_interrupts :heavy_check_mark:
1-cli_latency :heavy_check_mark:
2-nmi_and_brk :heavy_check_mark:
3-nmi_and_irq :heavy_check_mark:
4-irq_and_dma :heavy_check_mark:
5-branch_delays_irq :heavy_check_mark:
cpu_timing_test6Pass
instr_test-v5
18/18 Passall_instrs :heavy_check_mark:
official_only :heavy_check_mark:
01-basics :heavy_check_mark:
02-implied :heavy_check_mark:
03-immediate :heavy_check_mark:
04-zero_page :heavy_check_mark:
05-zp_xy :heavy_check_mark:
06-absolute :heavy_check_mark:
07-abs_xy :heavy_check_mark:
08-ind_x :heavy_check_mark:
09-ind_y :heavy_check_mark:
10-branches :heavy_check_mark:
11-stack :heavy_check_mark:
12-jmp_jsr :heavy_check_mark:
13-rts :heavy_check_mark:
14-rti :heavy_check_mark:
15-brk :heavy_check_mark:
16-special :heavy_check_mark:
instr_timing
3/3 Passinstr_timing :heavy_check_mark:
1-instr_timing :heavy_check_mark:
2-branch_timing :heavy_check_mark:
nestestPass

PPU Tests

NameResults
blargg_ppu_tests_2005.09.15b
5/5 Passpalette_ram :heavy_check_mark:
power_up_palette :heavy_check_mark:
sprite_ram :heavy_check_mark:
vbl_clear_time :heavy_check_mark:
vram_access :heavy_check_mark:
nmi_sync
0/2 Passdemo_ntsc :x:
demo_pal :x:
ppu_sprite_hit
11/11 Passppu_sprite_hit :heavy_check_mark:
01-basics :heavy_check_mark:
02-alignment :heavy_check_mark:
03-corners :heavy_check_mark:
04-flip :heavy_check_mark:
05-left_clip :heavy_check_mark:
06-right_edge :heavy_check_mark:
07-screen_bottom :heavy_check_mark:
08-double_height :heavy_check_mark:
09-timing :heavy_check_mark:
10-timing_order :heavy_check_mark:
ppu_vbl_nmi
11/11 Passppu_vbl_nmi :heavy_check_mark:
01-vbl_basics :heavy_check_mark:
02-vbl_set_time :heavy_check_mark:
03-vbl_clear_time :heavy_check_mark:
04-nmi_control :heavy_check_mark:
05-nmi_timing :heavy_check_mark:
06-suppression :heavy_check_mark:
07-nmi_on_timing :heavy_check_mark:
08-nmi_off_timing :heavy_check_mark:
09-even_odd_frames :heavy_check_mark:
10-even_odd_timing :heavy_check_mark:
scanlinePass

APU Tests

NameResultsNotes
apu_mixer
4/4 Passdmc :heavy_check_mark:
noise :heavy_check_mark:
square :heavy_check_mark:
triangle :heavy_check_mark:
apu_phase_resetPass
apu_reset
6/6 Pass4015_cleared :heavy_check_mark:
4017_timing :heavy_check_mark:
4017_written :heavy_check_mark:
irq_flag_cleared :heavy_check_mark:
len_ctrs_enabled :heavy_check_mark:
works_immediately :heavy_check_mark:
apu_test
9/9 Passapu_test :heavy_check_mark:
1-len_ctr :heavy_check_mark:
2-len_table :heavy_check_mark:
3-irq_flag :heavy_check_mark:
4-jitter :heavy_check_mark:
5-len_timing :heavy_check_mark:
6-irq_flag_timing :heavy_check_mark:
7-dmc_basics :heavy_check_mark:
8-dmc_rates :heavy_check_mark:
blargg_apu_2005.07.30
11/11 Pass01.len_ctr :heavy_check_mark:
02.len_table :heavy_check_mark:
03.irq_flag :heavy_check_mark:
04.clock_jitter :heavy_check_mark:
05.len_timing_mode0 :heavy_check_mark:
06.len_timing_mode1 :heavy_check_mark:
07.irq_flag_timing :heavy_check_mark:
08.irq_timing :heavy_check_mark:
09.reset_timing :heavy_check_mark:
10.len_halt_timing :heavy_check_mark:
11.len_reload_timing :heavy_check_mark:
dmc_tests
4/4 Passbuffer_retained :heavy_check_mark:
latency :heavy_check_mark:
status :heavy_check_mark:
status_irq :heavy_check_mark:
dpcmletterboxPassHSYNC timing issues create flicker when scrolling
fadeout_and_triangle_testPass
square_timer_div2Pass
test_apu_2
10/10 Passtest_1 :heavy_check_mark:
test_2 :heavy_check_mark:
test_3 :heavy_check_mark:
test_4 :heavy_check_mark:
test_5 :heavy_check_mark:
test_6 :heavy_check_mark:
test_7 :heavy_check_mark:
test_8 :heavy_check_mark:
test_9 :heavy_check_mark:
test_10 :heavy_check_mark:
test_apu_envPass
test_apu_m
3/3 Passtest_9 :heavy_check_mark:
test_10 :heavy_check_mark:
test_11 :heavy_check_mark:
test_apu_sweep
2/2 Passsweep_cutoff :heavy_check_mark:
sweep_sub :heavy_check_mark:
test_apu_timers
4/4 Passdmc_pitch :heavy_check_mark:
noise_pitch :heavy_check_mark:
square_pitch :heavy_check_mark:
triangle_pitch :heavy_check_mark:
test_tri_lin_ctrPass
volume_testsPass

Known Issues

  • there are some minor issues with PPU timing, but most games work OK anyway
  • the APU emulation isn't quite perfect, but not far off
  • only NTSC timing supported for now