home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-386-Vol-2of3.iso / c / caty16.zip / CATYINST.PAS < prev    next >
Pascal/Delphi Source File  |  1992-01-12  |  34KB  |  815 lines

  1. UNIT CATYINST (* CATY Instruction routines  D. J. Wilke N3HGQ 01/26/91 *);
  2.  
  3. INTERFACE
  4.  
  5. USES CRT, DOS, CATYGLO, CATYUTIL,
  6.     CATYDISP, CATYRTC, CATYNUM;
  7.  
  8. PROCEDURE HGSelect;
  9. PROCEDURE ModeSelect;
  10. PROCEDURE FreqScan(StepSet : STRING);
  11. PROCEDURE ProgStep;
  12. PROCEDURE CTCSSToneSet;
  13. PROCEDURE StatusUpdate(Param : String86);
  14. PROCEDURE CheckStatus(Inst : String5);
  15. PROCEDURE MainFrame;
  16. PROCEDURE MainMenu;
  17.  
  18. IMPLEMENTATION
  19.  
  20. USES CATYMVFO, CATYCOMM, CATYTERM;
  21.  
  22. (*═══════════════════════════════════════════════════════════════════════*)
  23. PROCEDURE HGSelect (* Select between Ham or General coverage bands *);
  24.  
  25. VAR
  26.    HGS,CovSel : CHAR;
  27.  
  28. BEGIN (* HgSelect *)
  29.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  30.    WINDOW(1,1,80,5);
  31.    PrMessage('     - Ham/General Coverage Screen -       ',4);
  32.    WINDOW(2,6,79,23);
  33.    CLRSCR;
  34.    PromptLine('S');                          (* Put up select message *)
  35.    PrBandLimits;                             (* Display band limits table *)
  36.    (* Display headings & draw `Band Mode' box *)
  37.    TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);      (* Requested param colors *)
  38.    GOTOXY(56,1); WRITE ('     Band Mode     ');
  39.    PrBox;                                    (* Draw `H/G Select' box *)
  40.    (* Prompt for Ham or General coverage *)
  41.    TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);      (* Requested param colors *)
  42.    GOTOXY(11,1); WRITE('H');
  43.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  44.    WRITE(' = Ham Bands, ');
  45.    TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);      (* Requested param colors *)
  46.    WRITE('G');
  47.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  48.    WRITE(' = General Coverage');
  49.    GOTOXY(11,3); WRITE('Enter H or G.');
  50.    GOTOXY(25,3); WRITE(CHR(198));
  51.    FOR Index := 1 TO 29 DO
  52.       WRITE(CHR(205));
  53.    WRITE(CHR(16));
  54.    IF SetSel THEN BEGIN
  55.       TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);   (* Requested param colors *)
  56.       GOTOXY(58,3); WRITE ('       ?        ');
  57.       GOTOXY(65,3);
  58.       REPEAT
  59.          CovSel := UPCASE(ReadKey);
  60.       UNTIL (CovSel = 'H') OR (CovSel = 'G');
  61.       PromptLine('W');                       (* Put up wait message *)
  62.       GOTOXY(58,3);
  63.       IF CovSel = 'H' THEN BEGIN
  64.          HGS := CHR(32);
  65.          WRITE('   Ham Bands    ');
  66.       END (* IF Covsel *)
  67.       ELSE BEGIN
  68.          HGS := CHR(33);
  69.          WRITE('  Gen Coverage  ');
  70.       END; (* ELSE *)
  71.    END; (* IF SetSel *)
  72.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  73.    TurnCatOn;
  74.    CatSend(Nul3String+HGS+CHR($A),26);
  75.    TurnCatOff;
  76.    MainMenu;
  77. END; (* HgSelect *)
  78.  
  79. (*═══════════════════════════════════════════════════════════════════════*)
  80. PROCEDURE ModeSelect (* Select operating Mode *);
  81.  
  82. VAR
  83.    ModeSel : CHAR;
  84.    Mode    : STRING;
  85.  
  86. BEGIN (* ModeSelect *)
  87.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  88.    WINDOW(1,1,80,5);
  89.    PrMessage('          - Select Mode Screen -           ',4);
  90.    WINDOW(2,6,79,23);
  91.    CLRSCR;
  92.    PromptLine('S');                          (* Put up select message *)
  93.    (* Display headings & draw `Mode' box *)
  94.    TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);      (* Requested param colors *)
  95.    GOTOXY(58,1); WRITE('Selected Memory');
  96.    GOTOXY(56,1); WRITE('       Mode        ');
  97.    PrBox;                                    (* Draw `Mode Select' box *)
  98.    (* Prompt for VFO A, VFO B or Memory *)
  99.    GOTOXY(11,1); WRITE('L=LSB, U=USB, C=CW, A=AM, F=FM, K=FSK');
  100.    GOTOXY(11,3); WRITE('Enter L, U, C, A, F, or K.');
  101.    GOTOXY(38,3); WRITE(CHR(198));
  102.    FOR Index := 1 to 16 DO
  103.       WRITE(CHR(205));
  104.    WRITE(CHR(16));
  105.    IF SetSel THEN BEGIN
  106.       TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);   (* Requested param colors *)
  107.       GOTOXY(60,3); WRITE ('     ?    ');
  108.       GOTOXY(65,3);
  109.       REPEAT
  110.          ModeSel := UPCASE(ReadKey);
  111.          CASE ModeSel OF
  112.             'L' : BEGIN
  113.                 Mode := CHR($10);
  114.                 GOTOXY(60,3); WRITE(' Lower SB ');
  115.             END;
  116.             'U' : BEGIN
  117.                 Mode := CHR($11);
  118.                 GOTOXY(60,3); WRITE(' Upper SB ');
  119.             END;
  120.             'C' : BEGIN
  121.                 Mode := CHR($12);
  122.                 GOTOXY(60,3); WRITE('    CW    ');
  123.             END;
  124.             'A' : BEGIN
  125.                 Mode := CHR($13);
  126.                 GOTOXY(60,3); WRITE('    AM    ');
  127.             END;
  128.             'F' : BEGIN
  129.                 Mode := CHR($14);
  130.                 GOTOXY(60,3); WRITE('    FM    ');
  131.             END;
  132.             'K' : BEGIN
  133.                 Mode := CHR($15);
  134.                 GOTOXY(60,3); WRITE('    FSK   ');
  135.             END;
  136.          END; (* Case *)
  137.       UNTIL (ModeSel = 'L') OR (ModeSel = 'U') OR (ModeSel = 'C') OR
  138.             (ModeSel = 'A') OR (ModeSel = 'F') OR (ModeSel = 'K');
  139.       PromptLine('W');                       (* Put up wait message *)
  140.       TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);   (* Default screen colors *)
  141.       TurnCatOn;
  142.       CatSend(Nul3String+Mode+CHR($A),8);    (* Set the Mode *)
  143.       TurnCatOff;
  144.       MainMenu;
  145.    END; (* IF SetSel *)
  146. END; (* ModeSelect *)
  147.  
  148. (*═══════════════════════════════════════════════════════════════════════*)
  149. PROCEDURE FreqScan(StepSet : STRING);
  150. (* Scan frequency by program step size Up or Down *)
  151.  
  152. VAR
  153.    KeyChar : CHAR;
  154.  
  155. BEGIN
  156.    REPEAT                                    (* Scan `til key hit *)
  157.    TurnCatOn;
  158.       IF DownFlag THEN                       (* Flag determines direct *)
  159.          CatSend(CHR(0)+CHR(0)+StepSet+CHR(5),5)  (* Pgm step DN *)
  160.       ELSE
  161.          CatSend(CHR(0)+CHR(0)+StepSet+CHR(4),5); (* Pgm step UP *)
  162.       TurnCatOff;                            (* Return to panel oper *)
  163.       QuickStat;                             (* Show progress *)
  164.       WINDOW(2,19,79,23); CLRSCR;            (* Clean off last readout *)
  165.       WINDOW(2,6,79,23);
  166.       BigNumerals(1,14);                     (* Put up big ones *)
  167.       PEEP(4000); DELAY(600);                (* About 1 sec per scan *)
  168.    UNTIL KeyPressed;                         (* Stop scanning *)
  169. END; (* FreqScan *)
  170.  
  171. (*═══════════════════════════════════════════════════════════════════════*)
  172. PROCEDURE ProgStep;
  173. (* Set step size for Programmed frequency Step Up/Down *)
  174.  
  175. VAR
  176.    StepSet, StepFreq   : STRING[6];
  177.    LSDStep             : STRING[6];
  178.    StepInt             : STRING[4];
  179.    StepChr             : STRING;
  180.    Result,BCDin,DotPos,
  181.    XNum,YNum           : INTEGER;
  182.    TuneStep            : REAL;
  183.    Choice              : CHAR;
  184.  
  185. BEGIN (* ProgStep *)
  186.    LSDStep  := '';StepFreq := '';StepInt  := '';StepSet  := '';
  187.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  188.    WINDOW(1,1,80,5);
  189.    PrMessage('   - Programmable Tuning Steps Screen -    ',4);
  190.    WINDOW(2,6,79,23);
  191.    CLRSCR;
  192.    PromptLine('S');                          (* Put up select message *)
  193.    (* Display headings & draw `Programmed Step Size' box *)
  194.    TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);      (* Requested param colors *)
  195.    GOTOXY(56,1); WRITE('Programmed Step Size');
  196.    PrBox;                                    (* Draw `Step Size' box *)
  197.    GOTOXY(11,3); WRITE('Enter desired Step Size.');
  198.    GOTOXY(36,3); WRITE(CHR(198));
  199.    FOR Index := 1 TO 18 DO
  200.       WRITE(CHR(205));
  201.    WRITE(CHR(16));
  202.    GOTOXY(67,3); WRITE('KHz.');
  203.    IF SetSel THEN BEGIN
  204.       TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);   (* Requested param colors *)
  205.       GOTOXY(61,3); WRITE('     ');
  206.       GOTOXY(61,3); READLN(StepFreq);
  207.    END (* SetSel *)
  208.    ELSE StepFreq := '12.34';
  209.    VAL(StepFreq,TuneStep,Result);
  210.    PromptLine('W');                          (* Put up wait message *)
  211.    WINDOW(2,6,79,23);
  212.    IF (TuneStep < 0) OR (TuneStep > 99) THEN BEGIN
  213.       ErrorAlarm(FreqErr,0,7);
  214.       Warble(3000,2400);
  215.       DELAY(1000);
  216.       EXIT;
  217.    END; (* IF TuneStep <0) *)
  218.    (* Display Step in `Programmed Step Size' box *)
  219.    GOTOXY(61,3); WRITE(TuneStep:4:2);
  220.    DotPos := Pos('.',StepFreq);
  221.    DELETE(StepFreq,DotPos,1);                (* Remove decimal *)
  222.    IF DotPos = 0 THEN
  223.       DotPos := LENGTH(StepFreq) +1;
  224.    (* Create StepInt with appropriate leading zeros *)
  225.    CASE DotPos OF
  226.       1 : StepInt := '00' + StepFreq;
  227.       2 : StepInt := '0'  + StepFreq;
  228.       3 : StepInt := StepFreq;
  229.    END; (* CASE *)
  230.    (* Pad StepInt with appropriate Trailing zeros *)
  231.    CASE LENGTH(StepInt) OF
  232.       1 : StepInt := StepInt + '000';
  233.       2 : StepInt := StepInt + '00';
  234.       3 : StepInt := StepInt + '0';
  235.    END; (* CASE *)
  236.    (* Construct 4 byte LSDStep string (LSD -> MSD) *)
  237.    Index := 4;
  238.    WHILE Index <> 0 DO BEGIN
  239.       LSDStep := LSDStep + COPY(StepInt,Index - 1,2);
  240.       Index := Index - 2;
  241.    END;
  242.    (* Convert LSDStep to 2 hex bytes *)
  243.    Index := 1;
  244.    WHILE Index < 4 DO BEGIN
  245.       StepChr := COPY(LSDStep,Index,2);
  246.       VAL(StepChr,BCDin,Result);
  247.       Index := Index + 2;
  248.       StepSet := StepSet + Translate(BCDin); (* StepSet now ready *)
  249.    END; (* WHILE Index *)
  250.    IF SetSel = FALSE THEN BEGIN              (* For testing only *)
  251.       GOTOXY(13,12); WRITE(LENGTH(StepFreq),'  Positions.');
  252.       GOTOXY(10,13); WRITE(TuneStep:4:2,' KHz.');
  253.       GOTOXY(10,14); WRITE(StepInt,'  Normal BCD');
  254.       GOTOXY(10,15); WRITE(LSDStep,'  Inverted BCD');
  255.       GOTOXY(11,16); WRITE(COPY(StepSet,1,1));
  256.       GOTOXY(13,16); WRITE(COPY(StepSet,2,1));
  257.       GOTOXY(16,16); WRITE('StepSet binary string.');
  258.       Promptline('M');
  259.    END; (* IF SetSel *)
  260.    GOTOXY(11, 3); WRITE('                                             ');
  261.    GOTOXY(24, 4); WRITE('  Key       Function');
  262.    PrLines('H',2,79,10,10,SBA,DBG,196);      (* Divider line *)
  263.    GOTOXY(24, 6);WRITE('<'+CHR(24)+'>        Programmed step UP');
  264.    GOTOXY(24, 7);WRITE('<'+CHR(25)+'>        Programmed step DOWN');
  265.    GOTOXY(24, 8);WRITE('<'+CHR(26)+'>        Start Frequency scan UP');
  266.    GOTOXY(24, 9);WRITE('<'+CHR(27)+'>        Start Frequency scan DOWN');
  267.    GOTOXY(24,11);WRITE('<Spacebar> Stop scanning');
  268.    GOTOXY(24,12);WRITE('<End>      Quit to Main Menu');
  269.    PrLines('H',2,79,18,18,SBA,DBG,196);      (* Divider line *)
  270.    PromptLine('S');                          (* Put up select message *)
  271.    BigNumerals(1,14);                        (* Put up big ones *)
  272.    TurnCatOn;
  273.    CatSend(Nul3String+CHR(0)+CHR(9),5);      (* 1st turn off Mem mode *)
  274.    TurnCatOff;
  275.    REPEAT
  276.       InKey(Fk,Choice);                      (* Get command *)
  277.       CASE Choice OF
  278.          #72 : BEGIN                         (* <Cursor Up> key *)
  279.                   TurnCatOn;                 (* Pgm'd step UP *)
  280.                   CatSend(CHR(0)+CHR(0)+StepSet+CHR(4),5);
  281.                   TurnCatOff;
  282.                   QuickStat;                 (* Show new freq *)
  283.                   WINDOW(2,19,79,23); CLRSCR;(* Clean off last readout *)
  284.                   WINDOW(2,6,79,23);
  285.                   BigNumerals(1,14);         (* Put up big ones *)
  286.                END;
  287.          #75 : BEGIN                         (* <Cursor Left> key *)
  288.                   DownFlag := TRUE;          (* Freq scan DOWN *)
  289.                   FreqScan(StepSet);         (* Do the scan *)
  290.                END;
  291.          #77 : BEGIN                         (* <Cursor Right> key *)
  292.                   DownFlag := FALSE;         (* Freq scan UP *)
  293.                   FreqScan(StepSet);         (* Do the scan *)
  294.                END;
  295.          #80 : BEGIN                         (* <Cursor Down> key *)
  296.                   TurnCatOn;                 (* Pgm'd step DOWN *)
  297.                   CatSend(CHR(0)+CHR(0)+StepSet+CHR(5),5);
  298.                   TurnCatOff;
  299.                   QuickStat;                 (* Show new freq *)
  300.                   WINDOW(2,19,79,23); CLRSCR;(* Clean off last readout *)
  301.                   WINDOW(2,6,79,23);
  302.                   BigNumerals(1,14);         (* Put up big ones *)
  303.                END;
  304.       END; (* CASE *)
  305.    UNTIL Choice = #79;                       (* <End> key quits *)
  306.    MainMenu;
  307. END; (* ProgStep *)
  308.  
  309. (*═══════════════════════════════════════════════════════════════════════*)
  310. PROCEDURE CTCSSToneSet; (* Set the tone for given mode *)
  311.  
  312. VAR
  313.    ToneSet,ToneFreq    : STRING[8];
  314.    LSDTone             : STRING[6];
  315.    ToneStr             : STRING[4];
  316.    ToneNum             : STRING[2];
  317.    ToneChr,ToneQ,HiQ   : STRING;
  318.    Tone                : REAL;
  319.    Result,BCDin,DotPos : INTEGER;
  320.  
  321. BEGIN (* CTCSSToneSet *)
  322.    ToneSet := ''; ToneFreq := '';            (* Init collection strings *)
  323.    ToneStr := ''; ToneChr  := '';
  324.    LSDTone := ''; ToneQ    := CHR($00); HiQ := CHR($00);
  325.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  326.    WINDOW(1,1,80,5);
  327.    PrMessage('          - CTCSS Tones Screen -           ',4);
  328.    WINDOW(2,6,79,23);
  329.    CLRSCR;
  330.    PromptLine('S');                          (* Put up select message *)
  331.    IF ToneEnc THEN BEGIN
  332.       TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);   (* Requested param colors *)
  333.       GOTOXY(56,1); WRITE('CTCSS Tone Frequency'); (* Display headings *)
  334.       PrBox;                                 (* Draw `CTCSS Tone' box *)
  335.       (* Display CTCSS valid frequencies table *)
  336.       GOTOXY(14,6);
  337.       WRITE('01. =  67.0  12. = 118.8  23. = 173.8  34. = C67.0');
  338.       GOTOXY(14,7);
  339.       WRITE('02. =  71.9  13. = 123.0  24. = 179.9  35. = C71.9');
  340.       GOTOXY(14,8);
  341.       WRITE('03. =  77.0  14. = 127.3  25. = 186.2  36. = C74.7');
  342.       GOTOXY(14,9);
  343.       WRITE('04. =  82.5  15. = 131.8  26. = 192.8  37. = C77.0');
  344.       GOTOXY(14,10);
  345.       WRITE('05. =  88.5  16. = 136.5  27. = 203.5  38. = C79.7');
  346.       GOTOXY(14,11);
  347.       WRITE('06. =  94.8  17. = 141.3  28. = 210.7  39. = C82.5');
  348.       GOTOXY(14,12);
  349.       WRITE('07. = 100.0  18. = 146.2  29. = 218.1  40. = C85.4');
  350.       GOTOXY(14,13);
  351.       WRITE('08. = 103.5  19. = 151.4  30. = 225.7  41. = C88.5');
  352.       GOTOXY(14,14);
  353.       WRITE('09. = 107.2  20. = 156.7  31. = 233.6  42. = C91.5');
  354.       GOTOXY(14,15);
  355.       WRITE('10. = 110.9  21. = 162.2  32. = 241.8');
  356.       GOTOXY(14,16);
  357.       WRITE('11. = 114.8  22. = 167.9  33. = 250.3');
  358.       GOTOXY(14,17);
  359.       TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);   (* Default screen colors *)
  360.       GOTOXY(17,18);
  361.       WRITE('Tones prefixed with `C'' have a high Q. (Q=80)');
  362.       (* Prompt for desired tone frequency *)
  363.       GOTOXY(7,3); WRITE('Enter CTCSS Tone number from table:');
  364.       TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);   (* Requested param colors *)
  365.       GOTOXY(43,3); READLN(ToneNum);         (* Get the tone number *)
  366.       IF ToneNum = '01' THEN ToneFreq := '67.0';
  367.       IF ToneNum = '02' THEN ToneFreq := '71.9';
  368.       IF ToneNum = '03' THEN ToneFreq := '77.0';
  369.       IF ToneNum = '04' THEN ToneFreq := '82.5';
  370.       IF ToneNum = '05' THEN ToneFreq := '88.5';
  371.       IF ToneNum = '06' THEN ToneFreq := '94.8';
  372.       IF ToneNum = '07' THEN ToneFreq := '100.0';
  373.       IF ToneNum = '08' THEN ToneFreq := '103.5';
  374.       IF ToneNum = '09' THEN ToneFreq := '107.2';
  375.       IF ToneNum = '10' THEN ToneFreq := '110.9';
  376.       IF ToneNum = '11' THEN ToneFreq := '114.8';
  377.       IF ToneNum = '12' THEN ToneFreq := '118.8';
  378.       IF ToneNum = '13' THEN ToneFreq := '123.0';
  379.       IF ToneNum = '14' THEN ToneFreq := '127.3';
  380.       IF ToneNum = '15' THEN ToneFreq := '131.8';
  381.       IF ToneNum = '16' THEN ToneFreq := '136.5';
  382.       IF ToneNum = '17' THEN ToneFreq := '141.3';
  383.       IF ToneNum = '18' THEN ToneFreq := '146.2';
  384.       IF ToneNum = '19' THEN ToneFreq := '151.4';
  385.       IF ToneNum = '20' THEN ToneFreq := '156.7';
  386.       IF ToneNum = '21' THEN ToneFreq := '162.2';
  387.       IF ToneNum = '22' THEN ToneFreq := '167.9';
  388.       IF ToneNum = '23' THEN ToneFreq := '173.8';
  389.       IF ToneNum = '24' THEN ToneFreq := '179.9';
  390.       IF ToneNum = '25' THEN ToneFreq := '186.2';
  391.       IF ToneNum = '26' THEN ToneFreq := '192.8';
  392.       IF ToneNum = '27' THEN ToneFreq := '203.5';
  393.       IF ToneNum = '28' THEN ToneFreq := '210.7';
  394.       IF ToneNum = '29' THEN ToneFreq := '218.1';
  395.       IF ToneNum = '30' THEN ToneFreq := '225.7';
  396.       IF ToneNum = '31' THEN ToneFreq := '233.6';
  397.       IF ToneNum = '32' THEN ToneFreq := '241.8';
  398.       IF ToneNum = '33' THEN ToneFreq := '250.3';
  399.       IF ToneNum = '34' THEN BEGIN
  400.          ToneFreq := '67.0'; HiQ := 'C';
  401.       END; (* IF ToneNum = '34' *)
  402.       IF ToneNum = '35' THEN BEGIN
  403.          ToneFreq := '71.9'; HiQ := 'C';
  404.       END; (* IF ToneNum = '35' *)
  405.       IF ToneNum = '36' THEN BEGIN
  406.          ToneFreq := '74.7'; HiQ := 'C';
  407.       END; (* IF ToneNum = '36' *)
  408.       IF ToneNum = '37' THEN BEGIN
  409.          ToneFreq := '77.0'; HiQ := 'C';
  410.       END; (* IF ToneNum = '37' *)
  411.       IF ToneNum = '38' THEN BEGIN
  412.          ToneFreq := '79.7'; HiQ := 'C';
  413.       END; (* IF ToneNum = '38' *)
  414.       IF ToneNum = '39' THEN BEGIN
  415.          ToneFreq := '82.5'; HiQ := 'C';
  416.       END; (* IF ToneNum = '39' *)
  417.       IF ToneNum = '40' THEN BEGIN
  418.          ToneFreq := '85.4'; HiQ := 'C';
  419.       END; (* IF ToneNum = '40' *)
  420.       IF ToneNum = '41' THEN BEGIN
  421.          ToneFreq := '88.5'; HiQ := 'C';
  422.       END; (* IF ToneNum = '41' *)
  423.       IF ToneNum = '42' THEN BEGIN
  424.          ToneFreq := '91.5'; HiQ := 'C';
  425.       END; (* IF ToneNum = '42' *)
  426.       GOTOXY(36,3); WRITE(CHR(198));
  427.       FOR Index := 1 TO 18 DO
  428.          WRITE(CHR(205));
  429.       WRITE(CHR(16));
  430.       TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);   (* Default screen colors *)
  431.       GOTOXY(69,3); WRITE ('Hz.');
  432.       GOTOXY(7,3);
  433.       WRITE('CTCSS Tone has been set in radio: ');
  434.       IF SetSel THEN BEGIN
  435.          TEXTCOLOR(RFG); TEXTBACKGROUND(DBG); (* Requested param colors *)
  436.          GOTOXY(61,3); WRITE('     ');
  437.          IF (HiQ = 'c') OR (HiQ = 'C') THEN BEGIN
  438.             GOTOXY(58,3); WRITE('          ');
  439.             GOTOXY(58,3); WRITE('Hi-Q');     (* Show 'Q' *)
  440.             ToneQ := CHR($01);               (* Set up to tell CAT *)
  441.          END; (* IF COPY *)
  442.       END (* IF SetSel *)
  443.       ELSE ToneFreq := ('131.8');            (* Default value for test *)
  444.       VAL(ToneFreq,Tone,Result);
  445.       (* Error trapping for correct tone freqs *)
  446.       IF (Tone < 67) OR (Tone > 250.3) THEN BEGIN
  447.          ErrorAlarm(FreqErr,0,7);
  448.          Warble(3000,2400);
  449.          DELAY(1000);
  450.          EXIT;
  451.       END; (* IF (Tone < 67) *)
  452.       (* Display Tone Frequency in `CTCSS Tone Frequency' box *)
  453.       GOTOXY(63,3); WRITE(Tone:3:1);         (* Show tone freq *)
  454.       (* Set up to send instruction to 767 *)
  455.       DotPos := Pos('.',ToneFreq);
  456.       DELETE(ToneFreq,DotPos,1);             (* Remove decimal *)
  457.       IF DotPos = 0 THEN
  458.          DotPos := LENGTH(ToneFreq) +1;
  459.       (* Create ToneStr with appropriate leading zeros *)
  460.       CASE DotPos OF
  461.          3 : ToneStr := '0'  + ToneFreq;
  462.          4 : ToneStr := ToneFreq;
  463.       END; (* CASE *)
  464.       (* Pad ToneStr with appropriate Trailing zeros *)
  465.       CASE LENGTH(ToneStr) OF
  466.          3 : ToneStr := ToneStr + '0';
  467.          4 : ToneStr := ToneStr;
  468.       END; (* CASE *)
  469.       (* Construct 4 byte LSDTone string (LSD -> MSD) *)
  470.       Index := 4;
  471.       WHILE Index <> 0 DO BEGIN
  472.          LSDTone := LSDTone + COPY(ToneStr,Index - 1,2);
  473.          Index := Index - 2;
  474.       END; (* WHILE Index *)
  475.       (* Convert LSDTone to 2 hex bytes *)
  476.       Index := 1;
  477.       WHILE Index < 4 DO BEGIN
  478.          ToneChr := COPY(LSDTone,Index,2);
  479.          VAL(ToneChr,BCDin,Result);
  480.          Index := Index + 2;
  481.          ToneSet := ToneSet + Translate(BCDin); (* Now ready for CAT *)
  482.       END; (* WHILE Index *)
  483.       TurnCatOn;
  484.       CatSend(CHR(0)+ToneQ+ToneSet+CHR($0C),26); (* Set the tone freq *)
  485.       TurnCatOff;
  486.       IF SetSel = FALSE THEN BEGIN           (* For testing only *)
  487.          GOTOXY(56,14); WRITE(ToneStr,'  Normal BCD');
  488.          GOTOXY(56,15); WRITE(LSDTone,'  Inverted BCD');
  489.          GOTOXY(57,16); WRITE(COPY(ToneSet,1,1));
  490.          GOTOXY(59,16); WRITE(COPY(ToneSet,2,1));
  491.          GOTOXY(62,16); WRITE('ToneSet bin str.');
  492.          GOTOXY(56,17); WRITE('Inst:');
  493.          GOTOXY(56,18); WRITE('Echo:');
  494.          WhatWasThat(Inst,62,17);
  495.          WhatWasThat(Echo,62,18);
  496.          Promptline('M');
  497.       END; (* IF SetSel *)
  498.       DELAY(1000);
  499.    END (* IF ToneEnc *)
  500.    ELSE BEGIN
  501.       ErrorAlarm(CTCSSErr,0,7);
  502.       Warble(3000,2400);
  503.       DELAY(1000);
  504.    END;
  505.    MainMenu;
  506. END; (* CTCSSToneSet *)
  507.  
  508. (*═══════════════════════════════════════════════════════════════════════*)
  509. PROCEDURE StatusUpdate(Param : String86);
  510. (* Display all radio params *)
  511.  
  512. BEGIN
  513.    PrFrame(1,80,1,24);                       (* Draw main frame *)
  514.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  515.    WINDOW(1,1,80,5);
  516.    PrMessage('         - Status Update Screen -          ',4);
  517.    GOTOXY(3,2); WRITE('LSD        MSD ');
  518.    WhatWasThat(Inst,3,3);                    (* Display Instr as sent *)
  519.    WhatWasThat(Echo,3,4);                    (* Display Echo as received *)
  520.    WINDOW(2,6,79,23);
  521.    CLRSCR;
  522.    PrRule; (* Draw inside ruling lines for status screen *)
  523.    ScreenWrite(CHR(209),18,1,SBA);           (* Dbl/sing tee, top *)
  524.    PrLines('V',18,0,2,4,SBA,DBG,179);        (* Sing V left side *)
  525.    ScreenWrite(CHR(207),18,5,SBA);           (* Dbl/sing tee, bot *)
  526.    ScreenWrite(CHR(209),63,1,SBA);           (* Dbl/sing tee, top *)
  527.    PrLines('V',63,0,2,4,SBA,DBG,179);        (* Sing V right side *)
  528.    ScreenWrite(CHR(207),63,5,SBA);           (* Dbl/sing tee, bot *)
  529.    PrLines('H',3,50,7,0,SBA,DBG,196);        (* Sing H line, mid top *)
  530.    PrLines('H',3,50,9,0,SBA,DBG,196);        (* Sing H line, mid top *)
  531.    PrLines('H',3,50,11,0,SBA,DBG,196);       (* Sing H line, mid top *)
  532.    ScreenWrite(CHR(199),1,13,SBA);           (* Dbl/sing tee, left *)
  533.    PrLines('H',2,79,13,0,SBA,DBG,196);       (* Sing H line, midscreen *)
  534.    ScreenWrite(CHR(182),80,13,SBA);          (* Dbl/sing tee, right *)
  535.    ScreenWrite(CHR(209),52,5,SBA);           (* Dbl/sing tee, top *)
  536.    PrLines('V',52,0,6,12,SBA,DBG,179);       (* Sing V midscreen, top *)
  537.    ScreenWrite(CHR(197),52,13,SBA);          (* Sing cross *)
  538.    PrLines('V',52,0,14,23,SBA,DBG,179);      (* Sing V midscreen, bot *)
  539.    ScreenWrite(CHR(207),52,24,SBA);          (* Dbl/sing tee, bot *)
  540.    PrLines('H',54,78,15,0,SBA,DBG,196);      (* Sing H line, mid bot *)
  541.    (* UPPER LEFT QUADRANT *)
  542.    TEXTCOLOR(DFG);                           (* Display headings *)
  543.    TEXTBACKGROUND(DBG);                      (* Default screen colors *)
  544.    GOTOXY(3,1); WRITE ('Function');
  545.    GOTOXY(16,1); WRITE ('Frequency');
  546.    GOTOXY(31,1); WRITE ('Mode');
  547.    GOTOXY(42,1); WRITE ('Tone');
  548.    TEXTCOLOR(PFG); TEXTBACKGROUND(DBG);      (* Param screen colors *)
  549.    GOTOXY(2,7); WRITE ('Clarifier');
  550.    GOTOXY(4,3); WRITE ('VFO A');
  551.    GOTOXY(4,5); WRITE ('VFO B');
  552.    (* Display returned status for VFO A, VFO B, Clarifier *)
  553.    IF LENGTH(Update) >= 26 THEN BEGIN
  554.       PrFreq(Param,15,13,3);                 (* VFO A *)
  555.       PrCTCSS(Param,19,39,3);
  556.       PrMode(Param,20,31,3);
  557.       PrFreq(Param,21,13,5);                 (* VFO B *)
  558.       PrCTCSS(Param,25,39,5);
  559.       PrMode(Param,26,31,5);
  560.       PrFreq(Param,9,13,7);                  (* Clarifier *)
  561.       PrCTCSS(Param,13,39,7);
  562.       PrMode(Param,14,31,7);
  563.    END; (* IF LENGTH *)
  564.    (* UPPER RIGHT QUADRANT *)
  565.    TEXTCOLOR(PFG); TEXTBACKGROUND(DBG);      (* Param screen colors *)
  566.    GOTOXY(56,1); WRITE('Operating Frequency');
  567.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  568.    PrBox;                                    (* Draw `Op Freq' box *)
  569.    GOTOXY(53,5);
  570.    FOR Index := 1 to 7 DO
  571.       WRITE(CHR(205));
  572.    WRITE(' Selected ');
  573.    FOR Index := 1 to 8 DO
  574.       WRITE(CHR(205));
  575.    TEXTCOLOR(PFG); TEXTBACKGROUND(DBG);      (* Param screen colors *)
  576.    GOTOXY(54,6); WRITE('Mode');
  577.    GOTOXY(63,6); WRITE('Tone');
  578.    GOTOXY(71,6); WRITE('Memory');
  579.    (* Display returned status for Op Freq, selected mode, tone, memory *)
  580.    PrFreq(Param,2,59,3);                     (* Op Freq *)
  581.    IF LENGTH(Update) >= 8 THEN BEGIN
  582.       PrCTCSS(Param,6,60,7);                 (* Tone *)
  583.       PrMode(Param,7,55,7);                  (* Mode *)
  584.       TEXTCOLOR(SFG); TEXTBACKGROUND(DBG);   (* Returned status colors *)
  585.       GOTOXY(73,7); WRITE('0');              (* Memory *)
  586.       WRITE(Bin2BCDHex(ORD(Param[8])));
  587.       TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);   (* Default screen colors *)
  588.    END; (* IF LENGTH *)
  589.    (* LOWER LEFT QUADRANT *)
  590.    TEXTCOLOR(PFG); TEXTBACKGROUND(DBG);      (* Param screen colors *)
  591.    FOR Index := 0 TO 9 DO BEGIN
  592.       GOTOXY(2,Index + 9); WRITE('Memory 0');
  593.       WRITE(Index);                          (* Display memory number *)
  594.    END; (* FOR Index *)
  595.    (* Display returned status for all memories *)
  596.    IF LENGTH(Update) = 86 THEN BEGIN
  597.       PrFreq(Param,27,13,9);
  598.       PrCTCSS(Param,31,39,9);
  599.       PrMode(Param,32,31,9);
  600.       PrFreq(Param,33,13,10);
  601.       PrCTCSS(Param,37,39,10);
  602.       PrMode(Param,38,31,10);
  603.       PrFreq(Param,39,13,11);
  604.       PrCTCSS(Param,43,39,11);
  605.       PrMode(Param,44,31,11);
  606.       PrFreq(Param,45,13,12);
  607.       PrCTCSS(Param,49,39,12);
  608.       PrMode(Param,50,31,12);
  609.       PrFreq(Param,51,13,13);
  610.       PrCTCSS(Param,55,39,13);
  611.       PrMode(Param,56,31,13);
  612.       PrFreq(Param,57,13,14);
  613.       PrCTCSS(Param,61,39,14);
  614.       PrMode(Param,62,31,14);
  615.       PrFreq(Param,63,13,15);
  616.       PrCTCSS(Param,67,39,15);
  617.       PrMode(Param,68,31,15);
  618.       PrFreq(Param,69,13,16);
  619.       PrCTCSS(Param,73,39,16);
  620.       PrMode(Param,74,31,16);
  621.       PrFreq(Param,75,13,17);
  622.       PrCTCSS(Param,79,39,17);
  623.       PrMode(Param,80,31,17);
  624.       PrFreq(Param,81,13,18);
  625.       PrCTCSS(Param,85,39,18);
  626.       PrMode(Param,86,31,18);
  627.    END; (* IF LENGTH *)
  628.    (* LOWER RIGHT QUADRANT *)
  629.    GOTOXY(54,9); WRITE('Status Byte Information');
  630.    TEXTCOLOR(PFG); TEXTBACKGROUND(DBG);      (* Param screen colors *)
  631.    GOTOXY(53,11); WRITE('PTT:        ');
  632.    GOTOXY(53,12); WRITE('Ham/Gen:    ');
  633.    GOTOXY(53,13); WRITE('Transmit:   ');
  634.    GOTOXY(53,14); WRITE('Split:      ');
  635.    GOTOXY(53,15); WRITE('VFO:        ');
  636.    GOTOXY(53,16); WRITE('Mem Recall: ');
  637.    GOTOXY(53,17); WRITE('Clarifier:  ');
  638.    GOTOXY(53,18); WRITE('Cat System: ');
  639.    PrStatusByte;                             (* Disp decoded status byte *)
  640. END; (* StatusUpdate *)
  641.  
  642. (*═══════════════════════════════════════════════════════════════════════*)
  643. PROCEDURE CheckStatus(Inst : String5);
  644. (* No change to radio, just request current status *)
  645.  
  646. BEGIN (* CheckStatus *)
  647.    PromptLine('W');                          (* Put up wait message *)
  648.    TurnCatOn;
  649.    CatSend(Inst,86);                         (* Request an update *)
  650.    TurnCatOff;
  651.    StatusUpdate(Update);                     (* Display all params *)
  652.    PromptLine('M');                          (* Put up Main Menu message *)
  653.    WINDOW(1,5,80,25);
  654.    CLRSCR;
  655.    MainFrame;                                (* Clean up screen *)
  656. END; (* CheckStatus *)
  657.  
  658. (*═══════════════════════════════════════════════════════════════════════*)
  659. PROCEDURE MainFrame (* Put up Main Frame for all screens *);
  660.  
  661. BEGIN (* MainFrame *)
  662.    CLRSCR;
  663.    PrFrame(1,80,1,24);                       (* Draw main frame *)
  664.    PromptLine('F');                          (* Put up FK line *)
  665.    PrMessage(Title,2);                       (* Display headings *)
  666.    PrMessage(Version + Rig + Credit,3);
  667.    PrRule;                                   (* Draw inside ruling lines *)
  668.    ScreenWrite(CHR(209),18,1,SBA);           (* Dbl/sing tee, top *)
  669.    PrLines('V',18,0,2,4,SBA,DBG,179);        (* Sing V left side *)
  670.    ScreenWrite(CHR(207),18,5,SBA);           (* Dbl/sing tee, bot *)
  671.    ScreenWrite(CHR(209),63,1,SBA);           (* Dbl/sing tee, top *)
  672.    PrLines('V',63,0,2,4,SBA,DBG,179);        (* Sing V right side *)
  673.    ScreenWrite(CHR(207),63,5,SBA);           (* Dbl/sing tee, bot *)
  674. END; (* MainFrame *)
  675.  
  676. (*═══════════════════════════════════════════════════════════════════════*)
  677. PROCEDURE MainMenu (* Put up Main Menu for selections *);
  678.  
  679. VAR
  680.    Fk     : BOOLEAN;
  681.    Choice : CHAR;
  682.  
  683. BEGIN (* MainMenu *)
  684.    Main := TRUE;
  685.    WINDOW(1,1,80,5);
  686.    PrMessage('               - Main Menu -               ',4);
  687.    QuickStat;                                (* Update quick status box *)
  688.    WINDOW(2,6,79,23);
  689.    CLRSCR;
  690.    PromptLine('F');                          (* Put up FK line *)
  691.    (* Display Menu selections *)
  692.    TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);      (* Requested param colors *)
  693.    GOTOXY(26,2);  WRITE('Set Operating frequency');
  694.    GOTOXY(26,3);  WRITE('Set Programmed tuning step / Scan');
  695.    GOTOXY(26,4);  WRITE('Select VFO<A> / VFO<B> / Memory');
  696.    GOTOXY(26,5);  WRITE('Select Memory channel');
  697.    GOTOXY(26,6);  WRITE('Set Operating Mode');
  698.    GOTOXY(26,7);  WRITE('Set CTCSS Tone frequencies');
  699.    GOTOXY(26,8);  WRITE('Load Memories from selected disk datafile');
  700.    GOTOXY(26,9);  WRITE('Load VFO<A> from selected disk datafile');
  701.    GOTOXY(26,10); WRITE('Repeater split frequency operation');
  702.    GOTOXY(26,11); WRITE('Terminal Node Controller operation');
  703.    GOTOXY(26,12); WRITE('Step UP 10 Hertz in frequency');
  704.    GOTOXY(26,13); WRITE('Step DN 10 Hertz in frequency');
  705.    GOTOXY(26,15); WRITE('Display radio status screen');
  706.    GOTOXY(21,17); WRITE(CHR(16) + (' ') + CHR(17) + '  Choice');
  707.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default colors *)
  708.    FOR Index := 2 TO 13 DO BEGIN
  709.       GOTOXY(21,Index);
  710.       WRITE('<');
  711.       IF (Index > 1) AND (Index < 11) THEN WRITE(Index-1);
  712.       IF Index = 11 THEN WRITE('0');
  713.       IF Index = 12 THEN WRITE('+');
  714.       IF Index = 13 THEN WRITE('-');
  715.       WRITE('>');
  716.    END; (* FOR Index *)
  717.    GOTOXY(14,15); WRITE('<Spacebar>');
  718.    GOTOXY(22,17); WRITE('?'); GOTOXY(22,17);
  719.    REPEAT
  720.      InKey(Fk,Choice);                       (* Get Choice from Menu *)
  721.    UNTIL Choice IN [#32..#68];
  722.    CASE Choice OF
  723.       #32 : CheckStatus(Check);              (* Spacebar *)
  724.       #43 : BEGIN
  725.             TurnCatOn;
  726.             CatSend(Up10Hz,5);               (* Numeric + *)
  727.             TurnCatOff;
  728.             END;
  729.       #45 : BEGIN
  730.             TurnCatOn;
  731.             CatSend(Dn10Hz,5);               (* Numeric - *)
  732.             TurnCatOff;
  733.             END;
  734.       #48 : DumbTerm;                        (* Numeric 0 *)
  735.       #49 : SetFreq;                         (* Numeric 1 *)
  736.       #50 : ProgStep;                        (* Numeric 2 *)
  737.       #51 : VFOMRSelect;                     (* Numeric 3 *)
  738.       #52 : MemSelect;                       (* Numeric 4 *)
  739.       #53 : ModeSelect;                      (* Numeric 5 *)
  740.       #54 : CTCSSToneSet;                    (* Numeric 6 *)
  741.       #55 : SelectMemFile;                   (* Numeric 7 *)
  742.       #56 : SelectVFOFile;                   (* Numeric 8 *)
  743.       #57 : BEGIN                            (* Numeric 9 *)
  744.             Repeater := TRUE;
  745.             MemSelect;
  746.             END;
  747.       #59 : HGSelect;                        (* Fk 1 *)
  748.       #60 : BEGIN                            (* Fk 2 *)
  749.             PromptLine('W');                 (* Put up wait message *)
  750.             TurnCatOn;
  751.             CatSend(Aclr,26);
  752.             TurnCatOff;
  753.             PromptLine('F');                 (* Put up FK line *)
  754.             END;
  755.  
  756.       #61 : BEGIN
  757.             PromptLine('W');                 (* Put up wait message *)
  758.             TurnCatOn;
  759.             CatSend(MultString(4,Nul) + CHR(9),5);
  760.             CatSend(BandDn,5);               (* Fk 3 *)
  761.             TurnCatOff;
  762.             PromptLine('F');                 (* Put up FK line *)
  763.             END;
  764.       #62 : BEGIN
  765.             PromptLine('W');                 (* Put up wait message *)
  766.             TurnCatOn;
  767.             CatSend(MultString(4,Nul) + CHR(9),5);
  768.             CatSend(BandUp,5);               (* Fk 4 *)
  769.             TurnCatOff;
  770.             PromptLine('F');                 (* Put up FK line *)
  771.             END;
  772.       #63 : BEGIN
  773.             PromptLine('W');                 (* Put up wait message *)
  774.             TurnCatOn;
  775.             CatSend(MultString(4,Nul) + CHR(9),5);
  776.             CatSend(SplitTog,26);            (* Fk 5 *)
  777.             TurnCatOff;
  778.             PromptLine('F');                 (* Put up FK line *)
  779.             END;
  780.       #64 : BEGIN
  781.             PromptLine('W');                 (* Put up wait message *)
  782.             TurnCatOn;
  783.             CatSend(ClarTog,26);             (* Fk 6 *)
  784.             TurnCatOff;
  785.             PromptLine('F');                 (* Put up FK line *)
  786.             END;
  787.       #65 : BEGIN
  788.             PromptLine('W');                 (* Put up wait message *)
  789.             TurnCatOn;
  790.             CatSend(MToV,26);                (* Fk 7 *)
  791.             CatSend(MultString(4,Nul) + CHR(9),5);
  792.             TurnCatOff;
  793.             PromptLine('F');                 (* Put up FK line *)
  794.             END;
  795.       #66 : BEGIN
  796.             PromptLine('W');                 (* Put up wait message *)
  797.             TurnCatOn;
  798.             CatSend(VToM,86);                (* Fk 8 *)
  799.             CatSend(MultString(3,Nul) + CHR(2) + CHR(9),5);
  800.             TurnCatOff;
  801.             PromptLine('F');                 (* Put up FK line *)
  802.             END;
  803.       #67 : BEGIN
  804.             PromptLine('W');                 (* Put up wait message *)
  805.             TurnCatOn;
  806.             CatSend(Swap,86);                (* Fk 9 *)
  807.             TurnCatOff;
  808.             PromptLine('F');                 (* Put up FK line *)
  809.             END;
  810.       #68 : QuitFlag := TRUE;                (* Fk 10 quits program *)
  811.    END; (* CASE *)
  812.    Main := FALSE;
  813. END; (* MainMenu *)
  814. END. (* of UNIT CATYINST *)
  815.