💾 Archived View for vigrey.com › blog › emulating-bell-103-modem captured on 2023-06-14 at 14:50:28. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2023-01-29)
-=-=-=-=-=-=-
The Bell 103 modem was a dial-up modem released by AT&T in 1962 that had a modulation rate of 300 baud. 300 baud means the modem was able to do 300 waveform changes per second. The Bell 103 modem used two sets of frequencies, one for the originating station and one for the answering station, so both stations were able to send information at 300 bits per second. For simplicity, we'll call the originating station the client and the answering station the server. The client used a mark tone of 1270Hz and a space tone of 1070Hz, while the server used a mark tone of 2225Hz and a space tone of 2025Hz. The mark tone is essentially the 1s and the space tone is essentially the 0s in a data stream.
A base carrier tone is sent by both the client and the server and essentially sends 1s continuously until actual data is sent.
If we wanted to send data over this modem connection, we could use a few data encoding standards, but a common one (and the one I currently use for my project "Modem-Tap") was ASCII 8-N-1 encoding.
8-N-1 stands for 8 data bits, no parity bit, 1 stop bit. The data being sent over is ASCII, where each ASCII character being sent over is 8 bits long. There are plenty of explanations online of how 8-bit ASCII works, so I won't go into too much detail, but just know that ASCII characters in this case are 8 digit long binary strings. There are two ways to represent the order of a binary string, either in Big-Endian or Little-Endian bit order.
Big-Endian bit order means that the most significant (largest) binary digit is first while Little-Endian bit order means that the least significant (smallest) binary digit is first. The names "Big-Endian" and "Little-Endian" come from the 1726 satire from John Swift titled "Gulliver's Travels", where a deep political rift occurs over whether to crack a boiled egg from the big end or the little end. Little-Endian is just the opposite order of Big-Endian. Shown below is the ASCII character lowercase h in both Big-Endian and Little-Endian bit order.
"h" ASCII 8-bit Encoding (01101000 - Big-Endian Bit Order, 00010110 - Little-Endian Bit Order)
8-N-1 encoding uses Little-Endian bit order.
Now to differentiate the data from the carrier tones (the constant 1s), we need to specify the start of the data, so 8-N-1 encoding uses a start bit of 0. 8-N-1 encoding also uses a stop bit of 1, so we'll place a 0 in the front of the 8 ASCII bits and a 1 at the end of it. This means every byte is total of 10 bits long and transfers 8 bits of data. The 8-N-1 encoded ASCII data "hi" differentiating itself from the bits of the carrier tone is shown below.
Below is an example of the client sending the 8-N-1 encoded ASCII data "hi" and the server responding with the 8-N-1 encoded ASCII data "OK".
"hi" Request "OK" Response Bell 103 Tones
A personal project I have been working on lately is a Bell 103 sound synthesizer called Modem-Tap, which takes a telnet connection and throttles it to the speed of a Bell 103 modem dial-up connection while also producing the client and server data stream sounds the dial-up connection would have produced. It is called Modem-Tap because it creates the sound (and can optionally create a WAV audio file) that would be heard if the phone line handling the dial-up connection was wiretapped.
Modem-Tap is just a personal project, but the code can be found at the following GitHub repo.