Skip to content

aszkid/chip8

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

62 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

chip8

A complete CHIP-8 emulator in Rust, which runs most ROMS you can find in the wild. It keeps the CPU at 500 Hz, and draws onto the screen at 60 Hz.

A demonstration GIF of the emulator running invaders.

Running

Execute cargo run filename, where filename is a file in the roms directory.

CPU

Implemented in chip8.rs. The cycle function is where most things happen: two bytes are fetched from the program counter, timers are delayed if necessary (at 60 Hz as per spec), and the CPU branches depending on the instruction fetched.

The load_rom function reads and copies a ROM file and in-memory, starting at the program base pointer, at 0x200.

Each instruction is implemented in its own function in that same file.

Display

The CPU writes onto a 64x32 array that represents video memory. A display implementation must read from this array and upscale the source to get something visualizable. This project provides an SFML-based implementation; take a look at display.rs for the Display trait definition, and display_sfml.rs for our implementation.

Sound

The CHIP-8 specification requires a single 'beep' sound, which plays as long as the sound timer is not zero. We generate 0.5 seconds of a pure sine wave, which is a bid ad-hoc, but has worked well so far.

Roms

The roms folder contains a collection of ROMS from this project: all credits due to the respective authors.

Todo

  • Debugger.
  • Assembler/disassembler (from/to Chipper).

About

A CHIP-8 emulator in Rust

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages