Transferring files from a PC to a TRS-80

I recently acquired a TRS-80 Model III and like most modern computer users have no way to write 5.25” diskettes from my PC. However, a quick web search netted Jeff Salzman’s most excellent instructions for solving this problem with a Model IV. Using this as a starting point, I adapted it to work for the Model III and made some improvements along the way.

Note – These are the instructions that worked with my Model III and LDOS 5.1.3. The same technique should work for other systems, but your mileage may vary.

Jeff’s instructions rely on the COMM program, which has a rather arcane command set. Seems like a lot of effort for a program you are never going to run again. Instead, we will make use of the LDOS ROUTE command to allow the PC to “type” directly into the TRS-80 BASIC editor. This also guarantees that no disk activity will occur during the transfer, since BASIC line editing is an in-memory operation. This allows us to boost the transfer speed from 300 to 1200 baud.

Bootstrapping XMODEM

1. Place the PC and TRS-80 next to each other. You will need to be able to see the TRS-80 screen while using the PC keyboard. Connect the two with a null modem cable.

2. Download and unzip the appropriate XMODEM software (Model III For Model IV use Model IV)

3. Fire up your favorite PC terminal program. I like TeraTerm.

4. Configure the serial port for 1200 baud, no parity, 8 bit word length, 1 stop bit, and no flow control (Setup->Serial Port in TeraTerm).

5. Boot the TRS-80 and enter this command on the TRS-80 keyboard:

SET *CL TO RS232T/DVR (B=1200,P=N,W=8,S=1)

This sets up the COMM driver for 1200 baud. This was the fastest speed I could get to work reliably.
6. Enter this command on the TRS-80 keyboard:


This instructs LDOS to use the serial port for all console input. We did not redirect console output, so you will still need to look at the TRS-80 screen to see what you are doing. The astute reader may decide to do this, but I prefer to leave the output unpiped to confirm proper receipt of the program lines.

7. From the PC terminal program, type this command (followed by ENTER):


8. Using your terminal program’s “send text file” function (File->Send File in TeraTerm) to transmit the .bas file downloaded in step 2. It will take approximately 60 seconds at 1200 baud. While uploading, monitor the TRS-80 screen to make sure the code “looks right”

9. Start the program using the following command. There is no need to save it first, it will execute right out of the BASIC memory buffer:


10. After several minutes of printing dots and disk activity, you should be greeted with two matching “Calculated checksum” and “Expected checksum” messages.

11. Press the orange reset button to undo all of the weirdness. You should be able to execute XMODEM/CMD (or XMODEM36/CMD) from the LDOS command prompt

Notes on XMODEM36/CMD

XMODEM36/CMD was the latest and greatest XMODEM program I was able to find for the Model III, but I found it a bit temperamental by modern standards. When used in the R or S modes, it relies on a previous program having set up the serial port. However, loading the LDOS *CL driver seems to interfere with XMODEM’s use of the serial port and I was unable to get reliable transfers at any baud rate.

When used in the T mode, XMODEM will set the baud rate for you, but the fastest it will allow is 1200 baud. So, I wrote a small program (DO96/CMD) which will initialize the serial port to 9600 baud. This will allow for fast, convenient transfers with modern hardware. Here is a BASIC binhex loader that can be transferred to your target system using the same technique as above:

31000 REM Created with BINHEX2/CMD on 01/01/80 00:02:38
31100 CLEAR 5000:CLS:DEFINT A-Z:H$="0123456789ABCDEF":READ LS$:LS$=LS$+":1"
31200 PRINT LS$:OPEN"O",1,LS$
31300 READ LS$:IF LS$="*" THEN READ CK:GOTO 31600
31400 FOR X=1 TO LEN(LS$) STEP 2:PRINT".";
31500 A1=INSTR(H$,MID$(LS$,X,1))-1:A2=INSTR(H$,MID$(LS$,X+1,1))-1:A3=A1*16+A2:DK=(DK+A3)AND255:PRINT#1,CHR$(A3);:NEXT X:GOTO 31300
31600 PRINT:PRINT "Calculated checksum =";DK:PRINT "Expected checksum =";CK
31800 CLOSE 1:END
31900 DATA DO96/CMD
32000 DATA 0506444F39362020013300613EFFD3E83EEED3E9
32001 DATA 3E6FD3EA211361CD1B02C953657269616C20706F
32002 DATA 72742073657420746F20393630302D4E2D382D31
32003 DATA 0D020200611A1A1A1A1A1A1A1A1A1A1A1A1A1A1A
32004 DATA 1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A
32005 DATA 1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A
32006 DATA 1A1A1A1A1A1A1A1A
32700 DATA *
32710 DATA 45


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s