@L `}/j5  $% l0?$)$$Hȱ$ ShL$ `e$$%` h?/ `  !I PR@1 YL I`! S S) H$ЙH 0}Џ$%`@ $% CC$$%e%dU$% ]0%$% DDmLp   % J)Lz ;D:KCOM1030.ACT;All the communications stuff:;;Opening, closing and dialing for;the ATARI 1030 modem;; KERMIT protocol(}; for Atari Home Computers; version 1.1; (C) 1983 John Howard Palevich; to be distributed free of charge;;Started NOVEMB(}ER 5, 1983;Print a string which will identify,;to the user, what hardware this;COM file supportsPROC MODEMINIT() PRIN(}TE("for the Atari 1030 modem") RETURN;Return number of character in the;input bufferCARD FUNC NCIB() BYTE INCNT = $4(}00 RETURN(INCNT);Put a character out the modemPROC PUTR(BYTE DATA) PUTD(2, DATA) RETURN;Put out a byte as a modem( } commandPROC PUTCMD(BYTE CMD) BYTE CMCMD = $0007 CMCMD = $FF PUTD(2, 27) PUTD(2, CMD) CMCMD = 0 RETURN;Tempor( }arily Suspend Communications;so that file I/O can take placePROC StopR() PUTCMD('Z) RETURN;Close down the modem chan( }nelPROC CloseR() PUTCMD('Y) CLOSE(2) RETURN;Initialize communicationsBYTE FUNC OpenR() STRING fname = "##:" B( }YTE T Close(2) fname(1) = 'T fname(2) = '1 t = 12 Open(2, fname, t, 0) T = MSTATUS(2) IF T >= 128 THEN PR( }INTF("Can't open %S, error %B%E", fname, T) CLOSE(2) RETURN(T) FI RETURN(0)PROC StartR() PUTCMD('Y) ;R(}esume operation PUTCMD('A) PUTR($20) PUTR('?) ;No Translation PUTCMD('C) PUTR(PARITY) RETURN;SubEQ(S, I, (}SS);; Check if SS is = S(I..I+Len(SS)-1)BYTE FUNC SUBEQ(STRING S BYTE I STRING SS) INT J IF S(0)-I+1 < SS(0) THEN RET(}URN(0) FI FOR J = 1 TO SS(0) DO IF S(I+J-1) <> SS(J) THEN RETURN(0) FI OD RETURN(1);Dial the number (}in string P;return 0 if failure, 1 if OKBYTE FUNC AutoDial(STRING P) BYTE I, NN, C, DVSTAT1 = $2EB NN = P(0) ;LEN(}GTH OF STRING ;This modem ignores baud rate FOR C = 1 TO NN DO IF P(C) = '# THEN DO C ==+ 1 U(}NTIL C > NN OR P(C) > 32 OD EXIT FI OD IF C > NN THEN PRINTE("No phone number in this entry!(}") RETURN(0) FI PRINTE("Dialing...press any key to abort") ERRORNUM = 0 STARTR() IF dial = 0 THEN PUTCMD((}'N) ELSE PUTCMD('O) FI PUTCMD('K) FOR I = C TO NN DO PutR(P(I)) OD PutR($9B) ;Wait for carrier WH(}ILE CH = $FF DO MDEVSTAT(2) IF (DVSTAT1 & $80) <> 0 THEN RETURN(1) FI OD PRINTE("User abort") PUTCMD((}'M) ;Go on-hook STOPR() RETURN(0);Hang up the phone linePROC HANGUP() STARTR() PUTCMD('M) ;Go on-hook STOPR() (} RETURN; --- END OF D:KCOM1030.ACT ---up the phone linePROC HANGUP() STARTR() PUTCMD('M) ;Go on-hook STOPR() (-;D:KCOM850.ACT;All the communications stuff:;; Opening, closing and; DIALING; (for the DC-Hayes Smartmodem); KERMIT pro,}tocol; for Atari Home Computers; version 1.1; (C) 1983 John Howard Palevich; to be distributed free of charge;;Started ,}NOVEMBER 5, 1983PROC MODEMINIT() PRINTE("for the Atari 850 and the") PRINTE("DC-Hayes Smartmodem") RETURNCARD FUNC ,}NCIB() CARD NC = 747, INCNT = $400 BYTE I MDEVSTAT(2) I = MSTATUS(2) IF I >= 128 THEN PRINTF("R: device ,}error: %D%E", I) RETURN(0) FI RETURN(NC)PROC PUTR(BYTE DATA) PUTD(2, DATA) RETURN;Temporarily Suspend C,}ommunications I/OPROC StopR() Close(2) RETURNPROC CloseR() CLOSE(2) RETURNBYTE FUNC OpenR() STRING fname = "#,}#:" BYTE T Close(2) fname(1) = 'R fname(2) = dnum + '0 t = 13 Open(2, fname, t, 0) T = MSTATUS(2) IF T >= 128, } THEN PRINTF("Can't open %S, error %B%E", fname, T) CLOSE(2) RETURN(T) FI CIOV(2, 34, 0, 0, 192+48, ,!}0) CIOV(2, 38, 0, 0, 32+PARITY*5, 0) CIOV(2, 36, 0, 0, 8+baud, 0) CIOV(2, 40, 0, 0, 0, 0) RETURN(0)PROC StartR() ,"} OpenR() RETURN;SubEQ(S, I, SS);; Check if SS is = S(I..I+Len(SS)-1)BYTE FUNC SUBEQ(STRING S BYTE I STRING SS) I,#}NT J IF S(0)-I+1 < SS(0) THEN RETURN(0) FI FOR J = 1 TO SS(0) DO IF S(I+J-1) <> SS(J) THEN RETURN(0) FI ,$}OD RETURN(1);GetMack() - wait for reply from SMPROC GetMack() BYTE A, S IF ERRORNUM >= 128 THEN RETURN FI S = 0,%} DO IF CH <> $FF THEN ERRORNUM = $FF RETURN FI IF NCIB() > 0 THEN A = GETD(2) IF DEBUG ,&}= 1 THEN PUT(27) PUT(A) FI IF S = 0 THEN IF A >= 32 THEN S = 1 FI ,'} ELSE IF A = 10 THEN ;End of reply RETURN FI FI FI OD;PutMatch(c) - put a character o,(}ut; to R:, wait for a matching character; or user's abortPROC PutMatch(BYTE c) BYTE A PUTD(2, C) IF ERRORNUM >= 128,)} THEN RETURN FI DO IF CH <> $FF THEN ERRORNUM = $FF RETURN FI IF NCIB() > 0 THEN A = GETD(2,*}) IF DEBUG = 1 THEN PUT(27) PUT(A) FI IF A = C THEN RETURN FI FI OD;D,+}ial the number in string P....BYTE FUNC AUTODIAL(STRING P) BYTE I, C, NN NN = P(0) ;LENGTH OF STRING ;See if Ba,,}ud Rate Specified FOR C = 1 TO NN DO IF P(C) = '( THEN IF SUBEQ(P,C,"(300)") = 1 THEN BAUD = 0 EL,-}SEIF SUBEQ(P,C,"(1200)") = 1 THEN BAUD = 2 FI EXIT FI OD FOR C = 1 TO NN DO IF P(C) ,.}= '# THEN DO C ==+ 1 UNTIL C > NN OR P(C) > 32 OD EXIT FI OD IF C > NN THEN,/} PRINTE("No phone number in this entry!") RETURN(0) FI PRINTE("Dialing...press any key to abort") ERRORNUM = 0,0} STARTR() PutMatch(13) ;Establish baud Rate PutMatch('A) PutMatch('T) PutMatch(13) GetMack() ;Swallow Reply PutM,1}atch('A) PutMatch('T) PutMatch(' ) PutMatch('D) IF dial = 0 THEN PutMatch('P) ELSE PutMatch('T) FI FOR ,2}I = C TO P(0) DO PutMatch(P(I)) OD PutMatch(13) DO IF ERRORNUM >= 128 OR CH <> $FF THEN PRINTE("U,3}ser Aborted") PUTD(2, 13) ;to get out of wait-for-carrier mode I = RTCLOCK+10 WHILE RTCLOCK <> I DO OD ;Dra,4}in STOPR() RETURN(0) FI IF NCIB() > 0 THEN C = GetD(2) IF DEBUG = 1 THEN PUT(27) ,5} PUT(C) FI IF C = 'C OR C = '1 THEN ;Connected STOPR() RETURN(1) ELSEIF C >= 32 THEN ,6} PrintF("Unexpected result '%C'%E", C) STOPR() RETURN(0) FI FI OD;CAUSE THE SMARTMODEM TO H,7}ANG UPPROC HANGUP() BYTE B STARTR() ;As per page 9-2 of the Smart- ;modem manual. Basicly, the ;escape sequence ,8}has to be pre- ;ceded by at least one character, ;and we can't count on the user ;having typed one, so we type one ;o,9}urselves. PUTR('+) WAIT(100) PUTR('+) PUTR('+) PUTR('+) WAIT(200) ;Flush buffer WHILE NCIB() > 0 DO B = ,:}GETD(2) IF DEBUG = 1 THEN PUT(27) PUT(B) FI OD ERRORNUM = 0 PutMatch(13) ;Establish baud Rate Put,;}Match('A) PutMatch('T) PutMatch(13) GetMack() ;Swallow Reply PUTMATCH('A) PUTMATCH('T) PUTMATCH(32) PUTMATCH('H,<}) PUTMATCH('0) PUTMATCH(13) GETMACK() STOPR() RETURN; --- END OF D:KCOM850.ACT --- PUTMATCH(32) PUTMATCH('H,`;D:KERMIT.ACT;; KERMIT protocol; for Atari Home Computers; version 1.2; (C) 1984 John Howard Palevich>}; to be distributed free of charge;;Started September 24, 1983;Start code above T: and/or R:;by compiling while those d?}evices;are in RAM. There ought to be a;better way!;INCLUDE "D2:SYS.ACT" ;nicht vorhandenMODULEDEFINE MAXPACK = "94"@}BYTE ARRAY RECPKT(MAXPACK), PACKET(MAXPACK), FILNAM, SBUF(2050)DEFINE EOF = "-1", SOH = "1", CR = "13", MAA}XTRY = "5", MYQUOTE = "'#", TRUE = "1", FALSE = "0"BYTE LMARGN = $52,;OS LEFT MARGIN CH = 764, ;OS CH VARIABLEB} RTCLOCK = 20,;OS CLOCK IN JIFFYS CRSINH = $2F0, ;OS CURSOR INHIBIT FLAG BACKS, ;CHAR TO SEND FOR BACK S baud, C} ;baud rate variable dial, ;nz for tone dialing DISKN, ;DEFAULT DISK DNUM, ;port num localeD}cho, ;local echo flag PARITY, ;communication parity ERRORNUM, ;ERROR NUMBER debug, ;debugging flag SE}TATE, PADCHAR, ENL, QUOTEINT SIZE, N, RPSIZ, SPSIZ, PAD, TIMINT, NUMTRY, OLDTRY, FD, REMFD, IMAF}GE, HOSTINCLUDE "D:KIO.ACT"; This is where KCOM#.ACT is;included. Include the KCOM file;which matches the comunicatiG}ons;device and/or modem you wish to use.;; For an 850 and a Hayes SmartModem,;include KCOM850.ACT;; For the ATARI 1050,H};include KCOM1050.ACT;; For any other set of devices, write;your own KCOM functions, and include;that file here.INCLUDI}E "D:KCOM850.ACT"INCLUDE "D:KFUNC.ACT"INCLUDE "D:KPRO.ACT"INCLUDE "D:KTTY.ACT"INCLUDE "D:KMENU.ACT"; --- END OF D:KERMJ}IT.ACT ---0.ACT"INCLUDE "D:KFUNC.ACT"INCLUDE "D:KPRO.ACT"INCLUDE "D:KTTY.ACT"INCLUDE "D:KMENU.ACT"; --- END OF D:KERM ;D:KFUNC.ACT; Utility functions for Kermit; (C) 1983 John Howard Palevich; to be distributed free of charge;;Started SepL}tember 24, 1983MODULECARD ARRAY bauds = [300 600 1200 1800 2400 4800 9600]PROC M}SHOWBUF(STRING BUF, INT LEN) INT I FOR I = 0 TO LEN-1 DO PUT(27) PUT(BUF(I)) OD RETURNPROC MERROR(BYTE A,X,N}Y) IF debug = 1 THEN PRINTF("ERROR %B%E", y) IF Y = 128 THEN CLOSE(2) CLOSE(3) CLOSE(1) BREO}AK() FI FI ERRORNUM = Y RETURNCARD FUNC DecodeBaud(BYTE b) STRING buf(6) STRC(bauds(b), buf) RETURN(buf)CP}ARD FUNC DecodeFlag(BYTE f) IF f = 0 THEN RETURN("off") ELSE RETURN("on") FIBYTE FUNC IsAlpha(BYTE c) IF (cQ} >= 'a AND c <= 'z) OR (c >= 'A AND c <= 'Z) THEN RETURN(1) ELSE RETURN(0) FIBYTE FUNC ToUpper(BYTE c) R} IF c >= 'a AND c <= 'z THEN RETURN(c - 32) ELSE RETURN(c) FI;SPack();; Send a PacketPROC SPack(BYTE TY S} INT NUM, LEN STRING DATA) INT I, BUFP BYTE CHKSUM STRING BUFFER(100) IF DEBUG = 1 THEN PRINTFT}("SPack('%C,%D,%D,", TY, NUM, LEN) PUT('") SHOWBUF(DATA, LEN) PRINTF("%C)%E", '") ELSE PUT('.) FIU} FOR I = 1 TO PAD DO PUTD(2, PADCHAR) OD BUFFER(0) = SOH BUFFER(1) = 32 + LEN+3 BUFFER(2) = 32 + NUM BUFFERV}(3) = TY CHKSUM = BUFFER(1)+BUFFER(2) +BUFFER(3) FOR I = 0 TO LEN-1 DO BUFFER(I+4) = DATA(I) CHKSUM ==+ DW}ATA(I) OD CHKSUM = (CHKSUM + ((CHKSUM & 192) RSH 6)) & 63 BUFFER(LEN+4) = 32 + CHKSUM BUFFER(LEN+5) = ENL CIOVX}(2, 11, BUFFER, LEN+6, -1, -1) RETURN;GetRT; Get a byte from R: with timeout; and user-abortBYTE FUNC GetRT(BYTE POINY}TER B) CHAR FSC = 19, TIMER TIMER = FSC+3 WHILE NCIB() = 0 DO IF FSC = TIMER THEN IF DEBUG = 1 THEN ;say timZ}eout PRINTE("(Timeout)") FI RETURN(0) ELSEIF CH <> $FF THEN ;User abort RETURN(0) FI OD [} B^ = GETD(2) RETURN(1); RPack();; Read a PacketINT FUNC RPack(INT POINTER LEN, NUM STRING DATA) INT I, \}DONE CHAR CHKSUM, T, UT, TY IF DEBUG = 1 THEN PRINT("RPack") FI DO IF GETRT(@T) = 0 THEN RETURN(0) ]} FI IF DEBUG = 1 AND T <> SOH THEN PUT(27) PUT(T) FI UNTIL T = SOH OD DONE = FALSE WHILE DON^}E = FALSE DO IF GETRT(@T) = 0 THEN RETURN(0) FI IF IMAGE = FALSE THEN T ==& 127 FI IF T_} <> SOH THEN ;GOT LEN CHKSUM = T LEN^ = T-3-32 IF GETRT(@T) = 0 THEN RETURN(0) FI IF`} IMAGE = FALSE THEN T ==& 127 FI IF T <> SOH THEN ;GOT NUM CHKSUM ==+ T NUM^ = T - a}32 IF GETRT(@T) = 0 THEN RETURN(0) FI IF IMAGE = FALSE THEN T ==& 127 FI IF T <> Sb}OH THEN CHKSUM ==+ T TY = T FOR I = 0 TO LEN^-1 DO IF GETRT(@T) = 0 THEN c} RETURN(0) FI IF IMAGE = FALSE THEN T ==& 127 FI IF T = SOH THEN EXIT FI d}CHKSUM ==+ T DATA(I) = T OD IF T <> SOH THEN IF GETRT(@T) = 0 THEN e} RETURN(0) FI IF IMAGE <> TRUE THEN T ==& 127 FI IF T <> SOH THEN DONE = TRf}UE FI FI FI FI FI OD CHKSUM = (CHKSUM + ((CHKSUM & 192) RSH 6)) & 63 UT = Tg} - 32 IF CHKSUM <> UT THEN IF DEBUG = 1 THEN PRINTF("(Bad checksum: %D <> %D)%E", CHKSUM, UT) FI h}RETURN(FALSE) FI IF DEBUG = 1 THEN ;give type PRINTF("('%C%C,%D,%D,%C", 27, TY, NUM^, LEN^, '") SHOWBUF(DATi}A, LEN^) PRINTF("%C)%E", '") FI IF TY = 'E THEN PRINT("Error: ") SHOWBUF(DATA, LEN^) PUTE() FI RETURNj}(TY);BuFill;;Get a bufferful of data from the;file that's being sent. Only;control-quoting is done; 8-bit &;repeat ck}ount prefixes arn't handledINT FUNC BuFill(STRING BUFFER) INT I BYTE T,T7 STOPR() I = 0 DO T = GETD(3) IFl} MStatus(3) >= 128 THEN IF DEBUG = 1 THEN PRINTE("End-of-file") FI EXIT FI IF IMAGE = TRUE m}THEN T7 = T & 127 IF T7 < 32 OR T7 = 127 OR T7 = QUOTE THEN BUFFER(I) = QUOTE I ==+n} 1 IF T7 <> QUOTE THEN T ==! 64 FI FI ELSE IF T <> 155 THEN T ==& 127 FI IF To} < 32 OR T = 127 OR T = QUOTE OR T = 155 THEN IF T = 155 THEN BUFFER(I) = QUOTE BUFp}FER(I+1) = 13 ! 64 I ==+ 2 T = 10 FI BUFFER(I) = QUOTE I ==+ 1 IF T <> QUq}OTE THEN T==! 64 FI FI FI BUFFER(I) = T I ==+ 1 IF I >= SPSIZ-8 THEN STARTR() RETURN(I) r} FI OD STARTR() IF I = 0 THEN RETURN(EOF) ELSE RETURN(I) FI;BufEmp;;Get data from an incomming packets};into a file.PROC BufEmp(STRING BUFFER INT LEN) INT I BYTE T STOPR() FOR I = 0 TO LEN-1 DO t} T = BUFFER(I) IF T = MYQUOTE THEN I ==+ 1 T = BUFFER(I) IF (T & 127) <> MYQUOTE THEN u} T ==! 64 FI FI IF IMAGE = TRUE THEN PUTD(3, T) ELSEIF T = CR THEN PUTD(3, 155) ELSEIF T <>v} 10 THEN PUTD(3, T) FI OD STARTR() RETURN;SPar();;Fill the data array with my;send-init parametersPROCw} SPar(STRING DATA) DATA(0) = 32 + MAXPACK DATA(1) = 32 + 5 DATA(2) = 32 + 0 DATA(3) = 64 ! 0 DATA(4) = 32 + 13 DAx}TA(5) = MYQUOTE RETURN;RPar();;Get the other host's send-init;parametersPROC RPAR(STRING DATA) SPSIZ = DATA(0) - 3y}2 TIMINT = DATA(1) - 32 PAD = DATA(2) - 32 PADCHAR = DATA(3) ! 64 ENL = DATA(4) - 32 QUOTE = DATA(5) RETURN; --z}- END OF D:KFUNC.ACT --- PAD = DATA(2) - 32 PADCHAR = DATA(3) ! 64 ENL = DATA(4) - 32 QUOTE = DATA(5) RETURN; --;D:KIO.ACT; I/O routines for kermit; (C) 1983 John Howard PalevichDEFINE STRING = "BYTE ARRAY"STRING iocbCARD filenumb |}erSTRING dname(20), fname(20);WAIT T 60THS OF A SECONDPROC WAIT(INT T) BYTE I WHILE T > 255 DO I = RTCLOCK-1 }} WHILE I <> RTCLOCK DO OD T ==- 255 OD I = RTCLOCK + T WHILE I <> RTCLOCK DO OD RETURNPROC STRCPY(STRING A, ~}B) CARD I FOR I = 1 TO B(0) DO A(I) = B(I) OD A(0) = B(0) RETURNBYTE FUNC MStatus(BYTE ch) iocb = $340 + ch L }SH 4 RETURN (iocb(3))PROC CIO=$E456(BYTE a, x)PROC CIOV(BYTE ch, cmd CARD adr, len INT ax1, ax2) } iocb = $340 + ch LSH 4 iocb(2) = cmd iocb(4) = adr iocb(5) = adr RSH 8 iocb(8) = len iocb(9) = len RSH 8 IF ax1 }>= 0 THEN iocb(10) = ax1 FI IF ax2 >= 0 THEN iocb(11) = ax2 FI CIO(0, CH * 16) RETURN;Do a Get Status Co }mmandBYTE FUNC MDevStat(BYTE ch STRING adr) CIOV( ch, $0D, adr + 1, adr(0), -1, -1) RETURN(io }cb(3)); -- file locking, unlocking, etc.; -- directory hacking functions;Returns 0 if EOF, else the file nameCARD FUNC }GetNext(CHAR ch) INT I, J STRING DSPEC(20) Close(ch) Open(ch, dname, 6, 0) IF mstatus(ch) >= 128 THEN RETURN( }0) FI FOR i = 0 TO filenumber DO INPUTMD(ch, DSPEC, 20) IF mstatus(ch) >= 128 THEN Close(ch) RETUR }N(0) FI OD IF DSPEC(0) <> 17 THEN RETURN(0) FI filenumber ==+ 1 Close(ch) ;Convert dspec into file name I = 1 } DO FNAME(I) = DNAME(I) I ==+ 1 UNTIL DNAME(I-1) = ': OD J = 3 DO FNAME(I) = DSPEC(J) I ==+ 1 } J ==+ 1 UNTIL J > 10 OR DSPEC(J) = 32 OD FNAME(I) = '. I ==+ 1 J = 11 WHILE J <= 13 AND DSPEC(J) <> 3 }2 DO FNAME(I) = DSPEC(J) I ==+ 1 J ==+ 1 OD FNAME(0) = I-1 RETURN(fname);Get the first nameCARD FUNC } GetFirst(BYTE ch STRING name) STRCPY(dname, NAME) filenumber = 0 RETURN(GetNext(ch));FIND CHAR C } IN STRING ABYTE FUNC FindC(STRING a BYTE c) CARD i,l l = a(0) FOR i = 1 TO l DO IF a(i) = c THEN } EXIT FI OD RETURN(i);Normalize a file name string to Dn:<0..8>.<0..3>;where n is the value of diskn;name should } be at least 3+8+1+3+2=17 bytes long;returns 0 if not a valid nameBYTE FUNC Normalize(STRING name) CARD i, len BYTE C } len = name(0) IF len = 0 THEN RETURN(0) FI;first, check if (): i = FindC(name,':) IF i > l }en THEN FOR i = 1 TO len DO name(len-i+4) = name(len-i+1) OD name(1) = 'D name(2) = '0 + DISKN name }(3) = ': len ==+ 3 FI;fixup length name(0) = len;and convert to upper case FOR i = 1 TO len DO c = name(i) } IF c >= 'a AND c <= 'z THEN name(i) = c - 32 FI OD RETURN(1)BYTE FUNC INSET(BYTE C STRING S) CARD I } FOR I = 1 TO S(0) DO IF C = S(I) THEN RETURN(I) FI OD RETURN(0); --- END OF D:KIO.ACTG S) CARD I n;D:KMENU.ACT; Menu functions of Kermit programMODULE DEFINE NUMWID = "38" STRING PNFILE = "D:KERMIT.PNS" STRING PAR}AMFILE = "D:KERMIT.OPT";Restore Phone Number BufferPROC RESTNUMS() BYTE I, J Close(3) ERRORNUM = 0 OPEN(3, PNFIL}E, 4, 0) IF ERRORNUM < 128 THEN FOR I = 0 TO 19 DO ERRORNUM = 0 InputMD(3,SBUF+I*NUMWID, 37) IF ERROR}NUM >= 128 THEN EXIT FI OD ELSE I = 0 ;Couldn't find file FI CLOSE(3) FOR J = I TO 19 DO } SBUF(NUMWID*J) = 0 OD RETURN;Display the editor screenPROC DispES() BYTE I ;Display Screen CRSINH = 1 PUT(1}25) PRINTE("Computer Name (baud rate) # 555-1212") FOR I = 0 TO 19 DO Put(32) PRINTE(SBUF+NUMWID*I) OD Pr}intE("Use arrows, then RETURN to dial,") PrintE("or ESC to quit. ^S Saves") PRINT("SPACE modifies, ^R Restores") Positi}on(LMARGN, 0) Put($1F) CRSINH = 0 Put($1E) RETURN;Auto-Dial a number, return 1 if;successful, 0 if failure;; Als}o has provisions for editing; phone numbers.BYTE FUNC EditDial() BYTE I, NN, C, CY BYTE POINTER P RESTNUMS() DISP}ES() CY = 0 ;Edit/Select Loop DO CRSINH = 1 POSITION(LMARGN, CY+1) PUT(27) PUT($1F) C = GetD(1) } IF C = 32 THEN ;User wants to change this line POSITION(LMARGN,CY+1) CRSINH = 0 PUT('?) InputM}D(0,SBUF+CY*NUMWID, 37) DISPES() ELSEIF C = 27 THEN Position(LMARGN, 23) CRSINH = 0 PUT($9C) } PrintE("Not Dialing") RETURN(0) ELSEIF (C = $1C OR C = '-) AND CY > 0 THEN PUT($7E) ;Erase the arro}w CY ==- 1 ELSEIF (C = $1D OR C = '=) AND CY < 19 THEN PUT($7E) ;Erase the arrow CY ==+ 1 E}LSEIF C = 'S-'@ THEN ;^S OPEN(3, PNFILE, 8, 0) FOR I = 0 TO 19 DO P = SBUF+I*NUMWID IF P(0) > 0 T}HEN PRINTDE(3, P) FI OD CLOSE(3) RESTNUMS() DISPES() ;Just to inform user CY }= 0 ELSEIF C = 'R-'@ THEN ;^R RESTNUMS() DISPES() CY = 0 ELSEIF C = $9B THEN ;RETURN EXIT } FI OD ;Dial the chosen number CRSINH = 0 PUT(125) P = SBUF+CY*NUMWID PrintE(P) C = AutoDial(P) RETURN(C)};Execute a DOS-type commandPROC DODOS(BYTE CMD STRING FSPEC) STRING FMSCOM = [0 $21 $23 $24 $FE] STRING FI}LNAM(21) BYTE I, CNF IF FSPEC(0) = 0 AND CMD <> 'A THEN RETURN FI IF CMD = 'A THEN ;DIRECTORY IF FSPEC(}0) = 0 THEN STRCPY(FSPEC, "D#:*.*") FSPEC(2) = '0 + DISKN FI NORMALIZE(FSPEC) CLOSE(6) ERRORNUM }= 0 OPEN(6, FSPEC, 6, 0) DO INPUTMD(6, FILNAM, 20) IF ERRORNUM >= 128 THEN EXIT FI PRINTE(FILNAM) } IF FILNAM(1) >= '0 AND FILNAM(1) <= '9 THEN EXIT FI OD CLOSE(6) ELSE ;ALL OTHER COMMAN}DS NORMALIZE(FSPEC) I = INSET(CMD, "DFGI") IF I = 0 THEN RETURN FI IF CMD = 'I THEN PRINTF("Type 'Y}' to format %S%E", FSPEC) CNF = GetD(1) IF TOUPPER(CNF) <> 'Y THEN PRINTF("Aborted%E") } RETURN ELSE PRINT("Formatting. . .") FI FI ERRORNUM = 0 XIO(6, 0, FMSCOM(I), 0, 0, FSPEC)} IF ERRORNUM >= 128 THEN PRINTF("Disk I/O error %B%E", ERRORNUM) FI FI RETURNPROC MICRODOS()} BYTE cmd STRING fspec(21) PUT(125) DO PRINTE("Micro-DOS:") PRINTE(" A - Disk Directory") PRINTE(" D - Del}ete File") PRINTE(" F - Lock File") PRINTE(" G - Unlock File") PRINTE(" I - Format Diskette") PRINTE(" Q - Qu}it (back to main menu)") PRINTF("%ECommand -> ") DO cmd = GetD(1) cmd = ToUpper(cmd) UNTIL INSE}T(CMD, "ADFGIQ") > 0 OD PUT(CMD) IF cmd = 'Q THEN PUTE() RETURN FI PRINTF("%EFile spec -}> ") InputMD(0, fspec, 20) DoDos(cmd, fspec) OD; SAVE PARAMETERSPROC SaveParams() ERRORNUM = 0 OPEN(3, PARA}MFILE, 8, 0) IF ERRORNUM < 128 THEN ;Can write PUTD(3, BACKS) PUTD(3, BAUD) PUTD(3, DISKN) PUTD(3}, DEBUG) PUTD(3, IMAGE) PUTD(3, LOCALECHO) PUTD(3, LMARGN) PUTD(3, PARITY) PUTD(3, DNUM) PUTD(3, dial}) FI CLOSE(3) RETURN;RESTORE PARAMETERSPROC RestoreParams() CARD TEMP CLOSE(3) ERRORNUM = 0 OPEN(3, PARAMF}ILE, 4, 0) IF ERRORNUM >= 128 THEN ;Defaults PRINTF("Couldn't open %S; error %D%E", PARAMFILE, ERRORNUM}) BACKS = 127 ;RUB OUT baud = 0 ;300 baud DISKN = 1 ;D1: debug = 0 } ;debug off IMAGE = 0 ;TEXT localecho = 0 ;full LMARGN = 2 ;2 CHARS PARITY = 0 } ;NO PARITY DNUM = 1 ;PORT 1 dial = 0 ;Pulse ELSE BACKS = GETD(3) BAUD = GET}D(3) DISKN = GETD(3) DEBUG = GETD(3) IMAGE = GETD(3) LOCALECHO = GETD(3) LMARGN = GETD(3) PARITY = GE}TD(3) DNUM = GETD(3) DIAL = GETD(3) FI CLOSE(3) RETURN;SET PARAMETERSPROC Params() BYTE cmd STRING ts} DO Put(125) PRINTE("Parameters are:") IF BACKS = 8 THEN TS = "control-H" ELSE TS = "rub out" FI} PRINTF(" A - Back S sends (%S)%E", ts) ts = DecodeBaud(baud) PRINTF(" B - Baud rate (%S)%E", TS) } IF IMAGE = 0 THEN ts = "text" ElSE ts = "binary" FI PRINTF(" D - Default disk drive (D%D:)%E", } diskn) PRINTF(" F - File type (%S)%E", ts) PRINTF(" I - I/O Port (%D)%E", DNUM) IF dial = 0 THE}N ts = "pulse" ELSE ts = "tone" FI PRINTF(" T - Dialing method (%S)%E", ts) ts = DecodeFla}g(localecho) PRINTF(" L - Local-Echo (%S)%E", ts) PRINTF(" M - Margin (%D)%E", LMARGN) IF PARITY = 0 THE}N TS = "none" ELSEIF PARITY = 1 THEN TS = "odd" ELSEIF PARITY = 2 THEN TS = "even" ELSEIF PARIT}Y = 3 THEN TS = "on" FI PRINTF(" P - Parity (%S)%E", ts) PRINTE("^S - Save parameters") PRINTE("^R - R}estore paramters") ts = DecodeFlag(debug) PRINTF(" * - Debug Mode (%S)%E", ts) PRINTF(" Q - Quit (back to} Commands)%E") PRINTF("Parameter to change -> ") cmd = GetD(1) cmd = ToUpper(cmd) IF IsAlpha(cmd) <> 0 THEN} Put(cmd) FI IF CMD = 'A THEN ;BACK S IF BACKS = 8 THEN BACKS = 127 ELSE BACKS }= 8 FI ELSEIF cmd = 'B THEN ;Baud-rate baud ==+ 1 IF baud > 6 THEN baud = 0 FI ELSEIF cmd = 'D TH}EN ;Disk number diskn ==+ 1 IF diskn > 4 THEN diskn = 1 FI ELSEIF cmd = '* THEN ;Debug debug = 1-debug} ELSEIF cmd = 'Q THEN ;Quit PRINTF("uit%E") RETURN ELSEIF cmd = 'F THEN ;File type IMAGE = 1-IMAG}E ELSEIF cmd = 'L THEN ;local-echo localecho ==+ 1 IF localecho > 1 THEN LOCALECHO = 0 FI } ELSEIF cmd = 'T THEN ;dialing DIAL ==+ 1 IF DIAL > 1 THEN DIAL = 0 FI ELSEIF CMD = 'M THEN ;M}argin LMARGN ==+ 1 IF LMARGN > 2 THEN LMARGN = 0 FI ELSEIF CMD = 'P THEN ;PARITY PARITY }==+ 1 IF PARITY > 3 THEN PARITY = 0 FI ELSEIF cmd = 'I THEN ;Port # dnum ==+ 1 IF dnum >} 4 THEN dnum = 1 FI ELSEIF cmd = 'S-'@ THEN ;Save Parameters PRINTE("Saving") SAVEPARAMS() ELSEIF cmd =} 'R-'@ THEN ;Restore parameters PRINTE("Restoring") RESTOREPARAMS() ELSE PUT(253) FI ODPROC Ma}in() BYTE cmd, FLAG, I, BANK = $D500 BANK = 0 ;SETUP MY ERROR ROUTINE ERROR = MERROR ENL = CR QUOTE = MYQUOTE} PAD = 0 PADCHAR = 0 HOST = FALSE FOR I = 1 TO 7 DO CLOSE(I) OD PRINTE("Kermit for the Atari Home Computer")} PRINTE("v1.2 (c) 1984 John Howard Palevich") MODEMINIT() PRINTE("- Feel free to copy this program -") RestoreParams}() Open(1, "K:", 4, 0) IF OPENR() <> 0 THEN PRINTE("PRESS ANY KEY TO EXIT") CH = $FF WHILE CH = $FF DO OD } CH = $FF ELSE STOPR() DO PRINTF("%E%ECommands are:%E") PRINTE(" A - Auto-dial (then connect)") }PRINTE(" C - Connect (to remote computer)") PRINTE(" D - Micro-DOS") PRINTE(" F - Finish (remote server mode)") } PRINTE(" H - Hang up (the phone)") PRINTE(" P - Parameters (inspect and change)") PRINTE(" R - Receive (a fi}le)") PRINTE(" S - Send (a file)") PRINTF(" Q - Quit (back to DOS)%E%E") PRINTF("Command -> ") DO } cmd = GetD(1) cmd = ToUpper(cmd) UNTIL INSET(CMD, "ACDFHPRSQ") <> 0 OD Put(cmd) IF CMD }= 'A THEN ;Auto-dial PRINTE("uto-dial") IF EditDial() = 1 THEN TTYMODE() FI }ELSEIF cmd = 'C THEN ;connect PRINTE("onnect") TTYMODE() ELSEIF cmd = 'F THEN ;Finish PRINTE("}inish") Finish() ELSEIF cmd = 'H THEN ;Hang up the phone PRINTE("ang up") HangUp() } ELSEIF cmd = 'D THEN ;MICRO-DOS PRINTE("os") MICRODOS() ELSEIF cmd = 'Q THEN ;Quit PRINTE(}"uit") EXIT ELSEIF cmd = 'P THEN ;Parameters PRINTE("arameters") Params() ELSEIF cmd = }'S THEN ;Send PRINTE("end") SENDSW() ELSEIF cmd = 'R THEN ;Recieve PRINTE("ecieve") RE}CSW() FI OD CLOSER() FI CLOSE(1) RETURN;--- END OF D:KMENU.ACT --- PRINTE("ecieve") RE[;D:KPRO.ACT; KERMIT protocol section; RInit();; Receive InitializationBYTE FUNC RINIT(STRING FSPEC) INT LEN, NUM, T} IF DEBUG = 1 THEN PRINTE("RInit") FI NUMTRY ==+ 1 IF NUMTRY > MAXTRY THEN RETURN('A) FI IF FSPEC(0) > 0} THEN FOR T = 1 TO FSPEC(0) DO PACKET(T-1) = FSPEC(T) OD SPACK('R, 0, T-1, PACKET) FI T = RPACK(@L}EN, @NUM, PACKET) IF T = 'S THEN RPAR(PACKET) SPAR(PACKET) SPACK('Y, N, 6, PACKET) OLDTRY = NUMTRY NUMT}RY = 0 N = (N + 1) MOD 64 RETURN('F) ELSEIF T = FALSE THEN RETURN(STATE) ELSE RETURN('A) FI; RFile();; Rec}eive File HeaderBYTE FUNC RFile() INT LEN, NUM, T BYTE W IF DEBUG = 1 THEN PRINTF("RFile%E") FI NUMTRY ==+ 1} IF NUMTRY > MAXTRY THEN RETURN('A) FI T = RPACK(@LEN, @NUM, PACKET+1) PACKET(0) = LEN IF T = 'S THEN OLDT}RY ==+ 1 IF OLDTRY > MAXTRY THEN RETURN('A) FI IF (N = 0 AND NUM = 63) OR (N <> 0 AND NUM = N-1) THEN } SPACK('Y, NUM, 0, 0) NUMTRY = 0 RETURN(STATE) ELSE RETURN('A) FI ELSEIF T = 'F THEN IF NUM }<> N THEN RETURN('A) FI STOPR() NORMALIZE(PACKET) ERRORNUM = 0 OPEN(3, PACKET, 8, 0) STARTR() IF ERRO}RNUM >= 128 THEN PRINTF("Couldn't create %S; error %D%E", PACKET, ERRORNUM) RETURN('A) FI PRI}NTF("Receiving %S%E", PACKET) SPACK('Y, N, 0, 0) OLDTRY = NUMTRY NUMTRY = 0 N = (N+1) MOD 64 RETURN}('D) ELSEIF T = 'B THEN IF NUM <> N THEN RETURN('A) FI SPACK('Y, N, 0, 0) ;WAIT 1 SECOND FOR ACK TO DRAIN }W = RTCLOCK+60 WHILE W <> RTCLOCK DO OD RETURN('C) ELSEIF T = FALSE THEN RETURN(STATE) ELSE RETURN('A) FI; R}Data();; Receive DataBYTE FUNC RData() INT NUM, LEN, T IF DEBUG = 1 THEN PRINTF("RData%E") FI NUMTRY ==+ 1 } IF NUMTRY > MAXTRY THEN RETURN('A) FI T = RPACK(@LEN, @NUM, PACKET) IF T = 'D THEN IF NUM <> N THEN } OLDTRY ==+ 1 IF OLDTRY > MAXTRY THEN RETURN('A) FI IF (N = 0 AND NUM = 63) OR (N <> 0 AND NUM = N-1) } THEN SPACK('Y, NUM, 0, 0) NUMTRY = 0 RETURN(STATE) ELSE RETURN('A) FI FI} BUFEMP(PACKET, LEN) SPACK('Y, N, 0, 0) OLDTRY = NUMTRY NUMTRY = 0 N = (N+1) MOD 64 RETURN('D) ELSE}IF T = 'F THEN OLDTRY ==+ 1 IF OLDTRY > MAXTRY THEN RETURN('A) FI IF (N = 0 AND NUM = 63) OR (N <}> 0 AND NUM = N-1) THEN SPACK('Y, NUM, 0, 0) NUMTRY = 0 RETURN(STATE) ELSE RETURN('A) FI} ELSEIF T = 'Z THEN IF NUM <> N THEN RETURN('A) FI IF DEBUG = 1 THEN PRINTE("End-of-File") FI STOPR()} CLOSE(3) STARTR() SPACK('Y, N, 0, 0) N = (N+1) MOD 64 RETURN('F) ELSEIF T = FALSE THEN RETURN(STATE)} ELSE RETURN('A) FI; RecSw();; This is the state table switcher; for receiving filesPROC RECSW() STRING FSPEC(20)} INT NUM, LEN, T STARTR() PUT(125) PRINTE("Type the file to receive, or just") PRINTE("RETURN if the other compute}r is not") PRINTE("in Server mode.") PUTE() PRINT("File Spec -> ") INPUTMD(0, FSPEC, 19) PRINTE("Receiving File(s)}") PRINTE("type any key to abort") STATE = 'R N = 0 NUMTRY = 0 DO IF CH <> 255 THEN PRINTE("User Abortin}g") CH = 255 EXIT FI IF STATE = 'D THEN STATE = RDATA() ELSEIF STATE = 'F THEN STATE = RFILE() EL}SEIF STATE = 'R THEN STATE = RINIT(FSPEC) ELSEIF STATE = 'A THEN PRINTE("Aborting") EXIT ELSE EXIT} FI OD STOPR() Close(3) RETURN; SInit;; Send Initiate:; Send my parameters, get other; side's backBYTE F}UNC SINIT() INT NUM, LEN BYTE T IF DEBUG <> 0 THEN PRINTF("SInit%E") FI NUMTRY ==+ 1 IF NUMTRY > MAXTRY THE}N RETURN('A) FI SPAR(PACKET) IF DEBUG <> 0 THEN PRINTF("n = %D%E", N) FI ;Clear out any junk in the input } ;buffer WHILE NCIB() > 0 DO GETD(2) OD SPACK('S, N, 6, PACKET) T = RPACK(@LEN, @NUM, RECPKT) IF T = 'N THEN RET}URN(STATE) ELSEIF T = 'Y THEN IF N <> NUM THEN RETURN(STATE) FI RPAR(RECPKT) IF ENL = 0 THEN EN}L = 13 FI IF QUOTE = 0 THEN QUOTE = '# FI NUMTRY = 0 N = (N + 1) MOD 64 IF FILNAM = 0 THEN } RETURN('A) FI ;Open a file STOPR() ERRORNUM = 0 Close(3) OPEN(3, FILNAM, 4, 0) STARTR() IF }ERRORNUM >= 128 THEN PRINTF("Error %D; couldn't read %S", ERRORNUM, FILNAM) RETURN('A) FI PRINTF(}"Sending %S%E", FILNAM) RETURN('F) ELSEIF T = FALSE THEN RETURN(STATE) ELSE RETURN('A) FI; SFile;; Send File H}eaderBYTE FUNC SFILE() INT NUM, LEN, T, I STRING STFNAME(20) IF DEBUG = 1 THEN PRINTE("SFile") FI NUMTRY ==+} 1 IF NUMTRY > MAXTRY THEN RETURN('A) FI I = 1 ;STANDARD FILE NAMES DON'T HAVE D1: WHILE FILNAM(I) <> ': DO I =}=+ 1 OD LEN = FILNAM(0)-I FOR T = 0 TO LEN-1 DO STFNAME(T) = FILNAM(I+T+1) OD SPACK('F, N, LEN, STFNAME) T = R }PACK(@LEN, @NUM, RECPKT) IF T = 'N OR T = 'Y THEN IF T = 'N THEN NUM ==- 1 IF NUM < 0 THEN NUM = 63 FI } FI IF N <> NUM THEN RETURN(STATE) FI NUMTRY = 0 N = (N + 1) MOD 64 SIZE = BUFILL(PACKET)  } IF SIZE = EOF THEN RETURN('Z) ELSE RETURN('D) FI ELSEIF T = FALSE THEN RETURN(STATE) ELSE RETURN(' }A) FI; SData;; Send File DataBYTE FUNC SData() INT NUM, LEN, T NUMTRY ==+ 1 IF NUMTRY > MAXTRY THEN RETURN }('A) FI SPACK('D, N, SIZE, PACKET) T = RPACK(@LEN, @NUM, RECPKT) IF T = 'N OR T = 'Y THEN IF T = 'N THEN } NUM ==- 1 IF NUM < 0 THEN NUM = 63 FI FI IF N <> NUM THEN RETURN(STATE) FI NUMTRY = 0 }N = (N + 1) MOD 64 SIZE = BUFILL(PACKET) IF SIZE = EOF THEN RETURN('Z) FI RETURN('D) ELSEIF T = FALSE} THEN RETURN(STATE) ELSE RETURN('A) FI; SEOF();; Send End-Of-FileBYTE FUNC SEOF() INT NUM, LEN, T IF DEBUG} = 1 THEN PRINTF("SEOF%E") FI NUMTRY ==+ 1 IF NUMTRY > MAXTRY THEN RETURN('A) FI SPACK('Z, N, 0, PACKET)} IF DEBUG = 1 THEN PRINT("SEOF1 ") FI T = RPACK(@LEN, @NUM, RECPKT) IF T = 'N OR T = 'Y THEN IF T = 'N TH}EN NUM ==- 1 IF NUM < 0 THEN NUM = 63 FI IF N <> NUM THEN RETURN(STATE) FI FI IF DEBUG = 1 THEN } PRINTF("SEOF2 ") FI IF N <> NUM THEN RETURN(STATE) FI NUMTRY = 0 N = (N + 1) MOD 64 IF }DEBUG = 1 THEN PRINTF("Closing %S%E", FILNAM) FI STOPR() IF DEBUG = 1 THEN PRINTF("getting next file%}E") FI DO FILNAM = GETNEXT(6) IF FILNAM = 0 THEN EXIT FI CLOSE(3) ERRORNUM = 0 OPEN(3,F}ILNAM, 4, 0) IF ERRORNUM < 128 THEN EXIT ELSE PRINTF("Can't read %S; Error %D%E", FILNA}M, ERRORNUM) FI OD STARTR() IF FILNAM = 0 THEN RETURN('B) FI PRINTE(FILNAM) RETURN('F) } ELSEIF T = FALSE THEN RETURN(STATE) ELSE RETURN('A) FI; SBreak();; Send Break (End-of-Text)BYTE FUNC SBreak() IN}T NUM, LEN, T IF DEBUG = 1 THEN PRINTF("SBreak%E") FI NUMTRY ==+ 1 IF NUMTRY > MAXTRY THEN RETURN('A) FI} SPACK('B, N, 0, PACKET) T = RPACK(@LEN, @NUM, RECPKT) IF T = 'N OR T = 'Y THEN IF T = 'N THEN NUM ==- 1} IF NUM < 0 THEN NUM = 63 FI IF N <> NUM THEN RETURN(STATE) FI FI IF N <> NUM THEN } RETURN(STATE) FI NUMTRY = 0 N = (N + 1) MOD 64 RETURN('C) ELSEIF T = FALSE THEN RETURN(STATE) ELSE RE}TURN('A) FI;MAIN SEND FILE ROUTINEPROC SENDSW() STRING FSpec(20) DO Print("File spec -> ") INPUTMD(0, FSPEC}, 19) IF FSPEC(0) = 0 THEN RETURN FI Normalize(FSPEC) FILNAM = GETFIRST(6, FSPEC) IF FILNAM = 0 THEN PR }INTE("Invalid file name") FI UNTIL FILNAM <> 0 OD Put(125) PRINTF("Sending %S%E", FSpec) PRINTE("Type any k!}ey to abort.") STARTR() STATE = 'S N = 0 NUMTRY = 0 DO IF CH <> 255 THEN PRINTE("User Abort") CH ="} 255 EXIT FI IF STATE = 'D THEN STATE = SDATA() ELSEIF STATE = 'F THEN STATE = SFILE() ELSEIF STATE#} = 'Z THEN STATE = SEOF() ELSEIF STATE = 'S THEN STATE = SINIT() ELSEIF STATE = 'B THEN STATE = SBREAK() ELSEIF S$}TATE = 'A THEN PRINTE("Aborting") EXIT ELSE EXIT FI OD STOPR() CLOSE(3) RETURN;Tell Server to q%}uitPROC Finish() INT NUM, LEN, T IF DEBUG = 1 THEN PRINTE("Finish") FI STARTR() FOR NUMTRY = 0 TO 3 DO &} PACKET(0) = 'F SPACK('G, 0, 1, PACKET) T = RPACK(@LEN, @NUM, RECPKT) IF T = 'N OR T = 'Y THEN IF T = 'N '} THEN NUM ==- 1 IF NUM < 0 THEN NUM = 63 FI IF 0 <> NUM THEN EXIT FI FI(} IF 0 = NUM THEN STOPR() RETURN FI FI OD STOPR() PRINTE("Server didn't respond"))} RETURN;--------------------------;Kermit Protocol code ends here;--------------------------; --- END OF D:KPRO.ACT --*}-RETURN;--------------------------;Kermit Protocol code ends here;--------------------------; --- END OF D:KPRO.ACT --;D:KTTY.ACT; Terminal emulation for the masses; Emulates a VT-52, Option quits,; Start scrolls.MODULE CARD ARRAY LBASE%,}(24) BYTE ARRAY LCUR(24) BYTE CX, CY, LMAR, DLTOGGLE,TSTATE, consol = $D01F CARD SDLST = $230, SAVEDL, H%-}ELPLINE;Create a display list and display it;; Uses: LBASE, LCUR, LMAR, SAVEDL,; Modifies: DLTOGGLE, SCREEN MEMORYPROC%.} HACKDISPLAY() BYTE ARRAY DBASE BYTE I CARD J, TBASE DBASE = DLTOGGLE*85+SAVEDL+72 DLTOGGLE = 1 - DLTOGGLE TBASE %/}= DBASE FOR I = 0 TO 2 DO DBASE(I) = $70 OD FOR I = 0 TO 23 DO DBASE ==+ 3 DBASE(0) = $42 J = LCUR(I) %0} J = LBASE(J) + LMAR - LMARGN DBASE(1) = J DBASE(2) = J RSH 8 OD DBASE(3) = $00 DBASE(4) = $42 DBASE(5) = H%1}ELPLINE DBASE(6) = HELPLINE RSH 8 DBASE(7) = $41 DBASE(8) = TBASE DBASE(9) = TBASE RSH 8 SDLST = TBASE RETURNPR%2}OC CFLIP() BYTE POINTER M BYTE I I = LCUR(CY) M = LBASE(I) + CX M^ ==! $80 RETURNPROC LCLEAR(BYTE LINE) BYTE %3}I BYTE ARRAY T I = LCUR(LINE) T = LBASE(I)-2 FOR I = 0 TO 81 DO T(I) = 0 OD RETURNPROC TINIT() CARD I, J%4} ;First, find 24 valid lines in ;Sbuf. Valid lines don't cross 4K J = SBUF FOR I = 0 TO 23 DO IF (J RSH 12) <>%5} ((J + 81) RSH 12) THEN J = (J & $F000) + $1000 FI LBASE(I) = J+2 J ==+ 82 LCUR(I) = I ;set %6}up current line order LCLEAR(I) OD ;Now set up a display list SAVEDL = SDLST HELPLINE = SDLST+32 PUT(125) PRI%7}NTE("OPTION quits, (SHIFT)+START scrolls") DLTOGGLE = 0 TSTATE = 'N CX = 0 CY = 0 LMAR = 0 CFLIP() HACKDISPLAY(%8}) RETURNBYTE FUNC TPUTN(BYTE C) BYTE I, TEMP BYTE POINTER M BYTE ARRAY TOSCR = [$40 $00 $20 $60] CFLIP() IF C <%9} 32 THEN IF C = 27 THEN RETURN('E) ELSEIF C = 10 THEN IF CY < 23 THEN CY ==+ 1 ELSE %:} LCLEAR(0) TEMP = LCUR(0) FOR I = 0 TO 22 DO LCUR(I) = LCUR(I+1) OD LCUR(23%;}) = TEMP HACKDISPLAY() FI ELSEIF C = 13 THEN CX = 0 ELSEIF C = 7 THEN ;BELL SETCOLOR(%<}4, 0, 14) I = RTCLOCK + 2 WHILE I <> RTCLOCK DO OD SETCOLOR(4, 0, 0) ELSEIF C = 8 THEN ;BACKSPACE%=} IF CX > 0 THEN CX ==- 1 FI ELSEIF C = 9 THEN ;TAB IF CX < 72 THEN CX = (CX + 8) %>}& $F8 FI ELSEIF C = 12 THEN FOR I = 0 TO 23 DO LCLEAR(I) OD CX = 0 CY = 0%?} FI ELSE ;printing char I = LCUR(CY) M = LBASE(I) + CX M^ = TOSCR((C & $60) RSH 5) % (C & $9F%@}) IF CX < 79 THEN CX ==+ 1 FI FI CFLIP() RETURN('N)BYTE FUNC TPUTE(BYTE C) BYTE TEMP, I BYTE ARRAY M IF%A} C = 'A THEN IF CY > 0 THEN CY ==- 1 FI ELSEIF C = 'B THEN IF CY < 23 THEN CY ==+ 1 FI ELSE%B}IF C = 'C THEN IF CX < 79 THEN CX ==+ 1 FI ELSEIF C = 'D THEN IF CX > 0 THEN CX ==- 1 FI EL%C}SEIF C = 'H THEN CX = 0 CY = 0 ELSEIF C = 'I THEN IF CY > 0 THEN CY ==- 1 ELSE LCLEAR(23) %D} TEMP = LCUR(23) FOR I = 0 TO 22 DO LCUR(23-I) = LCUR(22-I) OD LCUR(0) = TEMP HACKDISPLAY()%E} FI ELSEIF C = 'J OR C = 'K THEN I = LCUR(CY) M = LBASE(I) FOR I = CX TO 79 DO M(I) = 0 OD IF%F} C = 'J THEN FOR I = CY+1 TO 23 DO LCLEAR(I) OD FI ELSEIF C = 'Y THEN RETURN('R) ELSEIF C = '%G}Z THEN PUTD(2, 27) PUTD(2, '/) PUTD(2, 'Z) FI CFLIP() RETURN('N)PROC TPUTSW(BYTE C) IF TSTATE = 'N THEN%H} TSTATE = TPUTN(C) ELSEIF TSTATE = 'E THEN TSTATE = TPUTE(C) ELSEIF TSTATE = 'R THEN IF C < 32 THEN C = 32 FI%I} CY = C - 32 IF CY > 23 THEN CY = 23 FI TSTATE = 'C ELSEIF TSTATE = 'C THEN IF C < 32 THEN C = 32 FI CX%J} = C - 32 IF CX > 79 THEN CX = 79 FI CFLIP() TSTATE = 'N ELSE TSTATE = 'N FI RETURNPROC TQUIT() SDL%K}ST = SAVEDL PUT(125) RETURNPROC TTYMode() BYTE c, SKSTAT = $D20F, OLDSCROLL StartR() TINIT() OLDSCROLL = RTCL%L}OCK - 1 DO IF ch <> $FF THEN c = GetD(1) IF c = 155 THEN c = 13 ELSEIF c = 127 THEN c = 9 ELSEI%M}F c = $7E THEN c = backs FI PutD(2, c) IF localecho = 1 THEN TPUTSW(c) FI FI IF ncib%N}() > 0 THEN c = GetD(2) & $7F ;strip parity TPUTSW(c) FI consol = 8 IF (consol & 4) = 0 THEN E%O}XIT ELSEIF (CONSOL & 1) = 0 AND RTCLOCK <> OLDSCROLL THEN ;START - SHIFT LEFT & RIGHT IF (SKSTAT & 8) %P}= 0 THEN IF LMAR > 0 THEN LMAR ==- 1 FI ELSE IF LMAR < 40+LMARGN THEN LMAR %Q}==+ 1 FI FI HACKDISPLAY() OLDSCROLL = RTCLOCK FI OD TQUIT() StopR() RETURN;End of D:K%R}TTY.ACT FI FI HACKDISPLAY() OLDSCROLL = RTCLOCK FI OD TQUIT() StopR() RETURN;End of D:K$)| (c)1983 Action Computer Services  B JKIHiDiELV`LA)9T} A) BLV`L))l L) &` Fj`8冨凪` )EӅӥ9U} )`ʆǪƩ Ɛee` )ƦʆǢ &Ɛeǐ * *L) )'&&&8儨児9V}祂*L)&&*ń8&&L) _*`hihiHHȱȱL)c !#3`9W}L)JJJJ`H )h`Hȩh v)L* )L* ))L* 1)L* 7)H89X}`HhHh c+L* BHI V䅠L* L+ A)L*Ԇ ؠPIPP`9Y} +P 1)L* +L+ +L+ ,L+H- +8塪墨hL , #,L+ *,L+ +ȹP`9Z}텠8堨塪 +芨Oȩ-`PP +P棩 Ѥģ0-ģ6000:,80H 9[}& &ehe&eģ0ʥ 8堅塅`$ +&*i0:0i +Ʀ`¢ 护9\}°ڱ%ȱ%E +Ld-担CS V+Ld-I #,Ld-H -Ld- +Ld- &B V *NLMȑ9]}` MLN%B VL*S:.E: .H P+ .. + P+h)0I . .L+[\ZUVT` D. . .9^}` K.L+ >.L+ D.L+) ` K.L+ **` 0d )ҥ `2)29_}ҩ`p`0)9/`@0)ӈJJJJ)`Ѕ`ȱ`` 9/ȥ`Hh9`}ƣĢ`ƥĤ`Ѣ /`ȱѢĦ`膡`9a}`ťƤe8夰L/ Ƥ8`ŦeѠe桊L/^9b}^9c}"}9d} 1 1L111͈110L1811EL1L181111L19e}m111EL1L1`L1 *11Ȍ1112211LO21m11m11m11m119f}1L 21111`Ln2j2j2 @e\1i]1\1i]1i`L2 *2 2 @e\1i9g}]1\1i]1i2\1i]1i2\1i]1i22 )\1i]1i2\1i ]1i229q}`-----------`Ρ`Ԡ`-----------b=KERMIT ACTbMKMENU ACTb0KKFUNC ACTbKKPRO ACTb{KIO ACTb(+KTTY ACTbKCOM1030ACTb$KCOM850 ACT`-----------bKERMIT COMbSCKERMIT COMbRS232 COM`-----------bKERMIT DOC#oKERMIT80DOC`-----------#'KERMIT EXC#(STARTUP EXC`-----------#)KERMIT HLP#1KERMIT OPT#2KERMIT PNS`-----------#3AUTORUN SYS`----------- )22Lm3\1i ]1i222L3\1i ]1i22 ** V`L3 *33i9r}3i33 3 2\1i]1i` 1L'4 4 4 P+1`9s} 4 + 4 k2ɀLZ4` 4 4^14_144 44 4L44 4 + 4 k2ɀL4 4 P+` 4м 4Ln49t}4IL4`^1_1 4 P+ 4Ȍ 4 4`1 4t1 4 48 4 4`1I:L44444 4t1 4 4449u} 440 44I L5. 4t1 4 44 4 44L544I L544 4t1 4 444Lj58 4t11t9v}`L5 *5551` 1_1^15 $4`L5 *555555Ȍ5536546365465L9w}`65m55m5M5LU6L`655L"65`Lp6g6f6f6g6k6j6j6 k6L6`:g6f6 5i69x}h6j6h6k6i6L7i6Ȍh6j66k666h66i6LU78j6h6k6i6iif6eg6e8j6h6k6i69y}iif6eg6eh6Јi6L6f6ig6iDf6ig6i0m1f6ig6i:j6ij6k6ik6f69z}g6j6i6Ȍh6j67k677h67i6L.8f6mh6g6mi6l6l6aL#8zl6L#8f6mh6g6mi68l6 h9{}6Сi6L7`` L;8 *3878Ȍ684858j8j86878L848m6858m7838QL868`6878LZ8`L8L9|}8for the Atari 850 and the8 C+L8DC-Hayes Smartmodem8 C+`L8 3 k288ɀL19L9R: device error: %D%E9}}89 G-``L@9<9<9 +`LO9 P+`LX9 P+`##:^9Lh9 P+b9ic9iRb9ic9i 1i0 9~}d9d9c9b9 + k2d9d9ɀL:L9Can't open %S, error %B%Ec9d9b99 G- P+d9`9}" 2(1 ** ee& 2m1$ 29}( 2`L: e9`L: *:::8:i::ѬL;`:Ȍ::9}:0;0;::L;:m:m:8:e:e:m::m:QL~;`:Н:L ;`9}L;,1ɀL;`;IL;,1` 8Š塐L< +;01IL; +; +;L;; L;;L<;I L<`L;L9}< < < +,1ɀL%<`IL5<,1` 8Š塐Lp< + <01ILd< + < + P T U>u<Lw>s <,9}1ɀ IL>L> User Aborted> C+  +i u<Mu<L>L> L9` 8Š塐LO? +v<01IL> +v< +vLV? :+ =9d 1+ =9+ =9+ =99} 1 8Š塐L? +R?01IL? +R? +L{?,1 %D)%E9}DDG$ G-`01ILGL|G('%C%C,%D,%D,%CD{D|DyDzDȱ"Gl G-y9}DzD~D}D @LG%C)%E"G G-DIEL8HLHError: H V+yDzD~D}D @ +D`9}LKHCHBH L9EHDH +FH k2ɀLH01ILHLH End-of-fileH C+LJX1I Y1ILHFH)GHGH GHI 9}GHM@1LHBHmDHCHmEH@1DHEHGHM@1LHFHI@FHLIFHILIFH)FHFH FHIFHM@1 FHILIFHILI9}BHmDHCHmEH@1DHiEHiBHeCHe I@DHiDHEHiEH FHBHmDHCHmEH@1DHEHFHM@1LI9}FHI@FHBHmDHCHmEHFHDHEH8J1K1DHŮEHL J :EHDH`L\H :DH EHL)J`L4JEHDH`9}L>J *4J L99J8J86JqJ7JrJqJ8JrJ9JLK4Jm8J5Jm9J:J:JI#LJ8J9J4Jm8J5Jm9J:J9}:J)I#LJ:JI@:JX1I Y1ILJ:J +L K:JI LJ +L K:JI L K:J +8J9JL`J :`L!KKKKK9}~KiKi%KiKi KiKi@IKiKi-KiKi#`LKKKKK9}8 J1K1KiKi8 N1O1KiKi8 L1M1KiKiI@81KiKi8 <1Ki9}Ki@1`LBL8L7L01ILbLL[LRInitLU C+P1Q1P1Q10L~LA`7L8LѮLM>LȌ=L7L8L9}LL=L>LLL8=L>L7Lm=L8Lm>L0=L>LLL8=L>L0R BL0;L9 D9}>L=L=LIS >LILM0 K0 K0G1F1Y BQ1S1P1R1Q1P1F1iG1i@ *F1G9}1F`LM=L >LLM41`LMA`LM01ILMLMRFile%EM G-P1Q1P1Q10LNA`M0ŢM D9}MMM0MIS MILNR1S1R1S10LWNA`F1 G1LpNMI? MI+F1 G1LN8F1G1ME MELN9}MMY BQ1P141`LNA`LXPMIF MILOMMF1 MMG1LNA` L90 m6,10 +9} :,1ɀLbOLGOCouldn't create %S; error %D%E0,1O( G-A`LtOReceiving %S%E0Oe G-G19}F1Y BQ1S1P1R1Q1P1F1iG1i@ *F1G1D`LXPMIB MIL?PMMF1 MMG1LPA`9}G1F1Y Bi S V+S4 +L TR9}eceiving File(s)S C+L*Ttype any key to abortT C+R41G1F1Q1P1ILnTL_T User AbortingTQ C+LT41IDL9}T ^P41LT41IFLT M41LT41IRLTS4 ?L41LT41IALTLTAbortingT C+LTLTLTLDT L9 P+`LT01LUL9}TSInit%ET G-P1Q1P1Q10L!UA`0 K01LKUL ^@ V+^& +&^Lk^`^& m6^& 5 1 1 1 1L^L^Invalid file name^ C+ 1 1L=^9}} +L^ Sending %S%E^&^ G-L^Type any key to abort.^ C+ :S41G1F1Q1P1IL7_L(_ User Abort_ C+L9}_41IDLL_ Y41L_41IFLa_ V41L_41IZLv_ XZ41L_41ISL_ T41L_41IBL_ \41L_41IAL_L_Abor9}ting_ C+L_L_L_L_ L9 P+`L_01IL_L_Finish_ C+ :Q1P1P1Q1L`F00G B9}_0NҢ_ D___IN _I_IY _IL`_IN _IL`8______0L`_?_M_9} M_L`L`M_ M_L` L9`P1Q1L` L9L`Server didn't respond` C+`|0`9}L2aUa **m am!aiH(ai)a8aa)a.a(a-a*a*aLa(am*a)aip*aLa9}*a*aLRb(ai(a)ai)a(a)aB,a*aa+a+a m`,a*(mamaȱi8R+a,a(ai)ai9}+a(ai)ai,a+a )*aLa(ai)ai(ai)aiB(ai)ai$a(ai)ai9}%a$a )(ai)aiA(ai)ai-a(ai )ai.a-a ).a1-a0`L caacc m`9}*(mamacȱicccI`LScLcLcaMcMc m`*(ma8NcȱOcMcQMcLcNcmMc9}OciMcLc`Lc 1c 1cccͰccLd cc )ciQci )EE9}L9dc)c)icicc m`c*(maciciciRccicccac PcccLc1!9}a0 a0i $a1i%a} +Ld#OPTION quits, (SHIFT)+START scrollsd C+aNaaaa c /a`@ `dLed cd9} L>fdIL)eE`L;fdI LeaLCeaLe PcadddLvediadadLSeda /aL;fdI Le9}aL;fdILe .iddELeLe .L;fdILeaLe8aaL;fdI LfaHL fai)a9}L;fdI L;fddL3fd PcdLfaaLfaadd m`*(mamadȱidddd)`JJJJJ9}eeeid)aOLfa cN`LfffIALfaLf8aaLxhfIBLfaLfaLxhfIC9}LgaOLgaLxhfIDL9gaL6g8aaLxhfIHLNgaaLxhfIILgaLng8aaLg Pcaffͼ9}fLg8f8faafL~gfa /aLxhfIJ fIKLGhaaff m`*(maffafOͼfLh9}fmffifLgfIJLDhaifͼfLDhf PcfL.hLxhfIYLYhR`LxhfIZLxh +/ +Z + c9}N`LhhaINLhh eaL1iaIELhh faL1iaIRLhh Lh h8h aaLhaCaL1iaICL,9}ih L i h8h aOaL!iOa cNaL1iNa`L5i!a1 a0} +`LOi : c8HiILi +GiGiI9}Li GiLiGiILi GiLiGiI~Li1GiGi +$1ILiGi h 8Š塐Li +)GiGi hЭ)LiL9}SjLPj)LPjMHiLPj)L4jaL1j8aaLHj(eRaŮLHja /aHiL]i 2i L9` D:KERMIT.PNSZj D:KERM9}IT.OPTijL}j P+,1hjgj +,1ɀLjxjxjLj,1&xj ** 1e 1e% +,19}LjLjxjLjLkxj P+xjyjyjLIkyj& ** 1e 1eyjLk`LNk} +Lk$Computer Name 9}(baud rate) # 555-1212k[ C+JkJkLk +Jk& ** 1e 1e C+JkLkLk Use arrows, then RETURN9} to dial,k C+Llor ESC to quit. ^S Savesk C+L9lSPACE modifies, ^R Restoresl V+R >. + +`Lbl z9}j Kk\l\liR >. + + +[l[lI Ll\liR >.? +&\l ** 1e 1e9}% + KkL0n[lIL.mR >. +Lm Not Dialingm C+`L0n[lI [lI-LZm\lLZm~ +8\l\lL0n[lI9} [lI=Lm\lLm~ +\lL0n[lIL nhjgj +YlYlLm&Yl ** 1e]l 1e^l]l^l9}ѮLm^l]l J+YlLm P+ zj Kk\lL0n[lIL#n zj Kk\lL0n[lIL0nL3nLml} +&\l ** 1e9}]l 1e^l^l]l C+^l]l x<[l[l`!#$n`Ln *nnnLnnIALn`nIALon9}nLoLnD#:*.*n讂nn 1nini0m1nn m6 P+,1nn +n +,1ɀL9}WoLxon C+n0Luo9͋nLuoLxoL=o P+Lpnn m6LoDFGIon 88nnLo`nIIL(pLoType 'Y' to format %S%E9}nno G- +nn hAIYLpLp Aborted%Eo G-`L(pL!pFormatting. . .p V+,1nmnnin9}n +,1ɀLpL}pDisk I/O error %B%E,1pi G-``Lp} +Lp Micro-DOS:p C+Lp A - D9}isk Directoryp C+Lp D - Delete Filep C+L q F - Lock Filep C+L%q G - Unlock Fileq C+LDq I - Format Disketteq9}/ C+Llq Q - Quit (back to main menu)qN C+Lq %ECommand -> qv G- +pp hApLqADFGIQqp 88ŠLqp +9}pIQLq +`Lq%EFile spec -> q G-p +pp nLpLr,1wjvj +,1ɀLyr1 +1 +1 9}+01 +X1 +$1 +R +(1 + 1 +1 + P+`Lr P+,1wjvj +,1ɀLsLrCouldn't open 9}%S; error %D%Ewj,1vjr G-11Ȍ101Y1X1$1R(1Ȍ 11Lxs +1 +1 +1 +019} +Y1X1 +$1 +R +(1 + 1 +1 P+`Ls} +LsParameters are:s C+1ILsLs contro9}l-HsssLsLsrub outssʍsLs A - Back S sends (%S)%Esss G-1 @ssL0t B - Baud rate (%S)%Es9}st G-X1 Y1L_tLRttexttsMsLstLitbinarytsbsLt D - Default disk drive (D%D:)%E1tv G-Lt F - Fil9}e type (%S)%Esst G-Lt I - I/O Port (%D)%E 1t G-1LuLupulsetssL#uLutoneussLAu T - Di9}aling method (%S)%Essu& G-$1 @ssLzu L - Local-Echo (%S)%Essuc G-Lu M - Margin (%D)%ERu G9}-(1LuLunoneussL v(1ILuLuoddus֍sL v(1ILvLuevenussL v(1IL vLvonvssL6v P -9} Parity (%S)%Essv# G-L]v^S - Save parametersvH C+L~v^R - Restore paramtersvg C+01 @ssLv * - Debug M9}ode (%S)%Essv G-Lv Q - Quit (back to Commands)%Ev G-LwParameter to change -> v G- +~s~s hA~s~s 9}/AL1w~s +~sIALUw1ILMw1LRw1Lx~sIBLtw11Lqw1Lx~sIDLw11Lw1Lx~sI*Lw89}0101Lx~sIQLwLwuit%Ew G-`Lx~sIFLw8X1X1Y1Y1Lx~sILLx$1$1Lx$1Lx~sITL#x11L x9}1Lx~sIML?xRRLz A - Auto-dial (then connect)z C+Ljz! C - Connect (to remote computer)zH C+Lz D - Micro-DOSzt C+Lz:} F - Finish (remote server mode)z C+Lz H - Hang up (the phone)z C+L{$ P - Parameters (inspect and change)z C+L {:} R - Receive (a file){ C+L={ S - Send (a file){* C+Lc{ Q - Quit (back to DOS)%E%E{G G-Ly{ Command -> {m G- +:}xx hAxL{ ACDFHPRSQ{x 88L{x +xIAL{L{uto-dial{ C+ _lIL{ LiL|xICL |L{onnect{ C+ :}LiL|xIFL)|L|inish| C+ _L|xIHLJ|L=|ang up|6 C+ S?L|xIDLg|LZ|os|W C+ pL|xIQL|Lx|uit|t C+L:}|L|xIPL|L| arameters| C+ sL|xISL|L|end| C+ :^L|xIRL|L|ecieve| C+ NSLy U9 P+``xt C+L8wb3~* @*#1 KERMIT.ACT ---#M#JINCLUDE6 } "D:KTTY.ACT"#M#JINCLUDE "D:KMENU.ACT"#M#J#M#J; --- END OF D:JJJ6 C #6 }^ ` D1:KERMIT.ACT D1:KERMIT.ACTL444͜440L4844EL4L4846 }444L4m444EL4L4`t4:aL5 44Ȍ444/5/544Lc5 4m44m44m44m46 }44L54444`L5~5~5 @ep4iq4p4iq4i` !L5 5 5 6 }@ep4iq4p4iq4i5p4iq4i5p4iq4i55 栠p4iq4i5p4i q4i6}55 栠55L6p4i q4i555L6p4i q4i55 V` L6 6}66i6i66 6 5p4iq4i`274 FREE SECTORSL;777 y6}4t7 D7 5ɀLn7`!7 7r47s477 77!7L77$7 7 5ɀL77 y`6} 7м!7L7$7IL7`r4s47 y!7Ȍ 7 7t4 74 7!78 7!7t4I:L7#7"7"7$7 74 76}!7"7#7 "7#70 "7$7I L/8. 74 7!7#7 "7 "7#7L8"7$7I L8"7$7 74 7!7"7#7L~886} 744`:aL8 8884t 4s4r48 87`:a: L9 888999Ȍ99G99H9G6}99H99Lt9 8m98m9M8Li9Lt999L699`:a TL9{9z9z9{99~9~9 9L9`:{96}z9 9}9|9~9|99}9L:}9Ȍ|9~99999|99}9Li: 8~9|99}9iiz9e{9e8~9|96}9}9iiz9e{9e|9Ј}9L9z9i{9iDz9i{9i0m04z9i{9i:~9i6}~99i9z9{9~9}9Ȍ|9~9:9::|9:}9LB; z9m|9{9m}999aL7;z̀9L7;z9m|9{9m}96}89 |9С}9L:`Q~ LO; G;K;ȌJ;H;I;~;~;J;K;L; H;mJ;I;mK;G;QL;J;`J;K6};Ln;`L;L;for the Atari 850 and the; lL;DC-Hayes Smartmodem; l`L; 6 5;;ɀLE6}`=Ȍ===D>D>==L>0=m=m=8=e=e=m==m=QL>`=Н6}=L4>` ML>@4ɀL>`>IL>@4` ;Š塐L? >D4IL> Τ> Τ>L?> L ?>L?>I6 } L?`L> SL#??? Ѥ@4ɀL9?`ILI?@4` ;Š塐L? ?D4ILx? Τ? Τ?M?L?`L9?EL?6!}?????Ȍ????͊?L:@?m??iI(L4@L?(300)?څ??? =IL@(4L1@L@(12006"})@??? =IL1@(4L:@?L???P@P@͊?L@L?m??iI#L@??͊??m??i 6#}ѮLl@L@?LE@?͊?L@L@No phone number in this entry!@ l`L@ Dialing...press any key to abort@ l@4 =6$} ?A ?T ? ? >A ?T ? ?D ?,4LBAP ?LGAT ?????iAiA͉?LA ?m??i ?6%}?L^A ?@4ɀ ILALA User AbortedA l  Ѥi ?M?LALA `<` ;Š塐LcB ?D4IL B6&} Τ? Τ?IC ?I1L'B `<`LcB? LcBLMBUnexpected result '%C'%E?B4 ̣ `<`LA!LjB =+ Q<d 4+ Q<6'}+ Q<+ Q< 4 ;Š塐LB fBD4ILB ΤfB ΤLB@4 ?A ?T ? ? >A ?T ? ?H ?0 ? ? 6(}> `<`,X` %CBLC CCC8CKCCLCKCCLCCLyCH ΤCmCCmC ΤCCL:C6)}``LC zCD4ILCLC ERROR %B%E|CC ̣|CILC y y y ڧ|C@4`300LCCC mC*(mC6*}CЦ LCЅ` LDDDL3DL'DoffD#`LBDL9DonD6`QLFDBDBDaLZDzBDBDALvDZBDLvD`6+}L{D`QLD{D{DaLDz{DLD8{D `LD{D`B3 \!#:BA RMIT.ACT ---#M#J' CLUDE "D:KTTY.ACT"#M#JINCLUDE "D:KME6,}NU.ACT"#M#J#M#J; --- END OF D:C ' y0LE DD4ILEL?ESPack('%C,%D,%D,DDDDDE. ̣" ΤD6-}DDD CLE%C)%E"Ez ̣LE. ΤDȌD`4Ea4EEͯDEDLEL4 ѤDDLED mDmDi6.}D mDDDDDmDmDDDD8D7FD8F7FͯD8FDLFDiDiDmDDmDDDm6/}DDmDDqDDХDL&FD)JJJJJJDe)?DDiDi mDDDiDiP4DDDi60}Di  5`GL GGGiG ;LgGMGLUGD4ILMGLFG (Timeout)G< l`LdGILdG61}`LGGGHH hh`__b38X8YLG GD4ILGLGRPackG G GLG`D4IL62}GGILG ΤG ΤGILGGGG GLIG GL(H`l4 m4L;HG)GGILIGGGG8G63}8 G GLH`l4 m4LHG)GGILIGmGGGG8G G GLH64}`l4 m4LHG)GGILIGmGGGGGGGG8AIȱBIAI͓GBIGLIG GLZI65}`l4 m4LmIG)GGILzILIGmGGGmGGmGGGЏGL0IGILIG GLI`l4I m466}ILIG)GGILIGȌGLHG)JJJJJJGe)?G8G GGMGLsJD4ILjJLSJ(Bad checksum: %D <> %67}D)%EGGJ8 ̣`D4IL KLJ('%C%C,%D,%D,%CGGGGGȱ"68}J ̣GGGG CLK%C)%E"J ̣GIELLKL"KError: K GGGG C69} ̤G`3*L_KWKVK `<YKXK ZK 5ɀLKD4ILKLK End-of-fileK lL#Ml4I m4ILLZK)[K[6:}K [KI [KMT4LLVKmXKWKmYKT4XKYK[KMT4LLZKI@ZKLLZKIL%LZK)ZKZK ZKIZKMT4 ZKIL6;}LZKILLVKmXKWKmYKT4XKiYKiVKeWKe I@XKiXKYKiYK ZKVKmXKWKmYKT4XKY6<}KZKMT4LLZKI@ZKVKmXKWKmYKZKXKYK8^4_4XKŮYKL M =YKXK`LpK =XK YKL=M`LHM6=}YKXK`T,RUN)LRM HM `<MMLM8JMMKMMMLMMMML,N HMmLMIMmMMNMNMI#LMLMMMHMmLM6>}IMmMMNMNM)I#LMNMI@NMl4I m4ILMNM ѤL!NNMI LN ѤL!NNMI L!NNM ѤLMMMLtM =`3L5N16?}N0N0N1N~0Ni1Ni%0Ni1Ni 0Ni1Ni@I0Ni1Ni-0Ni1Ni#`b3LN6@}NNNN8 ^4_4NiNi8 b4c4NiNi8 `4a4NiNiI@L4NiNi86A} P4NiNiT4`ɛ+,LVOLOKOD4ILvOLoORInitOi ld4e4d4e40LOA`KOLOѮL#PROȌQO6B}KOLOOOQOROLP8QOROKOmQOLOmRO3QOROLO8QORO3R EO36C}OOM GROQOQOIS ROILP3 N3 2N3[4Z4Y Ee4g4d4f4e4d4Z4i[4i@6D} ޠZ4[4F`LPQO ROLPH4`LPA`LPD4ILPLPRFile%EP ̣d4e4d4e40LQA`P36E}٢P GPPP3PIS PILQf4g4f4g40LkQA`Z4 [4LQPI? PI+Z4 [4LQ8Z4[4PE6F} PELQPPY Ee4d4H4`LQA`LlSPIF PILRPMZ4 PM[4L RA` `<3 9@46G}3 D =@4ɀLvRL[RCouldn't create %S; error %D%E3@4R< ̣A`LRReceiving %S%E3Ry ̣6H}[4Z4Y Ee4g4d4f4e4d4Z4i[4i@ ޠZ4[4D`LlSPIB PILSSPMZ4 PM[4LSA6I}`[4Z4Y EiSC`LlSP PLgSH4`LlSA`LuSD4ILSLSRData%ES ̣d46J}e4d4e40LSA`S3lSn GqSpSpSID qSILTlSMZ4 mSM[4LTf4g4f4g40L TA`Z4 [46K}L%TlSI? mSI+Z4 [4L|T8Z4[4lSE mSEL|TmSlSY Ee4d4H4`LTA`oSnS3 OM6L}[4Z4Y Ee4g4d4f4e4d4Z4i[4i@ ޠZ4[4D`LHVpSIF qSILUf4g4f46M}g40LUA`Z4 [4L3UlSI? mSI+Z4 [4LU8Z4[4lSE mSELUmSlSY Ee4d4H4`LU6N}A`LHVpSIZ qSIL/VlSMZ4 mSM[4LUA`D4ILULU End-of-FileU l `< y =[4Z4Y EZ4i6O}[4i@ ޠZ4[4F`LHVpS qSLCVH4`LHVA` 4LeV =} ΤLV!Type the file to re6P}ceive, or justVp lLV#RETURN if the other computer is notV lLVin Server mode.V l ̤LV File Spec -> V 6Q}VH LWReceiving File(s)W lL>Wtype any key to abortW( lRH4[4Z4e4d4ILWLsW User AbortingWe l6R}LWH4IDLW rSH4LWH4IFLW PH4LWH4IRLWVH SOH4LWH4IALWLWAbortingW lLWLWLWLXW `< y` 6S}YLWD4LXLXSInit%EX ̣d4e4d4e40L5XA`3 2ND4L_XLPXn = %D%E[4Z4XG ̣ ;Š塐LwX L_X6T}3[4Z4S EW3bW GWWINLXH4`LYWIYLYZ4MW [4MWLXH4`3b NP4LX P6U}4T4LY#T4e4d4Z4i[4i@ ޠZ4[44 4LAYA` `<@4 y44 D =@4ɀLYLY6V}Error %D; couldn't read %S44@4Yq ̣A`LY Sending %S%E44Y ̣F`LYWLYH4`LYA`YK6W}ERMIT.ACTLZD4ILZLZSFileZ ld4e4d4e40L;ZA`YȌY4mY4mYI:LkZYYLDZ6X}448YYYYYY8YZYZZYZYLZ YmYYmYii4e4eYY6Y}YбYLZYYY[4Z4F EY3bY GYYYIN YIYIY YIL\YIN YIL[8Y6Z}YYYYY0L[Y?YZ4MY [4MYL[H4`e4d4Z4i[4i@ ޠZ4[43 \KY4X46[}X4I Y4IL[Z`L\D`L\Y YL\H4`L\A`YL%\d4e4d4e40LA\A`Y4X43[4Z4D E\6\}3b\ G!\ \ \IN !\I \IY !\ILM] \IN !\IL\8\\\\\\0L\\?\Z4M\6]} [4M\L\H4`e4d4Z4i[4i@ ޠZ4[43 \KY4X4X4I Y4ILE]Z`D`Lf] \ !\La]H6^}4`Lf]A`YLo]D4IL]L]SEOF%E]| ̣d4e4d4e40L]A`3[4Z4Z ED4IL]L]SEOF1 ]6_} ]3bf]h Gk]j]j]IN k]Ij]IY k]IL_j]IN k]ILn^8f]f]g]g]f]g]0LU^g]?f6`}]Z4Mf] [4Mg]Ln^H4`D4IL^L^SEOF2 ^{ ̣Z4Mf] [4Mg]L^H4`e4d4Z4i[4i@ ޠZ4[46a}D4IL^L^ Closing %S%E44^ ̣ ` aT a: :aLa`a: 9a: 8444 4LaLaInvalid file namea l6g}4 4LQa} ΤLa Sending %S%Ea:a ̣LbType any key to abort.a l =SH4[4Z4e4d4ILKbLd>dLdd=di6m}p>dLd>d>dLfedd?d?d md@d*(mdm1dȱi8R?d@d6n}dLd t ̣ ss |DsLtADFGIQts L;6}ŠLts ΤsIQLt ̤`Lt%EFile spec -> t ̣s ss qLsLu@4mm D@4ɀLu$4 Ѥ6}(4 Ѥ04 ѤD4 Ѥl4 Ѥ84 ѤR Ѥ<4 Ѥ44 Ѥ,4 Ѥ y`Lu y@4mm D@4ɀL$vLuC6}ouldn't open %S; error %D%Em@4mu ̣$4(4Ȍ04D4m4l484R<4Ȍ44,4Lv $4 (4 06}4 D4 m4l4 84 R <4 44 ,4 y`Q6DLv} ΤLvParameters are:v l$4I6}LvLv control-HvvčvLvLvrub outvvލvL w A - Back S sends (%S)%Evvv ̣(4 CvvLDw B - Baud ra6}te (%S)%Evvw. ̣l4 m4LswLfwtextwvavLwL}wbinarywvvvLw D - Default disk drive (D%D:)%E04w 6}Lw F - File type (%S)%Evvw ̣Lw I - I/O Port (%D)%E44w ̣,4L%xLxpulsexvvL7xL-xtonexv(6}vLUx T - Dialing method (%S)%Evvx: ̣84 DvvLx L - Local-Echo (%S)%Evvxw ̣Lx M - Margin (%D)%6}ERx ̣<4LxLxnonexvˍvL4y<4ILxLxoddxvꍓvL4y<4ILyL yevenyvvL4y<4IL4yL*yonyv6}'vLJy P - Parity (%S)%Evvy7 ̣Lqy^S - Save parametersy\ lLy^R - Restore paramtersy{ lD4 DvvLy6} * - Debug Mode (%S)%Evvy ̣Ly Q - Quit (back to Commands)%Ey ̣LzParameter to change -> y ̣ v6}v |Dvv CDLEzv ΤvIALiz$4ILaz$4Lfz$4L{vIBLz(4(4Lz(4L{vIDLz0404Lz04L6}{vI*Lz8D4D4L{vIQLzLzuit%Ez ̣`L{vIFLz8l4l4m4m4L{vILL{8484L{84L{vITL7{6},4,4L4{,4L{vIMLS{RRLP{RL{vIPLr{<4<4Lo{<4L{vIIL{4444L{44L{vIL{L{S6}aving{ l uL{vIL{L{ Restoring{ l uL{ ΤLvQL{խC~C P4#T4a4`4L4o4n4Ȍ{{L(|6}{ y{L|LN|"Kermit for the Atari Home Computer|+ lL{|"v1.2 (c) 1984 John Howard Palevich|X l ;L|"- Feel free to co6}py this program -| l uL|K:| D y<L}L|PRESS ANY KEY TO EXIT| lIL}L|L ` lLw~ Q - Quit (back to DOS)%E%E~[ ̣L~ Command -> 6}~ ̣ {{ |D{L~ ACDFHPRSQ~{ L;L~{ Τ{IAL~L~uto-dial~ l soIL~ `lL{ICLLo6}nnect l `lL{IFL=L0inish* l bL{IHL^LQang upJ l gBL{IDL{Lnosk l sL{IQLL6}uit lLL{IPLL arameters l vL{ISLLend l NaL{IRLLecieve l bVL} i< y`6}`{ lLL{IPLL arameters l vL{ISLLend l NaL{IRLLecieve l bVL} i< y`48K8P?@     Y`  Y0 l `8NU.ACT KPRO.ACT ATAP<XHow to install Kermit on your ATARIhome computer.RAM: 48K, or more RAMPeripherals: At least one disk drive F} ATARI 850 & a modem, or ATARI 1030, or other communications device1) Format a diskette and wF}rite a copyof DOS onto it.2) Write the AUTORUN.SYS file for thetype of modem that you are going touse. If you are usinF}g an 850, writethe AUTORUN.SYS file that came with theDOS II Master Diskette.3) Write all the K*.* files onto thedisketF}te.4) Insert an ACTION! cartridge intoyour ATARI computer, turn on your 850(or 1030, or whatever) and power cycleyour AF}TARI computer. After the DOSboots you should see the ACTION! editorscreen.5) Read in and edit the file"KERMIT.ACT". CF}hange the line near theend of the file from "KCOM850.ACT" towhichever device you wish to use.Write out the "KERMIT.ACT" fiF}le whenyou are done. If you are trying tosupport a new modem type, create a newKCOM file and use its name here....6) CF}lear the editor buffer and go tothe ACTION! monitor. TypeR "KERMIT.ACT"to compile and run the Kermit program.That's it.F} Here are some commonly askedquestions, with some off-the-cuffanswers:Q: Why do I need an ACTION! cartridgeto run KermF}it?A: The people who developed ACTION!have not yet provided a way of runningtheir program without the ACTION! cart.Q: F} Why do I have to re-compile theprogram every time I want to use it?A: DOS II's menu program destroysthe R: and T: devicF}e drivers, so youcan't use the "L" menu option to runa pre-compiled ACTION program thatdepends on the R: or T: drivers.IF}f you are clever, you can append theACTION! object code to the AUTORUN.SYSfile to generate an auto-bootingversion of KERMIF}T.If you have OS/A+, you can, indeed,save the compiled version of Kermit andexecute it from the command line. Justmake F}sure that you have loaded adevice driver first! Jack Palevichecute it from the command line. Justmake DR BUG Triomflaan 43 Bd du triomphe 14th January. 1050 BruJ}ssels KERMIT SOFTWARE STORY ______ ________ _____ J} During the last meeting I mentioned the future availability of Kermit software. The story is rather long. I, firsJ}t got two mag- tapes from Michel Bartholome (Universite de Liege) written in PDP 11 DOS format. They use a fJ}unny labelling code I was not able to read. So, I went to the V.U.B. where Mr. Goossens was able to read J} the tapes with a VAX utility program. So we were able to make two new tapes in VAX format. This is better becauseJ} they use ascii characters for the labels. The last step was to make or find a program to unblock and reaJ}d that couple of tapes. There came Marc Van Den Bosche (HP) who had written such a program. After a fJ}ew modifications (Kermit tapes contained more than 500 files and some are very large) I was finally able to read tJ}hose tapes. Total software occupies more than 20 megabytes. Using 'FC' or 'SAVER' it goes on one singlJ}e 1600 BPI 2400 feet Tape. At 800 BPI, two tapes are probably required. I made a couple of tests and it J}works very efficiently. For instance, I made a test transferring a large file between a hp1000 and J}a hp150 with a 1200 bauds modem. The effective data transfert reached 70 'usable' bytes per second (i.e. 700 baudJ}s) This means that Kermit has a very low overhead altough it makes sufficient checking to improve data inteJ}grity. The HP1000 version (written in ftn77 assuming RTE6 ) is not capable of terminal emulation. ThJ}at means that sitting at your terminal on a HP1000 you CANNOT become a terminal for an other J} ______ computer. HP1000 kermit works only as file server. This means that hp1000 to hp100J}0 transfert will only be possible after a small program modification...The 98xx version seems to be using J} the pascal language and is therefore not usable on the low end configurations (i.e 9825). The 150 version is veJ}ry similar to the IBM pc software. I had no time to check the 3000 version. I have 3.5 disquettes for hJ}p150 & 5.5 floppies for IBM PC. On top of that the software contains several very detailed documen- tationJ} files. You will also find 'preformated' files ready for a nice printout provided you have a printer that allows J}multiple prints on the same line (e.g. 2631). The user's manual is more than 200 pages long (KUSER) and thJ}e protocol definition manual is 100 pages long (KPROTO). A condensed manual (KINTRO) is also included. J}Last but not least, the software is friendly enough to be used without manual! kermit Jan 85 J} The use of a Multiplexer is mandatory because one needs an interface that does not do 'ENK-ACK' but sufficJ}iently buffered. (12531 will not work). For high speed 'Xon-Xoff' seems to be required. I worked at 1J}200 bauds on a 8 channel mux in TTY mode with no problem. Transmission was OK even when going through noJ}isy telephone lines. A small hint: the hp150 has a highly buffered data com interface. The effect is that KermJ}it may fails at start because it gets first the characters that are still in the buffer. The only solutioJ}n is to 're-'start kermit at main- frame side and at micro side up to the moment they are well synchroJ}nised... Copies are already distributed to: Mr Goosens VUB 02/6412932 (1600 & 800 BPI) Mr DreJ}ze UCL 010/432112 (1600 bpi) Mr Depireux Sonaca 071/342211 (1600 bpi & 3.5 floppy) Mr Sandrap UCL 0J}2/7645561 (1600 & 800 bpi) Mr Tromme F.N. 041/648400 (1600 bpi) If you call me at Distrigaz (02J}/2305020) or at Home (02/3669896), we can make an appointment for you to bring me your tape or disquetJ}tes. You will get them back a few days later because I cannot maintain this large software on-line. I can J} make 1600 & 6250 bpi tapes, 3.5 & 5.5 floppies. Hereafter, you will find a short introductory text made J} at Columbia University. For 100 US$ they can provide you with the latest copy of Kermit software. J} Good luck ____ ____ J} Jean-Luc De Schutter. kermit Jan 85 J}COLUMBIA UNIVERSITY CENTER FOR COMPUTING ACTIVITIES THE KERMIT FILE TRANSFER PROTOCOL J} July 1984 KERMIT is a protocol for transferring sequential files between computers J} of all sizes over ordinary asynchronous ________ _________J}___ telecommunication lines using packets, checksums, and _________________ _____ retraJ}nsmission to promote data integrity. KERMIT is non- proprietary, thoroughly documented, well tested, and in J}wide use. The protocol and the original implementations were developed at Columbia UniversityJ} and have been shared with many other institutions, some of which have made significant contributiJ}ons of their own. KERMIT is presently available for the following systems, with others under development: J} Machine Operating System Language DECsystem-10,20 TOPS-10,20 MACRO-10,20 J} IBM 370 Series VM/CMS, MVS/TSO IBM Assembler IBM 370 Series MTS Pascal J} CDC Cyber 170 NOS Fortran-77 Sperry/Univac-1100 EXEC EXEC Assembler J} Honeywell MULTICS PL/I DEC VAX-11 VMS Bliss-32, Macro-3J}2 DEC PDP-11 RT,RSX,RSTS,MUMPS MACRO-11 & others DEC Pro-300 Series P/OS BJ}liss-16, Macro-11 VAX,PDP-11,SUN,etc UNIX C PRIME PRIMOS PJ}L/P HP3000, Univac, etc Software Tools Ratfor HP1000 RTE Fortran J} Apollo Aegis Fortran Terak, HP-98x6, IBM PC UCSD p-System J} 8080, 8085, or Z80 CP/M-80 ASM 8086, 8088 PC-DOS, MS-DOS MS MASM-86 J} 8086, 8088 CP/M-86 DR ASM86 Apple II 6502 Apple DOS DEC-10/20 CROSS J} TRS80 I, III TRSDOS Z80 Assembler Atari DOS Action! J} The 8080 version runs on the DEC VT180, DECmate II (CP/M), Heath/Zenith-89 and 100, Superbrain, ApJ}ple II/Z80, TRS-80 II (CP/M), Osborne, Kaypro, and others. There are 8086 MS DOS versions for the IJ}BM PC, DEC Rainbow, Wang PC, Compaq, Heath/Zenith-100, HP-150, Tandy 2000, Victor 9000, and J} others. The 8086 CP/M-86 version runs on the DEC Rainbow and the NEC APC. KERMIT DISTRIBUTION POLICY: J}The KERMIT software is free and ______ ____________ _______ ___ ______ ________ __ ____ ___ availablJ}e to all. _________ __ ____ Columbia University, however, cannot afford to distribute free sofJ}tware on the scale required for KERMIT. Therefore, to defray our costs for media, printing, postage, labor, andJ} computing resources, we must request a moderate distribution fee from sites that request KERMIT direcJ}tly from us. The schedule is as follows: kermit Jan 85 Complete KERMIT DistributionJ} $100.00 (Includes Tape, User Guide, and Protocol Manual) Printed Documents J} $5.00 each (User Guide, Protocol Manual, or Any Source Listing) Order Processing Fee J} $100.00 (Omit this if you send a check with your order) The User Guide contains cJ}omplete instructions for installing and using each implementation of KERMIT. The Protocol Manual is a guiK}de for writing a new implementation of KERMIT, and includes a source listing in the C language. Other sitesK} remain free to redistribute KERMIT on their own _____ _____ ______ ____ __ ____________ ______ __ _____ _K}__ terms, and are encouraged to do so, with the following ______ ___ ___ __________ __ __ K}___ ____ ___ _________ stipulations: KERMIT should not be sold for profit; credit should _____________ ___K}___ ______ ___ __ ____ ___ ______ be given where it is due; and new material should be sent back to ColumK}bia University at the address below so that we can maintain a definitive and comprehensive set of KK}ERMIT implementations for further distribution. To order KERMIT from Columbia University, send a leK}tter requesting either: (a) The manuals or source listings you desire (specify each oneK}), or (b) A 9-track magnetic tape in one of the following formats: System Tape Format K } Densities TOPS-10 BACKUP/Interchange, Unlabeled 800, 1600 TOPS-20 K } DUMPER, Unlabeled 800, 1600 UNIX TAR 800, 1600 K } IBM VM/CMS EBCDIC, CMS Format 1600, 6250 or EBCDIC, OS StanK }dard Label 1600, 6250 Other ASCII, ANSI Label, Format ``D'' 800, 1600 (Specify systK }em, format, and density.) One copy of each manual will be included with the tape. We will supply the K} tape, packaging, and postage. We can only make tapes in the formats listed above. We cannot produce fK}loppy disks; bootstrapping procedures are provided to allow the microcomputer versions to be downloaded from K} the mainframe for which the tape is produced. The tape includes all source programs, documentation, and, K}when practical, binaries or hex. Unfortunately, our limited resources to not allow us to provide aK}utomatic updates to KERMIT recipients when new implementations, documentation, or bug fixes appear. SendK} your letter to: KERMIT Distribution Columbia University Center for Computing Activities 7th K}Floor, Watson Laboratory 612 West 115th Street New York, N.Y. 10025 kermit Jan 85 K} Please list the machines and operating systems you expect to run KERMIT on, specify the tape format or tK}he listings desired, and mention whether there are additional systems for which you require KERMIT or ifK} you might be interested in attempting your own implementation for a new system. No warranty of the soK}ftware nor of the accuracy of the __ ________ __ ___ ________ ___ __ ___ ________ __ ___ docK}umentation surrounding it is expressed or implied, and neither _____________ ___________ __ __ _________ __ ________ K}___ _______ the authors nor Columbia University acknowledge any liability ___ _______ ___ ________ ____K}______ ___________ ___ _________ resulting from program or documentation errors. _________ ____ _______ __ K}_____________ _______ ***************************************************************** The folowing pK}rogram can be used to print a "for" file (formatted) Your printer must be capable of performing 'oK}verprint'. Funny calls are in the 'brussels library' FTN7X PROGRAM KERPR (3,110),FOR FILES PRK}INTER <841226.1129> INTEGER BUF(100),NAM(3),SEC,CART,DCB(2000) CHARACTER*1 CONTROL(2),CR K } EQUIVALENCE (BUF(1),CONTROL(1)),(CR,ICR) DATA ICR/6400B/ CALL REIO(2,1,29H/KERPRINT : FILEK!} TO PRINT? _,-29) CALL FILNM(NAM,SEC,CART,401B) CALL OPEN(DCB,IER,NAM,0,SEC,CART,2000) K"} IF(IER.LT.0) GOTO 998 LP=6 1 CALL INITB(BUF,100,2H ) CALL READF(DCB,IER,BUF,1K#}00,L) IF(CONTROL(1).EQ.'1') CALL EXEC(3,LP+1100B,-1) IF(CONTROL(1).EQ.'0') CALL EXEC(3,LP+1100BK$},+2) IF(CONTROL(1).EQ.' ') CALL EXEC(3,LP+1100B,+1) CONTROL(1)=CR L=L+1 K%} CALL REIO(2,LP+2000B,BUF,L) IF(L.LT.1) GOTO 999 GOTO 1 998 CALL FMPER(IER,1) K&} 999 CALL CLOSE(DCB) END kermit Jan 85 1 998 CALL FMPER(IER,1) HYREM ǠӲ͠RS232REM ǠԮ͛CKERMITEND kermit Jan 85 1 998 CALL FMPER(IER,1) PAREM SWITCH ATARI 850REM THEN TYPE @KERMITԮ͛CKERMITEND kermit Jan 85 1 998 CALL FMPER(IER,1) T,Atari Kermit, Action! Version-----------------------------The Atari Home Computer KERMIT files have been renamed as follow_*}s for theKERMIT distribution tapes. The ATA prefix denotes the "ATari Action" version.The distribution names are unique wi_+}thin the 6.3 limitation of TOPS-10,the 8.3 limitation of most microcomputers, and fit within the 9.3 limit on theVAX VMS AN_,}SI labeled tape. When you want to use these files, you should movethem to a separate area and restore their original names._-} Original Name Distribution Name KCOM1030.ACT ATA1030.ACT KCOM850.ACT ATA850.ACT KE_.}RMIT.ACT ATAKERMIT.ACT KERMIT.DOC ATAKERMIT.DOC KERMIT.PNS ATAKERMIT.PNS KFUNC.A_/}CT ATAFUNC.ACT KIO.ACT ATAIO.ACT KMENU.ACT ATAMENU.ACT KPRO.ACT _0} ATAPRO.ACT KTTY.ACT ATATTY.ACT Total of 10 filesACT ATAMENU.ACT KPRO.ACT \I O.ACT KTTY.ACT ATATTY.ACT Total of 10 filesACT ATAMENU.ACT KPRO.ACT ` SU-Score(300)#4153221570SU-Score(1200)#4154970061T Total of 10 filesACT ATAMENU.ACT KPRO.ACT d38K8P?@     Y`  Y0 l `8 ATAMENU.ACT KPRO.ACT lX