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

  1. UNIT CATYDISP (* CATY Display routines  D. J. Wilke N3HGQ 07/13/91 *);
  2.  
  3. INTERFACE
  4.  
  5. USES CRT, DOS, CATYGLO, CATYUTIL;
  6.  
  7. PROCEDURE PromptLine(Prompt : STRING);
  8. PROCEDURE PrMessage(Mstring : String86; Tc : INTEGER);
  9. PROCEDURE PrFrame (LeftCol,RightCol,TopRow,BottomRow : INTEGER);
  10. PROCEDURE PrLines(Dir : STRING; X,X1,Y,Y1,Fg,Bg,Ch : INTEGER);
  11. PROCEDURE PrRule;
  12. PROCEDURE PrBox;
  13. PROCEDURE PrFreq (Update : String86; ByteNo,Col,Row : INTEGER);
  14. PROCEDURE PrMode (Param : String86; ByteNo,Col,Row : INTEGER);
  15. PROCEDURE PrCTCSS(Param : String86; ByteNo,Col,Row : INTEGER);
  16. PROCEDURE PrMem(Sb,Eb,SR,FC,MC,TC : INTEGER);
  17. PROCEDURE PrStatusByte;
  18. PROCEDURE PrBandLimits;
  19. PROCEDURE PrDfPage(Pg,Rec,Nlines : INTEGER);
  20.  
  21. IMPLEMENTATION
  22.  
  23. (*═══════════════════════════════════════════════════════════════════════*)
  24. PROCEDURE PromptLine(Prompt : STRING);
  25. (* Display appropriate prompt on line 25 *)
  26.  
  27. BEGIN (* PromptLine *)
  28.    IF Prompt = 'F' THEN BEGIN      (* Display Function keys on line 25 *);
  29.       FOR Index := 1 TO 80 DO
  30.          ScreenWrite(' ',Index,25,0);     (* Clear it *)
  31.       ScreenWrite(' Function Keys ',35,24,PFG);
  32.       ScreenWrite('1 HB/GC',1,25,FKA);
  33.       ScreenWrite('2 Reset',10,25,FKA);
  34.       ScreenWrite('3 Band'+CHR(25),19,25,FKA);
  35.       ScreenWrite('4 Band'+CHR(24),27,25,FKA);
  36.       ScreenWrite('5 Splt'+CHR(18),35,25,FKA);
  37.       ScreenWrite('6 Clar'+CHR(29),43,25,FKA);
  38.       ScreenWrite('7 M'+CHR(26)+'VFO',51,25,FKA);
  39.       ScreenWrite('8 VFO'+CHR(26)+'M',59,25,FKA);
  40.       ScreenWrite('9 Swap*',67,25,FKA);
  41.       ScreenWrite('0 Exit',75,25,FKA);
  42.    END; (* IF Prompt = 'F' *)
  43.  
  44.    IF Prompt = 'M' THEN BEGIN                (* Disp menu msg on line 25 *);
  45.       FOR Index := 1 TO 80 DO
  46.          ScreenWrite(' ',Index,25,0);        (* Clear it *)
  47.       FOR Index := 35 TO 49 DO
  48.          ScreenWrite(CHR(205),Index,24,SBA);
  49.       ScreenWrite('<Return> for Main Menu...',5,25,PFG);
  50.       Pause;
  51.    END; (* IF Prompt = 'M' *)
  52.  
  53.    IF Prompt = 'S' THEN BEGIN                (* Disp select msg on l 25 *);
  54.       FOR Index := 1 TO 80 DO
  55.          ScreenWrite(' ',Index,25,0);        (* Clear it *)
  56.       FOR Index := 35 TO 49 DO
  57.          ScreenWrite(CHR(205),Index,24,SBA);
  58.       ScreenWrite('Make selection please...',5,25,PFG);
  59.    END; (* IF Prompt = 'S' *)
  60.  
  61.    IF Prompt = 'T' THEN BEGIN      (* Display Function keys on line 25 *);
  62.       FOR Index := 1 TO 80 DO
  63.       BEGIN
  64.          ScreenWrite(CHR(205),Index,23,SBA);
  65.          ScreenWrite(' ',Index,24,0);        (* Clear line 24 *)
  66.          ScreenWrite(' ',Index,25,0);        (* Clear line 25 *)
  67.       END;
  68.       ScreenWrite(CHR(200),1,23,SBA);        (* Replace corners *)
  69.       ScreenWrite(CHR(188),80,23,SBA);
  70.       FOR Index := 35 TO 49 DO
  71.          ScreenWrite(CHR(205),Index,23,SBA);
  72.       ScreenWrite(' Function Keys ',35,23,PFG);
  73.       ScreenWrite('1 Help ',1,24,FKA);
  74.       ScreenWrite('2 Disp ',10,24,FKA);
  75.       ScreenWrite('3 Monit',19,24,FKA);
  76.       ScreenWrite('4 RTTY ',27,24,FKA);
  77.       ScreenWrite('5 Heard',35,24,FKA);
  78.       ScreenWrite('6 H Pak',43,24,FKA);
  79.       ScreenWrite('7 V Pak',51,24,FKA);
  80.       ScreenWrite('8 Disc ',59,24,FKA);
  81.       ScreenWrite('9 ARQ  ',67,24,FKA);
  82.       ScreenWrite('0 Stat',75,24,FKA);
  83.       ScreenWrite('<Page Up> Converse    <Page Down> CMD Mode    '+
  84.                   '<Home> Clear screen    <End> Exits',1,25,PFG);
  85.    END; (* IF Prompt = 'T' *)
  86.  
  87.    IF Prompt = 'V' THEN BEGIN                (* Disp pager cmds on ln 24,25 *);
  88.       FOR Index := 1 TO 80 DO
  89.       BEGIN
  90.          ScreenWrite(CHR(205),Index,23,SBA);
  91.          ScreenWrite(' ',Index,24,0);        (* Clear line 24 *)
  92.          ScreenWrite(' ',Index,25,0);        (* Clear line 25 *)
  93.       END;
  94.       ScreenWrite(CHR(200),1,23,SBA);        (* Replace corners *)
  95.       ScreenWrite(CHR(188),80,23,SBA);
  96.       FOR Index := 35 TO 49 DO
  97.          ScreenWrite(CHR(205),Index,23,SBA);
  98.       ScreenWrite(' Browsing Keys ',33,23,PFG);
  99.       ScreenWrite('<Page Up>   <Page Down>   <'+CHR(24)+','+CHR(25)+
  100.                   '> to select   <'+CHR(17)+CHR(196)+CHR(217)+
  101.                   '> to set VFO<A>   <End> to exit',1,25,PFG);
  102.       ScreenWrite('<'+CHR(27)+'> Datafile Reverse Scan  <'+CHR(26)+
  103.                   '> Datafile Forward Scan  <Spacebar> stops scanning',1,24,PFG);
  104.    END; (* IF Prompt = 'V' *)
  105.  
  106.    IF Prompt = 'W' THEN BEGIN                (* Disp wait msg on line 25 *);
  107.       FOR Index := 1 TO 80 DO
  108.          ScreenWrite(' ',Index,25,0);        (* Clear it *)
  109.       FOR Index := 35 TO 49 DO
  110.          ScreenWrite(CHR(205),Index,24,SBA);
  111.       ScreenWrite('Wait please...',5,25,PFG);
  112.    END; (* IF Prompt = 'W' *)
  113. END; (* PromptLine *)
  114.  
  115. (*═══════════════════════════════════════════════════════════════════════*)
  116. PROCEDURE PrMessage(Mstring : String86; Tc : INTEGER);
  117. (* Display message at line Tc centered horizontally *)
  118.  
  119. VAR
  120.    Lc : INTEGER;
  121.  
  122. BEGIN (* PrMessage *)
  123.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  124.    GOTOXY(40 - (LENGTH(Mstring) DIV 2) + 1,Tc);
  125.    WRITE(Mstring);                           (* Display Message centered *) 
  126. END; (* PrMessage *)
  127.  
  128. (*═══════════════════════════════════════════════════════════════════════*)
  129. PROCEDURE PrFrame (LeftCol,RightCol,TopRow,BottomRow : INTEGER);
  130. (* Draw basic screen frame using graphics characters *)
  131.  
  132. VAR
  133.    Vert,HorizLength : INTEGER;
  134.  
  135. BEGIN (* PrFrame *)
  136.    (* Do the corners *)
  137.    ScreenWrite(CHR(201),LeftCol,TopRow,SBA);
  138.    ScreenWrite(CHR(187),RightCol,TopRow,SBA);
  139.    ScreenWrite(CHR(200),LeftCol,BottomRow,SBA);
  140.    ScreenWrite(CHR(188),RightCol,BottomRow,SBA);
  141.  
  142.    (* Do the vertical lines *)
  143.    FOR Vert := TopRow + 1 TO BottomRow - 1 DO
  144.    BEGIN
  145.       ScreenWrite(CHR(186),LeftCol,Vert,SBA);
  146.       ScreenWrite(CHR(186),RightCol,Vert,SBA);
  147.    END;
  148.  
  149.    (* Do the horizontal lines *)
  150.    HorizLength := RightCol - LeftCol - 1;
  151.    FOR Index := 1 TO HorizLength DO BEGIN
  152.       ScreenWrite(CHR(205),Index + 1,TopRow,SBA);
  153.       ScreenWrite(CHR(205),Index + 1,BottomRow,SBA);
  154.    END; (* FOR Index *)
  155. END; (* PrFrame *)
  156.  
  157. (*═══════════════════════════════════════════════════════════════════════*)
  158. PROCEDURE PrLines(Dir : STRING; X,X1,Y,Y1,Fg,Bg,Ch : INTEGER);
  159. (* Draw horiz or vert ruling lines *)
  160.  
  161. BEGIN (* PrLines *)                          (* Ch=graphics character *)
  162.    IF Dir = 'H' THEN BEGIN                   (* Draw horiz line *)
  163.       FOR Index := X TO X1 DO                (* X=start col, X1=end col *)
  164.          ScreenWrite(CHR(Ch),Index,Y,Fg);    (* Draw @row Y, in color Fg *)
  165.    END; (* IF Dir H *)
  166.    IF Dir = 'V' THEN BEGIN                   (* Draw vert line *)
  167.       FOR Index := Y TO Y1 DO                (* Y=start row, Y1=end row *)
  168.          ScreenWrite(CHR(Ch),X,Index,Fg);    (* Draw @col X, in color Fg *)
  169.    END; (* IF Dir V *)
  170. END; (* PrLines *)
  171.  
  172. (*═══════════════════════════════════════════════════════════════════════*)
  173. PROCEDURE PrRule (* Display ruled lines at top of screen *);
  174.  
  175. BEGIN (* PrRule *)
  176.    ScreenWrite(CHR(204),1,5,SBA);            (* Dbl tee, left *)
  177.    PrLines('H',2,79,5,0,SBA,DBG,205);        (* Dbl H line, top *)
  178.    ScreenWrite(CHR(185),80,5,SBA);           (* Dbl tee, right *)
  179. END; (* PrRule *)
  180.  
  181. (*═══════════════════════════════════════════════════════════════════════*)
  182. PROCEDURE PrBox (* Display selected parameter box *);
  183.    (* Note: ABSOLUTE positions, not relative to window *)
  184.  
  185. BEGIN (* PrBox *)
  186.    ScreenWrite(CHR(201),57,7,SBA);           (* Dbl corner, UL *)
  187.    PrLines('H',58,74,7,0,SBA,DBG,205);       (* Top dbl line, box *)
  188.    ScreenWrite(CHR(187),75,7,SBA);           (* Dbl corner, UR *)
  189.    ScreenWrite(CHR(186),57,8,SBA);           (* Dbl V line, left *)
  190.    ScreenWrite(CHR(186),75,8,SBA);           (* Dbl V line, right *)
  191.    ScreenWrite(CHR(200),57,9,SBA);           (* Dbl corner, LL *)
  192.    PrLines('H',58,74,9,0,SBA,DBG,205);       (* Bot dbl line, box *)
  193.    ScreenWrite(CHR(188),75,9,SBA);           (* Dbl corner, LR *)
  194. END;
  195.  
  196. (*═══════════════════════════════════════════════════════════════════════*)
  197. PROCEDURE PrFreq (Update : String86; ByteNo,Col,Row : INTEGER);
  198. (* Decode and Display VFO, Operating & Memory frequencies *)
  199.  
  200. VAR
  201.    S    : STRING[2];
  202.    Temp : STRING[8];
  203.    Freq : REAL;
  204.    Code : INTEGER;
  205.  
  206. BEGIN (* PrFreq *)
  207.    Temp := '';
  208.    TEXTCOLOR(SFG);
  209.    IF Col <> 8 THEN
  210.       TEXTBACKGROUND(DBG)                    (* Returned status colors *)
  211.    ELSE
  212.       TEXTBACKGROUND(BLUE);                  (* Special status colors *)
  213.    GOTOXY(Col,Row);
  214.    FOR Index := ByteNo TO ByteNo + 3 DO BEGIN (* Grab the 4 Freq bytes *)
  215.       STR(Bin2BCDHex(ORD(Update[Index])),S); (* Make string of BCD Hex *)
  216.       IF LENGTH(S) < 2 THEN
  217.       S := '0' + S;                          (* Must have leading zero *)
  218.       Temp := Temp + S;                      (* Build 8 byte Temp string *)
  219.    END; (* FOR Index *)
  220.    VAL(Temp,Freq,Code);                      (* Convert to REAL number *)
  221.    SelFreq := Freq;                          (* Store in Global Variable *)
  222.    WRITE((Freq/100000):9:5);                 (* Display 5 decimal places *)
  223.    IF Col > 8 THEN BEGIN
  224.       TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);   (* Default screen colors *)
  225.       GOTOXY(Col+10,Row); WRITE('MHz.');
  226.    END (* IF Col *)
  227.    ELSE WRITE(' ');
  228.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  229. END; (* PrFreq *)
  230.  
  231. (*═══════════════════════════════════════════════════════════════════════*)
  232. PROCEDURE PrMode (Param : String86; ByteNo,Col,Row : INTEGER);
  233. (* Decode and Display modes *)
  234.  
  235. VAR
  236.    Mode     : INTEGER;
  237.    ModeByte : CHAR;
  238.  
  239. BEGIN (* PrMode *)
  240.    IF Row = 4 THEN BEGIN
  241.       TEXTCOLOR(SFG); TEXTBACKGROUND(BLUE);  (* Special status colors *)
  242.    END (* IF *)
  243.    ELSE BEGIN
  244.       TEXTCOLOR(SFG); TEXTBACKGROUND(DBG);   (* Returned status colors *)
  245.    END; (* ELSE *)
  246.    ModeByte := Param[ByteNo];                (* nth byte of Update stream *)
  247.    Mode     := Bin2BCDHex(ORD(ModeByte) AND 7); (* Mask off Mode bits *)
  248.    GOTOXY(Col,Row);
  249.    CASE Mode OF
  250.       0 : WRITE('LSB');
  251.       1 : WRITE('USB');
  252.       2 : WRITE('CW ');
  253.       3 : WRITE('AM ');
  254.       4 : WRITE('FM ');
  255.       5 : WRITE('FSK');
  256.    END; (* CASE *)
  257.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  258. END; (* PrMode *)
  259.  
  260. (*═══════════════════════════════════════════════════════════════════════*)
  261. PROCEDURE PrCTCSS(Param : String86; ByteNo,Col,Row : INTEGER);
  262. (* Decode and Display CTCSS tone frequencies *)
  263.  
  264. VAR
  265.    Tone  : INTEGER;
  266.    CTCSS : REAL;
  267.  
  268. BEGIN (* PrCTCSS *)
  269.    Tone := 0; CTCSS := 0.0;
  270.    Tone := ORD(Param[ByteNo]);               (* nth byte of Update stream *)
  271.    IF (Tone < $15) OR (Tone > $3E) THEN      (* Valid value range *)
  272.       CTCSS := 0.0;
  273.    CASE Tone OF
  274.      $15 : CTCSS := 91.5;
  275.      $16 : CTCSS := 88.5;
  276.      $17 : CTCSS := 85.4;
  277.      $18 : CTCSS := 82.5;
  278.      $19 : CTCSS := 79.7;
  279.      $1A : CTCSS := 77.0;
  280.      $1B : CTCSS := 74.7;
  281.      $1C : CTCSS := 71.9;
  282.      $1D : CTCSS := 67.0;
  283.      $1E : CTCSS := 250.3;
  284.      $1F : CTCSS := 241.8;
  285.      $20 : CTCSS := 233.6;
  286.      $21 : CTCSS := 225.7;
  287.      $22 : CTCSS := 218.1;
  288.      $23 : CTCSS := 210.7;
  289.      $24 : CTCSS := 203.5;
  290.      $25 : CTCSS := 192.8;
  291.      $26 : CTCSS := 186.2;
  292.      $27 : CTCSS := 179.9;
  293.      $28 : CTCSS := 173.8;
  294.      $29 : CTCSS := 167.9;
  295.      $2A : CTCSS := 162.2;
  296.      $2B : CTCSS := 156.7;
  297.      $2C : CTCSS := 151.4;
  298.      $2D : CTCSS := 146.2;
  299.      $2E : CTCSS := 141.3;
  300.      $2F : CTCSS := 136.5;
  301.      $30 : CTCSS := 131.8;
  302.      $31 : CTCSS := 127.3;
  303.      $32 : CTCSS := 123.0;
  304.      $33 : CTCSS := 118.8;
  305.      $34 : CTCSS := 114.8;
  306.      $35 : CTCSS := 110.9;
  307.      $36 : CTCSS := 107.2;
  308.      $37 : CTCSS := 103.5;
  309.      $38 : CTCSS := 100.0;
  310.      $39 : CTCSS := 94.8;                    (* Hi-Q *)
  311.      $3A : CTCSS := 88.5;                    (* Hi-Q *)
  312.      $3B : CTCSS := 82.5;                    (* Hi-Q *)
  313.      $3C : CTCSS := 77.0;                    (* Hi-Q *)
  314.      $3D : CTCSS := 71.9;                    (* Hi-Q *)
  315.      $3E : CTCSS := 67.0;                    (* Hi-Q *)
  316.    END; (* CASE *)
  317.    TEXTCOLOR(SFG); TEXTBACKGROUND(DBG);      (* Returned status colors *)
  318.    GOTOXY(Col,Row);
  319.    IF ToneEnc THEN BEGIN                     (* Is CTCSS bd installed? *)
  320.       WRITE(CTCSS:3:1);
  321.       TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);   (* Default screen colors *)
  322.       GOTOXY(Col + 7,Row); WRITE ('Hz.');
  323.    END
  324.    ELSE BEGIN
  325.       TEXTCOLOR(SFG); TEXTBACKGROUND(DBG);   (* Returned status colors *)
  326.       WRITE ('   None   ');                  (* No CTCSS board installed *)
  327.    END; (* ELSE *)
  328.    TEXTCOLOR(DFG); TEXTBACKGROUND(DBG);      (* Default screen colors *)
  329. END; (* PrCTCSS *)
  330.  
  331. (*═══════════════════════════════════════════════════════════════════════*)
  332. PROCEDURE PrMem(Sb,Eb,SR,FC,MC,TC : INTEGER);
  333. (* Decode & display memory Frequencies, Mode, Tone
  334.    Sb = Start byte in Update      FC = Frequency column
  335.    Eb = Ending byte in Update     MC = Mode column
  336.    SR = Starting screen row       TC = CTCSS tone column *)
  337.  
  338. BEGIN (* PrMem *)
  339.    IF LENGTH(Update) = 86 THEN BEGIN         (* Do only if full Update *)
  340.       WHILE Sb <= Eb DO BEGIN
  341.          PrFreq(Update,Sb,FC,SR);            (* Print Freq *)
  342.          PrMode(Update,Sb + 5,MC,SR);        (* Print Mode *)
  343.          PrCTCSS(Update,Sb + 4,TC,SR);       (* Print Tone *)
  344.          SR := SR + 1; Sb := Sb + 6;         (* Update pointers *)
  345.       END; (* WHILE *)
  346.    END; (* IF LENGTH *)
  347. END; (* PrMem *)
  348.  
  349. (*═══════════════════════════════════════════════════════════════════════*)
  350. PROCEDURE PrStatusByte (* Decode and Display status byte *);
  351.  
  352. VAR
  353.    SBStr : STRING[8];
  354.    PTT,HamGen,TXInh,Split,VFO,MemR,Clar,CATS : INTEGER;
  355.  
  356. BEGIN (* PrStatusByte *)
  357.    PTT    := Bin2BCDHex(ORD(Update[1]) AND $1);  (* Mask off PTT bit *)
  358.    HamGen := Bin2BCDHex(ORD(Update[1]) AND $2);  (* Mask off H/G bit *)
  359.    TXInh  := Bin2BCDHex(ORD(Update[1]) AND $4);  (* Mask off T/R bit *)
  360.    Split  := Bin2BCDHex(ORD(Update[1]) AND $8);  (* Mask off Split bit *)
  361.    VFO    := Bin2BCDHex(ORD(Update[1]) AND $10); (* Mask off VFO bit *)
  362.    MemR   := Bin2BCDHex(ORD(Update[1]) AND $20); (* Mask off MR bit *)
  363.    Clar   := Bin2BCDHex(ORD(Update[1]) AND $40); (* Mask off Clar bit *)
  364.    CATS   := Bin2BCDHex(ORD(Update[1]) AND $80); (* Mask off CatS bit *)
  365.  
  366.    TEXTCOLOR(SFG); TEXTBACKGROUND(DBG);      (* Returned status colors *)
  367.    GOTOXY(65,11);
  368.    IF PTT <> 0 THEN WRITE('Transmit') ELSE WRITE('Receive ');
  369.    GOTOXY(65,12);
  370.    IF HamGen <> 0 THEN WRITE('Gen Coverage') ELSE WRITE('Ham Bands');
  371.    GOTOXY(65,13);
  372.    IF TXInh <> 0 THEN WRITE('Inhibited') ELSE WRITE('Enabled  ');
  373.    GOTOXY(65,14);
  374.    IF Split <> 0 THEN WRITE('Active   ') ELSE WRITE('Inactive ');
  375.    GOTOXY(65,15);
  376.    IF VFO <> 0 THEN WRITE(' < B >   ') ELSE WRITE(' < A >   ');
  377.    GOTOXY(65,16);
  378.    IF MemR <> 0 THEN WRITE('Active   ') ELSE WRITE('Inactive ');
  379.    GOTOXY(65,17);
  380.    IF Clar <> 0 THEN WRITE('Active   ') ELSE WRITE('Inactive ');
  381.    GOTOXY(65,18);
  382.    IF CATS <> 0 THEN WRITE('Active   ') ELSE WRITE('Inactive ');
  383. END; (* PrStatusByte *)
  384.  
  385. (*═══════════════════════════════════════════════════════════════════════*)
  386. PROCEDURE PrBandLimits;
  387. (* Display legal Advanced Class band limits *)
  388.  
  389. BEGIN (* PrBandLimits *)
  390.    (* Display band limits headings *)
  391.    GOTOXY(5,5); WRITE ('Advanced Class Band');
  392.    GOTOXY(27,5); WRITE ('CW Band Edge Limits');
  393.    GOTOXY(50,5); WRITE ('Phone Band Edge Limits');
  394.    PrLines('H',6,75,11,11,SBA,DBG,196);      (* Display divider line *)
  395.    TEXTCOLOR(RFG); TEXTBACKGROUND(DBG);      (* Requested param colors *)
  396.    GOTOXY(10,7); WRITE('160 Meters      1.800 -   1.850 MHz.');
  397.    GOTOXY(52,7); WRITE('1.850 -   2.000 MHz.');
  398.    GOTOXY(11,8); WRITE('80 Meters      3.525 -   3.750 MHz.');
  399.    GOTOXY(52,8); WRITE('3.775 -   4.000 MHz.');
  400.    GOTOXY(11,9); WRITE('40 Meters      7.025 -   7.150 MHz.');
  401.    GOTOXY(52,9); WRITE('7.150 -   7.300 MHz.');
  402.    GOTOXY(11,10); WRITE('30 Meters     10.100 -  10.150 MHz.');
  403.    GOTOXY(51,10); WRITE('CW/RTTY only-100 Watts.');
  404.    GOTOXY(11,11); WRITE('20 Meters     14.025 -  14.150 MHz.');
  405.    GOTOXY(51,11); WRITE('14.175 -  14.350 MHz.');
  406.    GOTOXY(11,12); WRITE('17 Meters     18.068 -  18.110 MHz.');
  407.    GOTOXY(51,12); WRITE('18.110 -  18.168 MHz.');
  408.    GOTOXY(11,13); WRITE('15 Meters     21.025 -  21.200 MHz.');
  409.    GOTOXY(51,13); WRITE('21.225 -  21.450 MHz.');
  410.    GOTOXY(11,14); WRITE('12 Meters     24.890 -  24.930 MHz.');
  411.    GOTOXY(51,14); WRITE('24.930 -  24.990 MHz.');
  412.    GOTOXY(11,15); WRITE('10 Meters     28.000 -  28.300 MHz.');
  413.    GOTOXY(51,15); WRITE('28.300 -  29.970 MHz.');
  414.    GOTOXY(11,16); WRITE(' 6 Meters     50.000 -  54.000 MHz.');
  415.    GOTOXY(50,16); WRITE('Use Repeater Directory.');
  416.    GOTOXY(11,17); WRITE(' 2 Meters    144.000 - 148.000 MHz.');
  417.    GOTOXY(50,17); WRITE('Use Repeater Directory.');
  418.    GOTOXY(11,18); WRITE('70 Cm.       420.000 - 450.000 MHz.');
  419.    GOTOXY(50,18); WRITE('Use Repeater Directory.');
  420. END; (* PrBandLimits *)
  421.  
  422. (*═══════════════════════════════════════════════════════════════════════*)
  423. PROCEDURE PrDfPage(Pg,Rec,Nlines : INTEGER);
  424. (* Display Nlines records at a time from datafile memory array *)
  425.  
  426. VAR
  427.    Item       : INTEGER;
  428.    Mode       : CHAR;
  429.    Freq,Offset,
  430.    Desc       : STRING;
  431.    ModeStr    : STRING[3];
  432.    LineOfData : STRING[70];
  433.  
  434. BEGIN (* PrDfPage *)
  435.    FOR Index := 1 TO Nlines DO BEGIN
  436.      Freq       := '';
  437.      Offset     := '';
  438.      Mode       := ' ';
  439.      Desc       := '';
  440.      LineOfData := '';
  441.      (* No Rec # means do a full page *)
  442.      IF Rec = 0 THEN BEGIN
  443.         Item := Pg * 10 + Index;
  444.         GOTOXY(2,Index);
  445.      END (* IF Rec *)
  446.      (* Rec # means do specific record *)
  447.      ELSE BEGIN
  448.        Item := Rec;
  449.        IF Item MOD(10) = 0 THEN
  450.           GOTOXY(2,Item MOD(10) +10)
  451.        ELSE GOTOXY(2,Item MOD(10));
  452.      END; (* ELSE *)
  453.      IF Item <= DataFileRec THEN BEGIN
  454.         Freq   := COPY(MemArray[Item],15,7);
  455.         Offset := MemArray[Item,23];
  456.         Mode   := MemArray[Item,13];
  457.         Desc   := COPY(MemArray[Item],25,44);
  458.         CASE Mode OF
  459.            'L' : ModeStr := 'LSB';
  460.            'U' : ModeStr := 'USB';
  461.            'C' : ModeStr := 'CW ';
  462.            'A' : ModeStr := 'AM ';
  463.            'K' : ModeStr := 'FSK';
  464.            'F' : ModeStr := 'FM ';
  465.         END; (* CASE *)
  466.         LineOfData := '   ' +Freq +'   ' +Offset +
  467.                       '   ' +ModeStr +'  ' +Desc;
  468.      END; (* IF Item *)
  469.      WRITE(Item:3);
  470.      WRITE(LineOfData);
  471.    END; (* FOR Index *)
  472. END; (* PrDfPage *)
  473. END (* of UNIT CATYDISP *).
  474.