2024-11-12 - Involuntary Old Computer Challenge

My daily driver Slackware64 15.0 system died, so i am doing an involuntary old computer challenge. When it comes to obsolete resources, i have an embarassment of riches, including my phone and the public computers at the community library. However, those are the easy way out. What better excuse do i need to get nerdy?

Long ago, a friend gave me a raspberry pi 0w. At a thrift store i bought a (prolific?) USB RS-232 adapter for $1. From a family member i inherited an IBM PC with a Pentium processor and 32 MB of memory. I am happily running FreeDOS 1.3 on it.

I installed Alpine Linux on the raspberry pi and am using the FreeDOS PC as a terminal. I tried three different approaches for FreeDOS:

At home i only have WIFI network access. The raspberry pi acts as a bridge between the WIFI network and the RS-232 serial port on my DOS machine. Of the three approaches mentioned, i like kermit the best because it is reliable and has professional quality documentation.

Often on these retrocomputing explorations i will take detailed private notes, kind of a "build sheet" for my own future reference. I think it would be too obtuse to include these notes in their entirety, so i will post highlights.

telemate, with the raspberry pi as a virtual modem

Using tcpser as a virtual modem with telemate worked great. Telemate used the serial port and Hayes modem codes to dial out, and tcpser bridged that to a telnet BBS.

I installed the build-base package to get a GCC toolchain to compile tcpser on Alpine Linux.

Here's how i created my /etc/inittab entry for tcpser:

    # PHONE="$(printf %-21s 5553456789)=endofthelinebbs.com"
    # TCPSER=/home/ben/local/bin/tcpser
    # echo ttyUSB0::respawn:$TCPSER -d /dev/ttyUSB0 -s 9600 -n"$PHONE" \
        >>/etc/inittab

Why do i format the PHONE entry with printf? Telemate pads the phone number to 21 characters with trailing spaces. Those trailing spaces make a difference to tcpser, where a real modem would ignore them.

Why do i use ymodem for file transfers? Zmodem is not tuned for TCP/IP congestion control, etc. Ymodem performs better on a telnet BBS [3].

lsppp, with the raspberry pi as a PPP server

After some testing, i found that PPP and kermit file transfers do well with the serial port at full speed, but kermit terminal emulation is more reliable at slower speeds. For this reason i configured getty to toggle between 9600 and 115200 baud, when it receives a break.

I referred to the documents below [4] & [5] when configuring PPP.

Once configured, PPP worked great. I used the PING command from MTCP and the lynx and links browsers from the FreeDOS install CD.

I found it necessary to configure the PPP server option "lcp-echo-interval 0" or else lsppp would time out and disconnect after a few seconds.

I wrote a batch file ppp.bat which uses MS-DOS kermit as the chat script, then runs lsppp, and configures mtcp.cfg, wattcp.cfg, and sets a few environment variables such as DNS1 for the DNS server IP address.

By the way, here is NSLOOKUP.BAT, which uses MTCP:

    @echo off
    C:\FREEDOS\NET\MTCP\dnstest -name %1 -nameserver %DNS1%

kermit, with the raspberry pi as a Linux shell

I used the ctmouse mouse driver included with FreeDOS. I also configured mouse copy and paste using the "clip" package [6].

Here is the relevant section of my C:\FDAUTO.BAT

    C:\FREEDOS\BIN\CTMOUSE.EXE
    C:\UTIL\CLIP\WINOLDAP\WINOLDAP.COM
    C:\UTIL\CLIP\MOUSCLIP\MOUSCLIP /B32767

I click and drag the left mouse button to select text, and i right-click to paste text. This works at the command prompt and also in MS-DOS kermit.

I use MS-DOS kermit in two ways:

Kermit file transfers

Kermit can change the DOS serial port speed. The getty program can change the Linux serial port speed. If i am already logged into Linux, then i will need to exit to the login: prompt in order to return control to getty, so it can change the speed on the server.

    [C:\] MS-Kermit>set speed 115200
    [C:\] MS-Kermit>connect

I press Enter on the keyboard. If i see gibberish instead of a login: prompt, i press Alt-B to send a break. This triggers getty to toggle the Linux serial port speed. Once i get a login: prompt, then i log into a shell. I can use the "stty" command to verify the Linux server serial port speed.

At the Linux shell, i run "ckermit" to start the ckermit server. Then i press Alt-X to escape to the MS-DOS kermit prompt. At this prompt i can use the "remote dir" command to get a list of Linux files, "get" to get files from Linux, and "send" to send files from DOS.

When i am done transfering files, i type "c" and enter to return to the ckermit server prompt, then i type "q" and enter to quit back to the Linux shell prompt.

Kermit terminal emulation

Kermit terminal emulation is a little quirky at 115200 bps speed. I frequently needed to press Alt-R to reset the terminal emulator, then Ctrl-L to redraw the screen. The terminal emulation seems more reliable and stable at 9600 bps.

If i am logged in, then i will need to exit to the login: prompt in order to return control to getty, so it can change the speed on the server.

    [C:\] MS-Kermit>set speed 9600
    [C:\] MS-Kermit>connect

I press Enter on the keyboard. If i see gibberish instead of a login: prompt, i press Alt-B to trigger getty to toggle the Linux server serial port speed. Once i get a login: prompt, then i log into a shell. I can use the "stty" command to verify the Linux server serial port speed.

Copy / paste text from a DOS file

Suppose i wish to copy a snippet into Linux from the C:\FDAUTO.BAT file on the DOS machine? I have list.com in my path to view text files. First, i press Alt-X to exit to the MS-DOS kermit prompt, then i use the run command, like so:

    [C:\] MS-Kermit>run list.com C:\FDAUTO.BAT

I navigate to the desired section and drag the left mouse button to select text. I press the Esc key to quit back to the MS-DOS kermit prompt. I type "c" and the Enter key to return to Linux. Then i click the right mouse button to paste the text.

Input Unicode characters

MS-DOS kermit doesn't support multi-byte character sets. Alpine Linux with MUSL libc supports two character sets:

The C character set is 8-bit clean and single-byte. So simple!

I added the following snippet to my ~/.profile

    if [ "$TERM" = "vt100" ]
    then
        # probably kermit
        export CHARSET=C
        export LANG=C
    fi

Then i configured mskermit

    [C:\] MS-Kermit>set translation input off
      Input Translation is off
    [C:\] MS-Kermit>set terminal character-set transparent
    [C:\] MS-Kermit>set terminal display 8-bit
    [C:\] MS-Kermit>connect

Now i can enter CP437 data into the shell. My PC has standard BIOS, so i can enter the degree symbol by holding down the Alt key, pressing 2, 4, 8 on the number pad, then releasing the Alt key. After i enter this data into a file, then i can convert it to UTF-8 using iconv.

    $ awk 'BEGIN {printf "Preheat oven to 350%cF.", 248}' >test.cp437
    $ file test.cp437
    test.cp437: ISO-8859 text, with no line terminators
    $ iconv -f CP437 -t UTF-8 test.cp437 >test.txt
    $ file test.txt
    test.txt: Unicode text, UTF-8 text, with no line terminators

Note that test.cp437 is actually CP437 data, even though the file command reports ISO-8859. When editing test.cp437 with busybox vi, it will display a "." placeholder instead of the degree symbol. The "ed" editor will faithfully display the degree symbol.

One advantage of this method is that it seamlessly integrates with normal DOS methods of character display and input. One disadvantage is that it can only represent characters that exist in CP437. For a more capable workaround, i can use my modified version of UTF8TOCP [7].

For example, if i want to represent a Unicode degree symbol:

    $ echo "Preheat oven to 350\u00B0F." >test.enc
    $ utf8tocp -r 437 test.enc >test.utf8
    $ utf8tocp 437 test.utf8 >test.cp437

The \u00B0 represents the UTF-8 codepoint 00B0 for a degree symbol. The test.enc format is easy to edit in any editor. Both the calvin editor in DOS and the xvi editor in Linux display test.utf8 in the same way:

    Preheat oven to 350\302\260F.

The \302\260 represents octal escape sequences for the two bytes in a UTF-8 encoded degree symbol.

PicoMEM [8] is an 8-bit ISA card that allows a retro PC to get on WIFI using ne2k packet drivers in DOS.

Footnotes

[1] tcpser article
[2] tcpser patched for Alpine Linux
[3] Ymodem is better for telnet BBS
[4] Virtual modem guide
[5] Linux PPP HOWTO
[6] DOS clip utility
[7] UTF8TOCP with local changes
[8] PicoMEM

Tags

bencollver
nostalgia
retrocomputing
technical
unix