Setting Up with Cargo

Before writing any emulator code, we need a project. In Rust, that means using Cargo.

What is Cargo?

Cargo is Rust's build system and package manager — it compiles your code, runs your tests, downloads external libraries, and manages everything in between. Unlike ecosystems where these are separate tools, Cargo does it all.

Creating the project

cargo init chip8-rust
cd chip8-rust

Cargo creates exactly two files:

Cargo.toml   — the project manifest
src/main.rs  — the entry point

That is the entire initial structure.

Cargo.toml

[package]
name = "chip8-rust"
version = "0.1.0"
edition = "2024"

[dependencies]
  • edition — which Rust language standard to use. We use 2024, the latest.
  • [dependencies] — empty for now. When we need a graphics library (minifb) and a random number generator (rand), they go here. See External Crates and Cargo.toml.

src/main.rs

fn main() {
    println!("Hello, world!");
}

Every Rust binary needs a main function — the compiler looks for it explicitly.

The four commands you will use constantly

cargo build        # compile
cargo run          # compile and run
cargo test         # run all tests
cargo test <name>  # run tests matching a name
cargo clippy       # lint
cargo fmt          # auto-format

Run cargo run now to verify everything works.


In the emulator: We will use cargo test after every opcode implementation to verify correctness, and cargo run to open the window and see pixels on screen. The modules section (Modules) covers how we split the project into cpu.rs, memory.rs, and display.rs as it grows.