Skip to content

dnutiu/chip8-rust

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Chip8 Emulator

logo

A Chip8 emulator written in Rust (1.83.0) for learning and educational purposes.

In turns inside your Terminal and the code can be easily modified to run in other envionments.

See it in action:

Space Invaders

asciicast

Pong

asciicast


About Chip8

CHIP-8 is an interpreted programming language and a simple virtual machine designed primarily for running on 8-bit microcomputers and other systems in the late 1970s and early 1980s. Created by Joseph Weisbecker for RCA's COSMAC VIP microcomputer, CHIP-8 was intended to make programming more accessible by providing a higher-level language that could abstract away the complexities of direct hardware manipulation.

The CHIP-8 architecture features a straightforward design:

CPU: It uses a 16-bit address space and has 16 8-bit registers (V0-VF), where VF often serves as a flag register. Instructions are 2 bytes long, allowing for 35 possible opcodes.
Memory: There are 4KB (4096 bytes) of RAM, with the first 512 bytes reserved for the interpreter itself, leaving 3584 bytes for programs and data.
Display: A 64x32 pixel monochrome display where each pixel can be either on or off.
Input: It handles input through a 16-key hexadecimal keypad.
Timers: Two timers (delay and sound) decrement at 60 Hz, providing simple timing mechanisms.

CHIP-8 games and programs were typically small, often fitting within the limited memory constraints, and included classics like "Pong", "Space Invaders", and "Tetris" adaptations. The simplicity of CHIP-8 has made it a popular choice for educational purposes, teaching fundamentals of computer architecture, programming, and emulation. Modern emulators and interpreters for CHIP-8 exist on various platforms, including web browsers, allowing enthusiasts to run and even develop new games for this vintage system. This has kept CHIP-8 relevant as a tool for understanding basic computing concepts and low-level programming.

How is this project organized

The project is written in Rust and it's organized in the following modules:

.
├── Cargo.lock
├── Cargo.toml
├── LICENSE
├── proprietary_roms # Roms which I have no permission to share here.
├── README.md
├── roms
│   ├── 1-chip8-logo.ch8 # Chip8 Logo Test ROM
│   ├── 3-corax+.ch8 # Corax+ Instructions Test ROM
│   └── ibm-logo.ch8 # IBM Logo Test ROM
├── src
│   ├── display.rs # The screen / display module.
│   ├── chip8_core.rs # The chip8_core logic which emulates the CPU.
│   ├── input.rs # The input logic.
│   ├── instruction.rs # The instruction decoding logic.
│   ├── main.rs # The main file. This is the entrypoint.
│   ├── sound.rs # The sound module.
│   └── stack.rs # A stack implementation.

Resources

I've used the following resources to implement the project:

and got inspired by other people's code when I was confused by an instruction.


Made with ❤️ by NucuLabs.dev

Follow me on 🦋 or 🐘 and let's chat:

Releases

No releases published

Packages

No packages published

Languages