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.
- Install the dependencies
cargo
SDL2
(as library)
- Compile and install it
cargo install --path .
- Run
tinychip --help
If you want to help the project, you can follow the guidelines in CONTRIBUTING.md.
1 | 2 | 3 | 4 |
A | Z | E | R |
Q | S | D | F |
W | X | C | V |
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
).
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 | ❌ |
Some games where we know the best compatibility settings, Github issue.
docker buildx build . -t tinychip
In the example below, we have:
X11
as graphic serverPulseAudio
as sound server
docker run -it --rm \
-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
Run cargo doc --open
to read the documentation in the browser.