Play
The console from the repository, running in this page: the fast 2A03 and the fast 2C02 on one master clock through the authored glue, the sound through the board’s audio stage, and every frame encoded to the composite waveform and pulled apart by the three-line comb, exactly the signal path the ntsc bench runs. It is the same code the repository’s suites hold, compiled to WebAssembly from the recorded commit.
There is no cartridge here. Choose a .nes file from your own disk; it is read into a worker in this browser and goes nowhere else. Only NROM loads, the mapper the console has, and anything else is refused by name. The repository’s own test cartridge is what the site’s checks run, and its colour-bars cartridge is here to download: nobody’s game, the twelve hues in thirty-two-dot cells at one luma row, the row stepping every two seconds, the same file the capture comparison and the bench use.
Keys: arrows, Z and X for B and A, Enter for Start, right Shift for Select; or the pad below, a thumb on each side.
No cartridge. Choose a .nes file from your own disk; it never leaves this browser.
Under node on the repository’s bench the console with its sound runs at 84.3 frames a second, 1.40 times real time (2026-09-07). In a page the console and the signal path run on threads of their own, the shape the native shell settled on: the console keeps the source’s rate against the wall clock and the sound with it, and the picture decodes the newest frame at whatever rate this browser manages, a frame that arrived while it was busy counted as run but not decoded. The readout measures all of it live and the drift counters print what a real display would have duplicated or dropped, as the pacing rules specify. Where the browser gives the picture thread WebGPU, the whole picture runs there: the NES encoder as a compute pass (the source’s segment map, its transcribed levels and its wave rule, ported line for line, the levels and the grid taken from the encoder instance) and the comb decode as three more, the native shell’s shader with the display gamma left off, every constant from the decoder instance. Before it is used the first frame goes through the bundle’s own encoder and decoder as well: the readout states by how many volts the two encoders differed on any sample and by how many bytes of 255 the two decodes did, each against the tolerance it had to meet. Without WebGPU, or on a miss, the wasm path paints and the readout says so. The console page has the native shell’s figures.
The console bundle is built at the recorded commit e8562ad by the same script that measures this page’s figures, the signal path’s from e846070, and the records carry both bundles’ file hashes. The console’s tables were measured out of the switch-level chips, whose die data is CC BY-NC-SA, and that reaches this page: nothing here is for sale.