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

  1. UNIT CATYMVFO (* CATY Memory/VFO routines D. J. Wilke N3HGQ 7/13/91 *);
  2.  
  3. INTERFACE
  4.  
  5. USES CRT, DOS, CATYGLO, CATYUTIL,
  6.     CATYDISP, CATYCOMM, CATYRTC;
  7.  
  8. PROCEDURE LoadMemories(MemFileToUse : STRING);
  9. PROCEDURE SelectMemFile;
  10. PROCEDURE SetVFO(Page,BarPos : INTEGER);
  11. PROCEDURE Pager;
  12. PROCEDURE Upper;
  13. PROCEDURE Downer;
  14. PROCEDURE LoadVFO(VFOFileToUse : STRING);
  15. PROCEDURE SelectVFOFile;
  16. PROCEDURE SetFreq;
  17. PROCEDURE VFOMRSelect;
  18. PROCEDURE ShowSplits(SelFreq,OffsFreq : REAL);
  19. PROCEDURE MemSelect;
  20. PROCEDURE QuickStat;
  21. FUNCTION Offset(Page,BarPos : INTEGER) : STRING;
  22.  
  23. IMPLEMENTATION
  24.  
  25. USES CATYINST;
  26.  
  27. (*═══════════════════════════════════════════════════════════════════════*)
  28. PROCEDURE LoadMemories(MemFileToUse : STRING);
  29.  
  30. VAR
  31.    RecNo,DotPos,
  32.    Result,BCDin     : INTEGER;
  33.    Ok               : BOOLEAN;
  34.    FreqChr          : STRING;
  35.    Tone             : STRING[2];
  36.    DispFreq         : STRING[7];
  37.    FreqSet          : STRING[8];
  38.    FreqString,
  39.    LSDFreq          : STRING[10];
  40.    Desc             : STRING[50];
  41.    FreqTune         : REAL;
  42.    Mode             : CHAR;
  43.  
  44. BEGIN (* LoadMemories *)
  45.    PromptLine('W');                          (* Put up wait message *)
  46.    WINDOW(2,6,79,23);
  47.    PrMessage('  - Load Memories from Database File -    ',4);
  48.    CLRSCR;
  49.    ASSIGN(Y767MemDataFile,MemFileToUse);
  50.    {$I-} RESET(Y767MemDataFile) {$I+} ;
  51.    Ok := (IOResult = 0);
  52.    IF NOT Ok THEN BEGIN
  53.      TEXTCOLOR(20);
  54.      TEXTBACKGROUND(DBG);                    (* Error colors *)
  55.      GOTOXY(20,6);
  56.      WRITE('Cannot find FT-767 memory channel data file.');
  57.      GOTOXY(20,7);
  58.      WRITE('Memory channels will NOT be loaded.');
  59.      GOTOXY(20,8);
  60.      WRITE('Press return to continue.');
  61.      Warble(1000,800);
  62.      READLN;
  63.    END (* IF NOT Ok *)
  64.    ELSE BEGIN
  65.      RecNo := 0;
  66.      FreqString := '';
  67.      TEXTCOLOR(PFG); TEXTBACKGROUND(BLUE);   (* Special param colors *)
  68.      GOTOXY(26,3);
  69.      WRITE(' Using Datafile ');
  70.      TEXTCOLOR(SFG); TEXTBACKGROUND(BLUE);   (* Filename colors *)
  71.      WRITE(MemFileToUse,' ');
  72.      TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);    (* Default screen colors *)
  73.      GOTOXY(5,5);
  74.      WRITE('Memory   Frequency   Tone  ');
  75.      GOTOXY(33,5);
  76.      WRITE('Identifier, Description, Offset, Notes');
  77.      PrLines('H',6,75,11,11,SBA,DBG,196);    (* Display divider line *)
  78.      PrLines('V',9,9,12,21,SBA,DBG,179);
  79.      PrLines('V',26,26,12,21,SBA,DBG,179);
  80.      PrLines('V',31,31,12,21,SBA,DBG,179);
  81.      FOR Index := 1 TO 9 DO BEGIN
  82.          READLN(Y767MemDataFile);            (* Read past column titles *)
  83.      END; (* FOR Index *)
  84.      TurnCatOn;
  85.      CatSend(Nul3String+CHR(0)+CHR(9),5);    (* Load into VFO A *)
  86.      WHILE RecNo < 10 DO BEGIN
  87.          FreqString := '';
  88.          LSDFreq    := '';
  89.          FreqSet    := '';
  90.          TEXTCOLOR(PFG);
  91.          TEXTBACKGROUND(DBG);                (* Parameter colors *)
  92.          READLN(Y767MemDataFile,Y767MemFileParams);
  93.          IF LENGTH(Y767MemFileParams) > 26 THEN BEGIN
  94.          GOTOXY(6,RecNo + 7);
  95.          FreqString    := COPY(Y767MemFileParams,1,8);
  96.          Tone          := COPY(Y767MemFileParams,10,2);
  97.          Mode          := Y767MemFileParams[13];
  98.          DispFreq      := COPY(Y767MemFileParams,15,7);
  99.          Desc          := COPY(Y767MemFileParams,25,50);
  100.          GOTOXY(6,RecNo + 7);  WRITE(RecNo);
  101.          GOTOXY(12,RecNo + 7); WRITE(DispFreq);
  102.          GOTOXY(20,RecNo + 7); WRITE('MHz.');
  103.          GOTOXY(27,RecNo + 7); WRITE(Tone);
  104.          GOTOXY(33,RecNo + 7); WRITE(Desc);
  105.          VAL(FreqString,FreqTune,Result);
  106.          FreqTune := FreqTune/100000.0;
  107.          CheckFreq(FreqTune);                (* Check if valid Freq *)
  108.          LSDFreq  := MakeLSDMSD(FreqString,8);
  109.          FreqSet  := FreqParm(LSDFreq,8);
  110.          IF NOT FreqErrorFlag THEN BEGIN     (* Send the Freq to 767 *)
  111.             CASE Mode OF
  112.             'L' : Mode := CHR($10);
  113.             'U' : Mode := CHR($11);
  114.             'C' : Mode := CHR($12);
  115.             'A' : Mode := CHR($13);
  116.             'F' : Mode := CHR($14);
  117.             'K' : Mode := CHR($15);
  118.             END; (* CASE *)
  119.             CatSend(MultString(3,NUL)+
  120.                CHR(RecNo)+CHR($A),8);        (*Sel Mem channel *)
  121.             CatSend(FreqSet+CHR(8),5);       (* Set frequency *)
  122.             CatSend(Nul3String+Mode+
  123.                CHR($A),8);                   (* Set Memory Mode *)
  124.             CatSend(Nul3String+CHR($60)+
  125.                CHR($A),86);                  (* Move to Memory *)
  126.          END; (* IF NOT *)
  127.          END; (* IF LENGTH *)
  128.          INC(RecNo);
  129.      END; (* WHILE RecNo *)
  130.      CatSend(Nul3String+CHR(2)+CHR(9),5);    (* Now, turn on MR *)
  131.      TurnCatOff;
  132.      TEXTCOLOR(DFG);
  133.      TEXTBACKGROUND(DBG);                    (* Default screen colors *)
  134.      GOTOXY(19,18); WRITE('     Current contents of all memories.');
  135.      QuickStat;
  136.      WINDOW(1,1,80,25);
  137.      PromptLine('M');                        (* Put up Main Menu message *)
  138.      PromptLine('K');                        (* Put up FK line *)
  139.    END; (* ELSE *)
  140. END; (* LoadMemories *)
  141.  
  142. (*═══════════════════════════════════════════════════════════════════════*)
  143. PROCEDURE SelectMemFile;
  144.  
  145. VAR
  146.    MemoryProgramFile : CHAR;
  147.    MemFileToUse      : STRING[12];
  148.  
  149. BEGIN (* SelectMemFile *)
  150.    WINDOW(2,2,79,4);
  151.    PrMessage('  - Load Memories from Database File -    ',3);
  152.    WINDOW(2,6,79,23);
  153.    CLRSCR;
  154.    PromptLine('S');                          (* Put up select message *)
  155.    PrMessage('Choose a Memory Datafile:',1);
  156.    PrLines('V',41,41,8,22,SBA,DBG,179);      (* Display divider line *)
  157.    GOTOXY(2,3);
  158.    TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);      (* Requested param colors *)
  159.    WRITELN('A. 10 meter FM band repeaters.');
  160.    GOTOXY(2,4);
  161.    WRITELN('B.  2 meter FM band repeaters.');
  162.    GOTOXY(2,5);
  163.    WRITELN('C.  6 meter FM band repeaters.');
  164.    GOTOXY(2,6);
  165.    WRITELN('D. 70cM (B) band repeaters.');
  166.    GOTOXY(2,7);
  167.    WRITELN('E. AM broadcast band.');
  168.    GOTOXY(2,8);
  169.    WRITELN('F. AMTOR/SITOR frequencies.');
  170.    GOTOXY(2,9);
  171.    WRITELN('G. 10 meter CW BEACON frequencies.');
  172.    GOTOXY(2,10);
  173.    WRITELN('H. DEFAULT/TIME signal frequencies.');
  174.    GOTOXY(2,11);
  175.    WRITELN('I. WEFAX/WIREPHOTO frequencies.');
  176.    GOTOXY(2,12);
  177.    WRITELN('J. HF/VHF packet frequencies.');
  178.    GOTOXY(2,13);
  179.    WRITELN('K. RTTY/PRESS frequencies.');
  180.    GOTOXY(2,14);
  181.    WRITELN('L. "SKED" frequencies.');
  182.    GOTOXY(2,15);
  183.    WRITELN('M. PMS scan, CW band: 10M thru 20M.');
  184.    GOTOXY(2,16);
  185.    WRITELN('N. PMS scan, SSB band: 10M thru 20M.');
  186.    GOTOXY(43,3);
  187.    WRITELN('O. W1AW CW bulletins.');
  188.    GOTOXY(46,4);
  189.    WRITE('Daily: 5/8/11pm; MTWThF-10am.');
  190.    GOTOXY(43,6);
  191.    WRITELN('P. W1AW code practice.');
  192.    GOTOXY(46,7);
  193.    WRITE('slow speed: MWF-9am/7pm;');
  194.    GOTOXY(58,8);
  195.    WRITE('TThSSn-4/10pm.');
  196.    GOTOXY(46,9);
  197.    WRITE('fast speed: MWF-4/10pm;');
  198.    GOTOXY(58,10);
  199.    WRITE('TTh-9am; TThSSn-7pm.');
  200.    GOTOXY(43,12);
  201.    WRITELN('Q. W1AW SSB/RTTY bulletins.');
  202.    GOTOXY(46,13);
  203.    WRITE('SSB  Daily: 9:45pm, 12:45am.');
  204.    GOTOXY(46,14);
  205.    WRITE('RTTY Daily: 6/9/12pm;');
  206.    GOTOXY(58,15);
  207.    WRITE('MTWThF-11am.');
  208.    GOTOXY(28,18);
  209.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  210.    WRITE('Above times are EST & EDT.');
  211.    GOTOXY(55,1);
  212.    MemoryProgramFile := READKEY;
  213.    CASE MemoryProgramFile OF
  214.       'A','a' : MemFileToUse := 'Y76710M .MEM';
  215.       'B','b' : MemFileToUse := 'Y7672MR .MEM';
  216.       'C','c' : MemFileToUse := 'Y7676MR .MEM';
  217.       'D','d' : MemFileToUse := 'Y76770B .MEM';
  218.       'E','e' : MemFileToUse := 'Y767AMB .MEM';
  219.       'F','f' : MemFileToUse := 'Y767AMT .MEM';
  220.       'G','g' : MemFileToUse := 'Y767BEA .MEM';
  221.       'H','h' : MemFileToUse := 'Y767DEF .MEM';
  222.       'I','i' : MemFileToUse := 'Y767FAX .MEM';
  223.       'J','j' : MemFileToUse := 'Y767PAK .MEM';
  224.       'K','k' : MemFileToUse := 'Y767RTY .MEM';
  225.       'L','l' : MemFileToUse := 'Y767SKD .MEM';
  226.       'M','m' : MemFileToUse := 'Y767PM1 .MEM';
  227.       'N','n' : MemFileToUse := 'Y767PM2 .MEM';
  228.       'O','o' : MemFileToUse := 'Y767WCB .MEM';
  229.       'P','p' : MemFileToUse := 'Y767WCP .MEM';
  230.       'Q','q' : MemFileToUse := 'Y767WPB .MEM';
  231.    END; (* CASE *)
  232.    LoadMemories(MemFileToUse);
  233. END; (* SelectMemFile *)
  234.  
  235. (*═══════════════════════════════════════════════════════════════════════*)
  236. PROCEDURE SetVFO;
  237.  
  238. VAR
  239.    FreqSet,
  240.    LSDFreq,
  241.    FreqString : STRING[8];
  242.    Result     : INTEGER;
  243.    Mode       : CHAR;
  244.    FreqTune   : REAL;
  245.  
  246. BEGIN (* SetVFO *)
  247.    FreqString  := COPY(MemArray[Page *10 +BarPos],1,8);
  248.    VAL(FreqString,FreqTune,Result);
  249.    FreqTune := FreqTune/100000.0;
  250.    IF COPY(MemArray[Page *10 +BarPos],1,8) <> '        ' THEN BEGIN
  251.       LSDFreq := MakeLSDMSD(COPY(MemArray[Page *10 +BarPos],1,8),8);
  252.       FreqSet := FreqParm(LSDFreq,8);
  253.       Mode    := MemArray[Page *10 +BarPos,13];
  254.       CASE Mode OF
  255.          'L' : Mode := CHR($10);
  256.          'U' : Mode := CHR($11);
  257.          'C' : Mode := CHR($12);
  258.          'A' : Mode := CHR($13);
  259.          'F' : Mode := CHR($14);
  260.          'K' : Mode := CHR($15);
  261.       END; (* CASE *)
  262.       CheckFreq(FreqTune);                    (* In valid range? *)
  263.       IF NOT FreqErrorFlag THEN BEGIN
  264.          IF COPY(MemArray[Page *10 +BarPos],23,1) <> ' ' THEN BEGIN
  265.             WINDOW(3,6,29,7);
  266.             GOTOXY(5,5);
  267.             TEXTCOLOR(RFG); TEXTBACKGROUND(DBG); (* Req param colors *)
  268.             WRITELN(CHR(18) +' = Offset operation');
  269.             WINDOW(5,12,79,22);              (* Back to paging window *)
  270.             CatSend(Nul3String+CHR(1)+       (* Split operation *)
  271.                CHR(9),5);                    (* Set up to load VFO B *)
  272.             CatSend(Offset(Page,BarPos)+
  273.                CHR(8),5);                    (* Set VFO B frequency *)
  274.             CatSend(MultString(3,NUL)+
  275.                Mode+CHR($A),8);              (* Set the Mode *)
  276.          END; (* IF COPY *)
  277.          CatSend(Nul3String+CHR(0)+
  278.             CHR(9),5);                       (* Set up to load VFO A *)
  279.          CatSend(FreqSet+CHR(8),5);          (* Set VFO A frequency *)
  280.          CatSend(MultString(3,NUL)+
  281.             Mode+CHR($A),8);                 (* Set the Mode *)
  282.          IF COPY(MemArray[Page *10 +BarPos],23,1) = ' ' THEN
  283.             CatSend(Aclr,26)                 (* Turn off SPLIT/CLAR/OFFS *)
  284.          ELSE
  285.             IF (ORD(Update[1])) AND ($08) = 0 THEN (* Mask off Split bit *)
  286.                CatSend(SplitTog,26);         (* Toggle Split on, if off *)
  287.          TEXTCOLOR(SFG); TEXTBACKGROUND(DBG);(* Selected Freq colors *)
  288.          PrDfPage(Page,Page *10 +BarPos,1);  (* Place bar *)
  289.          CatSend(Check,86);                  (* Get new parameters *)
  290.          QuickStat;                          (* Display new Freq *)
  291.          WINDOW(5,12,79,22);                 (* Back to paging window *)
  292.          GOTOXY(1,BarPos);                   (* Put cursor at beg of line *)
  293.          Peep(4000);                         (* Give audible signal *)
  294.      END; (* IF NOT *)
  295.    END; (* IF *)
  296. END; (* SetVFO *)
  297.  
  298. (*═══════════════════════════════════════════════════════════════════════*)
  299. PROCEDURE Pager;
  300.  
  301. BEGIN (* Pager *)
  302.    TEXTCOLOR(PFG); TEXTBACKGROUND(DBG);      (* Requested param colors *)
  303.    CLRSCR;                                   (* Remove all old entries *)
  304.    PrDfPage(Page,0,10);                      (* Put up 10 line page *)
  305.    TEXTCOLOR(BFG); TEXTBACKGROUND(BBG);      (* Selection bar colors *)
  306.    PrDfPage(Page,Page *10 +BarPos,1);        (* Put bar on 1 or 10 *)
  307.    TEXTCOLOR(PFG); TEXTBACKGROUND(DBG);      (* Requested param colors *)
  308.    GOTOXY(1,BarPos);                         (* Put cursor at beg of line *)
  309. END; (* Pager *)
  310.  
  311. (*═══════════════════════════════════════════════════════════════════════*)
  312. PROCEDURE Upper; (* Bump the selection bar UP *)
  313.  
  314. BEGIN (* Upper *)
  315.    DEC(BarPos);
  316.    IF BarPos = 0 THEN BEGIN                  (* At top? *)
  317.       BarPos := 10;                          (* Then rollover *)
  318.       DEC(Page);
  319.       IF Page < 0 THEN Page := 9;
  320.       Pager;
  321.    END;
  322.    TEXTCOLOR(PFG);
  323.    TEXTBACKGROUND(DBG);
  324.    GOTOXY(1,BarPos);
  325.    TEXTCOLOR(BFG);
  326.    TEXTBACKGROUND(BBG);
  327.    PrDfPage(Page,Page *10 +BarPos,1);        (* Place bar *)
  328.    TEXTCOLOR(PFG);
  329.    TEXTBACKGROUND(DBG);
  330.    IF BarPos = 10 THEN
  331.       PrDfPage(Page,Page *10 +1,1)           (* Remove old bar at top *)
  332.    ELSE
  333.       PrDfPage(Page,Page *10 +BarPos +1,1);  (* Else remove old bar *)
  334.    GOTOXY(1,BarPos);
  335. END; (* Upper *)
  336.  
  337. (*═══════════════════════════════════════════════════════════════════════*)
  338. PROCEDURE Downer; (* Bump the selection bar DOWN *)
  339.  
  340. BEGIN (* Downer *)
  341.    INC(BarPos);
  342.    IF BarPos = 11 THEN BEGIN                 (* At bottom? *)
  343.       BarPos := 1;                           (* Then rollover *)
  344.       INC(Page);
  345.       IF Page = 10 THEN Page := 0;
  346.       Pager;
  347.    END;
  348.    TEXTCOLOR(PFG);
  349.    TEXTBACKGROUND(DBG);
  350.    GOTOXY(1,BarPos);
  351.    TEXTCOLOR(BFG);
  352.    TEXTBACKGROUND(BBG);
  353.    PrDfPage(Page,Page *10 +BarPos,1);        (* Place bar *)
  354.    TEXTCOLOR(PFG);
  355.    TEXTBACKGROUND(DBG);
  356.    IF BarPos = 1 THEN
  357.       PrDfPage(Page,Page *10 +10,1)          (* Remove old bar at bottom *)
  358.    ELSE
  359.       PrDfPage(Page,Page *10 +BarPos -1,1);  (* Remove old bar *)
  360.    GOTOXY(1,BarPos);
  361. END; (* Downer *)
  362.  
  363. (*═══════════════════════════════════════════════════════════════════════*)
  364. PROCEDURE LoadVFO(VFOFileToUse : STRING);
  365.  
  366. VAR
  367.    RecNo,Xpos,
  368.    Result,BCDin  : INTEGER;
  369.    Ok,Fk,Display : BOOLEAN;
  370.    Choice        : CHAR;
  371.  
  372. BEGIN (* LoadVFO *)
  373.    WINDOW(2,6,79,23);
  374.    PrMessage('      - Load VFO A from Datafile -        ',4);
  375.    CLRSCR;
  376.    ASSIGN(Y767VFODataFile,VFOFileToUse);
  377.    {$I-} RESET(Y767VFODataFile) {$I+} ;
  378.    Ok := (IOResult = 0);
  379.    IF NOT Ok THEN BEGIN
  380.       TEXTCOLOR(20); TEXTBACKGROUND(DBG);    (* Error colors *)
  381.       GOTOXY(20,6);
  382.       WRITE('Cannot find FT-767 VFO database file.');
  383.       GOTOXY(20,7);
  384.       WRITE('VFO A will NOT be loaded.');
  385.       GOTOXY(20,8);
  386.       WRITE('Press return to continue.');
  387.       Warble(1000,800);
  388.       READLN;
  389.    END (* IF NOT Ok *)
  390.    ELSE BEGIN                                (* File read OK, get data *)
  391.       RecNo      := 0;
  392.       Page       := 0;
  393.       Display    := TRUE;                    (* Display pages of datafile *)
  394.       Xpos       := 5;
  395.       BarPos     := 1;                       (* Bar at top on page 0 *)
  396.       TEXTCOLOR(PFG); TEXTBACKGROUND(BLUE);  (* Special param colors *)
  397.       GOTOXY(26,3);
  398.       WRITE(' Using Datafile ');
  399.       TEXTCOLOR(SFG); TEXTBACKGROUND(BLUE);  (* Filename colors *)
  400.       WRITE(VFOFileToUse,' ');
  401.       TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);   (* Special prompt colors *)
  402.       PromptLine('V');                       (* Put up pager key line *)
  403.       TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);   (* Default screen colors *)
  404.       GOTOXY(5,5);
  405.       WRITE('Record  Freq   Ofs  Mode   ');
  406.       GOTOXY(33,5);
  407.       WRITE('Identifier, Description, Notes');
  408.       PrLines('H',6,75,11,11,SBA,DBG,196);   (* Display divider line *)
  409.       FILLCHAR(MemArray,SIZEOF(MemArray),' '); (* Initialize array *)
  410.       FOR Index := 1 TO 9 DO BEGIN
  411.          READLN(Y767VFODataFile);            (* Read past column titles *)
  412.       END; (* FOR Index *)
  413.       WINDOW(5,12,79,22);                    (* Paging window *)
  414.       WHILE NOT EOF(Y767VFODataFile) DO BEGIN
  415.          TEXTCOLOR(PFG);
  416.          TEXTBACKGROUND(DBG);                (* Parameter colors *)
  417.          INC(RecNo);
  418.          READLN(Y767VFODataFile,Y767MemFileParams);
  419.          (* Make bar length = 70 characters for valid entries *)
  420.          IF (LENGTH(Y767MemFileParams) < 70) THEN BEGIN
  421.             Y767MemFileParams := Y767MemFileParams +
  422.             MultString(70 - LENGTH(Y767MemFileParams),' ');
  423.          END; (* IF *)
  424.          MemArray[RecNo] := Y767MemFileParams;
  425.       END; (* WHILE NOT EOF*)
  426.       DataFileRec := RecNo;
  427.       CLRSCR;
  428.       PrDfPage(Page,0,10);                   (* Display Page 0 *)
  429.       GOTOXY(1,BarPos);
  430.       TEXTCOLOR(BFG);
  431.       TEXTBACKGROUND(BBG);
  432.       PrDfPage(Page,Page *10 +BarPos,1);     (* Put bar on 1st entry *)
  433.       GOTOXY(1,BarPos);
  434.       WHILE Display DO BEGIN
  435.          REPEAT
  436.             InKey(Fk,Choice);
  437.          UNTIL (Choice IN [#72..#82])
  438.             OR (Choice = #13);
  439.          CASE Choice OF
  440.             #13 : BEGIN                      (* Accept this selection *)
  441.                 TurnCatOn;
  442.                 SetVFO(Page,BarPos);         (* Change the VFO *)
  443.                 TurnCatOff;
  444.             END;
  445.             #72 : Upper;                     (* Cursor Up *)
  446.             #73 : BEGIN                      (* Page UP *)
  447.                 DEC(Page);
  448.                 IF Page < 0 THEN Page := 9;
  449.                 BarPos := 10;
  450.                 Pager;
  451.             END;
  452.             #75 : BEGIN                      (* REVERSE Scan *)
  453.                 TurnCatOn;
  454.                 REPEAT                       (* This is the Scan *)
  455.                    Upper;                    (* Up = reverse *)
  456.                    SetVFO(Page,BarPos);      (* Setup the VFO *)
  457.                 UNTIL Keypressed;
  458.                 TurnCatOff;
  459.             END;
  460.             #77 : BEGIN                      (* FORWARD Scan *)
  461.                 TurnCatOn;
  462.                 REPEAT                       (* This is the Scan *)
  463.                    Downer;                   (* Down = forward *)
  464.                    SetVFO(Page,BarPos);      (* Setup the VFO *)
  465.                 UNTIL Keypressed;
  466.                 TurnCatOff;
  467.             END;
  468.             #79 : Display := FALSE;          (* End *)
  469.             #80 : Downer;                    (* Cursor Down *)
  470.             #81 : BEGIN                      (* Page Down *)
  471.                 INC(Page);
  472.                 IF Page = 10 THEN Page := 0;
  473.                 BarPos := 1;
  474.                 Pager;
  475.             END; (* #81 *)
  476.          END; (* CASE *)
  477.       END; (* WHILE Display *)
  478.    END; (* ELSE *)
  479.    FOR Index := 1 TO 80 DO BEGIN             (* Clean up behind us *)
  480.       ScreenWrite(' ',Index,23,0);
  481.       ScreenWrite(CHR(205),Index,24,SBA);    (* Put back line *)
  482.    END;
  483.    WINDOW(2,6,79,23);
  484.    ScreenWrite(CHR(186),1,23,SBA);           (* Put back corners *)
  485.    ScreenWrite(CHR(186),80,23,SBA);
  486.    ScreenWrite(CHR(200),1,24,SBA);
  487.    ScreenWrite(CHR(188),80,24,SBA);
  488.    TEXTCOLOR(DFG);
  489.    TEXTBACKGROUND(DBG);                      (* Default screen colors *)
  490. END; (* LoadVFO * )
  491.  
  492. (*═══════════════════════════════════════════════════════════════════════*)
  493. PROCEDURE SelectVFOFile;
  494.  
  495. VAR
  496.    VFOProgramFile : CHAR;
  497.    VFOFileToUse   : STRING[12];
  498.  
  499. BEGIN (* SelectVFOFile *)
  500.    WINDOW(2,2,79,4);
  501.    PrMessage('   - Load VFO<A> from Database File -     ',3);
  502.    WINDOW(2,6,79,23);
  503.    CLRSCR;
  504.    PromptLine('S');                          (* Put up select message *)
  505.    PrMessage('Choose a VFO Datafile:',2);
  506.    GOTOXY(10,4);
  507.    TEXTCOLOR(RFG);
  508.    TEXTBACKGROUND(DBG);                      (* Requested param colors *)
  509.    WRITELN('A. 2 Meter FM voice repeaters.');
  510.    GOTOXY(10,5);
  511.    WRITELN('B. 10 Meter CW BEACON frequencies.');
  512.    GOTOXY(10,6);
  513.    WRITELN('C. International MARINE radiotelephone channels.');
  514.    GOTOXY(10,7);
  515.    WRITELN('D. 2 Meter PACKET BBS frequencies.');
  516.    GOTOXY(10,8);
  517.    WRITELN('E. International Shortwave 2.000 - 11.500 MHz.');
  518.    GOTOXY(10,9);
  519.    WRITELN('F. International Shortwave 11.600 - 28.000 MHz.');
  520.    GOTOXY(10,10);
  521.    WRITELN('G. Commercial radioteletype 2.024 - 14.565 MHz.');
  522.    GOTOXY(10,11);
  523.    WRITELN('H. Commercial radioteletype 14.568 - 19.280 MHz.');
  524.    GOTOXY(10,12);
  525.    WRITELN('I. Commercial radioteletype 19.565 - 25.337 MHz.');
  526.    GOTOXY(10,13);
  527.    WRITELN('J. International Shortwave by day of week & UTC time.');
  528.    GOTOXY(55,2);
  529.       VFOProgramFile := READKEY;
  530.    CASE VFOProgramFile OF
  531.       'A','a' : VFOFileToUse := 'Y7672MR .DAT';
  532.       'B','b' : VFOFileToUse := 'Y767BEA .DAT';
  533.       'C','c' : VFOFileToUse := 'Y767MCH .DAT';
  534.       'D','d' : VFOFileToUse := 'Y767PAK .DAT';
  535.       'E','e' : VFOFileToUse := 'Y767SWA .DAT';
  536.       'F','f' : VFOFileToUse := 'Y767SWB .DAT';
  537.       'G','g' : VFOFileToUse := 'Y767TTA .DAT';
  538.       'H','h' : VFOFileToUse := 'Y767TTB .DAT';
  539.       'I','i' : VFOFileToUse := 'Y767TTC .DAT';
  540.       'J','j' : VFOFileToUse := 'Y767UTC .DAT';
  541.    END; (* CASE *)
  542.    LoadVFO(VFOFileToUse);
  543. END; (* SelectVFOFile *)
  544.  
  545. (*═══════════════════════════════════════════════════════════════════════*)
  546. PROCEDURE SetFreq;
  547. (* Get frequency, build BCD Hex string for use in CatSend Subroutine *)
  548.  
  549. VAR
  550.    FreqString,LSDFreq,FreqSet : STRING[10];
  551.    MHzString,KHzString : STRING[10];
  552.    FreqInt : STRING[8];
  553.    FreqTrans : STRING;
  554.    FreqTune : REAL;
  555.    DotPos,Result,BCDIn,MHz,KHz,Hz : INTEGER;
  556.  
  557. BEGIN (* SetFreq *)
  558.    FreqString := '';                         (* Initialize variables *)
  559.    MHzString  := '';
  560.    KHzString  := '';
  561.    FreqTune   := 0.0;
  562.    FreqInt    := '';
  563.    LSDFreq    := '';
  564.    FreqSet    := '';
  565.    DotPos     := 0;
  566.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  567.    WINDOW(1,1,80,5);
  568.    PrMessage('         - Set Frequency Screen -          ',4);
  569.    WINDOW(2,6,79,23);
  570.    CLRSCR;
  571.    PromptLine('S');                          (* Put up select message *)
  572.    (* Display headings & draw `Operating Frequency' box *)
  573.    TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);      (* Requested param colors *)
  574.    GOTOXY(56,1); WRITE('Operating Frequency');
  575.    PrBox;                                    (* Draw `Op Freq' box *)
  576.    IF SetSel THEN PrBandLimits;              (* Display band limits table *)
  577.    (* Prompt for desired frequency *)
  578.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  579.    GOTOXY(11,3); WRITE('Enter desired frequency.');
  580.    GOTOXY(36,3); WRITE(CHR(198));
  581.    FOR Index := 1 TO 18 DO
  582.       WRITE(CHR(205));
  583.    WRITE(CHR(16));
  584.    GOTOXY(69,3); WRITE('MHz.');
  585.    IF SetSel THEN BEGIN
  586.       TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);    (* Requested param colors *)
  587.       GOTOXY(59,3); WRITE('         ');
  588.       GOTOXY(59,3);
  589.       READLN(FreqString);
  590.    END
  591.    ELSE FreqString := ('145.03075');
  592.    PromptLine('W');                          (* Put up wait message *)
  593.    VAL(FreqString,FreqTune,Result);          (* Freq is REAL number *)
  594.    CheckFreq(FreqTune);
  595.    IF NOT FreqErrorFlag THEN BEGIN
  596.       GOTOXY(57,3);                           (* Set up `Op Freq' box *)
  597.       WRITE(FreqTune:10:5);                   (* Display Freq in box *)
  598.       (* Pad Freq with leading and trailing zeros, if necessary *)
  599.       DotPos := Pos('.',FreqString);
  600.       DELETE(FreqString,DotPos,1);
  601.       IF DotPos = 0 THEN DotPos := LENGTH(FreqString) + 1;
  602.       FreqInt := MultString(4 - DotPos,'0')
  603.          + FreqString + MultString(8 - LENGTH(FreqInt),'0');
  604.       LSDFreq := MakeLSDMSD(FreqInt,8);
  605.       FreqSet := FreqParm(LSDFreq,8);
  606.       IF NOT SetSel THEN BEGIN
  607.          GOTOXY(19,12); WRITE(LENGTH(FreqString),'  Positions.');
  608.          GOTOXY(10,13); WRITE(FreqTune:10:5,'  MHz. (FreqTune)');
  609.          GOTOXY(12,14); WRITE(FreqInt,'  Normal BCD (FreqInt)');
  610.          GOTOXY(12,15); WRITE(LSDFreq,'  Inverted BCD (LSDFreq)');
  611.          GOTOXY(13,16); WRITE(COPY(FreqSet,1,1));
  612.          GOTOXY(15,16); WRITE(COPY(FreqSet,2,1));
  613.          GOTOXY(17,16); WRITE(COPY(FreqSet,3,1));
  614.          GOTOXY(19,16); WRITE(COPY(FreqSet,4,1));
  615.          GOTOXY(22,16); WRITE('BCD string LSD->MSD (FreqSet)');
  616.       END; (* NOT SetSel *)
  617.    (* Send the Frequency to 767 *)
  618.    TurnCatOn;
  619.    CatSend(MultString(4,Nul) + CHR(9),5);    (* Turn off Mem mode 1st *)
  620.    CatSend(FreqSet + CHR(8),5);              (* Set the frequency *)
  621.    ModeSelect;
  622.    TurnCatOff;
  623.    END; (* IF NOT *)
  624. END; (* SetFreq *)
  625.  
  626. (*═══════════════════════════════════════════════════════════════════════*)
  627. PROCEDURE VFOMRSelect;
  628. (* Select between VFOs and Memory *)
  629.  
  630. VAR
  631.    VMS,VMSel : CHAR;
  632.  
  633. BEGIN (* VFOMRSelect *)
  634.    PromptLine('S');                          (* Put up select message *)
  635.    VMS := CHR(0);                            (* Initialize variables *)
  636.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  637.    WINDOW(1,1,80,5);
  638.    PrMessage('      - Select VFO/Memory Screen -        ',4);
  639.    WINDOW(2,6,79,23);
  640.    CLRSCR;
  641.    (* Display headings & draw `Operating Frequency' box *)
  642.    TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);      (* Requested param colors *)
  643.    GOTOXY(57,1); WRITE('     Selected      ');
  644.    PrBox;
  645.    (* Prompt for VFO A, VFO B or Memory *)
  646.    GOTOXY(11,1); WRITE('A=VFO A, B=VFO B, M=Memory');
  647.    GOTOXY(11,3); WRITE('Enter A, B, or M.');
  648.    GOTOXY(29,3); WRITE(CHR(198));
  649.    FOR Index := 1 TO 25 DO
  650.       Write(CHR(205));
  651.    WRITE(CHR(16));
  652.    IF SetSel THEN BEGIN
  653.       TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);    (* Requested param colors *)
  654.       GOTOXY(60,3); WRITE('     ?    ');
  655.       GOTOXY(65,3);
  656.       REPEAT
  657.          VMSel := UPCASE(ReadKey);
  658.          CASE VMSel OF
  659.             'A' : BEGIN
  660.                VMS := CHR(0);
  661.                GOTOXY(60,3); WRITE('  VFO  A  ');
  662.             END;
  663.             'B' : BEGIN
  664.                VMS := CHR(1);
  665.                GOTOXY(60,3); WRITE('  VFO  B  ');
  666.             END;
  667.             'M' : BEGIN
  668.                VMS := CHR(2);
  669.                GOTOXY(60,3); WRITE('  MEMORY  ');
  670.             END;
  671.          END; (* CASE *)
  672.       UNTIL (VMSel = 'A') OR (VMSel = 'B') OR (VMSel = 'M');
  673.       PromptLine('W');                        (* Put up wait message *)
  674.    END; (* IF SetSel *)
  675.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  676.    TurnCatOn;
  677.    CatSend(Nul3String+VMS+CHR(9),5);         (* Set VFOs or Mem *)
  678.    TurnCatOff;
  679.    MainMenu;
  680. END; (* VFOMRSelect *)
  681.  
  682. (*═══════════════════════════════════════════════════════════════════════*)
  683. PROCEDURE ShowSplits(SelFreq,OffsFreq : REAL);
  684. (* Display repeater splits *)
  685.  
  686. BEGIN (* ShowSplits *)
  687.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  688.    WINDOW(1,1,80,5);
  689.    PrMessage('    - Repeater Offset Display Screen -    ',4);
  690.    WINDOW(2,6,79,23);
  691.    CLRSCR;
  692.    PrMessage('Current VFO Parameters ',1);   (* Display Mem Chan headings *)
  693.    PrLines('H',6,55,7,7,SBA,DBG,196);        (* Display divider line *)
  694.    TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);      (* Requested param colors *)
  695.    GOTOXY(9,3); WRITE('VFO<A> - Repeater Output - Radio Receives on: ');
  696.    GOTOXY(9,4); WRITE('VFO<B> - Repeater Input - Radio Transmits on: ');
  697.    PrLines('H',6,55,10,10,SBA,DBG,196);      (* Display divider line *)
  698.    ScreenWrite(CHR(201),57,7,SBA);           (* Dbl corner, UL *)
  699.    PrLines('H',58,74,7,0,SBA,DBG,205);       (* Top dbl line, box *)
  700.    ScreenWrite(CHR(187),75,7,SBA);           (* Dbl corner, UR *)
  701.    ScreenWrite(CHR(186),57,8,SBA);           (* Dbl V line, left *)
  702.    ScreenWrite(CHR(186),75,8,SBA);           (* Dbl V line, right *)
  703.    ScreenWrite(CHR(186),57,9,SBA);           (* Dbl V line, left *)
  704.    ScreenWrite(CHR(186),75,9,SBA);           (* Dbl V line, right *)
  705.    ScreenWrite(CHR(200),57,10,SBA);          (* Dbl corner, LL *)
  706.    PrLines('H',58,74,10,0,SBA,DBG,205);      (* Bot dbl line, box *)
  707.    ScreenWrite(CHR(188),75,10,SBA);          (* Dbl corner, LR *)
  708.    TEXTCOLOR(SFG); TEXTBACKGROUND(DBG);      (* Returned status colors *)
  709.    GOTOXY(59,3); WRITE((SelFreq/100000):9:5); (* Disp rptr's output freq *)
  710.    GOTOXY(59,4); WRITE((OffsFreq/100000):9:5); (* Disp rptr's input freq *)
  711.    ScreenWrite(CHR(18),57,11,SFG);           (* Split legend explained *)
  712.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  713.    GOTOXY(57,6); WRITE('Indicates Split=ON');
  714.    GOTOXY(69,3); WRITE('mHz.');
  715.    GOTOXY(69,4); WRITE('mHz.');
  716.    PrLines('H',2,79,12,12,SBA,DBG,205);      (* Display dbl divider line *)
  717.    PrMessage('Internal Band Plan for Repeater Offsets',8);
  718.    PrLines('H',6,75,15,15,SBA,DBG,196);      (* Display divider line *)
  719.    TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);      (* Requested param colors *)
  720.    GOTOXY(13,9);
  721.    WRITE('10 Meters      -  29.500 mHz to  29.700 mHz:  -100 kHz');
  722.    GOTOXY(13,11);
  723.    WRITE('6 Meters       -  52.010 mHz to  52.999 mHz: +1000 kHz');
  724.    GOTOXY(13,12);
  725.    WRITE('               -  53.000 mHz to  54.000 mHz: -1000 kHz');
  726.    PrLines('H',6,75,18,18,SBA,DBG,196);      (* Display divider line *)
  727.    GOTOXY(13,14);
  728.    WRITE('2 Meters       - 144.600 mHz to 146.999 mHz:  -600 kHz');
  729.    GOTOXY(13,15);
  730.    WRITE('               - 147.000 mHz to 147.400 mHz:  +600 kHz');
  731.    PrLines('H',6,75,21,21,SBA,DBG,196);      (* Display divider line *)
  732.    GOTOXY(13,17);
  733.    WRITE('70 Centimeters - 442.000 mHz to 444.999 mHz: +5000 kHz');
  734.    GOTOXY(13,18);
  735.    WRITE('               - 445.000 mHz to 450.000 mHz: -5000 kHz');
  736.    CatSend(Check,86);
  737.    QuickStat;
  738.    PromptLine('M');                          (* Put up Main Menu message *)
  739.    Repeater := FALSE;
  740.    PromptLine('K');                          (* Put up FK line *)
  741. END; (* ShowSplits *)
  742.  
  743. (*═══════════════════════════════════════════════════════════════════════*)
  744. PROCEDURE MemSelect;
  745. (* Select memory channel *)
  746.  
  747. VAR
  748.    MemCh,MCH  : CHAR;
  749.    MemAddr    : INTEGER;
  750.    FreqInt,
  751.    LSDFreq,
  752.    ROffset,
  753.    FreqString : STRING[8];
  754.    Result     : INTEGER;
  755.    FreqTune   : REAL;
  756.    OffsFreq   : REAL;
  757.  
  758. BEGIN (* MemSelect *)
  759.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  760.    WINDOW(1,1,80,5);
  761.    PrMessage('         - Select Memory Screen -         ',4);
  762.    WINDOW(2,6,79,23);
  763.    CLRSCR;
  764.    PromptLine('S');                          (* Put up select message *)
  765.    PrMessage('Current Memory Parameters ',5); (* Disp Mem Chan headings *)
  766.    GOTOXY(13,6); WRITE(' Channel');
  767.    GOTOXY(29,6); WRITE('Frequency');
  768.    GOTOXY(48,6); WRITE('Mode');
  769.    GOTOXY(62,6); WRITE('Tone');
  770.    PrLines('H',6,75,12,12,SBA,DBG,196);      (* Display divider line *)
  771.    TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);      (* Requested param colors *)
  772.    FOR Index := 0 TO 9 DO BEGIN              (* Display Mem channel nos. *)
  773.       GOTOXY(12,Index + 8);
  774.       WRITE('Memory 0');
  775.       WRITE(Index);
  776.    END;
  777.    PrMem(27,86,8,27,49,59); (* Display channel data from Update stream *)
  778.    (* Display headings & draw `Selected Memory' box *)
  779.    TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);      (* Requested param colors *)
  780.    GOTOXY(58,1); WRITE('Selected Memory');
  781.    PrBox;                                    (* Draw `Memory Select' box *)
  782.    (* Prompt for desired memory number *)
  783.    GOTOXY(11,3); WRITE('Enter desired memory.');
  784.    GOTOXY(33,3); WRITE(CHR(198));
  785.    FOR Index := 1 TO 21 DO
  786.       WRITE(CHR(205)); WRITE(CHR(16));
  787.    GOTOXY(60,3); WRITE('Channel');
  788.    IF SetSel THEN
  789.    TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);      (* Requested param colors *)
  790.    GOTOXY(69,3); WRITE('  ');
  791.    REPEAT
  792.       MemCh := (ReadKey);
  793.    UNTIL MemCh IN [#48..#57];
  794.    PromptLine('W');                          (* Put up wait message *)
  795.    (* Display Channel # in `Selected Memory' box *)
  796.    GOTOXY(69,3); WRITE('0',MemCh);
  797.    MCH := CHR((ORD(MemCh) -48));             (* Compute Bin value *)
  798.    (* Compute ByteNo in Update stream *)
  799.    MemAddr := (ORD(MemCh) -48) *6 +27;
  800.    GOTOXY(59,3); WRITE('            ');
  801.    (* Display Memory Channel Frequency in `Selected Memory' box *)
  802.    PrFreq(Update,MemAddr,59,3);
  803.    TurnCatOn;
  804.    CatSend(Nul3String+MCH+CHR($A),8);        (* Set the channel *)
  805.    IF NOT Repeater THEN
  806.       CatSend(Nul3String+CHR(2)+CHR(9),5)     (* Switch mode to MR *)
  807.    ELSE CatSend(Nul3String+CHR(0)+CHR(9),5); (* Switch mode to VFO<A> *)
  808.    OffsFreq := SelFreq;
  809.    IF Repeater THEN BEGIN
  810.       (* 10 meter repeaters *)
  811.       IF (SelFreq >= 2950000) AND (SelFreq <= 2970000) THEN
  812.          OffsFreq := OffsFreq - 10000;
  813.       (* 6 meter repeaters *)
  814.       IF (SelFreq >= 5201000) AND (SelFreq <= 5400000) THEN BEGIN
  815.          IF SelFreq < 5300000 THEN OffsFreq := SelFreq - 100000;
  816.          IF SelFreq >= 5300000 THEN OffsFreq := SelFreq + 100000;
  817.       END; (* IF *)
  818.       (* 2 meter repeaters *)
  819.       IF (SelFreq >= 14460000) AND (SelFreq <= 14740000) THEN BEGIN
  820.          IF SelFreq < 14700000 THEN OffsFreq := SelFreq - 60000;
  821.          IF SelFreq >= 14700000 THEN OffsFreq := SelFreq + 60000;
  822.       END; (* IF *)
  823.       (* 70 centimeter repeaters *)
  824.       IF (SelFreq >= 44200000) AND (SelFreq <= 45000000) THEN BEGIN
  825.          IF SelFreq < 44500000 THEN OffsFreq := SelFreq +500000;
  826.          IF SelFreq >= 44500000 THEN OffsFreq := SelFreq -500000;
  827.       END; (* IF *)
  828.       IF OffsFreq <> SelFreq THEN BEGIN       (* Split is ready *)
  829.          IF (ORD(Update[1])) AND ($08) = 0 THEN (* Mask off Split bit *)
  830.          CatSend(SplitTog,26);               (* Toggle Split on if off *)
  831.       END
  832.       ELSE IF (ORD(Update[1])) AND ($08) <> 0 THEN (* Mask off Split bit *)
  833.          CatSend(SplitTog,26);               (* Toggle Split off if on *)
  834.       (* Construct LSD->MSD string for Offset value *)
  835.       STR(OffsFreq:8:0,FreqString);
  836.       WHILE COPY(FreqString,1,1) = ' ' DO
  837.          DELETE(FreqString,1,1);
  838.       FreqInt := MultString(8 - LENGTH(FreqString),'0') +FreqString;
  839.       LSDFreq := MakeLSDMSD(FreqInt,8);
  840.       ROffset := FreqParm(LSDFreq,8);
  841.       CatSend(Nul3String+CHR(1)+CHR(9),5);    (* Set up to load VFO B *)
  842.       CatSend(MToV,26);                       (* Move Mem to VFO B *)
  843.       CatSend(ROffset+CHR(8),5);              (* Set VFO B to offset *)
  844.       CatSend(Nul3String+CHR(0)+CHR(9),5);    (* Set up to load VFO A *)
  845.       CatSend(MToV,26);                       (* Move Mem to VFO A *)
  846.       ShowSplits(SelFreq,OffsFreq);           (* Display both freqs *)
  847.       Repeater := FALSE;
  848.    END; (* IF Repeater *)
  849.    CatSend(Check,86);
  850.    QuickStat;
  851.    TurnCatOff;
  852. END; (* MemSelect *)
  853.  
  854. (*═══════════════════════════════════════════════════════════════════════*)
  855. PROCEDURE QuickStat;
  856. (* Do a quick update in upper left box *)
  857.  
  858. VAR
  859.    HamGen,
  860.    ModePos : INTEGER;
  861.  
  862. BEGIN (* QuickStat *)
  863.    WINDOW(1,1,20,5);
  864.    (* Display upper left box headings *)
  865.    TEXTCOLOR(PFG); TEXTBACKGROUND(Blue);     (* Parameter screen colors *)
  866.    GOTOXY(3,2); WRITE('Freq:');
  867.    TEXTCOLOR(SFG); TEXTBACKGROUND(Blue);     (* Special status colors *)
  868.    PrFreq(Update,2,8,2);                     (* Operating Freq *)
  869.       (* Display selected Memory/VFO, Mode status in upper left box *)
  870.    TEXTCOLOR(SFG); TEXTBACKGROUND(Blue);     (* Special status colors *)
  871.    PrFreq(Update,2,8,2);                     (* Operating Freq *)
  872.    TEXTCOLOR(PFG); TEXTBACKGROUND(Blue);     (* Special param colors *)
  873.    GOTOXY(3,3); WRITE('Active: ');
  874.    TEXTCOLOR(SFG); TEXTBACKGROUND(Blue);     (* Special status colors *)
  875.    GOTOXY(11,3);
  876.    IF (ORD(Update[1])) AND ($20) <> 0 THEN BEGIN (* Mask off MR bit *)
  877.       WRITE('MEMORY ');
  878.       ModePos := ORD(Update[8]) * 6 + 32;     (* Calc selected MR mode *)
  879.    END (* IF *)
  880.    ELSE IF (ORD(Update[1])) AND ($10) = 0 THEN BEGIN (* Mask off VFO bit *)
  881.       WRITE('VFO A ');
  882.       ModePos := 20;
  883.    END (* ELSE IF *)
  884.    ELSE BEGIN
  885.       WRITE('VFO B ');
  886.       ModePos := 26;
  887.    END; (* ELSE *)
  888.    IF (ORD(Update[1])) AND ($08) <> 0 THEN BEGIN (* Mask off SPLIT bit *)
  889.       TEXTCOLOR(SFG); TEXTBACKGROUND(Blue);  (* Special status colors *)
  890.       WRITE(CHR(18));
  891.    END (* IF *)
  892.    ELSE IF (ORD(Update[1])) AND ($20) = 0 THEN  (* Mask off MR bit *)
  893.       WRITE(' ');
  894.    TEXTCOLOR(PFG); TEXTBACKGROUND(Blue);     (* Special param colors *)
  895.    GOTOXY(3,4); WRITE('Mode:          ');
  896.    TEXTCOLOR(SFG); TEXTBACKGROUND(Blue);     (* Special status colors *)
  897.    HamGen := Bin2BCDHex(ORD(Update[1]) AND $2);
  898.    GOTOXY(9,4);
  899.    IF HamGen <> 0 THEN WRITE('Gen/')
  900.    ELSE WRITE('Ham/');
  901.    PrMode(Update,ModePos,13,4);
  902.    TEXTCOLOR(SFG); TEXTBACKGROUND(Blue);     (* Special status colors *)
  903.    IF (ORD(Update[1])) AND ($40) <> 0 THEN BEGIN (* Mask off Clar bit *)
  904.       WRITE(' ',CHR(29));
  905.    END (* IF *)
  906.    ELSE WRITE('  ');
  907.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  908. END; (* QuickStat *)
  909.  
  910. (*═══════════════════════════════════════════════════════════════════════*)
  911. FUNCTION Offset(Page,BarPos : INTEGER) : STRING;
  912. (* Compute repeater Split from operating frequency, return Offset Freq *)
  913.  
  914. VAR
  915.    FreqSet,
  916.    FreqInt,
  917.    LSDFreq,
  918.    Junk,
  919.    FreqString : STRING[8];
  920.    Ofs        : CHAR;
  921.    DotPos,
  922.    Result     : INTEGER;
  923.    FreqTune   : REAL;
  924.  
  925. BEGIN (* Offset *)
  926.    LSDFreq    := '';
  927.    FreqInt    := '';
  928.    FreqString := '';
  929.    Ofs        := ' ';
  930.    (* Get repeater's OUTPUT Frequency from Memory array *)
  931.    VAL(COPY(MemArray[Page *10 +BarPos],1,8),FreqTune,Result);
  932.    Ofs := MemArray[Page *10 +BarPos,23];
  933.    (* 10 meter repeaters *)
  934.    IF (FreqTune >= 2950000) AND (FreqTune <= 2970000) THEN BEGIN
  935.       IF Ofs = '-' THEN FreqTune := FreqTune - 10000;
  936.       IF Ofs = '+' THEN FreqTune := FreqTune + 10000;
  937.    END; (* IF *)
  938.    (* 6 meter repeaters *)
  939.    IF (FreqTune >= 5201000) AND (FreqTune <= 5400000) THEN BEGIN
  940.       IF Ofs = '-' THEN FreqTune := FreqTune - 100000;
  941.       IF Ofs = '+' THEN FreqTune := FreqTune + 100000;
  942.    END; (* IF *)
  943.    (* 2 meter repeaters *)
  944.    IF (FreqTune >= 14460000) AND (FreqTune <= 14740000) THEN BEGIN
  945.       IF Ofs = '-' THEN FreqTune := FreqTune - 60000;
  946.       IF Ofs = '+' THEN FreqTune := FreqTune + 60000;
  947.    END; (* IF *)
  948.    (* 70 centimeter repeaters *)
  949.    IF (FreqTune >= 44200000) AND (FreqTune <= 45000000) THEN BEGIN
  950.       IF Ofs = '-' THEN FreqTune := FreqTune - 500000;
  951.       IF Ofs = '+' THEN FreqTune := FreqTune + 500000;
  952.    END; (* IF *)
  953.    (* Construct LSD->MSD string for Offset value *)
  954.    STR(FreqTune:8:0,FreqString);
  955.    WHILE COPY(FreqString,1,1) = ' ' DO
  956.       DELETE(FreqString,1,1);
  957.    FreqInt := MultString(8 - LENGTH(FreqString),'0') +FreqString;
  958.    LSDFreq := MakeLSDMSD(FreqInt,8);
  959.    Offset  := FreqParm(LSDFreq,8);
  960. END; (* Offset *)
  961.  
  962. END (* of UNIT CATYMVFO *).
  963.