August 23rd, 2008
I recently wrote about wanting to have a teletype. Well, I have since realized that teletypes weigh hundreds of pounds, draw hundreds of watts, and aren’t available on eBay for a reasonable price. Well I knew the hundreds of pounds bit, but still. I pretty well have had to give up on a real teletype.
So, now on to the next best thing: a teletype simulator. Enter the two free dot-matrix printers that found their way to my office earlier this week. One of them even works. I bicycled to the awesome local office supplies store (about 11 miles away) to buy a ribbon for it. This is the place that’s been there since the 1890s. They still stock dot matrix ribbons, typewriter ribbons, and even fanfold paper.
On the project. Linux has its heritage in Unix, which was used with these devices. It can be made to work with them even now. But there’s a trick: teletypes used a bidirectional serial link. Dot matrix printers have no keyboard. So we have to take input from a different device than we send output to.
A simple trick will do for that:
TERM=escpterm telnet localhost > /dev/lp0
Now, here’s the next problem. Dot-matrix printers have a line buffer. They don’t start printing the line at all until they see CR or LF. Makes it annoying for interactive use. So I wrote a quick tool to insert into that pipeline. After a certain timeout after the input stops, it will force the printer to flush its buffer. Took a little while to figure out how to do that, too; turns out there’s a command ESC J that takes an increment for vertical spacing in 1/216 inch, and accepts 0. So I can send \x1BJ\x00 to flush the buffer. I can run it like this:
TERM=escpterm telnet localhost | escpbuf > /dev/lp0
That leaves another problem, though: the printhead is right over the text. (Even though it moves to the right of the printing position, and then moves back left for the next character to print.) I modified the program to roll the paper out a bit, and then reverse feed it to continue printing the line. But that is slow and, I suspect, tough on the stepper motor.
Also, I have crafted a terminfo file for the Epson-compatible dot-matrix printers (which are almost all of them), which can also be found at the above link.
So here’s the question, for anyone that has used a real teletype:
Did the printhead obscure the text there too, or could you see the entire current line at all times?