Φ
NUMEN-1 · cartridge 002 · new
BLOODCROWN

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. →

NUMEN-1 · cartridge 001
The Last Flight Of The Dragolich

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. →

Game Development

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.

114
ROMs inventoried
6
cartridges NUMEN wrote
17,401
bytes of WebAssembly
0
float instructions

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.

download catcher.bin (2,048 B)
loading the machine…
CATCHER
Sky-drops fall. Stand under them. Eight makes the bar.
behaviour drop · contact good · walls none
md5 4dd0f2172314ac89c14d5cc03c92e5bc
483 bytes of code in a 2,048 byte cartridge
score $84
0
player $80/$81
0,0
other $82/$83
0,0
scanlines/frame
0
6507 cycles
0
frames
0
fps
0.0
halted
no
futures imagined
0
committed macro
hold
snapshot
0 B
branching
9 x 9 x 4

Four pieces, no engine

The assembler

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.

The grammar

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.

The machine

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 playtester

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.

cartridgeR1 +1R1 -1R2 +1R2 -1verdict
CATCHER82playable, polarity discovered
DODGER48playable, polarity discovered
HUNTER80playable, polarity discovered
RICOCHET84playable, polarity discovered
LABYRINTH0088born broken, repaired, signal now ties
SLALOM0088born 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.

Inventory only. Not one commercial ROM is hosted, served, or downloadable from this site. The only binaries you can download here are the six cartridges NUMEN wrote itself.
20
2,048 byte carts
52
4,096 byte carts
29
8,192 byte carts
1
10,495 byte carts
6
16,384 byte carts

Atari 2600 — 108 cartridges

adventure4,096
air_raid4,096
alien4,096
amidar4,096
assault4,096
asterix8,192
asteroids8,192
atlantis4,096
atlantis24,096
backgammon4,096
bank_heist4,096
basic_math2,048
battle_zone8,192
beam_rider8,192
berzerk4,096
blackjack2,048
bowling2,048
boxing2,048
breakout2,048
carnival4,096
casino4,096
centipede8,192
chopper_command4,096
combat2,048
crazy_climber8,192
crossbow16,384
darkchambers16,384
defender4,096
demon_attack4,096
donkey_kong4,096
double_dunk16,384
earthworld8,192
elevator_action8,192
enduro4,096
entombed4,096
et8,192
fishing_derby2,048
flag_capture2,048
freeway2,048
frogger4,096
frostbite4,096
galaxian8,192
gopher4,096
gravitar8,192
hangman4,096
haunted_house4,096
hero8,192
human_cannonball2,048
ice_hockey4,096
jamesbond8,192
journey_escape4,096
joust8,192
kaboom2,048
kangaroo8,192
keystone_kapers4,096
king_kong4,096
klax16,384
koolaid4,096
krull8,192
kung_fu_master8,192
laser_gates4,096
lost_luggage4,096
mario_bros8,192
maze_craze4,096
miniature_golf2,048
montezuma_revenge8,192
mr_do8,192
ms_pacman8,192
name_this_game4,096
othello2,048
pacman4,096
phoenix8,192
pitfall4,096
pitfall210,495
pong2,048
pooyan4,096
private_eye8,192
qbert4,096
riverraid4,096
road_runner16,384
robotank8,192
seaquest4,096
sir_lancelot8,192
skiing2,048
solaris16,384
space_invaders4,096
space_war2,048
star_gunner4,096
superman4,096
surround2,048
tennis2,048
tetris2,048
tic_tac_toe_3d2,048
time_pilot8,192
trondead4,096
turmoil4,096
tutankham8,192
up_n_down8,192
venture4,096
video_checkers4,096
video_chess4,096
video_cube4,096
video_pinball4,096
warlords4,096
wizard_of_wor4,096
word_zapper4,096
yars_revenge4,096
zaxxon8,192

NES — 6 cartridges

super-mario-bros-2-downsample40,976
super-mario-bros-240,976
super-mario-bros-downsample40,976
super-mario-bros-pixel40,976
super-mario-bros-rectangle40,976
super-mario-bros40,976