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: a) connect a null modem cable from the TANDY RS232 port and a RS232 (serial) port of the PC. b) use the MODE command on the PC and the STAT command in TELCOM on the T100/200 to match communications parameters. c) 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. d) 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 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 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 nickerso@mcmaster.ca