;D:KMENU.ACT›; Menu functions of Kermit program››MODULE› DEFINE NUMWID = "38"›› STRING PNFILE = "D:KERMIT.PNS"› STRING PARAMFILE = "D:KERMIT.OPT"››;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)›› PRINTE("Computer Name (baud rate) # 555-1212")› FOR I = 0 TO 19› DO› Put(32)› PRINTE(SBUF+NUMWID*I)› OD›› 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 EditDial()› BYTE I, NN, C, CY› BYTE POINTER P›› RESTNUMS()› DISPES()› 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('?)› 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)› C = AutoDial(P)› RETURN(C)››;Execute a DOS-type command››PROC DODOS(BYTE CMD› STRING FSPEC)› STRING FMSCOM = [0 $21 $23 $24 $FE]› STRING FILNAM(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 COMMANDS› 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› RETURN› ›PROC MICRODOS()› BYTE cmd› STRING fspec(21)› PUT(125)› DO› PRINTE("Micro-DOS:")› PRINTE(" A - Disk Directory")› PRINTE(" D - Delete File")› PRINTE(" F - Lock File")› PRINTE(" G - Unlock File")› PRINTE(" I - Format Diskette")› PRINTE(" Q - Quit (back to main menu)")› PRINTF("%ECommand -> ")› DO› cmd = GetD(1)› cmd = ToUpper(cmd)› UNTIL› INSET(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 PARAMETERS››PROC SaveParams()› ERRORNUM = 0› OPEN(3, PARAMFILE, 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 PARAMETERS››PROC RestoreParams()› CARD TEMP› CLOSE(3)› ERRORNUM = 0› OPEN(3, PARAMFILE, 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 = GETD(3)› DISKN = GETD(3)› DEBUG = GETD(3)› IMAGE = GETD(3)› LOCALECHO = GETD(3)› LMARGN = GETD(3)› PARITY = GETD(3)› DNUM = GETD(3)› DIAL = GETD(3)› FI› CLOSE(3)› RETURN››;SET PARAMETERS››PROC 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 THEN› ts = "pulse"› ELSE› ts = "tone"› FI› PRINTF(" T - Dialing method (%S)%E",› ts)›› ts = DecodeFlag(localecho)› PRINTF(" L - Local-Echo (%S)%E",› ts)›› PRINTF(" M - Margin (%D)%E", LMARGN)››› IF PARITY = 0 THEN› TS = "none"› ELSEIF PARITY = 1 THEN› TS = "odd"› ELSEIF PARITY = 2 THEN› TS = "even"› ELSEIF PARITY = 3 THEN› TS = "on"› FI› PRINTF(" P - Parity (%S)%E", ts)›› PRINTE("^S - Save parameters")› PRINTE("^R - Restore 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 THEN ;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-IMAGE›› 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 ;Margin› 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› OD››PROC Main()› BYTE cmd, FLAG, I, BANK = $D500›› BANK = 0›› ;SETUP MY ERROR ROUTINE› ERROR = MERROR›› EOL = 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 file)")› 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")› RECSW()› FI› OD›› CLOSER()› FI› CLOSE(1)› RETURN››;--- END OF D:KMENU.ACT ---››