NUMEN-1
We stopped borrowing somebody else’s machine. NUMEN-1 is our console: our instruction set, our rasterizer, our palette, our cartridge format, our sound. It is written in freestanding integer C with no standard library, compiled to 13,412 bytes of WebAssembly with zero floating-point instructions and zero imports, and it is running in this tab right now.
The source language is not C and it is not Python. A game on this machine is a seven-word sentence in ReL, our own language — one word per chakra band, ROOT to CROWN. The sentence is the game. Everything else is a compiler.
A sentence, compiled and played
Type a seed. The seed presses the ReL keyboard seven times, once inside each chakra band. The seven glyphs that come back decide the arena, the motion, the behaviour, what touching means, the palette, the hazard and the tempo. Those decisions are assembled into NUMEN-1 machine code in your browser and handed straight to the machine. No server, no engine, no asset pack.
The instruction set
Fixed 32-bit words. [op:8][ra:4][rb:4][rc:4][pad:12] for register forms, [op:8][ra:4][rb:4][imm:16] for immediates. No flags register, no interrupts, no undefined behaviour: every out-of-range load reads zero and every out-of-range store is dropped. A frame ends at SYNC, at HALT, or when the budget runs out.
There is no framebuffer access from code. You push arguments with GPUSH and issue one of twelve draw kinds with GDRAW. The rasterizer is integer-only: an edge function for triangles, a midpoint circle for discs and rings, Bresenham for lines, a 4x6 font of 40 glyphs for text and numbers.
A .n1 file is a 64-byte header — the magic NUM1, a version, the code word count, the data length, the tile count, a seed, and a 40-character ASCII title — followed by little-endian code words, the data image that lands at RAM address zero, and 64 bytes per 8x8 tile. The whole state of the machine, registers and RAM and stacks and audio, is 17,220 bytes, which is why the search brain can snapshot it and rewind.
Three hundred sentences, measured
We generated 300 seeds, compiled every one, loaded every one into the machine and ran 120 frames of scripted input through each. Nothing was hand-picked and nothing was thrown away.
arenas OPEN BORDER PILLARS LANES RINGS · motions GLIDE THRUST STEP ORBIT · behaviours CHASE FLEE FALL ORBIT BOUNCE · contacts COLLECT AVOID ABSORB PARRY · hazards NONE BEAM PULSE SPINNER · palettes ASH BLOOD EMBER GOLD JADE TIDE AMETHYST ORCHID
What this is not
- The prime carries the choice, not the meaning. Each glyph has a voice, a gate and a chakra. Inside a single chakra band the gate and the voice barely move, so they cannot select anything — we tried, and every sentence produced the same game. What varies is the glyph’s sigma-prime address, its unique coordinate in the 207-symbol alphabet. So the selector is ((prime >> 1) + index) mod n. The voice and gate shown next to each word are its identity, not its vote.
- Every sigma prime is odd. Our first version used prime mod 4 and could only ever return 1 or 3, so half the motions, contacts and hazards were unreachable across 300 seeds. That is a real bug we shipped and then measured our way out of. The number above is from the fixed selector.
- These are small games. One player, a handful of bodies, one hazard, a score bar. The claim is not that NUMEN-1 competes with a modern engine. The claim is that the machine, the language, the compiler and the games are all ours, top to bottom.
- Sound exists in the machine and is not wired to the page. NUMEN-1 has four voices — square, triangle, sine, noise — and the SND opcode drives them. Nothing on this page plays audio yet. When it does, we will say so here.
- Python built the scaffolding and is now gone. The Atari forge on the previous page was written in Python to prove the idea. This one is TypeScript in your browser and C in the machine. There is no Python anywhere in this pipeline.