

Corallium
A non-interoprable reimagening of the Atto-24 in rust.
- Size
- 88 × 147.9 mm
- Copper layers
- 2
- Thickness
- 1.6 mm
- Parts
- 26
- Nets
- 68
- Pads
- 173
- Tracks, vias
- 0, 0
- Routed
- Not yet
- KiCad
- KiCad 10.0 (file 20260206)
- Created
- 21 Dec 2025
- Updated
- 20 Aug 2026
Overview
Corallium is an open-source printed circuit board by DarkSystemGit, from the DarkSystemGit/Corallium repository on GitHub. It is a 2-layer board of 88 × 147.9 mm with 26 parts on 68 nets.
Its parts include 12 switches, 4 capacitors, 4 resistors, 3 ICs and 1 connector.
README
README.mdCorallium
Corallium is a fantasy console, similar to a previous project of mine, Atto-24. It supports Coral, a C-like language with Rust-inspired syntax, plus built-in graphics, sound, disk, and clock devices.
This repository contains a Coral Compiler, an executable/linking layer, and the VM.
Quick start
Requirements
- Rust (Cargo)
- A desktop session (the VM opens a graphics window and initializes audio output)
- X11/XWayland support on Linux, due to the lack of window decorations on Wayland
Install
chmod +x ./install.sh && ./install.shThis script should work for both linux and MacOS, though Mac is untested, along with Windows. Read over the script carefully before running it.
Run a Coral program
Compile to a cartridge (.cart):
corallium compile --file test/importTest.coralLink one or more extra files or directories into the cartridge:
corallium compile --file test/importTest.coral --link path/to/file1 path/to/dirRun from a cartridge:
corallium run --file test/importTest.cartEnable the runtime debugger:
corallium run --file test/importTest.cart --debugShow CLI help:
corallium --helpSDK file converters and binary formats
MIDI -> .csfx
corallium sdk convert_music path/to/song.midOptional preview WAV:
corallium sdk convert_music path/to/song.mid --wav-previewconvert_music writes path/to/song.csfx with this exact layout:
CSFX FILE
+------------------------------+
| Header (48 bytes total) |
| 8 channel records, each: |
| pan : f32 (4 bytes) |
| event_count: i16 (2 bytes) |
+------------------------------+
| Event Body |
| Channel 0 events |
| Channel 1 events |
| ... |
| Channel 7 events |
+------------------------------+Each event entry is 10 bytes:
+----------------------------+
| timestamp_ms : i32 (4) |
| frequency_hz : f32 (4) |
| volume : i16 (2) |
+----------------------------+All numeric fields are little-endian.
Image -> .cbmp
corallium sdk convert_image path/to/image.pngconvert_image writes path/to/image.cbmp with this exact layout:
CBMP FILE
+------------------------------+
| width : i16 (2 bytes) |
| height : i16 (2 bytes) |
+------------------------------+
| pixels : width*height*u32 |
| row-major order |
+------------------------------+Each pixel is one u32 value stored little-endian, where the packed color is:
0xRRGGBBAACoral language
Coral currently includes:
letbindings, arithmetic, bitwise ops, andascastsif/else,while,for,break, andcontinuematchexpressions with literal, wildcard, enum, union, struct, and optional patternsstruct,union,enum, andtypedeclarations- optionals (
T?) withSome,None, andtry ... catch defer, function calls, pointers, arrays, andsizeof(...)
Example:
fn main() -> void {
let x: i16=1+2+3;
let y: i16=4*5*6;
let z: i32=(y as i32)/(x as i32);
return;
}Polyp assembly
Polyp is the assembly language for Corallium. See docs/polyp.md for the syntax, instruction reference, and examples.
Specs
- Memory: 16 MiB base RAM, with stack-addressable memory above that range
- Display: 320x240 framebuffer (scaled in a window)
- Audio: 32 kHz output with built-in square/triangle/saw/sample channels
- ISA: integer, float, extended 32-bit, stack, control-flow, call/return, and device I/O ops
Device I/O is invoked as IO(device_id, command_id), with command arguments passed on the VM stack.
Built-in devices
| Device ID | Device | Command IDs |
|---|---|---|
0 | Disk | 0=read, 1=write, 2=loadSectors |
1 | Audio | 0=pause, 1=unpause, 2=volume, 3=pan, 4=frequency, 5=masterVolume, 6=loadSound, 7=setLoop, 8=schedule, 9=masterClock |
2 | Clock | 0=read |
3 | Graphics | 0=registerAtlas, 1=registerLayer, 2=registerSprite, 3=render, 4=pullControls, 5=setPixel, 6=getPixel, 7=removeSprite, 8=removeLayer, 9=registerBitmap, 10=removeBitmap, 11=deltaTime |
4 | Serial | 0=write (null-terminated string ptr), 1=writeNum (i32) |
Graphics control mapping:
A/S/D/F->A/B/X/Y- Arrow keys -> D-pad
Space-> StartQ/E-> Left/Right trigger
Imports and linking
import "module.coral";loads Coral source modules relative to the importing file- Importing a
.hpath loads symbols from the header and links a matching precompiled.binlibrary disk::linkedFileStart()returns the first sector after executable code/data, useful for reading files linked with--link
Project layout
src/compiler/- Coral frontend, AST, IR generation, and backend loweringsrc/std/- Coral standard libarysrc/assembler/- Polyp frontend, AST, and Code Generationsrc/executable.rs- bytecode/function packing, constants, disk image buildsrc/vm.rs- VM execution engine, stack/memory model, debug consolesrc/devices/- disk, audio, clock, graphics, and serial driverstest/- small Coral examples & tests
Demos
You can run a demo game made for corralium in demos/strider/strider.cart. You can run:
corallium run --file demos/strider/strider.cartCredits
Credit to Subspace Audio for the start up sound (sourced from this pack: 512 8-bit sounds).
Parts
26| Qty | Value | Footprint | References |
|---|---|---|---|
| 12 | Push_Button | Button_Switch_THT:SW_PUSH_6mm | SW1, SW2, SW3, SW4, SW5, SW6, SW7, SW8, SW9, SW10, SW11, SW12 |
| 2 | 10uF | PCM_SparkFun-Capacitor:C_0603_1608Metric | C2, C3 |
| 2 | 150ohm | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R1, R3 |
| 2 | 270ohm | Resistor_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal | R6, R7 |
| 2 | 33nF_Ceramic | Capacitor_THT:C_Disc_D5.0mm_W2.5mm_P2.50mm | C1, C4 |
| 2 | Speaker | PCM_fab:PinHeader_01x02_P2.54mm_Horizontal_SMD | LS1, LS2 |
| 1 | CR2013-MI2120 | Display:CR2013-MI2120 | U5 |
| 1 | Conn_02x20_Odd_Even | Connector_IDC:IDC-Header_2x20_P2.54mm_Vertical | J1 |
| 1 | MAX98306xDT | Package_DFN_QFN:TDFN-14-1EP_3x3mm_P0.4mm_EP1.78x2.35mm | U3 |
| 1 | MCP23017x-x-SO | Package_SO:SOIC-28W_7.5x17.9mm_P1.27mm | U1 |
Questions
How big is the Corallium PCB?
It measures 88 × 147.9 mm and has 2 copper layers, 1.6 mm thick.
What parts does the Corallium use?
26 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
Where can I download the Corallium KiCad files?
From the DarkSystemGit/Corallium repository on GitHub, at the commit this page was made from: the board is pcb/corallium/corallium.kicad_pcb and its schematic pcb/corallium/corallium.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Corallium design in my own project?
Its repository states no licence, so its author keeps all rights: ask DarkSystemGit before reusing the design.
Similar boards
- 2 layers57.3 × 19 mm

- 2 layers98 × 59.5 mm

MCP23017 PCB
hackclub/OnBoard
💡 Join 1,000 teenagers and make your first PCB with a $100 grant!
26 parts915 - 2 layers142.9 × 98.5 mm

- 2 layers86.1 × 86.1 mm

- 2 layers103.8 × 50 mm

Galagino pcb set
harbaum/galagino
A Galaga, Pac-Man and Donkey Kong arcade emulator for the ESP32
26 parts558 - 2 layers20.3 × 34.8 mm

L0 ESP32
Luos-io/luos_engine
Open-source and real-time orchestrator for cyber-physical-systems, to easily design, test and deploy embedded applications and digital twins.
26 parts546MIT - 2 layers40.6 × 50.8 mm

WALTsm
google/walt
A device for measuring latency of physical sensors and outputs on phones and computers
26 parts474Apache-2.0 - 2 layers158.5 × 75 mm
