SkillAgentSearch skills...

Hnes

:video_game: NES Emulator written in Haskell

Install / Use

/learn @dbousamra/Hnes
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

hnes

Build Status

Welcome to hnes. hnes is a NES emulator written in Haskell.

Screenshots

<p float="left"> <img src="screenshots/nestest-4.png" width="200" /> <img src="screenshots/mario-1.png" width="200" /> <img src="screenshots/mario-2.png" width="200" /> <img src="screenshots/megaman-3.png" width="200" /> <img src="screenshots/contra-1.png" width="200" /> <img src="screenshots/contra-2.png" width="200" /> <img src="screenshots/marble-madness-2.png" width="200" /> <img src="screenshots/paperboy2-2.png" width="200" /> </p>

Mapper support

The following mappers are supported:

  • NROM (0)
  • UNROM (2)
  • AOROM (7)

Lots of games run, but more don't. You can see which roms are compatible here: http://tuxnes.sourceforge.net/nesmapper.txt The best games seem to be MMC3, so that is a priority.

Mappers are basically custom memory modules that exist on the cartridges themselves, that allow referencing more memory than the NES originally shipped with. Sometimes they even do computation. A very clever idea, but a nightmare to emulate, since each mapper has to be emulated as well

Controls

| Nintendo | Emulator | | --------------------- | ----------- | | Up, Down, Left, Right | Arrow Keys | | Start | Enter | | Select | Space | | A | Z | | B | X |

Building

Get Stack for building Haskell projects.

Windows instructions:

$ stack exec -- pacman -Sy mingw-w64-x86_64-pkg-config mingw-w64-x86_64-SDL2
$ stack build

OS X instructions:

$ brew install sdl2
$ stack build

Ubuntu Linux instructions:

$ sudo apt-get install libsdl2-dev
$ stack build

FreeBSD instructions:

$ pkg install sdl2
$ stack build

Running

To run:

stack exec -- hnes roms/tests/cpu/nestest/nestest.nes

Task list

  • [x] Basic structure
  • [ ] Mappers
    • [x] Loading roms
    • [x] Mappers
      • [x] UNROM
      • [x] NROM
      • [x] AOROM
      • [ ] CNROM
      • [ ] MMC1
      • [ ] MMC3
  • [ ] CPU
    • [x] All official opcodes
    • [ ] All illegal opcodes
    • [x] Nestest passing
    • [x] Blarggs CPU test roms passing
  • [ ] PPU
    • [x] SDL integration
    • [x] Background rendering
    • [x] Scrolling
    • [x] Sprite rendering
    • [ ] VBlank timing for Battletoads edge case
  • [ ] APU
  • [x] Controller input handled
  • [x] Performance tuning
  • [ ] Command line interface
    • [ ] Parse args
    • [ ] Use optparse-applicative
    • [ ] Some debug params?

Tests

There's a small test suite that is used to check for CPU and PPU accuracy. They use test roms rather than hand coding tests.

Just run stack test:

<img src="screenshots/tests.png" width="200" />

Known issues.

There are so many, where do I even begin.

  • Performance is pretty average still. I get around 80 fps on my 2015 i5 MacBook.
  • VBlank timing is off. I don't know the exact reasons, but it causes scrolling issues.
View on GitHub
GitHub Stars380
CategoryContent
Updated8mo ago
Forks19

Languages

Haskell

Security Score

92/100

Audited on Aug 7, 2025

No findings