View source | |
# 2025-06-21 - ITA-2 Telegraph Code | |
Western Union Bicycle Messengers (1911) (Smithsonian) | |
A friend sent me a link to a video of someone creating art on an | |
old-school mechanical typewriter. Following up, i found typewriter | |
art books on the Internet Archive, one of which is dated 1936. | |
How To Make "Typeys" (1936) | |
Art Typing | |
I sent these links to another friend. I called it an example of | |
ASCII art from 1936. This friend informed me that ASCII didn't | |
exist in 1936. | |
Doing a little research, i found that what existed in 1932 was | |
ITA-2 telegraph code, which is encoded as 5-bit values that can be | |
punched on 5-hole paper tape. A perfect rabbithole to go down on | |
this rainy day. :-) | |
ITA-2 alphabet on 5-hole tape | |
I wrote a small AWK script to convert between ASCII and ITA-2. | |
The first limitation i noticed was that ITA-2 cannot represent every | |
ASCII character. Like my keyboard, ITA-2 lacks lowercase letters. | |
I wrote a small extension to work around this: any ASCII character | |
that doesn't exist in ITA-2 would get encoded as a five character | |
escape sequence. | |
* FIGURES | |
* ALLSPACE_NOTINUSE | |
* Octal digit1 | |
* Octal digit2 | |
* Octal digit3 | |
Why octal? Just for the fun of it. | |
Below is ita2.awk which converts between ASCII and ITA-2. | |
ita2.awk | |
Next i wrote an even smaller script to convert between ITA-2 and | |
simulated paper tape. Slackware's bsd-games package includes a `ppt` | |
command that simulates 8-hole tape. Below is ppt5.awk, which | |
simulates 5-hole tape. | |
ppt5.awk | |
To get a "tape" version of the natural musical tones: | |
$ printf ABCDEFG | mawk -f ita2.awk | mawk -f ppt5.awk >tones.txt | |
$ pr -n -t tones.txt | |
1 ________ | |
2 | .oo| | |
3 |oo . o| | |
4 | oo.o | | |
5 | o . o| | |
6 | . o| | |
7 | oo. o| | |
8 |oo .o | | |
9 -------- | |
For the round trip: | |
$ mawk -f ppt5.awk decode tones.txt | mawk -f ita2.awk decode | |
ABCDEFG | |
In xterm i can see a cat emoji using the following command. | |
$ printf "\360\237\220\261" >cat.txt | |
$ cat cat.txt | |
🐱 | |
To get a "tape" encoding of that cat: | |
$ mawk -f ita2.awk cat.txt | mawk -f ppt5.awk >tape.txt | |
$ pr -2n -t tape.txt | |
1 ________ 12 |oo .oo| | |
2 |oo .oo| 13 | . | | |
3 | . | 14 |o .oo| | |
4 | . o| 15 |o .oo| | |
5 |o o. o| 16 |o o.o | | |
6 |o o.o | 17 |oo .oo| | |
7 |oo .oo| 18 | . | | |
8 | . | 19 |o .oo| | |
9 |o .oo| 20 |o o. o| | |
10 | . o| 21 |o o.oo| | |
11 | o.oo| 22 -------- | |
To send that cat on a round trip: | |
$ mawk -f ppt5.awk decode tape.txt | mawk -f ita2.awk decode | |
🐱 | |
To be silly, here's the paper tape with corresponding pohl code: | |
1 ________ 12 |oo .oo| oddy-pod | |
2 |oo .oo| oddy-pod 13 | . | pohl | |
3 | . | pohl 14 |o .oo| ahtah-pod | |
4 | . o| poot 15 |o .oo| ahtah-pod | |
5 |o o. o| ahtah-tot 16 |o o.o | ahtah-dye | |
6 |o o.o | ahtah-dye 17 |oo .oo| oddy-pod | |
7 |oo .oo| oddy-pod 18 | . | pohl | |
8 | . | pohl 19 |o .oo| ahtah-pod | |
9 |o .oo| ahtah-pod 20 |o o. o| ahtah-tot | |
10 | . o| poot 21 |o o.oo| ahtah-tee | |
11 | o.oo| tee 22 -------- | |
Pohl Code | |
For a sanity check, i found an photo of 5-hole tape for CSIRAC, the | |
first digital computer in Australia. | |
5-hole tape photo | |
CSIRAC | |
I manually keyed in the first 10 characters visible in the photo. | |
$ pr -n -t 5hole.txt | |
1 ________ | |
2 |ooo. o| | |
3 |ooo.o | | |
4 | .oo| | |
5 |o o.oo| | |
6 | o . | | |
7 | o. | | |
8 | o .oo| | |
9 | .oo| | |
10 |ooo. | | |
11 | o . | | |
12 -------- | |
Now to decode the virtual paper tape. | |
$ mawk -f ppt5.awk decode 5hole.txt |\ | |
mawk -f ita2.awk decode |\ | |
hexdump -C | |
00000000 58 56 41 51 0d 20 4a 41 4d 0d |XVAQ. JAM.| | |
0000000a | |
I guess this means it's working? Apparently the lines of text end | |
with CR only and no LF. | |
See also: | |
Computerphile Paper Tape Video | |
DIY Paper Tape Puncher | |
p.s. | |
To run these examples with mawk on DOS, you may need to set an | |
environment variable MAWKBINMODE=1 | |
To run these examples with gawk, you may need to set an | |
environment variable LC_ALL=C | |
tags: history,retrocomputing,technical | |
# Tags | |
history | |
retrocomputing | |
technical |