Octo is a high-level assembler for the Chip8 virtual machine, complete with an environment for testing programs. The Chip8 keypad is represented on your keyboard as follows:
Chip8 Key Keyboard
--------- ---------
1 2 3 C 1 2 3 4
4 5 6 D q w e r
7 8 9 E a s d f
A 0 B F z x c v
General information:
- Language Manual
- Beginner's Guide
- Intermediate Guide
- Programming Techniques Guide
- Metaprogramming Cookbook
- SuperChip Extensions
- XO-Chip Extensions
- Octo Programming Google Group
- OctoJam an Octo-centric game jam held every October.
Third-party tools and references:
- Mastering Chip-8 the most accurate Chip-8 reference online.
- HP48 SuperChip research into the quirks and behavior of SuperChip.
- Sublime Text syntax definitions
- Atom syntax definitions
- Emacs syntax definitions
- Vim syntax definitions
- VSCode syntax definitions/integration
- OctoFont .TTF font converter.
- wernsey chip8 an alternative assembler/disassembler.
Third-party games, programs and libraries:
- KNIGHT by Simon Klit-Johnson. (Game)
- OCTOPEG by Chromatophore. (Game)
- Masquer8 by Chromatophore. (Game)
- Glitch Ghost by Jackie Kircher. (Game)
- CosmacCalc a COSMAC VIP spreadsheet built with Octo.
- Misc Samples small programs by Björn Kempen.
- Stack reusable stack data structure.
- Chip8-multiply reusable multiplication routines.
- Octo-Lfsr64 reusable PRNG implementation.
If you've built a project on, with, or for Octo and you'd like to have a link added to this list, submit a pull request!
The Octo assembler can also be used as a command-line tool via a Node.js frontend:
$ ./octo
usage: octo [--decompile] [--roundtrip] [--qshift]
[--qloadstore] <source> [<destination>]
$ cat simple.8o
: main
va := 1
vb := 2
$ ./octo simple.8o simple.ch8
$ hexdump simple.ch8
0000000 6a 01 6b 02
0000004
The --decompile
option can be used to send an existing Chip8 binary through Octo's general-purpose decompiler.
Octo has a share
feature which stores source code and configuration metadata and produces a URL you can share with others. By default, Octo stores programs in its own backend, indexed based on a key
. Alternatively, you can store your program in a GitHub gist and specify a gist
argument in the Octo URL. The example below demonstrates the structure Octo expects in a Gist.
You can also use the gist
id or key
to embed a Chip8 emulator in an iframe
on your websites:
<iframe
src="http://johnearnest.github.io/Octo/embed.html?scale=2&gist=f3685a75817cde6d5c0d"
width="256"
height="128"
></iframe>
(Special thanks to rmmh.)
The scale
argument is optional and specifies the number of pixels which should make up a high-resolution mode Chip8 pixel. Low-resolution mode pixels will be twice this size.
Octo, along with all its associated documentation, examples and tooling, are made available under the MIT license. See LICENSE.txt for additional details. If for any reason this is insufficiently flexible or permissive for some application, please contact John Earnest with your request. Contributions to this repository are welcome, with the understanding that they will fall under the same licensing conditions.