tinychip

Crates.iotinychip
lib.rstinychip
version0.1.1
sourcesrc
created_at2023-05-05 19:26:55.575964
updated_at2023-05-05 19:28:44.08758
descriptionCHIP-8 emulator/interpreter
homepagehttps://github.com/theobori/tinychip
repositoryhttps://github.com/theobori/tinychip
max_upload_size
id857992
size82,374
ThΓ©o Bori (theobori)

documentation

README

❇️ tinychip

CHIP-8 is an interpreted programming language, developed by Joseph Weisbecker made on his 1802 Microprocessor. It was initially used on the COSMAC VIP and Telmac 1800 8-bit microcomputers in the mid-1970s. - Wikipedia

It is able to supports multiple graphical APIs and multiple interpreter implementations. We consider an instruction ~= 1 cycle, so 500hz means it executes 500 instructions per second.

πŸ“– How to build and run ?

  1. Install the dependencies
    • cargo
    • SDL2 (as library)
  2. Compile and install it
    • cargo install --path .
  3. Run tinychip --help

πŸ‘ Tested programs

Name Status
IBM logo βœ…
Pong βœ…
Space invaders βœ…
Tetris βœ…

πŸ–ΌοΈ Screenshots

Breakout (320x160 - 500hz)

breakout

Space Invaders (320x160 - 500hz)

space_invaders

IBM logo (640x320 - 500hz)

ibm_logo

⌨️ Corresponding hotkeys

1 2 3 4
A Z E R
Q S D F
W X C V

πŸ”— Compatibility

Some descriptions of the chip8 instructions differ depending on the machine. For example, the instructions 8xy6 and 8xye do not do the same thing according to the documents.

In general throughout the documents there are two kinds of semantic for the load operations (fx55, fx65) and for the shift operations (8xy6, 8xye).

Semantics

To use the original semantic, use the following flags:

  • Load : --original-load=true
  • Shift : --original-shift=true
Opcode Default Original

8xy6 | Vx = Vx >> 1, Vf = carry | Vx = Vy >> 1, Vf = carry 8xye | Vx = Vx << 1, Vf = carry | Vx = Vy << 1, Vf = carry fx55 | I = I + x + 1 | ❌ fx65 | I = I + x + 1 | ❌

Games

Some games where we know the best compatibility settings, Github issue.

ℹ️ CLI help

USAGE:
    tinychip [OPTIONS] <rom>

FLAGS:
        --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
        --api <api>                          Graphical API, value(s): sfml, sdl
        --cycles <cycles>                    Cycle(s) per second (Hz)
    -h, --height <height>                    Window height
        --interpreter <interpreter>          Interpreter, value(s): original
        --original-load <original-load>      use the original semantic for fx55, fx65
        --original-shift <original-shift>    use the original semantic for 8xy6, 8xye
    -w, --width <width>                      Window width

ARGS:
    <rom>    Input file

πŸ‹ Docker playground

πŸ”¨ Build

docker build -t tinychip .

πŸŽ‰ Run example

In the example below, we have:

  • X11 as graphic server
  • PulseAudio as sound server
docker run -it \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v /dev/dri:/dev/dri \
    -v /dev/snd:/dev/snd \
    -v $PWD/roms:/roms \
    -v /run/user/$(id -u)/pulse/native:/run/user/$(id -u)/pulse/native \
    -e PULSE_SERVER=unix:/run/user/$(id -u)/pulse/native \
    -u $(id -u):$(id -u) \
    tinychip /roms/brick.ch8

βœ… Todo

Name Status
500Hz clock βœ…
Basic instructions βœ…
Handle every CLI args ΒΉ βœ…
Debug features ² ⚠️
Create font βœ…
Add beep sound βœ…
60Hz delay and sound timers βœ…

ΒΉ CLI args:

  • Clock (optional)
  • Window size (optional)
  • Graphical API (optional)
  • Interpreter (optional)
  • quirks (shift and load)

Β² Features:

  • Pause the game
  • Show interpreter values like registers, pc, keys, etc..
  • Switch between a limited amount of stored emulation state

ℹ️ Documentation

Run cargo doc --open to read the documentation in the browser.

Commit count: 23

cargo fmt