This is a text archive of the files for Tandy Color Computer (CoCo) Kermit. Each file is preceded by a line <<< name >>>, where "name" is the name of the file. The files begin on the next line. <<< ccexbin.bas >>> 110 ' EXBIN - CONVERT S-RECORD FORMAT TO BINARY 120 ' 130 PCLEAR 1 140 CLEAR 200,&H1FFF 150 DIM V(50) 160 AL=64*1024 ' LOWEST ADDRESS 170 AU=0 ' HIGHEST ADDRESS 180 AX=0 ' EXEC ADDRESS 190 AM=&H2000 ' MIN ALLOWED 200 SF=1 210 CLS 220 PRINT"EXBIN" 230 PRINT"CONVERT S-RECORD FILE TO BINARY" 240 ' 250 INPUT"S-FILE";NM$ 260 OPEN"I",SF,NM$ 270 ' 280 NREC=0 290 ' 300 ' MAIN LOOP - READ RECORD AND CONVERT IT 310 INPUT#SF,DL$: NREC=NREC+1 320 IF LEFT$(DL$,1)="S" THEN 380 330 PRINT "FILE IS NOT IN S-RECORD FORMAT." 340 PRINT "LINE";NREC 350 PRINT DL$ 360 STOP 370 ' RECORD TYPE (0,1 OR 9) 380 TYPE=VAL(MID$(DL$,2,1)) 390 ' RECORD LENGTH 400 LN=VAL("&H"+MID$(DL$,3,2)) 410 ' ADDRESS FIELD 420 ADR=VAL("&H"+MID$(DL$,5,4)) 430 ' COMPUTE CHECKSUM 440 CK=LN+INT(ADR/256)+ADR-256*INT(ADR/256) 450 ' DATA BYTES 460 IF LN<=3 THEN 510 470 FOR I=1 TO LN-3 480 V(I)=VAL("&H"+MID$(DL$,7+2*I,2)) 490 CK=CK+V(I) 500 NEXT I 510 CK=255-(CK-256*INT(CK/256)) 520 CS=VAL("&H"+RIGHT$(DL$,2)) 530 IF CK=CS THEN 580 540 PRINT"CHECKSUM ERROR AT LINE";NREC 550 PRINT DL$ 560 PRINT "COMPUTED ";HEX$(CK);" FOUND ";HEX$(CS) 570 STOP 580 IF TYPE=9 THEN TYPE=2 590 IF TYPE<0 OR TYPE>2 THEN PRINT"UNKNOWN RECORD TYPE ";TYPE:PRINT DL$:STOP 600 ON TYPE+1 GOSUB 640,720,840 610 IF TYPE<2 THEN GOTO 310 620 END 630 ' 640 ' FILE NAME RECORD 650 BN$="" 660 FOR I=1 TO LN-3 670 BN$=BN$+CHR$(V(I)) 680 NEXT I 690 PRINT"OUTPUT FILE = ";BN$ 700 RETURN 710 ' 720 ' DATA RECORD 730 IF ADR>=AM THEN 770 740 PRINT"ADDRESS ";HEX$(ADR);" LESS THAN ";HEX$(AM) 750 PRINT"AT LINE ";NREC 760 STOP 770 FOR I=0 TO LN-4 780 POKE ADR+I,V(I+1) 790 NEXT I 800 IF ADRAU THEN AU=ADR+LN-4 820 RETURN 830 ' 840 ' EXECUTION ENTRY RECORD 850 AX=ADR 860 PRINT"BINARY FILE = ";BN$ 870 PRINT"LOW ADDRESS = &H";HEX$(AL) 880 PRINT"HIGH ADDRESS = &H";HEX$(AU) 890 PRINT"EXEC ADDRESS = &H";HEX$(AX) 900 SAVEM BN$,AL,AU,AX 910 RETURN <<< cckermit.bwr >>> 26-Jul-86 20:09:12-EDT,1243;000000000001 Return-Path: Received: from usc-oberon.ARPA by CU20B.COLUMBIA.EDU with TCP; Sat 26 Jul 86 20:09:07-EDT Received: by usc-oberon.ARPA (4.12/5.5) id AA15164; Sat, 26 Jul 86 17:10:10 pdt Date: Sat, 26 Jul 86 17:10:10 pdt From: Bob Larson Message-Id: <8607270010.AA15164@usc-oberon.ARPA> To: info-kermit@cu20b.columbia.edu Subject: Re: CoCo Kermit Newsgroups: net.micro.6809 In-Reply-To: <273@vaxb.calgary.UUCP> Organization: U of Southern CA, Computer Services, Los Angeles This should probablby go the the beware file for coco kermit: In article <273@vaxb.calgary.UUCP> ingoldsby@calgary.UUCP writes: >I previously reported having some problems with getting V1.1 of CoCo >Kermit by Wes Hubert to work with our VAX UNIX Kermit. I found that >for some reason, someone had set the default number of pad chars on >the Coco Kermit to 1. The Vax didn't seem to care for this value and >when the Coco Kermit # of pad chars was set to 0, everything worked >fine. > >Terry Ingoldsby >...ihnp4!alberta!calgary!ingoldsby -- I'm having a brainstorm and I forgot my umbrella. (xg) Bob Larson Arpa: Blarson@Usc-Ecl.Arpa Uucp: ihnp4!sdcrdcf!usc-oberon!blarson <<< cckermit.doc >>> 1.0. TRS-80* Color Computer Kermit Version 1.1, March 1985 Kermit-CoCo is a program that implements the KERMIT file transfer protocol for the TRS-80 Color Computer. The minimum system re- quirements are a Color Computer with 16K memory, one disk drive, and a 300 baud (Bell 103/113 compatible) modem. Kermit-CoCo runs under the Radio Shack disk operating system and uses the built-in RS-232 port. It therefore does not require OS-9, the "deluxe" RS-232 pack, or any other hardware or software add-ons. It uses the disk ROM for file I/O and is compatible with both versions 1.0 and 1.1 of the Radio Shack ROM. Kermit-CoCo lets your Color Computer communicate with other systems in three ways. First, it is a terminal program. Your computer can function as a terminal connected to a remote com- puter. Second, it permits uploading (sending) and downloading (receiving) text files to and from a remote computer. Third, it provides KERMIT protocol file transfers of both text and binary files to and from a remote computer running KERMIT. KERMIT is a protocol designed for reliable file transfer. It was developed at the Columbia University Center for Computing Ac- tivities in 1981-82 where Bill Catchings and Frank da Cruz designed the protocol and implemented it for DEC-20 and CP/M com- puters. The two computers exchange information in small packets. The sending computer transmits a packet, then waits for an acknowledgement before sending another. Each packet includes in- formation used to validate the packet contents. If a packet is received incorrectly, the receiving system requests retransmis- sion of the packet. In addition to reliability, an advantage of Kermit over raw data transfer is that it permits transfer of binary files. This means Kermit can transfer Color Computer machine language programs, even over 7-bit connections. Kermit-CoCo implements only basic functions of the Kermit protocol. It does not provide time out, multiple file transfers, or server mode communication and the user interface is not as sophisticated as in many versions. It is, however, sufficient for simple, reliable file transfers. ____________ TRS-80 is a trademark of Tandy Corp., Fort Worth, Texas Kermit-CoCo - 1 - 03/85 1.1. Running Kermit-CoCo Kermit-CoCo consists of two files. CCKERMIT.BAS contains a short BASIC program to configure memory, load, and execute the machine code file. CCKERMIT.BIN contains the actual Kermit machine code. If you have obtained Kermit-CoCo in some way other than on a diskette, see section 1.6, Bootstrapping Kermit-CoCo. Make sure your modem is connected, place the Kermit-CoCo disk in your machine, and type: RUN"CCKERMIT" This runs the BASIC driver program, which loads and executes the machine language code. You can exit from Kermit-CoCo, execute other commands, then return to Kermit-CoCo with an EXEC command. Kermit-CoCo initially displays the following summary of command codes and parameter settings. KERMIT-COCO 1.1 (PREFIX CONTROL OR COMMANDS WITH DOWN-ARROW) 0 EXIT, ? PRINT MENU 1 LOCAL ECHO (N) 2 PARITY (E) 3 AUTO LF (N) 4 JOURNALIZE (N) 5 WRITE BUFFER TO FILE 6 READ FILE INTO BUFFER 7 UPLOAD BUFFER 8 ERASE BUFFER 9 DEF CHAR/LINE DELETE (08,18) KERMIT: = SET, < RECEIVE, > SEND ()!-# BRACES BAR TILDE DEL The current settings are shown in parentheses, where Y=yes, N=no, and E=even. The character and line delete codes are shown as hexadecimal values. If the default settings are correct for the system you are calling, continue with your normal sign-on procedure. First, however, the are a few things you need to know. 1.2. Multi-key Sequences The Color Computer keyboard has only 53 keys. It lacks some of the keys found on terminals; the most important of these is the CONTROL key. Since CONTROL is normally located to the left of the letter A, Kermit-CoCo uses the key in this position, the DOWN-ARROW, to indicate control codes. 03/85 - 2 - Kermit-CoCo Several other keys not shown on the keyboard are documented in the BASIC manual that came with your computer. These include using SHIFT-0 as a caps lock, SHIFT-DOWN-ARROW for [, SHIFT- RIGHT-ARROW for ], SHIFT-CLEAR for \, and SHIFT-UP-ARROW for un- derscore (underscore prints as a LEFT-ARROW). 1.2.1. ASCII Control Characters Unlike terminals, on which you press some other key while holding down the control key, in Kermit-CoCo you press the DOWN-ARROW first, release it, then press the key you want it to modify. For example, DOWN-ARROW followed by A generates the hexadecimal value 01 which is the ASCII code for control-A. Throughout the remainder of this document, control sequences are printed as "CTL-character"; for example, CTL-A for DOWN-ARROW followed by A. ASCII control codes (hexadecimal 00 through 1F) are generated by the standard combinations: CTL-@ for 00, CTL-A for 01, CTL-B for 02, ... CTL-Z for 1A, CTL-[ for 1B, CTL-\ for 1C, CTL-] for 1D, CTL-^ for 1E, and CTL-_ (SHIFT-UP-ARROW) for 1F. 1.2.2. Other Special Characters A second use of the DOWN-ARROW prefix is to generate other ASCII characters not on the keyboard. These are: ` CTL ' (Prints as inverse @) { CTL ( (Prints as inverse [) | CTL ! (Prints as inverse \) } CTL ) (Prints as inverse ]) Tilde CTL - (Prints as inverse ^) Rubout CTL # (Prints as inverse LEFT-ARROW) To help you remember these, they are shown at the bottom of the menu display. Some terminals have a special key for the ASCII escape code. It simply generates CTL-[ with a single key. Another key on many terminals is LINE-FEED. Use either CTL-DOWN- ARROW or CTL-J to generate the ASCII line feed character. On the Kermit-CoCo screen, LINE-FEED moves the cursor to the beginning of the next line. The BREAK key generates a break by sending a long (about 1/4 second) series of 0 bits. When CTL-G (bell) is received or typed on the keyboard it generates a tone through the speaker on your monitor. The LEFT-ARROW key backspaces the cursor and transmits a user selectable character deletion code. SHIFT-LEFT-ARROW transmits a user selectable line deletion code. Kermit-CoCo - 3 - 03/85 The CLEAR key clears the screen and moves the cursor to the upper left corner. It does not transmit any character. 1.2.3. Kermit-CoCo Commands A final use of the DOWN-ARROW key is for Kermit-CoCo commands. These include modifying parameter settings and beginning special actions such as KERMIT file transfers. CTL-? displays the main menu with current parameter settings shown in parentheses. CTL-0 terminates Kermit-CoCo and returns control to BASIC. You can restart Kermit-CoCo by entering EXEC. Modify control parameters by pressing the DOWN-ARROW key, then the number of the option you want to change. For example, if local echo is on (Yes), pressing CTL-1 changes it to off (No). Pressing CTL-1 again turns local echo back on. CTL-2 toggles the parity setting between even and none. Kermit- CoCo cannot communicate with systems that require other parity settings. Although Kermit-CoCo can generate even parity output it always ignores the parity bit of incoming data. The bit is not used for either parity checking or 8-bit data values. CTL-3 toggles local line-feed generation. When it is set to Yes, Kermit-CoCo adds a line-feed to the display after each carriage return. It does not transmit the added line-feed. After modifying parameters, you can verify the new settings by pressing CTL-? to display the menu with the new values. Setting character and line delete codes is similar, but requires a series of keystrokes. These codes, displayed as hexadecimal values on the menu, are transmitted by the LEFT-ARROW and SHIFT- LEFT-ARROW keys. To change the settings, press CTL-9, then the keys for the values to transmit. For example, CTL-9 @ CTL-X sets the character delete symbol to "@" (hexadecimal 40), and the line delete symbol to control-X (hexadecimal 18). You are now ready to use Kermit-CoCo as a terminal. The fol- lowing sections describe file transfer. 1.3. KERMIT File Transfers Kermit file transfers require a copy of Kermit on the remote com- puter as well as Kermit-CoCo on your system. The remote can range from another Color Computer to a large mainframe. 03/85 - 4 - Kermit-CoCo Before beginning a transfer, configure any necessary parameters using the CTL-= command described below. The default settings of EOL, SOH, etc. are appropriate for Kermit-CoCo and many other systems, but check documentation for the remote Kermit in case it requires other values. These must be correct or no communication can take place. 1.3.1. KERMIT Parameter Settings Typing DOWN-ARROW followed by an equal sign displays the current KERMIT parameter settings and leaves the cursor under the first. Pressing ENTER leaves all settings unchanged and returns to ter- minal mode. Any other key indicates a new value for the parameter above the cursor. To leave a parameter unchanged, press the space bar. Pressing any other key changes the parameter to the ASCII value of that key. The cursor then moves to the next parameter until you have responded for each one. Kermit-CoCo then returns to normal terminal mode. Note that for any parameter except the first, ENTER is taken as a parameter setting. Parameters that can be set are: TYPE COCO File Type: 0=BASIC, 1=TEXT, 2=Machine Code MODE COCO File Mode: 0=Binary, FF=ASCII EOL End-of-line required by the remote system when receiving Kermit packets. NTRY Maximum number for transmission attempts for each packet. SOH Start of packet character required by the remote Kermit. DBUG Debug flag: 0=Off, anything else=On When the debug flag is on, each packet sent is displayed on lines 9-11 of the screen and each packet received is displayed on lines 13-15. For example, to change the number of retransmission attempts, press CTL-=. Kermit-CoCo displays: TYPE MODE EOL NTRY SOH DBUG 00 FF 0D 05 01 00 Press the space bar three times to leave TYPE, MODE, and EOL un- changed, then type DOWN-ARROW and J to change the retry setting to 10 (10 is the decimal value of control-J). Press the space bar two more times to leave SOH and DBUG unchanged. The display now shows: TYPE MODE EOL NTRY SOH DBUG 00 FF 0D 05 01 00 00 FF 0D 0A 01 00 The second line of settings appeared as options were changed. Kermit-CoCo is now back in terminal mode. Kermit-CoCo - 5 - 03/85 To prepare to receive a machine code file, set TYPE to 2 (CTL-B) and MODE to 0 (CTL-@). Type and mode are automatically set when sending a file. They must be manually set for receiving. One reason that the distinction between binary and ASCII files is im- portant is that the Color Computer indicates end-of-line with a carriage return. When transmitting ASCII files, Kermit-CoCo adds a line-feed after each one. When receiving ASCII files, Kermit- CoCo replaces each carriage return followed by a line-feed with a single return. It does not insert or delete line feeds when processing binary files. Also, the operating system requires certain file types for certain types of processing. LOADM, for example, requires that a file be declared as machine code binary. Setting the type and mode parameters permits Kermit-CoCo to create the proper type of file. In addition to the space bar for leaving values unchanged, and ASCII codes for setting other values, the BREAK key can be used to set a parameter to hexadecimal FF. Several Kermit parameter settings are defined internally, with no provision for change. These include # for control quoting, & for 8th-bit (binary) quoting, and hexadecimal 0D (carriage return) for end of incoming packet. 1.3.2. Sending A File With KERMIT Before transmitting a file, the remote KERMIT must be ready to receive it. This is done through a RECEIVE command to the remote KERMIT. Press CTL-> on your keyboard. Kermit-CoCo requests the name of the file to transmit. Enter the name, and Kermit-CoCo begins sending. As each packet is sent, the packet number is shown as a hexadecimal value. If debug mode is active, the packets are also displayed on the screen. When the transfer is complete, the message TRANSFER COMPLETE appears on the screen and the ""bell" beeps. If the transmission fails, the message TRANSFER FAILED appears. In either case, Kermit-CoCo returns to terminal mode. If a "deadlock" occurs-- both KERMITs waiting for a message from the other, the packet number will stop changing. To break the deadlock and resume transmission, press the ENTER key. Before doing this, wait long enough to make sure that a deadlock really does exist. 1.3.3. Receiving A File With KERMIT Before attempting to receive a file, make sure that the file mode and type parameters are set correctly. Issue a SEND command for the remote Kermit, then press CTL-<. Kermit-CoCo will request a name for the incoming file. Unlike most KERMITs, Kermit-CoCo ig- nores the name in the incoming transmission, and writes the data to the file you specify. 03/85 - 6 - Kermit-CoCo The display while receiving is similar to that during transmis- sion. A hexadecimal packet number display keeps you posted on the status of the transmission. If a deadlock occurs, you can break it by pressing ENTER. Kermit-CoCo will signal either TRANSFER COMPLETE or TRANSFER FAILED at the end of the transfer, and return to terminal mode. Some remote Kermits can transmit multiple files. Do not use this capability with Kermit-CoCo. It can receive only one file at a time. 1.4. Journalizing A Session Kermit-CoCo can use all memory above the high end of the program (&H2FFF) as a buffer to keep a copy of all characters sent or received. This facility is used primarily for raw ASCII file transfers, but can also be used to journalize (keep a copy of) your terminal session. CTL-4 turns on session logging when it is off, turns it off when it is on. CTL-5 prompts for a file name and saves the buffer onto the file. CTL-8 erases the buffer by resetting the buffer pointer to the beginning of the buffer. Note that the buffer cannot be used for both raw file transfer and session logging at the same time. 1.5. Raw ASCII File Transfer Kermit transfers are more reliable than raw data transfers. They also permit transfer of binary (8-bit) data. However, since such transfers require Kermit on both the sending and receiving systems, Kermit-CoCo also provides raw ASCII file transfer. 1.5.1. Downloading Files CTL-R (Hex 12) places the system in download mode. Actually, it turns on the session logging buffer regardless of its current state. It can be entered at the keyboard or transmitted from the host system. Characters received following it are placed into the buffer. This mode ends when CTL-T is received or entered at the keyboard or when the buffer is filled. On a 16K system the buffer holds 4K bytes. On larger systems it hold 20K bytes. The pointer to the current buffer position can be reset by en- tering CTL-8 from the keyboard. This is a local signal only. It is not transmitted. If multiple downloads are done without reseting the buffer pointer, they will be stored one after another in the buffer. Kermit-CoCo - 7 - 03/85 1.5.2. Uploading Files Entering CTL-7 from the keyboard begins transmission of the buffer. As the upload takes place, the text is displayed on the screen. To prevent overprinting, you should turn on local line feed (CTL-3), then turn it off after the transfer is complete. While uploading, all keys except BREAK are ignored. The BREAK key can be used to stop the upload process. The upload ends automatically when the portion of the buffer currently in use has been transmitted. Before the buffer is transmitted, the remote computer must be prepared to receive its contents. To do this, enter the neces- sary commands (these depend on the remote system) using terminal mode before starting the upload. 1.5.3. Reading and Writing the Buffer CTL-5 writes the contents of the buffer to a disk file. CTL-6 reads a file into the buffer. For either function Kermit-CoCo will prompt for a file name. 1.6. Bootstrapping Kermit-CoCo The easiest way to get Kermit-CoCo is on a diskette. However, Kermit is also distributed in other ways which permit ASCII-only transfer. To support such transfer mechanisms, Kermit-CoCo is available in Motorola S-record format, along with a program to convert S-records to a binary file. It is also available in ASCII source format for input to the EDTASM+ assembler. 1.6.1. Using the S-record File To convert the S-record code to binary, you need to transfer files "CCEXBIN.BAS" and "CCKERMIT.S" to your diskette. Running "CCEXBIN" generates file "CCKERMIT.BIN", the executable version of Kermit-CoCo. Each S-record contains checksum information. If you did not receive the S-record file properly, CCEXBIN will stop with an error message. Transfer a new copy of CCKERM.S and try again. After you have CCKERMIT.BIN, create CCKERMIT.BAS with the fol- lowing program: 10 PCLEAR 1: CLEAR 200,&H1FFF 20 LOADM"CCKERMIT": EXEC You are now ready to run Kermit-CoCo. 03/85 - 8 - Kermit-CoCo 1.6.2. Assembling the Kermit-CoCo Source The source for Kermit-CoCo is in two parts. The first, COCOTERM.ASM, contains all of the terminal functions and raw ASCII file upload and download. The second, COCOPROT.ASM, con- tains the Kermit protocol source. The source files were prepared and assembled using the Radio Shack EDTASM+ ROM pack assembler, modified for disk I/O. It should be usable as is with the standard disk-based version of EDTASM+. For other assemblers minor changes may be necessary. Comments at the beginning of each file describe assembly and loading. No linker program is necessary to combine the two modules. As- semble the files to COCOTERM.BIN and COCOPROT.BIN, respectively. Load COCOTERM.BIN then load COCOPROT.BIN and SAVEM the code from address &H2000 through the end of COCOPROT.BIN. This is &H2EFE as distributed, but may vary with different versions of the as- sembler and with user modifications. Create CCKERMIT.BAS as described above. ORG pseudo-ops enable the separately assembled modules to com- municate; however, these require some care when modifying the code. Note that COCOPROT code begins loading at &H2800. Modifications to COCOTERM must not make the address of ZZTOP go beyond &H27FF. Such modifications would require changing the ORG statement ahead of KERMR in COCOTERM and the ORG statement at the beginning of COCOPROT. Increasing the size of COCOPROT so that address ZZZTOP is greater than &H2FFF would required changing the EQU statement for TOP in COCOTERM to place the origin of the raw data buffer beyond the end of the Kermit packet buffers. Kermit-CoCo - 9 - 03/85 <<< cckermit.s >>> S00F000043434B45524D49542E42494E97 S1232000204220D7210E214224562634266C271320B725CC4B45524D49542D434F434F202C S123202000434F50595249474854202843292031393835180800FF0030007FFF300000013A S1232040A312146010EF8D0749328D07AB1704FB170206308D0FA9AF8CDE9E74AF8CDB8D8E S12320603F17007327051703ED8D351700D427F181FF26048D3120E781FE260F6D8CB627A2 S12320800586081703D0A68CAB201181FD2605A68CA120086D8C9E27031703BA8D7020BF9C S12320A0B6FF224424FA397FFF208E6100301F26FC8602B7FF20393406EC8C838300012636 S12320C0FB358634108E00075F4624015C301F26F8465646351039B6FF224424024F39ECC5 S12320E08DFF5C44568300012EFBC6073406EC8DFF4D83000126FB12F6FF225466606A612E S123210026EC66603506847F817F26014F396D8DFF2427028DADC60834067FFF20EC8DFF58 S12321201E83000126FB64605959F7FF206A6126EC326217FF81C602F7FF2017FF7917FFC1 S123214076393404E69F00882B04E78DFEF5C6FFE79F00883504AD9FA000260139810326EF S12321600386FF398108260386FE398115260386FD39810C260934341703D035344F398130 S12321800A270139AD9FA00027FA81402505841FC60139813F26041700BF398130250481E1 S12321A03E2F283414308D0015E680A18527065A2AF9351439308D000CA685351439052712 S12321C02821292D23607B7C7D7E7F81302608351010EE8D05BC3981312606638DFE564F4E S12321E03981322606638DFE4D4F3981332606638DFE444F3981342606638DFE414F39814D S12322003526051704D44F39813626051704954F39813726051703004F398138260AEC8DE2 S1232220FE16ED8DFE164F398139261417FF1327FBA78DFDFF17FF0A27FBA78DFDF54F3911 S1232240813C2604BD280039813E2604BD280239813D2604BD2804393934361702ED308DFC S12322600062A68DFDCF4CA686A78D00CB3002A68DFDC34CA686A78D00D13002A68DFDB7C7 S12322804CA686A78D00D73002A68DFDB14CA686A78D00DDA68DFD9C1704D6ED8D0145A6F8 S12322A08DFD901704CBED8D013D308D001EEC81C30400DD88A68027F52B051702A420F5AA S12322C035364F39594E454E594E594E00084B45524D49542D434F434F20312E3100002288 S12322E02850524546495820434F4E54524F4C204F5220434F4D4D414E44530000422057B7 S123230049544820444F574E2D4152524F57290000623020455849542C20203F20505249F9 S12323204E54204D454E5500008231204C4F43414C204543484F20283F290000A232205031 S123234041524954592020202020283F290000C233204155544F204C4620202020283F29B0 S12323600000E234204A4F55524E414C495A4520283F2900010235205752495445204255D6 S12323804646455220544F2046494C450001223620524541442046494C4520494E544F20C4 S12323A0425546464552000142372055504C4F414420425546464552000162382045524193 S12323C0534520425546464552000182392044454620434841522F4C494E452044454C450D S12323E05445202858582C5858290001A04B45524D49543A203D205345542C203C205245F4 S123240043454956452C203E2053454E440001C22829212D2320425241434553204241522E S12324202054494C44452044454C0DFFB6FF0184F7B7FF01B6FF0384F7B7FF03B6FF238ACF S123244008B7FF23CC06F2F7FF208300081083000226F4860739A18DFBE7260A86FFA78DC4 S1232460FBDC17FC5239A18DFBD826066F8DFBCE20F0810726048DB4205C810C26071700A1 S1232480CA860C205181082606C660E79F0088810D261F6D8DFBA0263AE68DFBA6E79F0020 S12324A088C660E78DFB9CD689C4E0D78917FC072024810A261DE68DFB89E79F0088C660A5 S12324C0E78DFB7F860DD689CA1FD789170093860A200317008C6D8DFB64260139AE8DFBE0 S12324E05BAC8DFB552B076F8DFB538D0839A780AF8DFB48393402308D000FA68027051760 S1232500FF5420F717FBA0350239076275666665722066756C6C0A0010AE8DFB1B10AC8D23 S1232520FB1A2720A6A417FBE517FC16270481FF2712A6A017FF1F810D26E28E8000301F7F S123254026FC20D9C6FFE79F008839CC0400DD888E0480108E0580CC6000A785A7A55C26C0 S1232560F93934165F9E888108260B8C040027538660A7822027810D260E9E888660A78047 S12325801F10C51F26F62015812025374D2B0C814025068160250484DF8840A7809F885F84 S12325A08C05FF231E8E0400EC8820EE8822ED81EF818C05E025F19F88CC6060ED818C0670 S12325C00025F9C160270317FAED359634709EA6F6018EFE018F3454C67E338D0028F7011E S12325E08EFF018F10EF8D002F308D00219FA6A6841CFEBDADC686013554F7018EFF018F43 S12326009FA635704D3910EE8D000D4F20EA58B331AEFF8C2831290000003402B6C0058429 S1232620014833C635026ED4C8A4C952C468C48DCA3BCAE91700E97D2014272F8E094C86AF S123264020A7808C095725F9C6FF308DF9C65CA68526FB338D000A34406FE2CE26287E26ED S12326601A8649C601CE262CBD261A391700B17D2014272F8E094C8620A7808C095725F9C7 S1232680C6FF308DF98E5CA68526FB338D000A34406FE2CE26287E261A864FC601CE262C60 S12326A0BD261A3917FF8D7D2014272D8601976F17FF19261CBDA176AE8DF980AC8DF97A06 S12326C02A08A780AF8DF97420E617FE286F8DF96DCE263017FF430F6F39CC00FFFD0957F3 S12326E017FF897D094C272A8601976F10AE8DF94710AC8DF9462708A6A0AD9FA00220F100 S1232700810D2706860DAD9FA002CE263017FF0A0F6F398601976FCE263017FEFD0F6F3904 S1232720308D003EA680270517FE3720F7308DF8E35F17FA0D27FB810D272181FE26115DC5 S123274027F08660A79F0088860817FE155A20E2C10C27DEA78517FE095C20D617FE036FA1 S1232760853946494C454E414D452E4558543F200034025F48594859485948593502840FF5 S1232780C3303081392F028B07C1392F02CB071E8939FF00FF02FD00FF00FF00FF00FF00BF S12327A0FF02FF00FF00FD00FF00FF00FF00FF00FF02FF02FF00FF00FF02FF00FD02FF001F S12327C0FF00FF00FF00FF00FF00FF00FF00FF02FF00FF00FF00FF00FF00FF00FF00FF0003 S12327E0FF00FF00FF00FF00FF00FF00FD00FF00FF00FF00FF00FF000000FF00FF00FF00E6 S12328002004200520061605BE1604741603F94B45524D49542D434F434F20312E31002CD3 S123282020537E2F21402D23263120410D5E0000232600FF0D050100002146FF00FF00FFE1 S123284000FF00FF00FF00FF00FF00FF00FF008601976FAD9F20122607BDA1760F6F5F3959 S12328600F6FC601393414C601D76FAD9FA00235140F6F393402AD9F2010B6FF224424FAA8 S1232880350239A6802706AD9F200820F6393406C6203D6FE4E3E1C30400DD883934025F40 S12328A048594859485948593502840FC3303081392F028B07C1392F02CB071E89398DDDDF S12328C03404AD9F20083502AD9F200839CC0400DD888E0480108E0580CC6000A785A7A556 S12328E05C26F939DC883416CC030817FFA0A68DFF568DCAA68DFF518DC43516DD88391039 S12329009E88342017FF87A6808020847F3402A680AD9F20086AE426F68620AD9F2008D6A9 S1232920895CC47F26F535023506DD8839A68DFF04A78DFF15EC8DFF0FC30001ED8DFF08F6 S1232940395FA68480202712EB804A26FB1F98595959C4033404ABE0843F8B2039308D054D S1232960FF6F8DFECCE684C023273CA6038020A78DFEBA5A27315A272EA6058020A78DFECB S1232980AD5A2723A6068840A78DFEA35A27185A2715A608A78DFE985A270CA609815926B6 S12329A0028626A78DFE8A393410E684C0203AE68DFE7EE18DFE712704847F200D4D2A0A00 S12329C0E68DFE64E780847F201C810D26186D8DFE612712E68DFE4FE7808840A780E7809D S12329E0860A8840202AA18DFE3D260488402018A18DFE34260AA18DFE3726048840200891 S1232A0081202B04817F2608E68DFE1BE7808840A7801F10A3E43510CB20E784C01CE18D37 S1232A20FE0B2B03C601395F39341017FF13A7846D8DFE032708CC0800AEE417FEC1E68D52 S1232A40FDEC34046AE42B0AA68DFDE3AD9F200420F2350417FE8DA68DFDDBAD9F2004AE35 S1232A60E4E684C0203404A680AD9F20046AE42AF63504A68DFDBDAD9F2004351039308D17 S1232A80047CA7028623A784E68DFDBDC43FCB20E70117FEACA7848E8000301F26FC308D0A S1232AA0045C8D8539308D04B73410AD9F20062704810D2748AD9F200227F017FDB6A18D94 S1232AC0FD7426E7AEE4AD9F20062704810D272DAD9F200227F017FD9BA18DFD5927E5A7F8 S1232AE080A18DFD4726DF6D8DFD4C2708AEE4CC0C0017FE0A351017FE47A1843935108616 S1232B000139A68DFD2FA78DFD406D8DFD402714865917FF69EC8DFD2FC30001ED8DFD28CF S1232B206F8DFD2A6A8DFD222B5D308D043217FF742707864E17FF4620EA308D0422EC8D8F S1232B40FD06262117FE16308DFCD48659A70217FDEFA784308DFCC717FECECC0001ED8D0F S1232B60FCE6865339C43FCB20E1012707864E17FF0C20B06A8DFCD6308D03E4E684C023DF S1232B803003A61F8144398651395D260517FF7226045AA680395F396F8DFCB06F8DFCAD53 S1232BA05F17FFE62761A18DFC8726096C8DFC9D17FFD72752A18DFC77262F17FFCC274710 S1232BC0A18DFC6D2724A18DFC66271E88406D8DFC7B26166D8DFC5B27106D8DFC6E270AA8 S1232BE0810A26066F8DFC6420176D8DFC5F27028B806F8DFC56810D26046C8DFC4E17FCA2 S1232C00646F8DFC48209A3917FCC2308DFC0017FC71308D021617FC6A308DFC1586063427 S1232C20028620AD9F2008AD9F2008AD9F2008A68017FC8A6AE426E93502860AAD9F200831 S1232C40C6063404308DFBEA8620AD9F2008AD9F2008AD9F2008AD9F200627FAE6E4C106A4 S1232C602604810D271181202704A7802002A68017FC4B6AE426D13504860AAD9F2008390C S1232C8017FC4A308DFB8817FBF9308D021517FBF2AD9F200A7D2014260139FC0957ED8D53 S1232CA0FB90CC0000ED8DFB9FCC030017FBDF308D020B17FBCD8653308DFB63A702A68D6C S1232CC0FB73A78DFB846A8DFB80102B00E8308DFB4D17FD5417FDCD26ECA68D0284815947 S1232CE026E417FC78108E2014308DFB4E5FA6A52705A7855C20F7CB23308DFB3BE784178B S1232D00FC2B6A8DFB44102B00AC308DFB2A17FD1817FD9126ECA68D0248815926E4AD9FF9 S1232D202012265C17FC06308D01D3C43FE78DFB1ACB20E701C644E7028623A784AD9F209F S1232D4012260C17FB09308D01B417FC5B27EE6A8DFAF7102B005F308D01A317FCCB17FD46 S1232D604426EC308D01F9EC018020C1592709C14E102600414A843FA18DFACF26D1209E2C S1232D80AD9F200E17FBA66A8DFABF102B0027865A17FCEA17FD0E26EE17FB916A8DFAAA9A S1232DA0102B0012864217FCD517FCF926EE308D012017FACE39AD9F200E864217FCBF30B8 S1232DC08D012617FABD3917FB03308DFA4117FAB2308D00DA17FAABCC0000ED8DFA69EC7C S1232DE08DFA4FFD0957AD9F200C7D2014260139CC030017FA98308D00C417FA866F8DFA8D S1232E004D17FCFE8153262117FCF78146261A17FD86815A261317FCE98142260C8659178F S1232E20FC5CAD9F200E16FF8516FF8A0A0A414C4C20504152414D45544552532053484F78 S1232E40574E20494E204845580A454E544552204E45572056414C554553204259204B4520 S1232E605920434F44450A424C414E4B3D4E4F204348414E47452C20425245414B3D46462E S1232E800A0A202054595045204D4F44452020454F4C204E5452592020534F4820444255A1 S1232EA0470A000A53454E442046494C450A000A524543454956452046494C450A00504157 S1232EC0434B45542023303030302028484558290A000A075452414E5346455220434F4DEF S1222EE0504C45544507070A000A075452414E53464552204641494C454407070A00FFEB S9032000DC <<< ccprot.asm >>> 00010 * COLOR COMPUTER KERMIT VERSION 1.1 03/85 00020 * COPYRIGHT (C) 1985 BY WES HUBERT 00030 * 3020 STEVEN DRIVE, LAWRENCE, KS 66044 00040 * 00050 * THIS IS AN IMPLEMENTATION OF THE KERMIT 00060 * PROTOCOL DEVELOPED BY FRANK DA CRUZ AND 00070 * BILL CATCHINGS AT THE COLUMBIA UNIVERSITY 00080 * CENTER FOR COMPUTING ACTIVITIES. 00090 * 00100 * THE USUAL KERMIT PERMISSIONS APPLY: 00110 * THE PROGRAM MAY BE COPIED FOR PRIVATE USE 00120 * OR NON-PROFIT DISTRIBUTION, BUT CANNOT BE 00130 * SOLD OR INCORPORATED INTO OTHER SOFTWARE 00140 * SOLD FOR PROFIT. 00150 * 00160 * THIS VERSION OF KERMIT RUNS ON THE TRS-80 00170 * COLOR COMPUTER. IT SHOULD WORK WITH BOTH 00180 * VERSION 1.0 AND 1.1 DISK ROM. 00190 * MINIMUM SYSTEM IS 16K WITH ONE DISK. 00200 * 00210 * THIS PORTION OF THE CODE PERFORMS KERMIT 00220 * PROTOCOL TRANSFERS. IT REQUIRES PRIOR 00230 * LOADING OF A SEPARATE PROGRAM FOR 00240 * KERMIT-COCO GENERAL TERMINAL FUNCTIONS. 00250 * 00260 * THIS CODE IS SUITABLE FOR THE RADIO SHACK 00270 * EDTASM ASSEMBLER. IT WAS PREPARED FROM THE 00280 * ROM-PACK VERSION WITH THE DISK I/O MODS 00290 * FROM RAINBOW MAGAZINE. 00300 * 00310 * SINCE THIS IS AN IN-MEMORY ASSMBLER 00320 * (ASSEMBLER, CODE AND SYMBOL TABLES 00330 * ALL RESIDE IN MEMORY) COMMENTS ARE 00340 * SKETCHY. THESE COMMENTS DOWN TO 00350 * THE ORG MUST BE DELETED TO GET 00360 * ENOUGH MEMORY TO ASSEMBLE. 00370 * 00380 * 1. ASSEMBLE BOTH TERMINAL & PROTOCOL CODE. 00390 * 2. PCLEAR 1: CLEAR 10,&H1FFF 00400 * 3. LOADM"COCOTERM" 00410 * 4. LOADM"COCOPROT" 00420 * 5. SAVEM"CCKERMIT",&H2000,&H2FFF,&H2000 00430 * 00440 * THIS VERSION OF KERMIT SENDS OR RECEIVES 00450 * ONLY ONE FILE AT A TIME. THE NAME MUST 00460 * BE EXPLICITLY GIVEN BY THE USER. THIS 00470 * IS TO PLACE RESPONSIBILITY TO AVOID 00480 * OVERWRITING EXISTING FILES ON THE USER. 00490 * 00500 ************************* 00510 * KERMIT-COCO ENTRIES * 00520 ************************* 00530 * 00540 ORG $2800 (ADDRESS KNOWN TO TERMINAL CODE) 00550 BRA LRCV (RECEIVE) 00560 BRA LSEND (SEND) 00570 BRA LSET (SET-UP) 00580 LRCV LBRA KRCV 00590 LSEND LBRA KSEND 00600 LSET LBRA KSET 00610 * 00620 ************************* 00630 * TERMINAL ENTRY POINTS * 00640 ************************* 00650 * 00660 RS232I EQU $2002 (RS232 INPUT) 00670 RS232O EQU $2004 (RS232 OUTPUT) 00680 KEYIN EQU $2006 (KEYBOARD INPUT) 00690 CHROUT EQU $2008 (DISPLAY OUTPUT) 00700 INNAME EQU $200A (OPEN INPUT FILE) 00710 OTNAME EQU $200C (OPEN OUTPUT FILE) 00720 FCLOSE EQU $200E (CLOSE FILE) 00730 WAIT EQU $2010 (PAUSE 1 BIT TIME) 00740 QEOF EQU $2012 (TEST FILE EOF) 00750 FNAME EQU $2014 (FILENAME BUFFER) 00760 * 00770 ************************* 00780 * COCO DEFINITIONS * 00790 ************************* 00800 * 00810 UNIT EQU $6F (I/O UNIT#) 00820 SCRPTR EQU $88 (SCREEN POINTER) 00830 SCREEN EQU $400 (SCREEN MEMORY) 00840 RTYPE EQU $957 (TYPE/MODE) 00850 PUTCHR EQU $A002 (PUT CHAR, INDIRECT) 00860 GETCHR EQU $A176 (READ SINGLE CHAR) 00870 INPIA EQU $FF22 (INPUT PIA) 00880 * 00890 HEADER FCC 'KERMIT-COCO 1.1' 00900 FCB 0 00910 * 00920 ************************* 00930 * KERMIT INIT PACKET * 00940 ************************* 00950 * 00960 INPAK RMB 0 00970 INLNG FCB 44 (LENGTH+32) 00980 FCB 32 (PACKNO+32) 00990 INTYPE FCC 'S' (SEND INIT) 01000 MYMAXL FCB 126 (MAX PACKET SIZE+32) 01010 MYTIME FCB 47 (15 SECOND TIMEOUT) 01020 MYPADN FCB 33 (1 PAD CHAR) 01030 MYPADC FCB $40 (NULL) 01040 MYEOLI FCB 45 (EOL=CARRIAGE RETURN) 01050 MYQCTL FCC '#' (CONTROL QUOTE) 01060 MYQBIN FCC '&' (BINARY QUOTE) 01070 MYCHKT FCC '1' (1-BYTE CHECKSUM) 01080 MYREPT FCB 32 (NO REPEATS) 01090 RMB 1 (PLACE FOR CHECKSUM) 01100 MYEOL FCB 13 (MYEOLI-32) 01110 * 01120 ************************* 01130 * REMOTE CHARACTERISTICS* 01140 ************************* 01150 * 01160 MAXL FCB 94 (MAY BE 01170 PADN FCB 0 REVISED 01180 PADC FCB 0 BY THE 01190 QCTL FCC '#' REMOTE INIT 01200 QBIN FCC '&' PACKET) 01210 * 01220 ************************* 01230 * SETABLE PARAMETERS * 01240 ************************* 01250 * 01260 FTYPE FCB 0 (FILE TYPE=BASIC) 01270 FMODE FCB $FF (FILE MODE=ASCII) 01280 EOL FCB 13 (C.R.) 01290 MAXTRY FCB 5 (# OF RETRIES) 01300 SOH FCB 1 (PACKET HEADER) 01310 QDEBUG FCB 0 (0=NODEBUG) 01320 * 01330 ************************* 01340 * FILE NAME PACKET * 01350 ************************* 01360 * 01370 FBUFF FCB 0 (LENGTH) 01380 FCB 33 (PACKET #) 01390 FCC 'F' (TYPE) 01400 FBN RMB 12 (NAME) 01410 RMB 1 (CHECKSUM) 01420 * 01430 ************************* 01440 * SCRATCH VARIABLES * 01450 ************************* 01460 * 01470 NPACK RMB 2 (CURRENT PACKET) 01480 NTRY RMB 1 (REMAINING RETRIES) 01490 SNUM RMB 1 (PACKET MOD 64) 01500 QCR RMB 1 (CR PENDING) 01510 FBIN RMB 1 (HIGH BIT FLAG) 01520 NEEDAK RMB 1 (ACK PENDING) 01530 * 01540 ************************* 01550 * READ CHAR FROM FILE 1 * 01560 * RETURN CHAR IN A * 01570 * CLEAR Z FLAG ON EOF * 01580 ************************* 01590 * 01600 FGET LDA #1 (UNIT #1) 01610 STA UNIT 01620 JSR [QEOF] 01630 BNE FGETE 01640 JSR GETCHR (BASIC ROM) 01650 CLR UNIT 01660 CLRB 01670 RTS 01680 FGETE CLR UNIT 01690 LDB #1 (FLAG EOF) 01700 RTS 01710 * 01720 ************************* 01730 * PUT CHAR INTO FILE 1 * 01740 * RECEIVE CHAR IN A * 01750 ************************* 01760 * 01770 FPUT PSHS X,B 01780 LDB #1 (UNIT #1) 01790 STB UNIT 01800 JSR [PUTCHR] 01810 PULS X,B 01820 CLR UNIT (BACK TO SCREEN) 01830 RTS 01840 * 01850 ************************* 01860 * SYNC AFTER RS232 INPUT* 01870 ************************* 01880 * 01890 SYNC PSHS A (SAVE INCHAR) 01900 JSR [WAIT] (ONE BIT-TIME) 01910 SYNC1 LDA INPIA 01920 LSRA 01930 BCC SYNC1 (WAIT FOR STOP BIT) 01940 PULS A 01950 RTS 01960 * 01970 ************************* 01980 * PRINT STRING [X] * 01990 * STRING ENDS WITH NULL * 02000 ************************* 02010 * 02020 PRINT LDA ,X+ (CHAR FROM STRING) 02030 BEQ PRINTX (NULL MARKS END) 02040 JSR [CHROUT] 02050 BRA PRINT 02060 PRINTX RTS 02070 * 02080 ************************* 02090 * CURSOR TO LINE=A,COL=B* 02100 ************************* 02110 * 02120 AT PSHS D 02130 LDB #32 (LINE 0-15) 02140 MUL 02150 CLR ,S 02160 ADDD ,S++ (ADD COL 0-31) 02170 ADDD #SCREEN (SCREEN ORIGIN) 02180 STD SCRPTR 02190 RTS 02200 * 02210 ************************* 02220 * BINARY VALUE TO HEX * 02230 ************************* 02240 * 02250 TOHEX PSHS A (BINARY VALUE) 02260 CLRB 02270 LSLA (HIGH 4 BITS TO B) 02280 ROLB 02290 LSLA 02300 ROLB 02310 LSLA 02320 ROLB 02330 LSLA 02340 ROLB 02350 PULS A 02360 ANDA #$F (ORIGINAL LOW 4) 02370 ADDD #$3030 (ASCII EXCESS) 02380 CMPA #$39 02390 BLE THX2 02400 ADDA #7 02410 THX2 CMPB #$39 02420 BLE THX4 02430 ADDB #7 02440 THX4 EXG A,B 02450 RTS 02460 * 02470 ************************* 02480 * OUTPUT VAL(A) IN HEX * 02490 ************************* 02500 * 02510 HEXOUT BSR TOHEX (VAL(A) TO HEX(D)) 02520 PSHS B 02530 JSR [CHROUT] 02540 PULS A 02550 JSR [CHROUT] 02560 RTS 02570 * 02580 ************************* 02590 * CLEAR SCREEN * 02600 ************************* 02610 * 02620 CLEAR LDD #SCREEN 02630 STD SCRPTR (HOME CURSOR) 02640 LDX #SCREEN+$80 02650 LDY #SCREEN+$180 02660 LDD #$6000 (60=SCREEN BLANK) 02670 CLR2 STA B,X 02680 STA B,Y 02690 INCB 02700 BNE CLR2 (256 TIMES) 02710 RTS 02720 * 02730 ************************* 02740 * SHOW CURRENT PACKET # * 02750 ************************* 02760 * 02770 SNDSTS LDD SCRPTR (SAVE SCREEN LOC) 02780 PSHS X,D 02790 LDD #$0308 (LINE 4, COL 9) 02800 LBSR AT (MOVE CURSOR) 02810 LDA NPACK,PCR 02820 BSR HEXOUT 02830 LDA 1+NPACK,PCR 02840 BSR HEXOUT 02850 PULS X,D 02860 STD SCRPTR 02870 RTS 02880 * 02890 ************************* 02900 * ECHO PACKET TO SCREEN * 02910 * RECEIVE A=LINE, B=CHR * 02920 * FOR START OF DISPLAY * 02930 ************************* 02940 * 02950 ECHO LDY SCRPTR (SAVE SCREEN LOC) 02960 PSHS Y 02970 LBSR AT 02980 LDA ,X+ (LENGTH) 02990 SUBA #32 03000 ANDA #$7F (128 CHAR MAX) 03010 PSHS A 03020 ECHO2 LDA ,X+ 03030 JSR [CHROUT] 03040 DEC ,S 03050 BNE ECHO2 03060 LDA #' (ADD BLANKS) 03070 ECHO4 JSR [CHROUT] 03080 LDB 1+SCRPTR 03090 INCB 03100 ANDB #$7F (TO EVEN 128 BYTES) 03110 BNE ECHO4 03120 PULS A 03130 PULS D (SCREEN LOC) 03140 STD SCRPTR 03150 RTS 03160 * 03170 ************************* 03180 * PREPARE TO SEND PACKET* 03190 ************************* 03200 * 03210 NEWPAK LDA MAXTRY,PCR 03220 STA NTRY,PCR (SET # RETRIES) 03230 LDD NPACK,PCR 03240 ADDD #1 (BUMP PACKET #) 03250 STD NPACK,PCR 03260 RTS 03270 * 03280 ************************* 03290 * COMPUTE CHECKSUM * 03300 * PACKET ADDRESS IN X * 03310 * RETURN CHECKSUM IN A * 03320 * CHECKSUM ADDRESS IN X * 03330 ************************* 03340 * 03350 CHKSUM CLRB 03360 LDA ,X (LENGTH) 03370 SUBA #32 03380 BEQ CHKX 03390 CHK2 ADDB ,X+ 03400 DECA 03410 BNE CHK2 (SUM ALL BYTES) 03420 TFR B,A 03430 ROLB (MOVE HIGH 2 BITS 03440 ROLB TO LOW BITS 03450 ROLB THROUGH CARRY) 03460 ANDB #3 (2 BITS ONLY) 03470 PSHS B 03480 ADDA ,S+ (ADD INTO LOW 6) 03490 ANDA #$3F (KEEP 6 BITS) 03500 CHKX ADDA #32 (PRINTING ASCII) 03510 RTS 03520 * 03530 ************************* 03540 * GET PARAMS FROM S PAK * 03550 ************************* 03560 * 03570 REMINI LEAX RBUFF,PCR 03580 CLR QBIN,PCR (CLEAR 8TH-BIT QUOTE) 03590 LDB ,X (LENGTH) 03600 SUBB #35 (LESS SEQ,TYPE,CHKSUM,32) 03610 BEQ REMX 03620 LDA 3,X 03630 SUBA #32 03640 STA MAXL,PCR 03650 DECB 03660 BEQ REMX 03670 DECB (CAN'T TIME OUT) 03680 BEQ REMX 03690 LDA 5,X 03700 SUBA #32 03710 STA PADN,PCR 03720 DECB 03730 BEQ REMX 03740 LDA 6,X 03750 EORA #$40 03760 STA PADC,PCR 03770 DECB 03780 BEQ REMX 03790 DECB 03800 BEQ REMX 03810 LDA 8,X 03820 STA QCTL,PCR 03830 DECB 03840 BEQ REMX 03850 LDA 9,X 03860 CMPA #'Y (Y=& IF REQUESTED) 03870 BNE REM4 03880 LDA #'& 03890 REM4 STA QBIN,PCR 03900 REMX RTS 03910 * 03920 ************************* 03930 * PUT CHAR INTO PACKET * 03940 * RECEIVE CHAR IN A * 03950 * PACKET ADDRESS IN X * 03960 * CLEAR Z IF PACKET FULL* 03970 ************************* 03980 * 03990 KRMPUT PSHS X (PACKET ADDRESS) 04000 LDB ,X (CURRENT LENGTH) 04010 SUBB #32 (TOCHAR OFFSET) 04020 ABX (CURRENT CHAR) 04030 LDB QBIN,PCR (CHECK 8-BIT QUOTE) 04040 CMPB MYQBIN,PCR 04050 BEQ KRMP0 04060 ANDA #$7F (IGNORE HIGH BIT) 04070 BRA KRMP1 04080 KRMP0 TSTA (CHECK HIGH BIT) 04090 BPL KRMP1 04100 LDB MYQBIN,PCR 04110 STB ,X+ 04120 ANDA #$7F 04130 BRA KRMP2 04140 KRMP1 CMPA #$0D (CR INTO CR,LF) 04150 BNE KRMP2 04160 TST FMODE,PCR 04170 BEQ KRMP2 (UNLESS BINARY) 04180 LDB MYQCTL,PCR 04190 STB ,X+ 04200 EORA #$40 04210 STA ,X+ 04220 STB ,X+ 04230 LDA #$0A 04240 EORA #$40 04250 BRA KRMP6 04260 KRMP2 CMPA MYQCTL,PCR (SEE IF CTL FLAG) 04270 BNE KRMP3 04280 EORA #$40 (TEMPORARY SHIFT) 04290 BRA KRMP5 04300 KRMP3 CMPA MYQBIN,PCR (SEE IF BIN FLAG) 04310 BNE KRMP4 04320 CMPA QBIN,PCR (CHECK 8TH-BIT QUOTE) 04330 BNE KRMP4 04340 EORA #$40 (TEMPORARY SHIFT) 04350 BRA KRMP5 04360 KRMP4 CMPA #32 (SEE IF CONTROL) 04370 BMI KRMP5 04380 CMPA #$7F (RUBOUT) 04390 BNE KRMP6 04400 KRMP5 LDB MYQCTL,PCR 04410 STB ,X+ 04420 EORA #$40 04430 KRMP6 STA ,X+ 04440 * 04450 TFR X,D (NEW NEXT POSITION) 04460 SUBD ,S (LESS PACKET ORIGIN) 04470 PULS X 04480 ADDB #32 04490 STB ,X (LENGTH) 04500 SUBB #28 (NEED UP TO 4 MORE) 04510 CMPB MAXL,PCR 04520 BMI KRMP9 04530 LDB #1 (FLAG END OF PACKET) 04540 RTS 04550 KRMP9 CLRB 04560 RTS 04570 * 04580 ************************* 04590 * SEND PACKET * 04600 * PACKET ADDRESS IN X * 04610 ************************* 04620 * 04630 SNDPAK PSHS X (HOLD ADDRESS) 04640 LBSR CHKSUM 04650 STA ,X 04660 TST QDEBUG,PCR 04670 BEQ SND2 04680 LDD #$0800 (LINE 9) 04690 LDX ,S 04700 LBSR ECHO 04710 SND2 LDB PADN,PCR 04720 PSHS B 04730 SND3 DEC ,S 04740 BMI SND4 04750 LDA PADC,PCR 04760 JSR [RS232O] (SEND PAD) 04770 BRA SND3 04780 SND4 PULS B 04790 LBSR SNDSTS (SHOW PACKET #) 04800 LDA SOH,PCR 04810 JSR [RS232O] (SEND SOH) 04820 LDX ,S (ADDRESS) 04830 LDB ,X (LENGTH) 04840 SUBB #32 04850 PSHS B 04860 SND6 LDA ,X+ 04870 JSR [RS232O] 04880 DEC ,S 04890 BPL SND6 04900 PULS B 04910 LDA EOL,PCR 04920 JSR [RS232O] 04930 PULS X 04940 RTS 04950 * 04960 ************************* 04970 * SEND EMPTY PACKET * 04980 * PACKET TYPE IN A * 04990 ************************* 05000 * 05010 SEND1 LEAX SBUFF,PCR 05020 STA 2,X (TYPE) 05030 LDA #35 05040 STA ,X 05050 LDB 1+NPACK,PCR 05060 ANDB #$3F 05070 ADDB #32 05080 STB 1,X 05090 LBSR CHKSUM 05100 STA ,X 05110 LDX #$8000 (PAUSE) 05120 SEND1P LEAX -1,X 05130 BNE SEND1P 05140 LEAX SBUFF,PCR 05150 BSR SNDPAK 05160 RTS 05170 * 05180 ************************* 05190 * GET PACKET FROM REMOTE* 05200 * CLEAR Z IF FAIL * 05210 ************************* 05220 * 05230 GETPAK LEAX RBUFF,PCR 05240 PSHS X 05250 GETP1 JSR [KEYIN] (ALLOW INTERRUPTION) 05260 BEQ GETP2 05270 CMPA #$0D (BY C.R.) 05280 BEQ GETPB 05290 GETP2 JSR [RS232I] 05300 BEQ GETP1 05310 LBSR SYNC (WAIT FOR STOP BIT) 05320 CMPA SOH,PCR 05330 BNE GETP1 (IGNORE UNTIL SOH) 05340 GETP3 LDX ,S (BUFFER LOC) 05350 GETP4 JSR [KEYIN] 05360 BEQ GETP5 05370 CMPA #$0D 05380 BEQ GETPB 05390 GETP5 JSR [RS232I] 05400 BEQ GETP4 05410 LBSR SYNC (WAIT FOR STOP BIT) 05420 CMPA SOH,PCR 05430 BEQ GETP3 05440 STA ,X+ 05450 CMPA MYEOL,PCR 05460 BNE GETP4 05470 GETP6 TST QDEBUG,PCR 05480 BEQ GETP7 05490 LDX ,S (SHOW PACKET) 05500 LDD #$0C00 (LINE 13) 05510 LBSR ECHO 05520 GETP7 PULS X 05530 LBSR CHKSUM 05540 CMPA ,X 05550 RTS 05560 GETPB PULS X 05570 LDA #1 05580 RTS 05590 * 05600 ************************* 05610 * RECEIVE A PACKET. * 05620 * FIRST ACK PREVIOUS IF * 05630 * NOT YET ACKNOWLEDGED. * 05640 * LEAVE DATA LENGTH IN B* 05650 * DATA ADDRESS IN X * 05660 * Z SET IF TYPE IS DATA * 05670 ************************* 05680 * 05690 RGET LDA MAXTRY,PCR 05700 STA NTRY,PCR 05710 TST NEEDAK,PCR 05720 BEQ RGET2 05730 LDA #'Y 05740 LBSR SEND1 (ACK LAST PACKET) 05750 LDD NPACK,PCR 05760 ADDD #1 05770 STD NPACK,PCR 05780 CLR NEEDAK,PCR 05790 RGET2 DEC NTRY,PCR 05800 BMI RFAIL 05810 LEAX RBUFF,PCR 05820 LBSR GETPAK 05830 BEQ RGET4 05840 LDA #'N (NAK) 05850 LBSR SEND1 05860 BRA RGET2 05870 RGET4 LEAX RBUFF,PCR 05880 LDD NPACK,PCR 05890 BNE RGET5 05900 LBSR REMINI 05910 LEAX INPAK,PCR (SPECIAL ACK FOR INIT) 05920 LDA #'Y 05930 STA 2,X 05940 LBSR CHKSUM 05950 STA ,X 05960 LEAX INPAK,PCR 05970 LBSR SNDPAK 05980 LDD #1 05990 STD NPACK,PCR 06000 LDA #'S 06010 RTS 06020 RGET5 ANDB #$3F 06030 ADDB #32 06040 CMPB 1,X 06050 BEQ RGET8 06060 LDA #'N (NAK) 06070 LBSR SEND1 06080 BRA RGET2 06090 RGET8 DEC NEEDAK,PCR 06100 LEAX RBUFF,PCR 06110 LDB ,X 06120 SUBB #35 06130 LEAX 3,X 06140 LDA -1,X (TYPE) 06150 CMPA #'D 06160 RTS 06170 RFAIL LDA #'Q 06180 RTS 06190 * 06200 ************************* 06210 * GET NEXT DATA CHAR * 06220 * VIEWS DATA AS STREAM * 06230 * B=CHARS LEFT IN PACKET* 06240 * X=CURRENT DATA ADDRESS* 06250 * RETURN CHAR IN A * 06260 * ON END OF DATA, SET Z * 06270 * LEAVE PACKET TYPE IN A* 06280 ************************* 06290 * 06300 GETCHP TSTB 06310 BNE GETC2 06320 LBSR RGET 06330 BNE GETC4 06340 GETC2 DECB 06350 LDA ,X+ 06360 RTS 06370 GETC4 CLRB 06380 RTS 06390 * 06400 ************************* 06410 * RECEIVE DATA * 06420 * COPY DATA TO FILE 'TIL* 06430 * NON-DATA PACKET. * 06440 ************************* 06450 * 06460 KGET CLR QCR,PCR (NO CR PENDING) 06470 CLR FBIN,PCR (NO HIGH BIT) 06480 CLRB 06490 KGET1 LBSR GETCHP 06500 BEQ KGETX 06510 CMPA QBIN,PCR 06520 BNE KGET4 06530 INC FBIN,PCR (FLAG HIGH BIT) 06540 LBSR GETCHP 06550 BEQ KGETX 06560 KGET4 CMPA QCTL,PCR 06570 BNE KGET8 06580 LBSR GETCHP 06590 BEQ KGETX 06600 CMPA QBIN,PCR 06610 BEQ KGET8 06620 CMPA QCTL,PCR 06630 BEQ KGET8 06640 EORA #$40 06650 TST FBIN,PCR 06660 BNE KGET8 06670 TST FMODE,PCR (0=BINARY) 06680 BEQ KGET8 06690 TST QCR,PCR (0=NO CR PENDING) 06700 BEQ KGET8 06710 CMPA #$0A 06720 BNE KGET8 06730 CLR QCR,PCR 06740 BRA KGET9 (SKIP LF AFTER CR) 06750 KGET8 TST FBIN,PCR 06760 BEQ KGET8A 06770 ADDA #$80 06780 KGET8A CLR QCR,PCR 06790 CMPA #$0D 06800 BNE KGET8C 06810 INC QCR,PCR 06820 KGET8C LBSR FPUT (INTO FILE) 06830 KGET9 CLR FBIN,PCR 06840 BRA KGET1 06850 KGETX RTS 06860 * 06870 ************************* 06880 * SHOW/SET PARAMETERS * 06890 * ENTERED FROM ATEP * 06900 ************************* 06910 * 06920 KSET LBSR CLEAR 06930 LEAX HEADER,PCR 06940 LBSR PRINT 06950 LEAX HDRSET,PCR 06960 LBSR PRINT 06970 LEAX FTYPE,PCR 06980 LDA #6 (# PARAMS) 06990 PSHS A 07000 KREP1 LDA #' 07010 JSR [CHROUT] 07020 JSR [CHROUT] 07030 JSR [CHROUT] 07040 LDA ,X+ 07050 LBSR HEXOUT 07060 DEC ,S 07070 BNE KREP1 07080 PULS A 07090 LDA #$0A 07100 JSR [CHROUT] 07110 * NEW PARAMETERS 07120 LDB #6 (# PARAMS) 07130 PSHS B 07140 LEAX FTYPE,PCR 07150 KNEW1 LDA #' 07160 JSR [CHROUT] 07170 JSR [CHROUT] 07180 JSR [CHROUT] 07190 KNEW2 JSR [KEYIN] 07200 BEQ KNEW2 07210 LDB ,S 07220 CMPB #6 (SEE IF FIRST) 07230 BNE KNEW2A 07240 CMPA #$0D (EXIT ON CR IF SO) 07250 BEQ KNEW5 07260 KNEW2A CMPA #' (LEAVE ASIS) 07270 BEQ KNEW3 07280 STA ,X+ 07290 BRA KNEW4 07300 KNEW3 LDA ,X+ (GET OLD) 07310 KNEW4 LBSR HEXOUT 07320 DEC ,S 07330 BNE KNEW1 07340 KNEW5 PULS B 07350 LDA #$0A 07360 JSR [CHROUT] 07370 RTS 07380 * 07390 ************************* 07400 * SEND FILE - MAIN ENTRY* 07410 ************************* 07420 * 07430 KSEND LBSR CLEAR (CLEAR SCREEN) 07440 LEAX HEADER,PCR 07450 LBSR PRINT 07460 LEAX HDRSND,PCR 07470 LBSR PRINT 07480 JSR [INNAME] 07490 TST FNAME (NOTE NOT PCR) 07500 BNE KSEND2 07510 RTS 07520 KSEND2 LDD RTYPE (TYPE/MODE) 07530 STD FTYPE,PCR 07540 LDD #0 07550 STD NPACK,PCR 07560 LDD #$0300 07570 LBSR AT 07580 LEAX HDRPAK,PCR 07590 LBSR PRINT 07600 *** SEND INIT PACKET *** 07610 LDA #'S 07620 LEAX INPAK,PCR 07630 STA 2,X 07640 LDA MAXTRY,PCR 07650 STA NTRY,PCR 07660 SISND DEC NTRY,PCR 07670 LBMI SFAIL 07680 LEAX INPAK,PCR 07690 LBSR SNDPAK 07700 LBSR GETPAK 07710 BNE SISND 07720 LDA 2+RBUFF,PCR 07730 CMPA #'Y 07740 BNE SISND 07750 LBSR REMINI 07760 *** SEND FILE HEADER PACKET *** 07770 LDY #FNAME 07780 LEAX FBN,PCR 07790 CLRB 07800 FNCOPY LDA B,Y 07810 BEQ FNGOT 07820 STA B,X 07830 INCB 07840 BRA FNCOPY 07850 FNGOT ADDB #35 (TOCHAR) 07860 LEAX FBUFF,PCR 07870 STB ,X 07880 LBSR NEWPAK 07890 FNSND DEC NTRY,PCR 07900 LBMI SFAIL 07910 LEAX FBUFF,PCR 07920 LBSR SNDPAK 07930 LBSR GETPAK 07940 BNE FNSND 07950 LDA 2+RBUFF,PCR 07960 CMPA #'Y 07970 BNE FNSND 07980 *** SEND DATA PACKETS *** 07990 SHDR JSR [QEOF] 08000 BNE SCLOSE 08010 LBSR NEWPAK 08020 LEAX SBUFF,PCR 08030 ANDB #$3F (MOD 64) 08040 STB SNUM,PCR (FOR ACK) 08050 ADDB #32 (TOCHAR) 08060 STB 1,X 08070 LDB #'D (DATA) 08080 STB 2,X 08090 LDA #35 (SIZE) 08100 STA ,X 08110 SBUILD JSR [QEOF] (SEE IF EOF) 08120 BNE SSEND 08130 LBSR FGET 08140 LEAX SBUFF,PCR 08150 LBSR KRMPUT (INTO PACKET) 08160 BEQ SBUILD (FILL PACKET) 08170 SSEND DEC NTRY,PCR 08180 LBMI SFAIL 08190 LEAX SBUFF,PCR 08200 LBSR SNDPAK 08210 LBSR GETPAK 08220 BNE SSEND 08230 LEAX RBUFF,PCR (CHECK ACK) 08240 LDD 1,X 08250 SUBA #32 (PACK#) 08260 CMPB #'Y 08270 BEQ SACK 08280 CMPB #'N 08290 LBNE SFAIL 08300 DECA (NAK NEXT?) 08310 ANDA #$3F 08320 SACK CMPA SNUM,PCR 08330 BNE SSEND (FAILURE) 08340 BRA SHDR 08350 SCLOSE JSR [FCLOSE] 08360 *** SEND END OF FILE PACKET *** 08370 LBSR NEWPAK 08380 SNDEOF DEC NTRY,PCR 08390 LBMI SFAIL 08400 LDA #'Z (EOF) 08410 LBSR SEND1 08420 LBSR GETPAK 08430 BNE SNDEOF 08440 *** SEND END OF TRANSMISSION PACKET *** 08450 LBSR NEWPAK 08460 SNDEOT DEC NTRY,PCR 08470 LBMI SFAIL 08480 LDA #'B (EOT) 08490 LBSR SEND1 08500 LBSR GETPAK 08510 BNE SNDEOT 08520 SOK LEAX SFINI,PCR 08530 LBSR PRINT 08540 RTS 08550 SFAIL JSR [FCLOSE] 08560 LDA #'B 08570 LBSR SEND1 08580 LEAX SERR,PCR 08590 LBSR PRINT 08600 RTS 08610 * 08620 ************************* 08630 * MAIN RECEIVE ROUTINE * 08640 ************************* 08650 * 08660 KRCV LBSR CLEAR 08670 LEAX HEADER,PCR 08680 LBSR PRINT 08690 LEAX HDRREC,PCR 08700 LBSR PRINT 08710 LDD #0 08720 STD NPACK,PCR 08730 LDD FTYPE,PCR 08740 STD RTYPE 08750 JSR [OTNAME] 08760 TST FNAME (NOTE NOT PCR) 08770 BNE KRCV2 08780 RTS (NO NAME, EXIT) 08790 KRCV2 LDD #$0300 08800 LBSR AT 08810 LEAX HDRPAK,PCR 08820 LBSR PRINT 08830 CLR NEEDAK,PCR 08840 LBSR RGET (INIT) 08850 CMPA #'S 08860 BNE KRFAIL 08870 LBSR RGET 08880 CMPA #'F 08890 BNE KRFAIL 08900 LBSR KGET (RECEIVE DATA) 08910 CMPA #'Z (EOF?) 08920 BNE KRFAIL 08930 LBSR RGET 08940 CMPA #'B (EOT) 08950 BNE KRFAIL 08960 LDA #'Y 08970 LBSR SEND1 08980 JSR [FCLOSE] 08990 LBRA SOK 09000 KRFAIL LBRA SFAIL 09010 * 09020 HDRSET FDB $0A0A 09030 FCC 'ALL PARAMETERS SHOWN IN HEX' 09040 FCB $0A 09050 FCC 'ENTER NEW VALUES BY KEY CODE' 09060 FCB $0A 09070 FCC 'BLANK=NO CHANGE, BREAK=FF' 09080 FDB $0A0A 09090 FCC ' TYPE MODE EOL NTRY SOH DBUG' 09100 FDB $0A00 09110 HDRSND FCB $0A 09120 FCC 'SEND FILE' 09130 FDB $0A00 09140 HDRREC FCB $0A 09150 FCC 'RECEIVE FILE' 09160 FDB $0A00 09170 HDRPAK FCC 'PACKET #0000 (HEX)' 09180 FDB $0A00 09190 SFINI FDB $0A07 09200 FCC 'TRANSFER COMPLETE' 09210 FDB $0707 09220 FDB $0A00 09230 SERR FDB $0A07 09240 FCC 'TRANSFER FAILED' 09250 FDB $0707 09260 FDB $0A00 09270 * 09280 ZZZBUF RMB 0 (TOP EXCEPT BUFFER) 09290 SBUFF RMB 98 (SEND BUFFER) 09300 RBUFF RMB 98 (RECEIVE BUFFER) 09310 ZZZTOP RMB 0 09320 END $2000 (ATEP ENTRY) <<< ccterm.asm >>> 00010 * KERMIT-COCO: COLOR COMPUTER KERMIT 00020 * VERSION 1.1 : 03/85 00030 * COPYRIGHT (C) 1985 BY WES HUBERT 00040 * 3020 STEVEN DRIVE, LAWRENCE KS 66044 00050 * 00060 * THIS PROGRAM IS BOTH A STAND-ALONE 00070 * TERMINAL PROGRAM AND THE BASE FOR 00080 * A COLOR COMPUTER IMPLEMENTATION OF 00090 * THE KERMIT FILE TRANSFER PROTOCOL. 00100 * 00110 * PERMISSION IS GRANTED FOR NON-PROFIT USE AND 00120 * DISTRIBUTION AS PART OF THE COLOR COMPUTER 00130 * KERMIT SYSTEM PROVIDED THAT THIS NOTICE IS 00140 * NOT REMOVED. 00150 * 00160 * KERMIT IS A FILE TRANSFER PROTOCOL DEVELOPED 00170 * BY FRANK DA CRUZ AND BILL CATCHINGS 00180 * AT THE COLUMBIA UNIVERSITY CENTER FOR 00190 * COMPUTING ACTIVITIES. 00200 * 00210 * THIS PORTION OF KERMIT-C0C0 PROVIDES 00220 * TERMINAL FACILITIES INCLUDING EVEN/NO 00230 * PARITY, LOCAL/REMOTE ECHO, AND SIMPLE 00240 * NO PROTOCOL FILE UPLOAD/DOWNLOAD. 00250 * PARITY IS ALWAYS IGNORED ON INPUT. 00260 * THE PARITY BIT TIME IS USED FOR SCREEN 00270 * SCROLLING WHEN NECESSARY. 00280 * 00290 * CHROUT CODE ADAPTED FROM CC TERM 00300 * BY RICHARD CAMPBELL. 00310 * (COLOR COMPUTER MAGAZINE, MARCH 1984) 00320 * 00330 * DISK OPEN/CLOSE CODE ADAPTED FROM TAPE TO 00340 * DISK FILE TRANSFER BY ROGER SCHRAG. 00350 * (RAINBOW MAGAZINE, JANUARY 1984) 00360 * 00370 * THE CODE FOR KERMIT PROTOCOL TRANSFERS 00380 * IS ASSEMBLED AND LOADED SEPARATELY 00390 * AFTER ASSEMBLY AND LOADING OF THIS 00400 * ROUTINE. SEE THE PROTOCOL CODE FOR 00410 * MORE INFORMATION. 00420 * 00430 * THIS PORTION OF THE CODE RESIDES IN 00440 * (HEX) 2000-27FF, THE PROTOCOL CODE 00450 * FROM 2800-2FFF. MEMORY BELOW 2000 00460 * IS AVAILABLE FOR BASIC PROGRAMS, AND 00470 * MEMORY ABOVE 2FFF IS USED FOR THE 00480 * JOURNALIZATION / RAW ASCII TRANSFER 00490 * BUFFER. 00500 * 00510 * NOTE THAT ALTHOUGH EACH PART IS 00520 * WRITTEN IN POSITION INDEPENDENT FORM 00530 * THE COMBINATION IS NOT POSITION INDEPENDENT 00540 * BECAUSE OF FIXED ADDRESSES USED FOR 00550 * COMMUNICATION BETWEEN THE PROGRAMS. TO 00560 * RELOCATE THE PROGRAM, THESE ADDRESSES 00570 * MUST BE MODIFIED. 00580 * 00590 ORG $2000 00600 TERM BRA START 00610 * 00620 ************************* 00630 * ENTRIES FOR PROTOCOL * 00640 ************************* 00650 * 00660 FDB RS232I 00670 FDB RS232O 00680 FDB KEYIN 00690 FDB OTCHAR 00700 FDB INNAME 00710 FDB OTNAME 00720 FDB FCLOSE 00730 FDB WAIT 00740 FDB QEOF 00750 FILNAM FCC 'KERMIT-COCO ' 00760 FCB 0 (END OF STRING) 00770 FCC 'COPYRIGHT (C) 1985' 00780 * 00790 ******************************************* 00800 * 00810 ************************* 00820 * STANDARD COCO DEFS * 00830 ************************* 00840 * 00850 SYSMEM EQU $74 HIGH MEMORY ADDRESS 00860 SCRPTR EQU $88 SCREEN CURSOR PTR 00870 SCREEN EQU $400 SCREEN MEMORY 00880 FNAME EQU $94C FILE NAME 00890 FTYPE EQU $957 FILE TYPE 00900 TOP EQU $3000 END OF KERMIT 00910 POLCAT EQU $A000 KEYBOARD POLL ROUTNE 00920 PUTCHR EQU $A002 CHARACTER OUTPUT 00930 OUTPIA EQU $FF20 MODEM PIA LOC 00940 INPIA EQU $FF22 IN MODEM PIA 00950 * 00960 ************************* 00970 * DEFAULT CONFIGURATION * 00980 ************************* 00990 * 01000 CAN FCB $18 (XMIT SHFT<- AS CAN) 01010 DEL FCB $08 (XMIT <- AS BKSP) 01020 LECHO FCB 0 (-1=HALF/0=FULL) 01030 PARITY FCB -1 (-1=EVEN/0=NONE) 01040 AUTOLF FCB 0 (-1=YES/0=NO) 01050 CPYMIN FDB TOP (BUFFER ORIGIN) 01060 CPYMAX FDB $7FFF (32K SYSTEM) 01070 CPYPTR FDB TOP (BUFFER POINTER) 01080 COPY FCB 0 (-1=BUFFER/0=DON'T) 01090 SPEED FDB 419 (419=300 BAUD) 01100 DC2 FCB $12 (TURN ON BUFFER) 01110 DC4 FCB $14 (TURN OFF BUFFER) 01120 CURCHR FCB $60 (PLACE FOR CHAR 01130 * UNDER CURSOR) 01140 * 01150 ************************* 01160 * EXECUTION ENTRY * 01170 ************************* 01180 * 01190 START STS ISTACK,PCR 01200 LEAS TOPSTK,PCR 01210 LBSR CLEAR (CLEAR SCREEN) 01220 LBSR MENU (PRINT MENU) 01230 LEAX TOP,PCR (LOCATE BUFFER) 01240 STX CPYMIN,PCR 01250 LDX SYSMEM (SIZE) 01260 STX CPYMAX,PCR (TOP OF BUFFER) 01270 * 01280 ****************************************** 01290 * TOP OF MAIN LOOP * 01300 * ALTERNATELY POLL RS232 INPUT AND * 01310 * KEYBOARD. * 01320 ****************************************** 01330 * 01340 CHKMN BSR RSSYNC (WAIT FOR CARRIER) 01350 CHKRSI LBSR RS232I (POLL RS232 PORT) 01360 BEQ CHKKBI 01370 LBSR OTCHAR 01380 BSR RSSYNC 01390 CHKKBI LBSR KEYIN (POLL KEYBOARD) 01400 BEQ CHKRSI 01410 * 01420 CHKBRK CMPA #$FF (BREAK) 01430 BNE CHKDEL 01440 BSR BREAK 01450 BRA CHKMN 01460 * 01470 CHKDEL CMPA #$FE (LEFT ARROW) 01480 BNE CHKCAN 01490 TST LECHO,PCR 01500 BEQ CHKD2 01510 LDA #08 (PRINT BACKSPACE) 01520 LBSR OTCHAR 01530 CHKD2 LDA DEL,PCR (SEND DELETE CHAR) 01540 BRA CHKOUT 01550 * 01560 CHKCAN CMPA #$FD (SHIFT LEFT ARROW) 01570 BNE CHKDUP 01580 LDA CAN,PCR (SEND LINE DELETE) 01590 BRA CHKOUT 01600 * 01610 CHKDUP TST LECHO,PCR 01620 BEQ CHKOUT 01630 LBSR OTCHAR (ECHO PRINT CHAR) 01640 * 01650 CHKOUT BSR RS232O (TRANSMIT CHAR) 01660 BRA CHKMN 01670 * 01680 ************************* 01690 * WAIT FOR STOP BIT * 01700 ************************* 01710 * 01720 RSSYNC LDA INPIA (READ MODEM) 01730 LSRA 01740 BCC RSSYNC (LOOP UNTIL SET) 01750 RTS 01760 * 01770 ************************ 01780 * SEND LINE BREAK * 01790 ************************ 01800 * 01810 BREAK CLR OUTPIA (SEND ZERO BITS) 01820 LDX #$6100 (ABOUT .25 SECONDS) 01830 BRK2 LEAX -1,X 01840 BNE BRK2 01850 LDA #2 01860 STA OUTPIA (SEND STOP BIT) 01870 RTS 01880 * 01890 ************************ 01900 * PAUSE ABOUT 1 BIT * 01910 ************************ 01920 * 01930 WAIT PSHS D (WAIT BIT TIME) 01940 LDD SPEED,PCR 01950 WT2 SUBD #1 01960 BNE WT2 01970 PULS D,PC 01980 * 01990 ************************ 02000 * SET EVEN PARITY * 02010 ************************ 02020 * 02030 EVEN PSHS X (PRESERVE X) 02040 LDX #7 (SEVEN DATA BITS) 02050 CLRB 02060 EVEN2 RORA 02070 BCC EVEN4 02080 INCB (COUNT 1 BITS) 02090 EVEN4 LEAX -1,X 02100 BNE EVEN2 02110 RORA 02120 RORB (PARITY BIT) 02130 RORA 02140 PULS X (RESTORE X) 02150 RTS 02160 * 02170 ************************ 02180 * READ FROM MODEM * 02190 ************************ 02200 * 02210 RS232I LDA INPIA (READ MODEM) 02220 LSRA 02230 BCC RSI2 (LOOK FOR START BIT) 02240 CLRA 02250 RTS 02260 RSI2 LDD SPEED,PCR 02270 LSRA (HALF BIT) 02280 RORB 02290 RSI4 SUBD #1 (PPAUSE) 02300 BGT RSI4 02310 LDB #7 (7 DATA BITS) 02320 PSHS A,B 02330 RSI5 LDD SPEED,PCR (WAIT FOR NEXT) 02340 RSI6 SUBD #1 02350 BNE RSI6 02360 NOP 02370 LDB INPIA (GET DATA BIT) 02380 LSRB 02390 ROR 0,S 02400 DEC 1,S 02410 BNE RSI5 02420 ROR 0,S 02430 PULS A,B 02440 ANDA #$7F (DROP PARITY) 02450 CMPA #$7F (IGNORE RUBOUT) 02460 BNE RSI7 02470 CLRA 02480 RSI7 RTS 02490 * 02500 ************************ 02510 * WRITE TO MODEM * 02520 ************************ 02530 * 02540 RS232O TST PARITY,PCR 02550 BEQ RSO1 02560 BSR EVEN (SET PARITY BIT) 02570 RSO1 LDB #8 (BIT COUNT) 02580 PSHS A,B (BYTE TO SEND,COUNT) 02590 CLR OUTPIA (START BIT) 02600 RSO2 LDD SPEED,PCR 02610 RSO4 SUBD #1 02620 BNE RSO4 02630 LSR 0,S (GET DATA BIT) 02640 ROLB (SHIFT FOR PIA) 02650 ROLB (BIT TWO) 02660 STB OUTPIA (SEND IT) 02670 DEC 1,S (COUNT THE BIT) 02680 BNE RSO2 02690 LEAS 2,S (DROP WORK/COUNT) 02700 LBSR WAIT 02710 LDB #2 02720 STB OUTPIA (STOP BIT) 02730 LBSR WAIT 02740 LBSR WAIT 02750 RTS 02760 * 02770 ************************ 02780 * READ FROM KEYBOARD * 02790 ************************ 02800 * 02810 KEYIN PSHS B (CHAR FROM SCREEN) 02820 LDB [SCRPTR] 02830 BMI KI0 (SKIP IF CURSOR) 02840 STB CURCHR,PCR (ELSE REMEMBER) 02850 KI0 LDB #$FF (CURSOR CHAR) 02860 STB [SCRPTR] (ONTO SCREEN) 02870 PULS B 02880 JSR [POLCAT] (POLL KEYBOARD) 02890 BNE KI1 02900 RTS (NO INPUT) 02910 * 02920 KI1 CMPA #$03 (BREAK) 02930 BNE KI1A 02940 LDA #$FF (CODE BREAK) 02950 RTS 02960 KI1A CMPA #$08 (BACKSPACE) 02970 BNE KI1B 02980 LDA #$FE 02990 RTS 03000 KI1B CMPA #$15 (SHIFT LEFT ARROW) 03010 BNE KI2 03020 LDA #$FD 03030 RTS 03040 KI2 CMPA #$0C (CLEAR) 03050 BNE KI2A 03060 PSHS X,Y,B 03070 LBSR CLEAR 03080 PULS X,Y,B 03090 CLRA 03100 RTS 03110 KI2A CMPA #$0A (DOWN-ARROW) 03120 BEQ KI3 03130 RTS (NORMAL CHARACTER) 03140 KI3 JSR [POLCAT] (GET CONTROL CHAR) 03150 BEQ KI3 03160 CMPA #$40 (@) 03170 BLO KI4 03180 ANDA #$1F (MAKE CONTROL) 03190 LDB #1 03200 RTS 03210 KI4 CMPA #'? (MENU?) 03220 BNE KI5 03230 LBSR MENU 03240 RTS 03250 KI5 CMPA #'0 (0-9 LOCAL CONTROL 03260 BLO KI6 03270 CMPA #'> 03280 BLE OP0 03290 KI6 PSHS X,B (TRANSLATE 03300 LEAX SPCTAB,PCR 03310 LDB ,X+ 03320 SPC2 CMPA B,X 03330 BEQ SPC4 03340 DECB 03350 BPL SPC2 03360 PULS X,B (LEAVE ASIS) 03370 RTS 03380 SPC4 LEAX OUTTAB,PCR 03390 LDA B,X (CHANGE) 03400 PULS X,B 03410 RTS 03420 SPCTAB FCB 5 (# SPECIAL-1) 03430 FCC /'(!)-#/ 03440 OUTTAB FDB $607B 03450 FDB $7C7D 03460 FDB $7E7F 03470 * 03480 *********************** 03490 * PROCESS OPTIONS * 03500 *********************** 03510 * 03520 OP0 CMPA #$30 0=EXIT 03530 BNE OP1 03540 PULS X (DROP RETURN 03550 LDS ISTACK,PCR 03560 RTS 03570 OP1 CMPA #$31 1=LOCAL ECHO 03580 BNE OP2 03590 COM LECHO,PCR 03600 CLRA 03610 RTS 03620 OP2 CMPA #$32 2=PARITY 03630 BNE OP3 03640 COM PARITY,PCR 03650 CLRA 03660 RTS 03670 OP3 CMPA #$33 3=AUTO L.F. 03680 BNE OP4 03690 COM AUTOLF,PCR 03700 CLRA 03710 RTS 03720 OP4 CMPA #$34 4=BUFFER ON/OFF 03730 BNE OP5 03740 COM COPY,PCR 03750 CLRA 03760 RTS 03770 OP5 CMPA #$35 5=WRITE FILE 03780 BNE OP6 03790 LBSR WRITEF 03800 CLRA 03810 RTS 03820 OP6 CMPA #$36 6=READ FILE 03830 BNE OP7 03840 LBSR READF 03850 CLRA 03860 RTS 03870 OP7 CMPA #$37 7=UPLOAD 03880 BNE OP8 03890 LBSR UPLOAD 03900 CLRA 03910 RTS 03920 OP8 CMPA #$38 8=RESET POINTER 03930 BNE OP9 03940 LDD CPYMIN,PCR 03950 STD CPYPTR,PCR 03960 CLRA 03970 RTS 03980 OP9 CMPA #$39 9=SET DELETE CHARS 03990 BNE OPR 04000 OP91 LBSR KEYIN 04010 BEQ OP91 04020 STA DEL,PCR 04030 OP9A LBSR KEYIN 04040 BEQ OP9A 04050 STA CAN,PCR 04060 CLRA 04070 RTS 04080 OPR CMPA #'< <=KERMIT RECEIVE 04090 BNE OPS 04100 JSR KERMR 04110 RTS 04120 OPS CMPA #'> >=KERMIT SEND 04130 BNE OPT 04140 JSR KERMS 04150 RTS 04160 OPT CMPA #'= ==KERMIT SETUP 04170 BNE OPX 04180 JSR KERMT 04190 RTS 04200 OPX RTS ** NOT SPECIAL 04210 * 04220 ************************* 04230 * PRINT MENU * 04240 ************************* 04250 * 04260 MENU PSHS X,Y,D 04270 LBSR CLEAR 04280 LEAX MCHARS,PCR (SHOW CURRENT STATUS) 04290 LDA LECHO,PCR 04300 INCA 04310 LDA A,X 04320 STA MDUP,PCR 04330 LEAX 2,X 04340 LDA PARITY,PCR 04350 INCA 04360 LDA A,X 04370 STA MPAR,PCR 04380 LEAX 2,X 04390 LDA AUTOLF,PCR 04400 INCA 04410 LDA A,X 04420 STA MLF,PCR 04430 LEAX 2,X 04440 LDA COPY,PCR 04450 INCA 04460 LDA A,X 04470 STA MJRNL,PCR 04480 LDA DEL,PCR 04490 LBSR TOHEX 04500 STD MDEL,PCR 04510 LDA CAN,PCR 04520 LBSR TOHEX 04530 STD MCAN,PCR 04540 LEAX MTEXT,PCR 04550 MEN2 LDD ,X++ 04560 ADDD #SCREEN 04570 STD SEND' 05140 FCB 0 05150 FDB 450 05160 FCC '()!-# BRACES BAR TILDE DEL' 05170 FDB $0DFF 05180 * 05190 ************************* 05200 * SOUND BELL * 05210 ************************* 05220 * 05230 BELL LDA $FF01 (CONFIGURE FOR 05240 ANDA #$F7 05250 STA $FF01 05260 LDA $FF03 SIX BIT 05270 ANDA #$F7 05280 STA $FF03 05290 LDA $FF23 05300 ORA #$08 05310 STA $FF23 SOUND) 05320 LDD #$06F2 (INITIAL TONE) 05330 BELL4 STB OUTPIA (OUTPUT SOUND) 05340 SUBD #$08 (CHANGE TONE) 05350 CMPD #$0002 05360 BNE BELL4 05370 LDA #$07 (RESTORE "BELL") 05380 RTS 05390 * 05400 ************************* 05410 * WRITE TO SCREEN * 05420 ************************* 05430 * 05440 OTCHAR CMPA DC2,PCR (DOWNLOAD FLAG) 05450 BNE OT1 05460 LDA #$FF (SET FLAG) 05470 STA COPY,PCR 05480 OTCX LBSR WAIT 05490 RTS 05500 OT1 CMPA DC4,PCR (END DOWNLOAD) 05510 BNE OT2 05520 CLR COPY,PCR 05530 BRA OTCX 05540 OT2 CMPA #$07 (BELL) 05550 BNE OT2A 05560 BSR BELL 05570 BRA OTX 05580 OT2A CMPA #$0C (CLEAR) 05590 BNE OT3 05600 LBSR CLEAR 05610 LDA #$0C 05620 BRA OTX 05630 OT3 CMPA #$08 (BACKSPACE) 05640 BNE OT4 05650 LDB #$60 05660 STB [SCRPTR] 05670 OT4 CMPA #$0D (RETURN/ENTER) 05680 BNE OT5 05690 TST AUTOLF,PCR 05700 BNE OT6 05710 LDB CURCHR,PCR 05720 STB [SCRPTR] 05730 LDB #$60 05740 STB CURCHR,PCR 05750 LDB SCRPTR+1 05760 ANDB #$E0 05770 STB SCRPTR+1 05780 LBSR WAIT 05790 BRA OTX 05800 OT5 CMPA #$0A (LINE FEED) 05810 BNE OT6 05820 LDB CURCHR,PCR 05830 STB [SCRPTR] 05840 LDB #$60 05850 STB CURCHR,PCR 05860 LDA #$0D (PRINT C.R) 05870 LDB SCRPTR+1 05880 ORB #$1F (AT END OF LINE) 05890 STB SCRPTR+1 05900 LBSR CHROUT 05910 LDA #$0A (RESTORE L.F.) 05920 BRA OTX 05930 OT6 LBSR CHROUT (NORMAL CHAR) 05940 OTX TST COPY,PCR 05950 BNE OTCOPY 05960 RTS 05970 * 05980 ************************ 05990 * "WRITE" TO BUFFER * 06000 ************************ 06010 * 06020 OTCOPY LDX CPYPTR,PCR (BUFFER PTR) 06030 CMPX CPYMAX,PCR 06040 BMI CPY2 06050 CLR COPY,PCR (TURN OFF) 06060 BSR CPYERR 06070 RTS 06080 CPY2 STA ,X+ (STORE CHARACTER) 06090 STX CPYPTR,PCR 06100 RTS 06110 CPYERR PSHS A 06120 LEAX CEM,PCR 06130 CE2 LDA ,X+ 06140 BEQ CEX 06150 LBSR OTCHAR 06160 BRA CE2 06170 CEX LBSR BREAK 06180 PULS A 06190 RTS 06200 CEM FCB $07 06210 FCC 'buffer full' 06220 FDB $0A00 06230 * 06240 ************************ 06250 * UPLOAD FROM BUFFER * 06260 ************************ 06270 * 06280 UPLOAD LDY CPYMIN,PCR 06290 UP2 CMPY CPYPTR,PCR 06300 BEQ UP8 06310 LDA ,Y 06320 LBSR RS232O 06330 LBSR KEYIN (ALLOW BREAK) 06340 BEQ UP4 06350 CMPA #$FF 06360 BEQ UP8 06370 UP4 LDA ,Y+ 06380 LBSR OTCHAR 06390 CMPA #$0D 06400 BNE UP2 06410 LDX #$8000 (PAUSE AFTER LINE) 06420 UP6 LEAX -1,X 06430 BNE UP6 06440 BRA UP2 06450 UP8 LDB #$FF (RESTORE CURSOR) 06460 STB [SCRPTR] 06470 RTS 06480 * 06490 *********************** 06500 * CLEAR SCREEN * 06510 *********************** 06520 * 06530 CLEAR LDD #SCREEN 06540 STD SCRPTR 06550 LDX #SCREEN+$80 06560 LDY #SCREEN+$180 06570 LDD #$6000 06580 CLR2 STA B,X 06590 STA B,Y 06600 INCB 06610 BNE CLR2 06620 RTS 06630 * 06640 ************************ 06650 * DISPLAY CHAR * 06660 ************************ 06670 * 06680 CHROUT PSHS A,B,X 06690 CLRB 06700 LDX