Skip to main content
Back to articles
2026 / 02
| 6 min read

Deep Dive: Simulating DATAPAC, Canada's Forgotten Internet

Rebuilding the DATAPAC PAD experience in code: the command loop, X.25 NUAs, and five period-authentic hosts behind a 300-baud prompt.

emulator networking history x25 datapac
On this page

The prompt is a single asterisk. You dial in, wait for the banner, and then you’re staring at * while it waits for you to say where you want to go. DATAPAC was Canada’s packet-switching network, opened in 1977 and finally shut down by Bell at the end of 2009, though the dial-up era most people remember belongs to the 1980s and early 1990s.

I wanted to rebuild that experience. Not the X.25 protocol stack, which would be a different article, but the feel of sitting at a terminal, typing C 30200100100, watching the PAD do its work, and landing on a host that behaved like something you might have dialled in 1986. What I decided early: authenticity here lives in timing and vocabulary, not protocol fidelity.

The PAD as a State Machine

The command loop is the whole thing. The PAD accepts a line, and that line either routes you to a host or reconfigures how the PAD behaves. Everything else hangs off that loop.

The states:

  • CONNECT — show the banner and speed
  • PAD_PROMPT — read commands
  • CALLING — simulate setup delay
  • CONNECTED — forward input to a host
  • DISCONNECT — hang up

Banner, prompt, call, host, clear. Each state knows what input it accepts and where it can go next.

The Banner

DATAPAC didn’t open with a splash screen. It opened with a phone line and asterisks.

DATAPAC

CONNECTED TO DATAPAC

TELECOM CANADA DATAPAC NETWORK
1986-05-01 14:32:17 EST

TERMINAL: TTY
SPEED: 300 BPS

*

The CONNECTED TO DATAPAC line comes after a 500ms delay, enough to suggest the network acknowledged you. The date and time are real, generated from Date.now(). Terminal type and speed are hardcoded because the emulator doesn’t negotiate them.

When you’re connected to a host and press Escape, the emulator prints *** PAD RECALL *** and returns to the command loop. I kept that phrasing verbatim; it’s the sort of string that either means nothing to you or means a great deal.

The Commands

The PAD command set is terse. I implemented the ones that create the sensation of a terminal doing something on your behalf:

  • C <nua> / CALL <nua> — connect to a host
  • CLR — clear the connection
  • STAT — show connection state
  • SET <param>:<value> — configure PAD parameters
  • PAR — display current parameters
  • PROF — reset parameters to defaults
  • DIR — list available hosts
  • HELP — command reference
  • BYE — disconnect from DATAPAC

STAT and PAR are the ones that make it feel real. STAT reports whether you’re connected, to what NUA, and for how long. PAR surfaces a thin slice of the X.3 parameter space:

  • P1 PAD recall (escape key behaviour)
  • P2 echo mode
  • P3 forward character
  • P4 idle timer
  • P6 service signals
  • P12 flow control

That’s a small subset of X.3, chosen because it’s enough to make the PAD feel configurable. SET 2:0 actually works: it turns off local echo, and the line input handler respects the setting.

NUAs and the Directory

DATAPAC addressing is NUA-shaped: long numeric strings that look like phone numbers but route through packet switches. The emulator maps five NUAs to five virtual hosts:

NUAServiceWhat It Was
30200100100ENVOY 100Telecom Canada electronic mail
30200200200iNET 2000Bell Canada gateway to online databases
30200300300INFO GLOBEGlobe and Mail database
30200400400QL SYSTEMSQuicklaw legal database
30200555555DATAPAC BBSCommunity bulletin board

I had those first two backwards while building it, and the emulator’s own directory listing still says so: it labels ENVOY 100 as videotex and iNET 2000 as a mail service. Envoy 100 was Telecom Canada’s electronic messaging service, and iNet 2000 was Bell’s gateway to commercial databases. The table above is the corrected version.

DIR lists the hosts in a formatted table. Partial NUAs resolve, because real users typed short forms and the network did the rest. If nothing matches, the PAD returns CLR DTE NC (clear, DTE not connected) and drops you back to *.

The 800-Millisecond Pause

After CALLING 30200300300, the backend waits ~800ms before printing COM or clearing the call. That pause is what makes the network feel external rather than instantaneous.

CALLING 30200300300
COM

INFO GLOBE - THE GLOBE AND MAIL ELECTRONIC LIBRARY

The delay is hardcoded in attemptConnection(). I tried shorter values; they felt wrong. I tried longer values; they felt broken. 800ms is the threshold where the network has presence without frustration.

The Hosts Themselves

Each host is a small modal menu implemented as a state machine inside the backend. They’re not deep. They’re plausible.

ENVOY 100 logs you in with any username and shows a menu: news headlines, weather, stock quotes, electronic mail, directory. The news mentions Expo 86 and the new loonie. The weather lists five Canadian cities. The mail always reports “0 NEW MESSAGES.”

iNET 2000 takes a mailbox ID, greets you, and returns “NOT AVAILABLE IN DEMO” for every function.

INFO GLOBE accepts a search term and admits it has no database: “0 ARTICLES FOUND (DEMO MODE - NO DATABASE ACCESS).”

QL SYSTEMS lists legal databases — Supreme Court Reports, Federal Court Reports, Ontario Law Reports, Canadian Criminal Cases — and refuses to open any of them.

DATAPAC BBS is the only one that feels alive. Two messages from SYSOP and GUEST dated 1986, an active users list, and an info screen explaining that the BBS runs over X.25. A message board is the cheapest way to suggest activity without building a persistence layer.

None of these reconstruct the real services. They reconstruct the shape of them: the login prompts, the menu structures, the vocabulary.

What I Took From It

Five states, nine commands, six parameters. That’s not a simulation of X.25; it’s a simulation of what X.25 felt like from a terminal.

The real protocol had virtual circuits, flow control windows, packet sequencing, and a hundred details that never surfaced to the person typing. Starting from the user experience let me skip all of it and still land something recognizable to anyone who was there.

Pacing turned out to matter more than I gave it credit for. Dial 555-0325, wait for the banner, type C 30200100100, wait again — the rhythm carries more of the memory than the vocabulary does.


Phone: 555-0325

See also: Deep Dive: Bell 103 FSK Modem