;D:KCOM850.ACT›;All the communications stuff:›;›; Opening, closing and›; DIALING›; (for the DC-Hayes Smartmodem)›; KERMIT protocol›; for Atari Home Computers›; version 1.1›; (C) 1983 John Howard Palevich›; to be distributed free of charge›;›;Started NOVEMBER 5, 1983››PROC MODEMINIT()› PRINTE("for the Atari 850 and the")› PRINTE("DC-Hayes Smartmodem")› RETURN››CARD 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 Communications I/O››PROC StopR()› Close(2)› RETURN››PROC CloseR()› CLOSE(2)› RETURN››BYTE 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)› INT 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 SM›PROC 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 out›; to R:, wait for a matching character›; or user's abort››PROC 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››;Dial the number in string P....››BYTE FUNC AUTODIAL(STRING P)› BYTE I, C, NN› › NN = P(0) ;LENGTH OF STRING›› ;See if Baud Rate Specified› FOR C = 1 TO NN› DO› IF P(C) = '( THEN› IF SUBEQ(P,C,"(300)") = 1 THEN› BAUD = 0› ELSEIF 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› STARTR()› PutMatch(13) ;Establish baud Rate› PutMatch('A)› PutMatch('T)› PutMatch(13)› GetMack() ;Swallow Reply› PutMatch('A)› PutMatch('T)› PutMatch(' )› PutMatch('D)› IF dial = 0 THEN› PutMatch('P)› ELSE› PutMatch('T)› FI› FOR I = C TO P(0)› DO› PutMatch(P(I))› OD› PutMatch(13)› DO› IF ERRORNUM >= 128› OR CH <> $FF THEN› PRINTE("User Aborted")› PUTD(2, 13) ;to get out of wait-for-carrier mode› I = RTCLOCK+10› WHILE RTCLOCK <> I DO OD ;Drain› STOPR()› RETURN(0)› FI› IF NCIB() > 0 THEN› C = GetD(2)› IF DEBUG = 1 THEN› PUT(27)› PUT(C)› FI› IF C = 'C OR C = '1 THEN ;Connected› STOPR()› RETURN(1)› ELSEIF C >= 32 THEN› PrintF("Unexpected result '%C'%E", C)› STOPR()› RETURN(0)› FI› FI› OD››;CAUSE THE SMARTMODEM TO HANG UP››PROC HANGUP()› BYTE B› STARTR()› ;As per page 9-2 of the Smart-› ;modem manual. Basicly, the› ;escape sequence 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› ;ourselves.›› 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› PutMatch('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 ---›