Web100

News | Documentation | Hardware | Software | Books | Links

Having been the happy owner of a Tandy 200 for a long time, I've compiled some information that I've found useful for uploading to a PC from a T200 or T100 WITHOUT A TERMINAL PROGRAM. After a description of uploading procedure and some tips, I've included a TANDY 100/200 program which will upload all .DO and .BA files in a memory bank to a PC in one concatenated process, and a PC GWBASIC program to reconstitute them.

T200/100 <-> IBM PC
FILE EXCHANGE

by Kent Nickerson


1) TANDY File Types

Only 7-bit files can easily be transmitted and received by the T200/100. This means that only .DO files can be exchanged, so that .BA files must be saved in .DO (ASCII) format for uploading. .CO files on the TANDY cannot be uploaded without some sort of code/decode scheme. Multiplan spreadsheet files can be saved in SYLK format for upload and decoded by importing into spreadsheets capable of decoding SYLK format (like Quattro Pro).

2) Upload/Download Procedure

File exchange between a T200/100 and a PC involves the following steps:

  1. Connect a null modem cable from the TANDY RS232 port and a RS232 (serial) port of the PC.
  2. Use the MODE command on the PC and the STAT command in TELCOM on the T100/200 to match communications parameters.
  3. To download, go into TELCOM terminal mode on the T100/200, press "Down", then send the PC file out the appropriate port using the COPY command on the PC. Press "Down" again when the file transfer is complete.
  4. To upload, use the PC COPY command to direct its serial port input to a file. Go into terminal mode in TELCOM on the T100/200, press "Up" and specify the .DO file to transfer. Press CTRL-Z when the transfer is finished.

 

I will expand on these points:

a) Null Modem Cable

A NULL MODEM cable is required with a 25-pin male connector on one end (to mate with the TANDY female RS232 port connector) and a 9 or 25 pin connector on the other end to mate with a PC serial (RS232) port. Such a cable can be made from a normal RS232 cable with a NULL MODEM adapter available from computer shops for about $10.

A null modem cable can be made at home from a pair of connectors (preferably with "solder cup" connections) and a 7 conductor cable. For neatness, one should use a ribbon cable or jacketed cable with 7 or more wires. The connectors are wired in the following way:

2 --------------------------- 3 (2)
3 --------------------------- 2 (3)
4 -,------------------------- 8 (7)
5 -'                       ,- 4 (8)
8 -------------------------'- 5 (1)
7 --------------------------- 7 (5)
6 --------------------------- 20 (4)
20 --------------------------- 6 (6)

Pin numbers are for 25-pin connectors, while those in brackets are for 9-pin connectors. Note that pins 4 and 5 are shorted together on each connector. The pin numbers will be printed beside the connector pins (they will be hard to see!).

 

b) Setting Up Communications

When the cable has been installed, go into TELCOM on the laptop and select communications parameters which match those of the PC's serial port. Personally, I've experienced the occasional error at baud rates greater than 1200. There are many parameter permutations possible, but the one that I use is 1200 baud, even parity. Set this up on the TANDY by pressing "Stat" and typing:

57e1enn (on the T200)

or

57e1e (on the T100)

To set up the PC communications parameters, type:

mode comx: 1200,e,7,1

where "comx" is the PC serial port the null modem cable is hooked into (com1 or com2). If other comm parameters are desired, see the end of this document.

After the comm parameters are set and matched, press "Term" on the laptop to prepare for up/download. More details on communications parameters are included at the end of this document.

 

c) Download from PC to T200/100:

Press "Down" on the Tandy. When it turns reverse video, type on the PC:

copy filename comx:

where "comx" is the PC serial port used and "filename" the PC file to download. When transfer is complete (the transfer will appear on the laptop screen), push "Down" again to terminate.

NOTE: If there are many errors in download, decrease the baud rate.

Conversely, one may try a higher baud rate if no problems are experienced at 1200 baud.

 

d) Upload from T200/100 to PC:

On the PC, type:

copy comx: filename

where "filename" is the file you want to upload data to. Press "Up" and enter the name of .DO file to upload (extension not required). The "Width" parameter, if one is entered, specifies a maximum uploaded line length and will cause lines exceeding the length you specify to be cut into several lines less than or equal to it. If you do not specify this parameter, lines will be sent without any breaks other than those

already in the file. Generally, specifying no width is ok, but sometimes will cause a PC buffer overflow and abort if there are lines exceeding 255 characters.

After pressing Enter, the "Up" label should go into reverse video, indicating that upload is progressing. When it returns to normal video, the upload is finished. If the "Up" label is still in reverse video after a time (in seconds) of about the ten times the size of the file in bytes divided by the baud rate (e.g. about 20 seconds for a 2000 byte file at 1200 baud), there is something wrong with the cable or the communications parameters are not matched. You may have to reboot the

PC in this case to break it out of its reverie. If the upload has been performed, press CTRL-Z on the laptop (Hold down CTRL and press Z) to close the connection to the PC. The PC should save the file and return with a screen prompt. To abort an upload, press the reset switch in the back ot the laptop, enter TELCOM again, press "Term", then CTRL-Z to close the PC connection.

On most PCs, uploading in this manner will create files which have only line feeds for line breaks, resulting in lines which appear without carraige returns, like this, or in lines which overwrite when displayed because they have carriage returns but no line feeds. You can make your T100/200 send <CR><LF> pairs by modifying a specific byte by going into BASIC on the laptop and typing:

POKE 61243,1 (for the T200), or

POKE 63066,1 (for the T100)

The default value is 0 (for sending <LF> only). The new value will stay in effect as long as the computer is not cleared (by memory reset or by being without batteries for a long time). This modification may cause null characters (ASCII 0) to be added to the beginning and end of the document, but these are easily removed and indeed are ignored and stripped by some processors like WordPerfect.

 

3) Memory Bank Upload Utility

For those who wish to upload whole memory bank(s) at a time, I've written the following programs: BK.BA for the T100/200, and a PC GWBASIC parser. Program BK will upload all .DO and .BA files on a bank to a single concatenated file on the PC. The component (ASCII) files will be separated with a header with a marker line and the filename, like so:

FILENAME

The component files can then be separated with a word processor or automatically parsed by the PC GWBASIC program UNPACK, which is listed further on in this document.

Because of the Usenet's 80 column limitation, program lines 90, 100, and 180 are broken. Download the program as described above to the TANDY and restore the broken lines (without spaces) on the T100/200. It must be converted to a .BA file and named "BK" for use. To do this, go into BASIC and type:

load "filename"

where filename is the TANDY .DO program file. When the "Load" label stops flashing, type:

save "bk

The .DO file can then be erased (KILLed).

Once the program is on the laptop (it must be in the bank you want to upload), type "copy comx: filename" on the PC and run the program. The PC should automatically be released at the end of the transfer.

Notes: Sometimes this program will close the PC file after a BASIC (*.BA) file has been sent up from the TANDY. See comment on line 100 if you have this problem. Program BK.BA was derived in large part from a program written and distributed on CompuServe by James Yi (73327,1653 01/16/88)


10 ' Saves all .BA and .DO type files in the current ram bank to RS232. 
20 ' If program stopped, running again will save next file, but POKE Q,0 
30 ' will cause it to start over.  WARNING: Run program from .BA format.
40 MAXFILES=2:CLEAR600
45 IFPEEK(1)=171THENSL=62122:KB=64798:LF=61243 ELSESL=63919:KB=65450:LF=63066 50 POKE LF,1:OPEN "COM:57e1enn" FOR OUTPUT AS 2
60 Q=SL+3:F=PEEK(Q):IFF>48THENF=0
70 F=F+1:POKEQ,F:RD=F*11+SL:S=PEEK(RD)
75 IFS=255THENPOKE Q,0: PRINT #2,CHR$(26):PRINT"Done.":BEEP:END 
80 IFS=0THEN70
90 F$="":FORM=RD+3TORD+10:F$=F$+CHR$(PEEK(M)):NEXT:FP$=LEFT$(F$,6):F$=FP$+ "."+RIGHT$(F$,2)
100 IFS<>192ANDS<>128THENPRINT"File is binary or not recognized --";S;F$:GOTO70
110 IFF$="BK    .BA"THEN70
120 IFS=128THEN180 ' BASIC file
150 GOSUB230:OPEN F$ FOR INPUT AS 1
160 A$=INPUT$(1,1):PRINT #2,A$;
170 IFNOTEOF(1)THEN160ELSECLOSE1:GOTO70
180 GOSUB230:Q$=CHR$(34):K$=CHR$(127)+"Loadf$"+CHR$(13)+"Save"+Q$ +"com:57e1enn"+CHR$(13)+"Run"+Q$+"BK"+CHR$(13) 
190 ' Activate Keyboard Buffer
200 FORL=1TOLEN(K$):POKEKB+L*2-1,ASC(MID$(K$,L,1)):NEXT
210 POKE KB,L-1
220 END
230 PRINT"Saving:";CHR$(27)+"p"+F$+CHR$(27)+"q"
240 PRINT #2," ":PRINT #2,"!@#$!@#$":PRINT#2,F$:PRINT#2," "
250 RETURN

Some documentation:

Line 45 - Location 1 identifies a Model 100 or 200 (PEEK(1)=171 for a 200).

File directory, keyboard buffer, line feed enable locations assigned.

50 - The line feed patch is enabled. Normally, the TANDY does not issue LF characters on file transfers. This patch is useful for most computers, but some PCs' (HP150) will terminate receiving at the first carraige return if it is invoked. In such a case, change the first statement of this line to POKE lf,0. The RS-232 port is set as an output device at 1200 baud. Edit this segment if you want comm parameters changed.

60 - Location Q serves to count the number of files transferred, and to supply an index to byte RD, which contains a file type code (128=BASIC file, 192=text file). Since there is a maximum of 48 files, any greater number implies this program has not been run, and the file number is reset. Q is not an internal because all such variables are lost when the program calls itself in line 180-210.

70 - Head of program loop.

75 - Code = 255 indicates no more files. CTRL-Z sent to terminate PC receive.

80 - Provision for empty entry.

90 - Q is file name pointer.

100 - This program handles transfer of text and BASIC files only. Some PC's will stop receiving data from this program at the end of transmission of a BASIC file. If this is the case, change line 140 to:

140 IFS=128THEN70:' BASIC file (e.g. jump to 70 instead of 180)

(Lines 180 to 210 inclusive can be removed in this case, but will do no harm otherwise). If transfer of BASIC files are desired in this event, they must first be saved in ASCII format before invoking this program.

110 - Prevents transmission of the program file itself (save in .DO format if file copy desired).

120 - Escape (chr$(27)) sequences cause file name display in reverse video. 130 - Print file separation header to the PC file. If sequence changed, modify program UNPACK as well.

180-210: Load keyboard buffer with instructions to load .BA file, and save in ASCII form to RS232 port, and invoke BK again. Marker set in 60,70 gives restart point.

If the program is aborted, type POKE Q,0 to reset it fully.

Do not change the name of this program from "BK" without similarly changing all references to itself in the program. At any rate, the name cannot be longer than two letters, given keyboard buffer size limit in line 180.

The (concatenated) PC file can then be separated by a word processor, using the component file headers or else by using the GWBASIC program below on the PC. The program will check against overwriting existing files.


10 REM ********************  PROGRAM "UNPACK"  *****************************
20 REM
30 REM This program unpacks a composite text file composed of a number of 
40 REM  files delimited by a three line header.  The first header line is
50 REM  the string:
60 REM             !@#$!@#$      (e.g. a distinct marker)
70 REM  followed by the file name and a blank line.  These headers are 
80 REM  stripped and the separate files reconstituted.
90 REM
100   DIM BUFFER$(1001)       'A buffer is used to reduce disk file writes.
110 REM
120   ON ERROR GOTO 800
130     INPUT "Enter name of composite file >",C$
140     OPEN C$ FOR INPUT AS #1
150   EOFFL=0: ERRFL=0
160 REM
170 REM If a drive is specified (second character = ":"), set the drive
180 REM  as a filename prefix.  Unpacked files will go to this drive as well.
190 REM
200             PREFIX$=""
210     IF MID$(C$,2,1)=":" THEN PREFIX$=LEFT$(C$,2)
220 REM
230 REM Go through the file line by line until the first file header is found.
240 REM The first header usually is right at the file beginning, but "junk"
250 REM characters may precede it - hence the initial search using INSTR.
260 REM
270         LINE INPUT #1, A$
280   IF INSTR(A$,"!@#$!@#$")<>0 THEN 560
290   IF NOT EOF(1) THEN 270
300         PRINT "End of file reached - No file bounds found":END
310 REM
320 REM Read lines of the composite file until:
330 REM  1) 1000 lines are read
340 REM  2) the "!@#$!@#$" delimiter line is found, or
350 REM  3) end of file is reached.
360 REM In case 2), the counter is reduced by 1 to omit the delimiter line
370 REM
380   FOR I=1 TO 1000
390             LINE INPUT #1, BUFFER$(I)
400        IF NOT EOF(1) GOTO 430
410         EOFFL=1                 'End of file flag
420         GOTO 540
430        IF LEFT$(BUFFER$(I),8)="!@#$!@#$" THEN I=I-1: GOTO 540
440   NEXT I
450 REM
460 REM If 1000 lines read, write them to the output file, and resume reading 470 REM
480        FOR J=1 TO 1000: PRINT #2, BUFFER$(J): NEXT J
490     GOTO 380
500 REM
510 REM Case of delimiter encoutered.  Variable FIRST prevents "close #2"
520 REM  statement on first pass, since no output file is open then.
530 REM
540     FOR J=1 TO I: PRINT #2, BUFFER$(J): NEXT J    'Write final data
550         CLOSE #2                      'Close file
560   IF EOFFL<>0 GOTO 770          'End program if input file exhausted
570             LINE INPUT #1,F$    'Read file name
580             F$ = PREFIX$+F$           'Add directory
590         OPEN F$ FOR INPUT AS #2 'Attempt to open file
600 REM
610          IF ERRFL<>0 THEN 720   'File does not exist if no error
620             BEEP                'Case of file already existing
630         PRINT "File ";F$;" exists.  Overwrite? (Y,y=yes) >";
640         INPUT ANS$
650        IF ANS$="y" OR ANS$="Y" THEN 720
660         INPUT "Enter alternative file name (No entry will skip file) >",F$ 670 REM
680 REM A null file name will initiate search for the next file header.
690 REM Otherwise, an existence check is performed on the new file name.
700 REM
710        IF F$="" THEN 150 ELSE GOTO 580
720             ERRFL=0:CLOSE #2
730         OPEN F$ FOR OUTPUT AS #2      'Open new output file
740             PRINT "Restoring file ";F$
750             LINE INPUT #1, A$         'Ignore blank header line
760     GOTO 380
770     CLOSE
780     END
790 REM  Error Handler.  Primarily used to detect an error condition in 520.
800   ERRFL=ERR:RESUME NEXT   'Set error flag in case of error (ERR <> 0)

4) Communications Parameters for T100/200 and PC

While I have settled on 1200 baud even parity as my standard communications parameters, others may want to experiment with different parameters.

a) PC Communications Parameters

Command Syntax:

mode comx: b,p,d,s,r

where

comx: "x" can be any number from 1 to 4, depending on the port the null modem cable is attached to.

b=baud rate (110, 150, 300, 600, 1200, 2400, 4800, 9600, 19200) p=parity (e,o for "even" and "odd". Other options available, but they do not match T100/200 options)

d=data (number of dat bits - can be 5,6,7,8. Use 7 with the T100/200)

s=stop (number of stop bits - 1,1.5, or 2. Use 1 with T100/200) r=retry (I've not tried playing with this one)

Given the restrictions on the T100/200 communications parameters, and the fact that using even or odd parity is arbitrary, the generic PC communications parameter set command is (the retry parameter doesn't have to be specified):

mode comx: b,e,7,1

with x and b being adjustable.

b) T100/200 Communications Parameters:

The generic TANDY 200 communications parameter set command ("Stat") has 9 fields. Note there is a comma between fields 7,8 and 8,9. The T100 comm parameters are the same (I beleive) except there are no fields 6 and 7.

1st character:

M : 300 baud modem is the communications port

For the following, the communications takes place through the RS-232 port:

1 = 75 baud, 2 = 110, 3 = 300, 4 = 600, 5 = 1200, 6= 2400
7 = 4800, 8 = 9600, 9 = 19200

2nd character:

 

7 = 7 bit character length
8 = 8 bit character length (don't be fooled. You can't send 8 bit data)


3rd Character:

Parity:

E = Even
O = Odd
N = None
I = Ignore

4th Character:

Stop bits: 1 or 2

5th Character:

Xon/Xoff data enable/disable:

E = Enable, D = Disable

6th Character:

Control code filter:

I = Ignore control codes
N = Normal

7th Character:

Line Feed for incoming data only (not outgoing):

N = C/R = C/R
I = C/R = C/R + L/F

(comma)

8th character:

Modem Mode:

O = Originate Mode
A = Answer Mode

(comma)

9th Character(s):

  • 10, 20, or T for 10, 20 pps pulse dialing, or tone dialling.
  • The generic parameter set command for the T100/200 is
  • B7E1ENN for the T200 (last two fields not necessary)
  • B7E1E for the T100
  • where "B" can take on any value from 1 to 9 (as described above) to match the PC communications parameters.

 


I waive any claims against using or modifying the above programs and appeal to standard disclaimers regarding the use of the programs and this information. I hope that this, as a distillation of my satisfactory experience with the T200 serves as a complete guide and utility for TANDY to PC file exchanges.

Truly,
Kent Nickerson

 


ureturn.gif (2080 bytes)

Return to: | Documents | M200 |