Three zones, six acts, one crown. A brand new side-scroller in 2,961 instruction words, with its mechanics counted out of the RAM maps of 28 real Mega Drive integrations. Our search brain takes every act and the crown — 41,875 points at frame 1,941. →
A complete arcade game written straight onto silicon we designed ourselves — 2,105 instruction words, 64 colours, four sound voices, zero assets. Playable now, and our own rollout-and-rewind search brain cleared all six gates with 46,300 points. →
The operating system writes
its own video games.
Not sprites in a web page. Real Atari 2600 cartridges — 2,048 bytes of 6502 machine code each, written by a generator we built, running on a 6507 + TIA machine we wrote in freestanding integer C and compiled to WebAssembly. The search brain that solves ARC puzzles and speedruns Mario is the playtester: it plays every cartridge before you ever see it, and it decides whether the thing is a game or garbage.
The Cartridge Forge
Pick a cartridge. Watch the Oracle play it, or take the stick yourself with the arrow keys or WASD. Everything below the canvas is read straight out of the 128 bytes of RAM inside the emulated machine.
md5 4dd0f2172314ac89c14d5cc03c92e5bc
483 bytes of code in a 2,048 byte cartridge
Four pieces, no engine
A 6502 assembler written from scratch in Python, with the full TIA and RIOT register map. It emits raw bytes at $F000 with the start vector at $FFFC. No toolchain, no library.
A game is a handful of choices: how the other thing moves (fall, chase, flee, bounce), whether touching it is good or bad, and what the walls do (none, border, maze, bars). The generator turns those choices into a scanline kernel and a game loop, then assembles them.
A 6507 + TIA + RIOT in freestanding integer C: 128 bytes of RAM, playfield, two players, two missiles, a ball, NUSIZ, reflect, priority, eight collision latches, and the RIOT timer. Compiled to 17,401 bytes of WebAssembly with zero floating-point instructions.
The same rollout-and-rewind search that runs the rest of this site. It snapshots the whole machine into 280 bytes, imagines nine macro-actions two levels deep, keeps the best, and throws the rest away.
The playtest ledger
Every cartridge was played twice by the Oracle, 1,200 frames per run, once with the reward pointing toward the other object and once pointing away. It was never told which was correct. Each run imagined 109,200 frames across 300 decisions. Round 2 exists only for the two cartridges that round 1 proved were broken.
| cartridge | R1 +1 | R1 -1 | R2 +1 | R2 -1 | verdict |
|---|---|---|---|---|---|
| CATCHER | 8 | 2 | — | — | playable, polarity discovered |
| DODGER | 4 | 8 | — | — | playable, polarity discovered |
| HUNTER | 8 | 0 | — | — | playable, polarity discovered |
| RICOCHET | 8 | 4 | — | — | playable, polarity discovered |
| LABYRINTH | 0 | 0 | 8 | 8 | born broken, repaired, signal now ties |
| SLALOM | 0 | 0 | 8 | 8 | born broken, repaired, signal now ties |
Where this fails
- Two of the six games were born broken. LABYRINTH and SLALOM scored zero on both polarities in round 1. The generator had emitted games where touching the other object was fatal but nothing ever incremented the score, so there was no way to win. It took 218,400 imagined frames per cartridge to prove there was nothing there.
- The repair overshot. Adding a survival tick made both cartridges max out at 8 on both polarities. That means the score no longer tells approach from avoid. They are playable now and the reward signal is useless. We are publishing that rather than tuning it until the table looks clean.
- This is not a general Atari 2600 emulator. The TIA is scanline-accurate, not cycle-accurate inside a line. There is no audio, no BCD arithmetic, no page-cross cycle penalty, and no bank switching. It runs the cartridges we write. It will not run your copy of Pitfall.
- The standard research harness refuses our games. ALE whitelists cartridges by MD5, so nothing NUMEN writes can be benchmarked against published Atari scores. Our carts are measured only by our own playtester.
- The Oracle gets help. Score alone is far too sparse at a horizon of eight frames, so the evaluation adds the Manhattan distance between the two objects. It is never told the sign — it finds approach or avoid by running both — but the shaping term is an assist and we are naming it.
- The games are thin. Two objects, a score bar, and walls. Nobody is going to lose a weekend to CATCHER. What is real is that the machine wrote the bytes, and the machine found out which of them were worth playing.
The ROM library
A complete harvest of every real cartridge image present on the machine NUMEN runs on: 108 Atari 2600 ROMs totalling 600,319 bytes, and 6 NES ROMs at 40,976 bytes each. These are the worlds the search brain already plays — the arcade and speedrun pages run on them.