(TXT) View source
       
       # 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:
       
       * telemate, with the raspberry pi as a virtual modem
       * lsppp, with the raspberry pi as a PPP server
       * kermit, with the raspberry pi as a Linux shell
       
       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.
       
       Here is an article describing tcpser:
       
 (HTM) https://magpi.raspberrypi.com/articles/add-internet-access-to-a-vintage-computer-using-raspberry-pi
       
       Here is a version of tcpser fixed for Alpine Linux:
       
 (DIR) gopher://tilde.club/1/~freet/gophhub/?https://github.com/go4retro/tcpser
       
       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.
       
 (HTM) http://www.ipingthereforeiam.com/bbs/msgs/view.plx?schema=echoes&id=255525&echo=cooking
       
       # 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 following documents when configuring PPP.
       
 (HTM) http://www.steptail.com/guides:virtual_modem
       
 (HTM) https://tldp.org/HOWTO/PPP-HOWTO/
       
       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.
       
 (DIR) gopher://tilde.pink/1/~bencollver/files/dos/util/clip/
       
       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 (works best at full speed)
       * Kermit terminal emulator (works best at 9600 bps)
       
       # 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:
       
       * UTF-8
       * C
       
       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.
       
 (DIR) gopher://tilde.pink/1/~bencollver/files/dos/util/utf8tocp/
       
       p.s.
       
       While i can use my CHARSET=C workaround at the shell, it won't work in
       tmux because tmux simply won't support CP437. GNU screen can be
       configured to do CP437, but it has bitrot and other issues.  I will
       use utf8tocp within tmux.  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 is an 8-bit ISA card that allows a retro PC to get on WIFI
       using ne2k packet drivers in DOS.
       
 (HTM) PicoMEM
       
       tags: bencollver,retrocomputing,technical,unix
       
       # Tags
       
 (DIR) bencollver
 (DIR) retrocomputing
 (DIR) technical
 (DIR) unix