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.
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 speedPAD_PROMPT— read commandsCALLING— simulate setup delayCONNECTED— forward input to a hostDISCONNECT— 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 hostCLR— clear the connectionSTAT— show connection stateSET <param>:<value>— configure PAD parametersPAR— display current parametersPROF— reset parameters to defaultsDIR— list available hostsHELP— command referenceBYE— 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:
P1PAD recall (escape key behaviour)P2echo modeP3forward characterP4idle timerP6service signalsP12flow 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:
| NUA | Service | What It Was |
|---|---|---|
30200100100 | ENVOY 100 | Telecom Canada electronic mail |
30200200200 | iNET 2000 | Bell Canada gateway to online databases |
30200300300 | INFO GLOBE | Globe and Mail database |
30200400400 | QL SYSTEMS | Quicklaw legal database |
30200555555 | DATAPAC BBS | Community 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