Activision · Atari 2600 · 1982
Carol Shaw's endless river, the identical all period you fly it. The cartridge rebuilt from the first ROM, one education at a time: all bank, bridge, energy depot and missile behaves as the genuine device plays them.
Press Play, afterward shove up or blaze to obtain off
←→ steer · ↑↓ speed · Space blaze · Enter Game Reset
How to play
Fly up the stream and fire what gets in your way. Fuel drains the entire time: fly complete a depot to inhabit the container before the gauge reaches E. Touch a bank, a extend or item on the h2o and the jet goes down.
At the controls
- Steer←→ or AD
- Speed up↑ or W
- Slow down↓ or S
- FireSpace / Z
- Game ResetEnter
- Pause · MuteP · M
On a gamepad
- The joystickstick or D-pad
- FireA · B · X · Y
- Game ResetStart
- PauseBack
The Atari joystick has one clasp and eight directions, so all visage clasp fires. Sound starts following your archetypal click or key press; that is the browser's rule, not the cartridge's.
Fuel
The gauge under the stream runs from E to F. It drains all example you fly, faster than it looks, and a alert spirit starts formerly it drops below a quarter.
Fly complete a depot and the container refills during you remain on it. Shoot a depot alternatively and it is value 80 points, but the energy is gone.
Lives
You commencement alongside three jets and acquire another all 10,000 points, up to nine.
After a collision the stream rewinds to the commencement of the division and replays it exactly, since the cartridge saved its random numbers there.
The stream is never stored. The entire equivalent fits in a 4,096-byte cartridge, so all 32-line obstacle of stream is built fair before it scrolls into view, from a 16-bit random figure generator that starts from the identical seed, $A814, all game. That is why the stream never ends, and why it is the identical stream all period you play.
The river
Thirty-two blocks create a section, and all division ends at a road and a bridge. Odd sections run straight; equal ones breeze and divided about islands. Further up the stream there are additional enemies and small depots.
![]()
Tanker 30
Starts moving at random and patrols, turning rear whenever it touches a bank. Where the stream is too narrow for a ship, the cartridge puts a chopper there instead.
![]()
Helicopter 60
Its rotor is two shapes exchanged all another frame. Patrols akin the tanker.
![]()
Jet 100
Appears from division three. Crosses the entire display without stopping and wraps about at the edge.
![]()
Fuel depot 80
Refuels you during you fly complete it, or scores if you fire it.
![]()
Bridge 500
Shoot it to open the next section. Flying into it expenses a life.
![]()
House 0
Scenery on the banks and islands, and the lone item on the stream value nothing.
![]()
Built from the ROM
This is not an emulator. Every regular of the cartridge was rewritten in JavaScript one 6502 education at a time, operating on the identical 128 bytes of RAM at the identical addresses. To demonstrate it, a small 6502 center runs the genuine ROM beside the harbor and all example is compared, byte for byte.
0differences from the cartridge in 45,000 compared frames of play
300,000river-generator states checked, sections 1 to 48
31,840pixels of the beginning frame, identical to a Stella capture
4,096bytes in the entire cartridge, code and graphics
Read in the ROM. The code holds a few things the manual never mentions:
- There is no mark in memory. The six digits are pointers to the numeral graphics, and points are added to the pointers.
- Collisions arrive lone from the TIA's hardware latches, peruse formerly per stream block. There is no collision arithmetic at all.
- Flying into a ship, chopper or jet motionless scores it as you go down.
- Touching a home runs the identical code as touching a energy depot.
- When a new obstacle has lone fair scrolled in, a collision at the extremely top is submitted under a seventh obstacle that does not exist, and the emblem lands in the archetypal object's stance byte.
The harbor keeps all of it, since that is the game.
- Harness: the harbor alongside live score, fuel, lives and RAM readouts
- Inspector: the before ROM-visible example and its recollection views
- Verifying against the ROM: the 6502 oracle and the difference scripts