$LINES COMMENT ************************************************************************** ** TDD.BAS (SBASIC) v.4 TTY for the deaf for Kaypro II ** ** See TDD.DOC for interface instructions. ** ** (1984) Ron Friedrich, 7611 Park Ln, Dallas, TX 75225. ** ************************************************************************** END VAR A,X,N,I,BITCOUNT,TABCOUNT,SHIFT,LINECOUNT,BUFFIN,BUFFOUT,MODIFY,READY,MAX,BACK1,BACK2,IN1,IN2,IN3=CHAR VAR WAIT,STARTBIT,RCVBIT,RCVSTOP,SENDSTOP,RUNBIT,MSGBIT,DELAY,MAKE,BREAK,HANG,INTERDGT,SAVCOUNT=INTEGER VAR MSGFILE,SAVEFILE=STRING:14 VAR A$=STRING DIM CHAR KEYCODE(6,127) TDDTOASC(1,31) KEYIN(6) BUFFER(255) PHONUM(11,26) SAVE(16380) DIM STRING:35; MENULINE(25) FILES D,S(1),SA(1),R(48),SA(1) PROCEDURE PRINT&SAVE(X1=CHAR) PRINT X1; IF X1=8 THEN BEGIN IF SAVCOUNT>0 THEN SAVCOUNT=SAVCOUNT-1 PRINT CHR(24); END ELSE BEGIN IF SAVCOUNT=16380 THEN BEGIN SAVCOUNT=1 MAX='Y' END ELSE SAVCOUNT=SAVCOUNT+1 SAVE(SAVCOUNT)=X1 END END PROCEDURE PROCEDURE FIX.KEYIN(X2=CHAR) IF NOT KEYCODE(6,X2)=0 AND NOT KEYCODE(6,X2)=SHIFT THEN BEGIN IF SHIFT=1 THEN BEGIN SHIFT=2 BUFFIN=BUFFIN+1 BUFFER(BUFFIN)=11 END ELSE BEGIN SHIFT=1 BUFFIN=BUFFIN+1 BUFFER(BUFFIN)=12 END END CASE X2 OF 32: IF LINECOUNT>60 THEN X2=13 11: SHIFT=2 12: SHIFT=1 END CASE IF X2=13 THEN BEGIN LINECOUNT=0 BUFFIN=BUFFIN+1 BUFFER(BUFFIN)=13 PRINT&SAVE 13 X2=10 END BUFFIN=BUFFIN+1 BUFFER(BUFFIN)=X2 IF X2>12 THEN LINECOUNT=LINECOUNT+1 PRINT&SAVE KEYCODE(0,X2) END PROCEDURE PROCEDURE DRIVE.OFF I=INP(01CH) IF I<64 THEN BEGIN I=I+64 OUT 01CH,I END END PROCEDURE PROCEDURE HANGUP OUT 8,5 FOR WAIT=0 TO HANG NEXT WAIT OUT 8,1 GOTO 1.DIAL END PROCEDURE PROCEDURE EXIT.DIALER IF MODIFY THEN BEGIN CREATE "PHONUM.TDD" OPEN #3;"PHONUM.TDD" FOR A=0 TO 25 WRITE #3,A;MENULINE(A) FOR I=0 TO 11 WRITE #3,A;PHONUM(I,A) NEXT I NEXT A CLOSE #3 MODIFY=0 END PRINT CHR(26); IF X=3 THEN STOP ELSE 0.RESET END PROCEDURE PROCEDURE DIALNUM(NUM=CHAR) FOR A=1 TO PHONUM(0,NUM) IF PHONUM(A,NUM)=10 THEN PRINT STRING(4,12);'0';CHR(8); ELSE PRINT STRING(4,12);(PHONUM(A,NUM))+48;CHR(8); FOR WAIT=0 TO INTERDGT NEXT WAIT FOR N=1 TO PHONUM(A,NUM) OUT 8,5 FOR WAIT=0 TO BREAK NEXT WAIT OUT 8,1 FOR WAIT=0 TO MAKE NEXT WAIT NEXT N PRINT CHR(12); INPUT3 #5;X IF X=27 THEN A=PHONUM(0,NUM) NEXT A IF X=27 THEN HANGUP ELSE EXIT.DIALER END PROCEDURE PROCEDURE LOADNUM(NUM=CHAR) PRINT SPC(4); FOR A=1 TO 11 INPUT3 X IF X>47 AND X<58 THEN BEGIN PRINT X;SPC(4); IF X='0' THEN PHONUM(A,NUM)=10 ELSE PHONUM(A,NUM)=X-48 END ELSE A=A-1 PHONUM(0,NUM)=A IF X=13 THEN A=11 NEXT A END PROCEDURE rem ***************************************************************** rem ** start program ** rem ** SET UP ASCII/BAUDOT CONVERSION TABLES ** rem ***************************************************************** on error goto 0.time open #1;"TIMING.DAT" read #1;STARTBIT,RCVBIT,RCVSTOP,RUNBIT,MSGBIT,SENDSTOP,HANG,BREAK,MAKE,INTERDGT goto 0kload 0.time STARTBIT=145 RCVBIT=97 RCVSTOP=30 RUNBIT=88 MSGBIT=94 SENDSTOP=10 HANG=5000 BREAK=270 MAKE=170 INTERDGT=3000 0kload on error off DRIVE.OFF OUT 8,1 rem set tdd output bit high OUT 5,8 rem quiet keyboard PRINT CHR(26);"Loading conversion tables..."; TDDTOASC(1,0)=CHR(8) TDDTOASC(1,1)='E' TDDTOASC(1,2)=CHR(10) TDDTOASC(1,3)='A' TDDTOASC(1,4)=CHR(32) TDDTOASC(1,5)='S' TDDTOASC(1,6)='I' TDDTOASC(1,7)='U' TDDTOASC(1,8)=CHR(13) TDDTOASC(1,9)='D' TDDTOASC(1,10)='R' TDDTOASC(1,11)='J' TDDTOASC(1,12)='N' TDDTOASC(1,13)='F' TDDTOASC(1,14)='C' TDDTOASC(1,15)='K' TDDTOASC(1,16)='T' TDDTOASC(1,17)='Z' TDDTOASC(1,18)='L' TDDTOASC(1,19)='W' TDDTOASC(1,20)='H' TDDTOASC(1,21)='Y' TDDTOASC(1,22)='P' TDDTOASC(1,23)='Q' TDDTOASC(1,24)='O' TDDTOASC(1,25)='B' TDDTOASC(1,26)='G' TDDTOASC(1,27)='u' TDDTOASC(1,28)='M' TDDTOASC(1,29)='X' TDDTOASC(1,30)='V' TDDTOASC(1,31)='d' TDDTOASC(2,0)=CHR(8) TDDTOASC(2,1)='3' TDDTOASC(2,2)=CHR(10) TDDTOASC(2,3)='-' TDDTOASC(2,4)=CHR(32) TDDTOASC(2,5)=CHR(39) TDDTOASC(2,6)='8' TDDTOASC(2,7)='7' TDDTOASC(2,8)=CHR(13) TDDTOASC(2,9)='$' TDDTOASC(2,10)='4' TDDTOASC(2,11)=CHR(39) TDDTOASC(2,12)=',' TDDTOASC(2,13)='!' TDDTOASC(2,14)=':' TDDTOASC(2,15)='(' TDDTOASC(2,16)='5' TDDTOASC(2,17)=CHR(34) TDDTOASC(2,18)=')' TDDTOASC(2,19)='2' TDDTOASC(2,20)='=' TDDTOASC(2,21)='6' TDDTOASC(2,22)='0' TDDTOASC(2,23)='1' TDDTOASC(2,24)='9' TDDTOASC(2,25)='?' TDDTOASC(2,26)='+' TDDTOASC(2,27)='u' TDDTOASC(2,28)='.' TDDTOASC(2,29)='/' TDDTOASC(2,30)=';' TDDTOASC(2,31)='d' COMMENT *************************************************************************** ** KEYCODE Second dimension is keyboard ASCII char. ** ** First dimension (0-6): ** ** 0 = CRT print char ** ** 1 = TDD code (decimal), later converted to TDD first bit.** ** 2-5 = TDD bits 2-5 ** ** 6 = TDD shift status ** ** 0 = neutral (space,bkspace,shift up/down,ret.) ** ** 1 = LTRS (shift down) ** ** 2 = FIGS (shift up) ** *************************************************************************** END KEYCODE(0,8)=8 rem console print char KEYCODE(0,10)=10 KEYCODE(0,13)=13 FOR N=32 TO 95 KEYCODE(0,N)=N NEXT N KEYCODE(0,60)=40 KEYCODE(0,62)=41 KEYCODE(0,64)=32 KEYCODE(0,91)=40 KEYCODE(0,92)=47 KEYCODE(0,93)=41 KEYCODE(0,94)=39 FOR N=96 TO 126 X=N-32 KEYCODE(0,N)=X NEXT N KEYCODE(0,127)=8 FOR N=0 TO 31 rem ascii to tdd KEYCODE(1,N)=4 NEXT N KEYCODE(1,8)=0 KEYCODE(1,10)=2 KEYCODE(1,11)=27 KEYCODE(1,12)=31 KEYCODE(1,13)=8 KEYCODE(1,32)=4 KEYCODE(1,33)=13 KEYCODE(1,34)=17 KEYCODE(1,35)=20 KEYCODE(1,36)=9 KEYCODE(1,38)=26 KEYCODE(1,39)=11 KEYCODE(1,40)=15 KEYCODE(1,41)=18 KEYCODE(1,42)=3 KEYCODE(1,43)=26 KEYCODE(1,44)=12 KEYCODE(1,45)=3 KEYCODE(1,46)=28 KEYCODE(1,47)=29 KEYCODE(1,48)=22 KEYCODE(1,49)=23 KEYCODE(1,50)=19 KEYCODE(1,51)=1 KEYCODE(1,52)=10 KEYCODE(1,53)=16 KEYCODE(1,54)=21 KEYCODE(1,55)=7 KEYCODE(1,56)=6 KEYCODE(1,57)=24 KEYCODE(1,58)=14 KEYCODE(1,59)=30 KEYCODE(1,60)=15 KEYCODE(1,61)=20 KEYCODE(1,62)=18 KEYCODE(1,63)=25 KEYCODE(1,64)=14 KEYCODE(1,65)=3 KEYCODE(1,66)=25 KEYCODE(1,67)=14 KEYCODE(1,68)=9 KEYCODE(1,69)=1 KEYCODE(1,70)=13 KEYCODE(1,71)=26 KEYCODE(1,72)=20 KEYCODE(1,73)=6 KEYCODE(1,74)=11 KEYCODE(1,75)=15 KEYCODE(1,76)=18 KEYCODE(1,77)=28 KEYCODE(1,78)=12 KEYCODE(1,79)=24 KEYCODE(1,80)=22 KEYCODE(1,81)=23 KEYCODE(1,82)=10 KEYCODE(1,83)=5 KEYCODE(1,84)=16 KEYCODE(1,85)=7 KEYCODE(1,86)=30 KEYCODE(1,87)=19 KEYCODE(1,88)=29 KEYCODE(1,89)=21 KEYCODE(1,90)=17 KEYCODE(1,91)=15 KEYCODE(1,92)=29 KEYCODE(1,93)=18 KEYCODE(1,94)=29 KEYCODE(1,95)=3 FOR N=96 TO 126 X=N-32 KEYCODE(1,N)=KEYCODE(1,X) NEXT N KEYCODE(1,127)=0 FOR N=33 TO 126 rem status IF KEYCODE(0,N)>64 AND KEYCODE(0,N)<91 THEN KEYCODE(6,N)=1 ELSE KEYCODE(6,N)=2 NEXT N FOR N=0 TO 127 rem tdd bits X=KEYCODE(1,N) IF X>15 THEN BEGIN KEYCODE(5,N)=1 X=X-16 END ELSE KEYCODE(5,N)=0 IF X>7 THEN BEGIN KEYCODE(4,N)=1 X=X-8 END ELSE KEYCODE(4,N)=0 IF X>3 THEN BEGIN KEYCODE(3,N)=1 X=X-4 END ELSE KEYCODE(3,N)=0 IF X>1 THEN BEGIN KEYCODE(2,N)=1 X=X-2 END ELSE KEYCODE(2,N)=0 KEYCODE(1,N)=X NEXT N SHIFT=1 SAVCOUNT=0 READY=0 MAX=0 IF INP(1CH)<67 THEN PRINT CHR(26);"Connect the acoustic coupler and turn it on."; REPEAT I=INP(01CH) UNTIL I>72 rem Wait here until coupler is on. PRINT CHR(26);"Ready" rem ***************************************************************** rem ** TDD SEND/RECEIVE ROUTINE ** rem ***************************************************************** 0.RESET DRIVE.OFF ON ERROR GOTO 0.RESET BUFFIN=0 BUFFOUT=0 ECHO OFF REPEAT BEGIN rem CYCLE STARTS HERE IF BUFFOUT=BUFFIN THEN BEGIN REPEAT BEGIN rem sample ports INPUT3 #5;X I=INP(01CH) END UNTIL I<67 OR NOT X=0 IF NOT X=0 THEN BEGIN IF X=27 THEN 0.CTRL ELSE FIX.KEYIN X END ELSE BEGIN rem receive routine N=0 FOR WAIT=0 TO STARTBIT NEXT WAIT rem get first bit rem (Majority vote on 3 inputs determines bit level; nec. for noisy lines.) IN1=INP(1CH) IN2=INP(1CH) IN3=INP(1CH) IF IN1+IN2+IN3>210 THEN N=N+1 ELSE N=N+0 FOR WAIT=0 TO RCVBIT NEXT WAIT rem get second bit IN1=INP(1CH) IN2=INP(1CH) IN3=INP(1CH) IF IN1+IN2+IN3>210 THEN N=N+2 ELSE N=N+0 FOR WAIT=0 TO RCVBIT NEXT WAIT rem get third bit IN1=INP(1CH) IN2=INP(1CH) IN3=INP(1CH) IF IN1+IN2+IN3>210 THEN N=N+4 ELSE N=N+0 FOR WAIT=0 TO RCVBIT NEXT WAIT rem get fourth bit IN1=INP(1CH) IN2=INP(1CH) IN3=INP(1CH) IF IN1+IN2+IN3>210 THEN N=N+8 ELSE N=N+0 FOR WAIT=0 TO RCVBIT NEXT WAIT rem get fifth bit IN1=INP(1CH) IN2=INP(1CH) IN3=INP(1CH) IF IN1+IN2+IN3>210 THEN N=N+16 ELSE N=N+0 X=TDDTOASC(SHIFT,N) IF NOT X=13 THEN FOR WAIT=0 TO RCVSTOP NEXT WAIT CASE X OF 'd': SHIFT=1 'u': SHIFT=2 13: BEGIN PRINT&SAVE 13 rem PRINT&SAVE 10 rem LINECOUNT=0 END 10: rem DO NOTHING 8: IF INP(1CH)>72 THEN PRINT&SAVE 8 rem coupler "ON" X: BEGIN PRINT&SAVE X LINECOUNT=LINECOUNT+1 END END CASE IF BACK1='G' AND X='A' THEN BEGIN IF BACK2<33 OR BACK2='d' THEN OUT 5,4 rem BEEP on " GA" END BACK2=BACK1 BACK1=X END END IF NOT BUFFIN=BUFFOUT THEN BEGIN rem send routine BUFFOUT=BUFFOUT+1 X=BUFFER(BUFFOUT) OUT 8,0 rem start bit WAIT=DELAY WAIT=DELAY INPUT3 #5;KEYIN(0) FOR WAIT=0 TO RUNBIT NEXT WAIT FOR BITCOUNT=1 TO 5 OUT 8,KEYCODE(BITCOUNT,X) INPUT3 #5;KEYIN(BITCOUNT) FOR WAIT=0 TO RUNBIT NEXT WAIT NEXT BITCOUNT OUT 8,1 rem stop bit INPUT3 #5;KEYIN(6) FOR BITCOUNT=0 TO 6 IF NOT KEYIN(BITCOUNT)=0 THEN FIX.KEYIN KEYIN(BITCOUNT) ELSE FOR WAIT=0 TO SENDSTOP NEXT WAIT INPUT3 #5;KEYIN(BITCOUNT) NEXT BITCOUNT FOR BITCOUNT=0 TO 6 IF NOT KEYIN(BITCOUNT)=0 THEN FIX.KEYIN KEYIN(BITCOUNT) NEXT BITCOUNT END END UNTIL X<8 rem ****************************************************************** rem ** CONTROL FUNCTIONS ** rem ****************************************************************** 0.CTRL TEXT 0,^ SPECIAL FUCTIONS ================ D> DIALER V> View the preceding conversation(s). W> Write the preceding conversation(s) to disk. M> Message file name (step 1) S> Send message file (step 2) L> Change delay loop timing (technical stuff) C> Clear screen X> Exit to CP/M ANY OTHER KEY: Return to TDD send/receive mode. ^ input3 "Your pleasure: ";X print chr(13);string(14,11);string(LINECOUNT,12);chr(23); IF X>96 THEN X=X-32 ECHO ON IF X='C' THEN PRINT CHR(26); IF X='D' THEN 0.DIAL IF X='W' THEN BEGIN rem save conversation ON ERROR GOTO 00PSAVE PRINT INPUT2 "Enter name of file to write: ";A$ N=LEN(A$) SAVEFILE="" FOR A=1 TO N I=RIGHT(A$,A) SAVEFILE=SAVEFILE+KEYCODE(0,I) NEXT A PRINT "Writing ";SAVEFILE; CREATE SAVEFILE OPEN #4;SAVEFILE IF MAX THEN BEGIN FOR WAIT=SAVCOUNT TO 16380 PRINT #4;SAVE(WAIT); NEXT WAIT END FOR WAIT=1 TO SAVCOUNT PRINT #4;SAVE(WAIT); NEXT WAIT PRINT #4;CHR(26); CLOSE #4 PRINT CHR(13);STRING(2,11);STRING(LINECOUNT,12);CHR(23); END IF X='M' THEN BEGIN PRINT INPUT3 "Enter message file name: ";A$ N=LEN(A$) MSGFILE="" FOR A=1 TO N I=RIGHT(A$,A) MSGFILE=MSGFILE+KEYCODE(0,I) NEXT A PRINT CHR(13);CHR(11);STRING(LINECOUNT,12);CHR(23); END IF X='S' THEN 0.MSG IF X='V' THEN BEGIN ECHO OFF PRINT CHR(26); IF MAX THEN BEGIN FOR WAIT=SAVCOUNT TO 16380 PRINT SAVE(WAIT); INPUT3 #5;N IF N=19 THEN INPUT3 N NEXT WAIT END FOR WAIT=1 TO SAVCOUNT PRINT SAVE(WAIT); INPUT3 #5;N IF N=19 THEN INPUT3 N NEXT WAIT END IF X='L' THEN BEGIN rem change delay loop timing PRINT CHR(26);"Enter Delay Loop Parameters:" INPUT3 "(Hit to chicken out; hit any other key to continue.)";N PRINT SPC(3);CHR(26); rem Spaces clear codes. IF N=27 THEN 0.RESET Input2 "Restore variables to the original default values? ? ";A IF A THEN BEGIN STARTBIT=145 RCVBIT=97 RCVSTOP=30 RUNBIT=88 MSGBIT=94 SENDSTOP=10 HANG=5000 BREAK=270 MAKE=170 INTERDGT=3000 DELETE "TIMING.DAT" END ELSE BEGIN PRINT CHR(13);CHR(24);"(To enter current value, simply hit key.)";CHR(10) print " Receive Startbit length (current";STARTBIT;"): "; INPUT2 WAIT IF WAIT>0 THEN STARTBIT=WAIT print " Receive Databit length (current";RCVBIT;"): "; INPUT2 WAIT IF WAIT>0 THEN RCVBIT=WAIT print " Receive Stopbit length (current";RCVSTOP;"): "; INPUT2 WAIT IF WAIT>0 THEN RCVSTOP=WAIT print " Databit length (current";RUNBIT;"): "; INPUT2 WAIT IF WAIT>0 THEN RUNBIT=WAIT print " Stopbit length (current";SENDSTOP;"): "; INPUT2 WAIT IF WAIT>0 THEN SENDSTOP=WAIT print " Message bit length (current";MSGBIT;"): "; INPUT2 WAIT IF WAIT>0 THEN MSGBIT=WAIT print " Dial BREAK (current is";BREAK;"): "; INPUT2 WAIT IF WAIT>0 THEN BREAK=WAIT print " Dial MAKE (current is";MAKE;"): "; INPUT2 WAIT IF WAIT>0 THEN MAKE=WAIT print " Interdigit pause (current";INTERDGT;"): "; INPUT2 WAIT IF WAIT>0 THEN INTERDGT=WAIT print " Hang up (current is";HANG;"): "; INPUT2 WAIT IF WAIT>0 THEN HANG=WAIT print chr(10);"Save new current values on file as new defaults? "; input2 A if A then begin Create "TIMING.DAT" open #1;"TIMING.DAT" write #1;STARTBIT,RCVBIT,RCVSTOP,RUNBIT,MSGBIT,SENDSTOP,HANG,BREAK,MAKE,INTERDGT close #1 end END PRINT CHR(26); END IF X='X' THEN STOP GOTO 0.RESET 00PSAVE PRINT PRINT "Sorry. For some reason I can't write this file." GOTO 0.RESET 00PS.MSG PRINT PRINT "Sorry. I can't find file ";MSGFILE GOTO 0.RESET rem ***************************************************************** rem ** MESSAGE TRANSMIT ROUTINE ** rem ***************************************************************** 0.MSG ON ERROR GOTO 00PS.MSG BUFFIN=0 BUFFOUT=0 TABCOUNT=7 DELAY=MSGBIT*2 ECHO OFF OPEN #2;MSGFILE REPEAT BEGIN IF BUFFIN=BUFFOUT THEN BEGIN INPUT3 #2;X DRIVE.OFF IF X=26 THEN 0.RESET IF TABCOUNT=0 THEN TABCOUNT=7 IF X=9 THEN BEGIN PRINT SPC(TABCOUNT); FOR N=1 TO TABCOUNT BUFFIN=BUFFIN+1 BUFFER(BUFFIN)=32 NEXT N TABCOUNT=7 X=32 END IF X<32 THEN TABCOUNT=7 ELSE TABCOUNT=TABCOUNT-1 IF NOT KEYCODE(6,X)=0 AND NOT KEYCODE(6,X)=SHIFT THEN BEGIN IF SHIFT=1 THEN BEGIN SHIFT=2 BUFFIN=BUFFIN+1 BUFFER(BUFFIN)=11 END ELSE BEGIN SHIFT=1 BUFFIN=BUFFIN+1 BUFFER(BUFFIN)=12 END END PRINT KEYCODE(0,X); BUFFIN=BUFFIN+1 BUFFER(BUFFIN)=X END BUFFOUT=BUFFOUT+1 X=BUFFER(BUFFOUT) OUT 8,0 rem start bit WAIT=DELAY FOR WAIT=0 TO MSGBIT NEXT WAIT FOR BITCOUNT=1 TO 5 OUT 8,KEYCODE(BITCOUNT,X) FOR WAIT=0 TO MSGBIT NEXT WAIT NEXT BITCOUNT OUT 8,1 rem stop bit FOR WAIT=0 TO DELAY NEXT WAIT INPUT3 #5;X END UNTIL NOT X=0 GOTO 0.RESET rem ***************************************************************** rem ** DIAL ROUTINE ** rem ***************************************************************** 0.DIAL ON ERROR GOTO 1.DIAL IF NOT READY THEN BEGIN READY='Y' FOR A=0 TO 25 rem clear variables MENULINE(A)="" FOR I=0 TO 11 PHONUM(I,A)=0 NEXT I NEXT A OPEN #3;"PHONUM.TDD" FOR A=0 TO 25 READ #3,A;MENULINE(A) FOR I=0 TO 11 READ #3,A;PHONUM(I,A) NEXT I NEXT A END 1.DIAL PRINT CHR(26); ECHO OFF FOR A=0 TO 12 PRINT A+65;"> ";MENULINE(A) NEXT A PRINT CHR(30); FOR A=13 TO 25 PRINT STRING(41,12);A+65;"> ";MENULINE(A) NEXT A PRINT CHR(10);" Exit or Abort dialing. Momentarily hang up." PRINT " Modify dialing menu. Dial a number not listed.";CHR(10) PRINT "Your pleasure: "; 00PS.1 INPUT3 X IF X=3 OR X=27 THEN EXIT.DIALER rem CTRL-C or IF X=8 THEN HANGUP rem IF X=13 THEN BEGIN rem manual dial PRINT CHR(13);"Number to dial (terminate with key):";CHR(24) LOADNUM 26 PRINT CHR(13); DIALNUM 26 END IF X=127 THEN BEGIN rem modify PRINT CHR(13);"Modify which menu line? ";CHR(24); 00PS.2 INPUT3 X IF X=27 THEN 1.DIAL IF X>96 THEN X=X-32 IF X<65 OR X>90 THEN 00PS.2 I=X-65 PRINT CHR(13);"If you want to make this a BLANK record, hit twice. Otherwise..." PRINT "Enter menu display for line <";X;"> [";SPC(35);']';STRING(36,8); ECHO ON INPUT2 A$ ECHO OFF N=RIGHT$(A$,1) IF N=27 THEN 1.DIAL ELSE MENULINE(I)=A$ PRINT "Enter phone number exacly as it should be dialed." PRINT "Terminate with key." LOADNUM I MODIFY='Y' GOTO 1.DIAL END IF X>96 THEN X=X-32 rem make it uppercase IF X<65 OR X>90 THEN 00PS.1 rem BEGIN AUTO DIAL ROUTINE I=X-65 IF PHONUM(0,I)=0 THEN BEGIN PRINT CHR(13);"Sorry, no number in that selection. Try again...."; GOTO 00PS.1 END ELSE PRINT CHR(13);X;"> ";MENULINE(I);CHR(24);CHR(10) DIALNUM I