1000 REM RETROCHALLENGE 2021 1010 REM MICHEAL H. MCCABE 1020 REM 1030 REM USING TI 99/4A TO CONTROL TELEPHONE SWITCHING 1040 REM 1050 REM IMPLEMENTS A MATRIX SWITCH FOR SEMI- 1060 REM AUTOMATIC TELEPHONE SWITCHING. 1070 REM 1080 REM REVISED OCT. 25, 2021 1090 OPTION BASE 0 1100 DIM T(15,2) 1110 DIM C$(10) 1120 GOSUB 2440 1130 GOSUB 2660 1140 REM L HOLDS LENGTH OF DTMF TONES IN MILLISECONDS 1150 LET L=100 1160 REM V HOLDS DESIRED VOLUME FOR DTMF TONES 1170 LET V=7 1180 REM A HOLDS BINARY VALUE FOR ROW SELECT 1190 LET A=0 1200 REM B HOLDS BINARY VALUE FOR COLUMN SELECT 1210 REM A$ AND B$ ARE BINARY STRING VERSIONS OF A AND B 1220 REM OPEN #1,"PIO" 1230 REM OPEN #2,"PIO/1" 1240 CALL CLEAR 1250 PRINT "TELEPHONE SYSTEM CONTROL" 1260 PRINT 1270 PRINT "MAIN MENU:" 1280 PRINT 1290 PRINT TAB(5);"1. DTMF TONE SIGNALING" 1300 PRINT TAB(5);"2. CALL PROGRESS TONES" 1310 PRINT TAB(5);"3. MATRIX SWITCH CONTROL" 1320 PRINT TAB(5);"4. END PROGRAM" 1330 PRINT 1340 INPUT "ENTER YOUR SELECTION:":S 1350 IF S<>INT(S)THEN 1240 1360 IF (S<1)+(S>4)THEN 1240 1370 IF S=1 THEN 1470 1380 IF S=2 THEN 2130 1390 IF S=3 THEN 2280 1400 REM QUIT PROGRAM 1410 LET A=0 1420 LET B=0 1430 REM PRINT #1,ASC(A); 1440 REM PRINT #2,ASC(B); 1450 CALL CLEAR 1460 END 1470 REM DTMF SIGNALING MENU 1480 PRINT 1490 PRINT "DTMF SIGNALING MENU:" 1500 PRINT 1510 PRINT TAB(5);"1. SEND DTMF DIGITS" 1520 PRINT TAB(5);"2. TEST ALL DTMF DIGITS" 1530 PRINT TAB(5);"3. SEND DTMF COMMANDS" 1540 PRINT TAB(5);"4. RETURN TO MAIN MENU" 1550 PRINT 1560 INPUT "ENTER YOUR SELECTION:":S 1570 IF INT(S)<>S THEN 1470 1580 IF (S<1)+(S>4)THEN 1470 1590 IF S=4 THEN 1240 1600 IF S=1 THEN 1650 1610 IF S=2 THEN 1900 1620 IF S=3 THEN 1930 1630 PRINT "GURU MEDITATION ERROR." 1640 STOP 1650 PRINT 1660 INPUT "ENTER DTMF:":T$ 1670 FOR I=1 TO LEN(T$) 1680 LET D$=SEG$(T$,I,1) 1690 LET D=ASC(D$) 1700 IF (D>=48)*(D<=57)THEN 1770 1710 IF (D>=65)*(D<=68)THEN 1800 1720 IF D=35 THEN 1830 1730 IF D=42 THEN 1860 1740 PRINT 1750 PRINT "PARSE ERROR." 1760 GOTO 1470 1770 LET D=D-48 1780 GOSUB 2810 1790 GOTO 1880 1800 LET D=D-53 1810 GOSUB 2810 1820 GOTO 1880 1830 LET D=11 1840 GOSUB 2810 1850 GOTO 1880 1860 LET D=10 1870 GOSUB 2810 1880 NEXT I 1890 GOTO 1470 1900 REM TEST ALL DTMF DIGITS 1910 GOSUB 2840 1920 GOTO 1470 1930 REM SEND DTMF COMMANDS 1940 PRINT 1950 PRINT "SEND DTMF COMMANDS:" 1960 PRINT 1970 PRINT "1. SET ANONYMOUS CALL REJECT" 1980 PRINT "2. CANCEL ANON CALL REJECT" 1990 PRINT "3. FORWARD CALLS TO CELL" 2000 PRINT "4. CANCEL CALL FORWARDING" 2010 PRINT "5. RETURN LAST CALL" 2020 PRINT "6. CANCEL CAL RETURN" 2030 PRINT "7. CANCEL CALL WAITING" 2040 PRINT "8. BLOCK CALLER ID" 2050 PRINT "9. CANCEL CALLER ID BLOCK" 2060 PRINT "10. REPEAT DIALING" 2070 PRINT 2080 INPUT "ENTER YOUR SELECTION:":S 2090 IF (S<1)+(S>10)THEN 1960 2100 LET T$=C$(S) 2110 PRINT T$ 2120 GOTO 1670 2130 REM GENERATE CALL PROGRESS TONES 2140 PRINT 2150 PRINT "GENERATE CALL PROGRESS TONES" 2160 PRINT 2170 PRINT "1. SEND DIAL TONE" 2180 PRINT "2. SEND RING SIGNAL" 2190 PRINT "3. SEND BUSY SIGNAL" 2200 PRINT "4. SEND RE-ORDER TONES" 2210 PRINT "5. RETURN TO MAIN MENU" 2220 PRINT 2230 INPUT "ENTER YOUR SELECTION:":S 2240 IF (S<1)+(S>5)THEN 2130 2250 IF S=5 THEN 1240 2260 ON S GOSUB 2910,2990,3060,3130 2270 GOTO 2130 2280 REM MATRIX SWITCH CONTROL 2290 PRINT 2300 PRINT "MAIN MENU:" 2310 PRINT 2320 PRINT "1. DISPLAY SWITCH STATUS" 2330 PRINT "2. SET A CONNECTION" 2340 PRINT "3. CLEAR A CONNECTION" 2350 PRINT "4. CLEAR ALL CONNECTIONS" 2360 PRINT "5. MAIN MENU" 2370 PRINT 2380 INPUT "ENTER YOUR SELECTION:":S 2390 IF (S<1)+(S>5)THEN 2290 2400 IF S=5 THEN 1240 2410 ON S GOSUB 3230,3650,3780,3910 2420 GOTO 2280 2430 END 2440 REM LOAD ARRAY T WITH DTMF TONE FREQUENCIES 2450 RESTORE 2460 FOR I=0 TO 15 2470 READ T(I,1),T(I,2) 2480 NEXT I 2490 RETURN 2500 DATA 941,1336 2510 DATA 697,1209 2520 DATA 697,1336 2530 DATA 697,1477 2540 DATA 770,1209 2550 DATA 770,1336 2560 DATA 770,1477 2570 DATA 852,1209 2580 DATA 852,1336 2590 DATA 852,1477 2600 DATA 941,1209 2610 DATA 941,1477 2620 DATA 697,1633 2630 DATA 770,1633 2640 DATA 852,1633 2650 DATA 941,1633 2660 REM LOAD COMMADS INTO ARRAY C$ 2670 FOR I=1 TO 10 2680 READ C$(I) 2690 NEXT I 2700 RETURN 2710 DATA "*77" 2720 DATA "*87" 2730 DATA "72#8144647258" 2740 DATA "73#" 2750 DATA "*69" 2760 DATA "*89" 2770 DATA "*70" 2780 DATA "*67" 2790 DATA "*82" 2800 DATA "*66" 2810 REM SEND DTMF DIGIT 2820 CALL SOUND(L,T(D,1),V,T(D,2),V) 2830 RETURN 2840 REM TEST DTMF TONES 2850 FOR D=0 TO 15 2860 PRINT D; 2870 GOSUB 2810 2880 NEXT D 2890 PRINT 2900 RETURN 2910 REM SEND DIAL TONE 2920 CALL SOUND(4000,350,V,440,V) 2930 RETURN 2940 REM WAIT N SECONDS 2950 FOR J=0 TO N*10 2960 LET Z=SQR(J) 2970 NEXT J 2980 RETURN 2990 REM SEND RING TONES 3000 FOR I=1 TO 5 3010 CALL SOUND(2000,440,7,480,7) 3020 N=4 3030 GOSUB 2940 3040 NEXT I 3050 RETURN 3060 REM SEND BUSY SIGNAL 3070 FOR I=1 TO 15 3080 CALL SOUND(500,480,7,620,7) 3090 N=0.75 3100 GOSUB 2940 3110 NEXT I 3120 RETURN 3130 REM SEND FAST BUSY 3140 FOR I=1 TO 20 3150 CALL SOUND(250,480,7,620,7) 3160 N=0.3 3170 GOSUB 2940 3180 NEXT I 3190 RETURN 3200 REM SEND 440 HZ COMMAND TONE 3210 CALL SOUND(250,440,7) 3220 RETURN 3230 REM DISPAY MATRIX SWITCH STATUS 3240 PRINT 3250 PRINT "CURRENT STATUS OF MATRIX SW" 3260 PRINT "----------------------------" 3270 PRINT 3280 LET E=A 3290 GOSUB 3540 3300 LET A$=G$ 3310 LET E=B 3320 GOSUB 3540 3330 LET B$=G$ 3340 PRINT TAB(6);"ROW" 3350 FOR I=1 TO 8 3360 PRINT TAB(6); 3370 PRINT 9-I; 3380 PRINT SEG$(A$,I,1);":"; 3390 FOR J=1 TO 8 3400 IF (SEG$(A$,I,1)="1")*(SEG$(B$,J,1)="1")THEN 3420 ELSE 3440 3410 STOP 3420 PRINT "*"; 3430 GOTO 3450 3440 PRINT "-"; 3450 NEXT J 3460 PRINT ":";SEG$(A$,I,1) 3470 NEXT I 3480 PRINT TAB(11);B$ 3490 PRINT TAB(11);"12345678" 3500 PRINT TAB(12);"COLUMN" 3510 PRINT 3520 PRINT "----------------------------" 3530 RETURN 3540 REM CONVERT INT TO BINARY STRING 3550 LET F=E 3560 LET G$="" 3570 FOR K=7 TO 0 STEP -1 3580 IF F<2^K THEN 3620 3590 LET F=F-2^K 3600 LET G$=G$&"1" 3610 GOTO 3630 3620 LET G$=G$&"0" 3630 NEXT K 3640 RETURN 3650 REM SET CONNECTION BY ROW / COLUMN 3660 INPUT "ENTER ROW FOR CONNECTION:":R 3670 INPUT "ENTER COL FOR CONNECTION:":C 3680 IF (R<1)+(R>8)THEN 3660 3690 IF (C<1)+(C>8)THEN 3670 3700 LET R=R-1 3710 LET C=8-C 3720 LET A=A+2^R 3730 LET B=B+2^C 3740 GOSUB 3230 3750 REM PRINT #1,ASC(A); 3760 REM PRINT #2,ASC(B); 3770 RETURN 3780 REM RESET CONNECTION BY ROW / COLUMN 3790 INPUT "ENTER ROW FOR DISCONNECT:":R 3800 INPUT "ENTER COL FOR DISCONNECT:":C 3810 IF (R<1)+(R>8)THEN 3790 3820 IF (C<1)+(C>8)THEN 3800 3830 LET R=R-1 3840 LET C=8-C 3850 LET A=A-2^R 3860 LET B=B-2^C 3870 GOSUB 3230 3880 REM PRINT #1,ASC(A); 3890 REM PRINT #2,ASC(B); 3900 RETURN 3910 REM CLEAR ALL CONNECTIONS 3920 INPUT "TYPE 'YES' TO CLEAR ALL CONNECTIONS:":Q$ 3930 IF Q$="YES" THEN 3950 ELSE 3970 3940 STOP 3950 LET A=0 3960 LET B=0 3970 GOSUB 3230 3980 REM PRINT #1,ASC(A); 3990 REM PRINT #2,ASC(B); 4000 RETURN