Abysmal Games LLC

7800 Link

PrototypeTested on my own console, November 2026

Two Atari 7800s playing one game together, linked through joystick port 2. Today it links a real console to an emulator; real console to real console, and over the internet, come next.

What it is

A small adapter plugs into joystick port 2 of an Atari 7800. It passes the game's updates to another 7800, so two players can each have their own console and their own TV, playing the same game.

In the video, my real 7800 (running a link test on a GameDrive cart) is linked to an emulated 7800 on a laptop. Both screens say LINKED; the joystick moves dot 1 on the TV and on the laptop, and the laptop's keyboard moves dot 2 on both.

That session ran for about 11 minutes: around 39,000 updates each way at 60 a second, with no drops.

Watch it on YouTube

A TV showing the console link test with status LINKED, a 7800 joystick, and a laptop running the emulated 7800 showing the same screen
The real 7800 on the TV (left) and the emulated one on the laptop (right), both LINKED.

How it works

The chain

Each 7800 connects from port 2 through a DB9 cable to an adapter, the adapter to a PC by USB, and the two PCs meet at an internet relay. YOUR HOME FRIEND'S HOME Atari 7800 the game runs here port 2, DB9 cable Adapter Arduino Leonardo USB PC a small bridge program Atari 7800 or an emulator port 2 Adapter Arduino Leonardo USB PC a small bridge program internet internet Relay rooms, results Two consoles in one room: a cable between their ports 2 does the same job, no PCs.

Either end can also be an emulator, or a 7800 running in a web browser, instead of a real console. Today's test: a real 7800 on one end, an emulator on the other.

Both consoles run the same game

Each console sends only its own player's joystick. Both consoles then compute the same update from the same two inputs, so both screens agree. 7800 A player 1's stick 7800 B player 2's stick inputs only, every update Update N P1 uses A's input P2 uses B's input same rules, same dice Update N P1 uses A's input P2 uses B's input same rules, same dice = Screen A player 1's view Screen B player 2's view same game, own view

Only the players' inputs travel, a few bytes per update. Each console works out the whole game from both inputs, in the same order, so both stay in step (this is called lockstep). Every input is used a few updates after it is pressed, on both consoles alike. That small, fixed delay gives the far input time to arrive, and the adapter answers the console straight away, so the game never stalls waiting on the internet. A check byte in every update catches the two consoles drifting apart.

The wiring

The adapter only uses the four direction pins of port 2 and ground. Each direction pin goes through its own 1 kOhm resistor, which keeps both sides safe if they ever disagree about who drives a line.

Port 2 pin (DB9)ThroughLeonardo pin
1 (up)1 kOhmD10
2 (down)1 kOhmD11
3 (left)1 kOhmD8
4 (right)1 kOhmD9
8 (ground)a plain wireGND
7 (+5 V)never connected
5, 6, 9not used

Pin 7 is the console's own 5 V supply; the PC's USB power and the console's must never meet. The adapter only ever pulls a line low or lets it go, never drives it high.

Pictures

The front of an Atari 7800 with a green DB9 screw-terminal breakout plugged into joystick port 2
A DB9 screw-terminal breakout on joystick port 2.
A breadboard with four resistors and jumper wires connected to an Arduino Leonardo board
The prototype adapter: four resistors on a breadboard and an Arduino Leonardo.

What could be possible

In the house or across the internet

Two 7800s in one room with a cable, or in two homes through the adapter and a relay.

Real hardware or a browser

A real 7800 against another one, an emulator, or someone playing in a web browser.

Two screens, head to head

Each player gets their own full view. DREAD 2P is the test game for this, in testing now.

Co-op

Two players on the same side, each on their own console and TV.

Turn-based games

Chess, cards and strategy, where internet delay does not matter at all.

3-letter tags

No accounts: you pick an arcade-style tag like ACE or ZAP.

A lobby, planned

The idea: a console shows a room code (or a QR code for a phone) and your friend joins it, from their own 7800 or from a browser. A JOIN ANY option would pair you with whoever is waiting. When nobody is around, you could play a BOT opponent, always clearly labelled, and bot games never count on the human leaderboard.

Mockup of a 7800 screen: waiting for partner, room code KWPR
Waiting with a room code.
Mockup of a 7800 screen with a QR code to join room KWPR from a phone or PC
A QR code to join from a phone.
Mockup of a 7800 screen with online stats: top players by tag and recent matches
Stats on the TV.

These are mockups of planned screens, with made-up names and numbers.

Leaderboards

Two kinds are planned:

  • Per-game stats, made for one game (for DREAD 2P: wins, frags, games played).
  • A generic leaderboard for any game that registers: the game sends a small report after each match (who won, the scores, and optionally a few columns of its own), and the board does the rest.

Both consoles send their report, and the relay counts a match only when the two reports agree.

See the lobby preview
A preview with sample data: nothing is live yet.

Build one

Not just yet! This is a prototype, and the firmware, wiring and games that support it are still changing. Nothing here is ready to use yet, so please hold off building one until the full build guide and the files are released. The list below is just to show what's involved.

The next adapter needs no soldering: every connection is a screw terminal. About $30 in parts and an evening.

  • Arduino Leonardo (a 5 V board) and a USB data cable
  • A screw-terminal shield that plugs on top of it
  • A DB9 extension cable, male to female, straight through (not "null modem")
  • A DB9 female screw-terminal breakout
  • 4 x 1 kOhm resistors and a little solid-core wire
  1. Flash the adapter's firmware onto the Leonardo, on its own.
  2. Fit the shield, then run each of pins 1 to 4 through its resistor to D10, D11, D8 and D9, and pin 8 to GND with a wire. Pin 7 stays empty.
  3. Check it with a meter before it goes near a console: about 1 kOhm on each line, ground beeps, nothing on pin 7.
  4. Console off: cable into port 2, USB into the PC, then power on.

A full build guide is coming soon. A small PCB version is planned later.

For developers

The link lives in the game: a game has to support it, so it only works with games built for it.

  • Small: about 660 bytes of ROM and about 40 bytes of RAM.
  • A few calls: start the link once, then exchange inputs every update.
  • Deterministic: the same inputs must give the same results on both consoles. Randomness comes from a seed both consoles share, and nothing in the game logic may depend on local timing.
link_start();          // find the other console
// then, every update:
link_my_in = my_stick;
link_exchange();       // swap inputs
p1 = link_in[0];       // the same two inputs
p2 = link_in[1];       // on both consoles

Notes

  • Port 2 is used by the link, so a linked game is played with the joystick in port 1.
  • On a GameDrive, set BREAK to off for link games: its break feature pulses port 2 and breaks the link.
  • Not yet tried on the Concerto or the 7800+.

Coming soon: the library (for cc7800 C, plain 6502 assembly and 7800basic), the protocol spec and the adapter files, all open source.

Status

Prototype A real 7800 linked to an emulated one through the adapter, on my own console (November 10, 2026).

Next:

  • Two real consoles over the internet.
  • DREAD 2P link tests.
  • The online lobby.

Part 2 of the video series will show two real consoles linked over the internet.