home *** CD-ROM | disk | FTP | other *** search
-
-
-
- 10 ' THIS PROGRAM GENERATES THE GAIN TABLE FOR THE AUTOMATIC
- 20 ' GAIN CONTROL ALGORITHM IN THE MODEM CODE
- 30 '
- 31 ' Written by: Peter Ehlig
- 32 ' Copyright Texas Instruments, 07/18/86
- 33 '
- 40 ' THE PROGRAM PROMPTS THE USER IN THE FOLLOWING MANNER:
- 50 '
- 60 ' AGC TABLE ADJUST FACTOR ?
- 70 ' This feature allows the AGC to gain to a level lower
- 80 ' than unity. The entry for unity gain is 256. To set
- 90 ' the gain lower than unity, enter the appropriate per-
- 100 ' centage of 256.
- 110 '
- 120 ' ENTER NAME OF OUTPUT FILE =
- 130 ' This prompt request the name of a MS-DOS format file
- 140 ' name to store the generated table.
- 150 '
- 160 ' TABLE LENGTH =
- 170 ' This feature allows the user to generate different
- 180 ' length AGC tables. This allows the accuracy of the
- 190 ' table to vary by the number of entries. The number
- 200 ' of entries is tied to the number of bits used in the
- 210 ' table lookup. In the modem algorithm six bits were
- 220 ' used in the lookup, therefore the table length is
- 230 ' 64 words.
- 240 '
- 250 ' THE TABLE GENERATED INCLUDES DESCRIPTIVE COMMENTS AND IS
- 260 ' BE IN A FORM READY TO BE ADDED DIRECTLY INTO THE ASSEMBLY CODE
- 270 ' FOR AN ALGORITHM. SINCE THE AGC SOFTWARE SHIFTS THE LOOKUP
- 280 ' VALUE TO THE MOST SIGNIFICANT BIT, THE FIRST HALF OF THE AGC
- 290 ' TABLE (THE LESS ACCURATE HALF) NOT USED. THEREFORE, THE USER
- 300 ' CAN DELETE THE FIRST HALF AND SAVE A CONSIDERABLE AMOUNT OF PRO-
- 310 ' GRAM MEMORY SPACE.
- 320 '
- 330 ' THIS PROGRAM WAS WRITTEN BY PETER EHLIG FOR USE ON A
- 340 ' TEXAS INSTRUMENTS PROFESSIONAL COMPUTER.
- 350 ' THE CODE TO MY KNOWLEDGE IS WRITTEN IN STANDARD MS-BASIC AND
- 360 ' SHOULD OPERATE ON ANY MS-DOS SYSTEM.
- 370 '
- 380 PRINT 'PROGRAM STARTED"
- 390 DIM TBLD(500),HTB$(500)
- 400 OPEN "LPT1:" FOR OUTPUT AS #1
- 410 INPUT "AGC TABLE ADJUSTMENT FACTOR ? ",GAINADJ
- 420 INPUT "ENTER NAME OF OUTPUT FILE = ",OUTFILE$
- 430 OPEN OUTFILE$ FOR OUTPUT AS #3
- 440 PI = 3.1415927#
- 450 PI2 = PI * 2
- 460 INPUT "TABLE LENGTH = ",TBLEN
- 470 GOSUB 820 ' GENERATE TABLE HEADER
- 480 DELTA = 32768! / TBLEN
- 490 FOR I = 1 TO TBLEN
- 500 TBL = INT(32767 / (I * DELTA) * GAINADJ)
- 510 TBLD(I) = TBL
- 520 HTBL$ = HEX$(TBL)
- 530 HTB$(I) = HTBL$
- 540 GOSUB 690 ' DISPLAY RANGE ACCURACY (OPTIONAL)
- 550 NEXT
- 560 GOTO 650
- 570 ' SAVE AGC TABLE TO DISK
- 580 PRINT#3, " DATA ";
- 590 PRINT#3, USING ">\ \";HTB$(I);
- 600 PRINT#3, " ";
- 610 TBLD1 = TBLD(I) / 256
- 620 PRINT#3, USING "###.#######";TBLD1
- 630 RETURN
- 640 ' END OF AGC TABLE SAVE ROUTINE
- 650 GOSUB 940 ' DISPLAY SECOND LEVEL LOOKUP
- 660 GOSUB 880 ' GENERATE TABLE TERMINATION COMMENTS
- 670 PRINT "PROGRAM FINISHED"
- 680 END
- 690 ' THIS ROUTINE DISPLAYS INFORMATION ABOUT THE RANGE
- 700 ' ACCURACY OF EACH STEP OF THE TABLE
- 710 TBLRL = (I - 1) * DELTA - 256
- 720 IF TBLRL < 0 THEN TBLRL = 0
- 730 SH1$ = HEX$(TBLRL)
- 740 SH1A$ = HEX$(TBLRL * TBL / 256)
- 750 TBLRH = (I - 1) * DELTA + 255
- 760 SH2$ = HEX$(TBLRH)
- 770 SH2A$ = HEX$(TBLRH * TBL / 256)
- 780 PRINT I;TBL;HTBL$;" ";SH1$;" ";SH1A$;" ";SH2$;" ";SH2A$
- 790 ' PRINT#1,I;TBL;HTBL$;" ";SH1$;" ";SH1A$;" ";SH2$;" ";SH2A$
- 800 RETURN
- 810 ' END OF RANGE INFORMATION
- 820 ' THE ROUTINE GENERATES THE HEADER COMMENTS FOR THE TABLE
- 830 PRINT#3,"***********************************************************"
- 840 PRINT#3,"AGCTBL EQU $ AGC TABLE LENGTH = ";
- 850 PRINT#3, USING "###";TBLEN
- 860 RETURN
- 870 ' END OF HEADER ROUTINE
- 880 ' THIS ROUTINE GENERATES THE TABLE TERMINATION COMMENTS
- 890 PRINT#3,"***********************************************************"
- 900 PRINT#3, " PAGE"
- 910 CLOSE
- 920 RETURN
- 930 ' END OF TERMINATOR ROUTINE
- 940 ' TRY SECOND LEVEL LOOKUP
- 950 DELTA1 = DELTA * 8
- 960 FOR I = 1 TO 64
- 970 GOSUB 570 ' SAVE AGC TABLE TO DISK
- 980 TBLRL = (I - 1) * DELTA - 256
- 990 IF TBLRL < 0 THEN TBLRL = 0
- 1000 TBLRH = (I - 1) * DELTA + 255
- 1010 SH1$ = HEX$(TBLRL)
- 1020 SH2$ = HEX$(TBLRH)
- 1030 GOSUB 1100 ' CALCULATE ACCURACY STEPS
- 1040 SH1A$ = HEX$(TBLRL * TBLD(TBLR1) / SHF1)
- 1050 SH2A$ = HEX$(TBLRH * TBLD(TBLR2) / SHF1)
- 1060 PRINT I;TBL;HTBL$;" ";SH1$;" ";SH1A$;" ";SH2$;" ";SH2A$;TBLR1;TBLR2;SHF1
- 1080 NEXT 1090 RETURN
- 1100 'TABLE LOOKUP SHIFTER
- 1110 TBLEV = TBLRH - 4096
- 1120 IF TBLEV > 0 GOTO 1180
- 1130 TBLEV = TBLEV + 2048
- 1140 IF TBLEV > 0 GOTO 1220
- 1150 TBLEV = TBLEV + 1024
- 1160 IF TBLEV > 0 GOTO 1260
- 1170 GOTO 1300
- 1180 TBLR1 = I
- 1190 TBLR2 = I
- 1200 SHF1 = 256
- 1210 RETURN
- 1220 TBLR2 = FIX(TBLRH / 64) + 1
- 1230 TBLR1 = FIX(TBLRL / 64) + 1
- 1240 SHF1 = 32
- 1250 RETURN
- 1260 TBLR2 = FIX(TBLRH / 32) + 1
- 1270 TBLR1 = FIX(TBLRL / 32) + 1
- 1280 SHF1 = 16
- 1290 RETURN
- 1300 TBLR2 = FIX(TBLRH / 16) + 1
- 1310 TBLR1 = FIX(TBLRL / 16) + 1
- 1320 SHF1 = 8
- 1330 RETURN