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
| Name | Results |
|---|---|
| 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_test6 | Pass |
| 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: |
| nestest | Pass |
PPU Tests
| Name | Results |
|---|---|
| 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: |
| scanline | Pass |
APU Tests
| Name | Results | Notes |
|---|---|---|
| apu_mixer | 4/4 Passdmc :heavy_check_mark:noise :heavy_check_mark: square :heavy_check_mark: triangle :heavy_check_mark: | |
| apu_phase_reset | Pass | |
| 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: | |
| dpcmletterbox | Pass | HSYNC timing issues create flicker when scrolling |
| fadeout_and_triangle_test | Pass | |
| square_timer_div2 | Pass | |
| 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_env | Pass | |
| 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_ctr | Pass | |
| volume_tests | Pass |
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