;D:KDIAL.ACT›;Auto-Dial and phone number editor›; (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›MODULE› STRING PNFILE = "D:KERMIT.PNS"› DEFINE NUMWID = "38"››;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››;Restore Phone Number Buffer››PROC RESTNUMS()› BYTE I, J›› Close(3)› ERRORNUM = 0› OPEN(3, PNFILE, 4, 0)› IF ERRORNUM < 128 THEN› FOR I = 0 TO 19 DO› ERRORNUM = 0› InputMD(3,SBUF+I*NUMWID, 37)› IF ERRORNUM >= 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 screen››PROC DispES()› BYTE I›› ;Display Screen› CRSINH = 1› PUT(125)› FOR I = 0 TO 19› DO› Put(32)› PRINTE(SBUF+NUMWID*I)› OD›› PUTE()› PrintE("Use arrows, then RETURN to dial,")› PrintE("or ESC to quit. ^S Saves")› PRINT("SPACE modifies, ^R Restores")› Position(LMARGN, 0)› Put($1F)› CRSINH = 0› Put($1E)› RETURN››;Auto-Dial a number, return 1 if›;successful, 0 if failure›;›; Also has provisions for editing›; phone numbers.››BYTE FUNC AutoDial()› BYTE I, NN, C, CY› BYTE POINTER P›› RESTNUMS()› DISPES()› CY = 0›› ;Edit/Select Loop› › DO› CRSINH = 1› POSITION(LMARGN, CY)› PUT(27)› PUT($1F)› C = GetD(1)› IF C = 32 THEN› ;User wants to change this line› POSITION(LMARGN,CY)› CRSINH = 0› PUT('?)› InputMD(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 arrow› CY ==- 1›› ELSEIF (C = $1D OR C = '=)› AND CY < 19 THEN› PUT($7E) ;Erase the arrow› CY ==+ 1›› ELSEIF C = 'S-'@ THEN ;^S› OPEN(3, PNFILE, 8, 0)› FOR I = 0 TO 19 DO› P = SBUF+I*NUMWID› IF P(0) > 0 THEN› 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)› 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(' )› FOR I = C TO NN› 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››; --- END OF D:KDIAL.ACT ---›