home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / TURBOPAS / TP003.ZIP / MENU.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1985-10-23  |  17.9 KB  |  531 lines

  1.  
  2.  
  3.  
  4. (*          NOTE : TO USE THIS MENU PROCEDURE THE FOLLOWING FILES
  5.  
  6.             MUST APPEAR IN ORDER AT THE TOP OF THE MAIN PROGRAM
  7.  
  8.                             {$I RVSONOFF.PAS}
  9.                             {$I REP_CHAR.PAS}
  10.                             {$I CENTER.PAS}
  11.                             {$I MENU.PAS}                                   *)
  12.  
  13. {****************************************************************************}
  14. TYPE                                   {* JUST A COUPLE OF TYPE DECLARATIONS*}
  15.   MENU_ITEM       = STRING[40];        {* NEEDED FOR A NUMBER OF ROUTINES   *}
  16.                                        {*************************************}
  17.  
  18.   MENU_SELECTIONS = ARRAY[1..15] OF MENU_ITEM;
  19.   HL_SELECTIONS   = ARRAY[1..15] OF CHAR;
  20.  
  21.   CURS_COND       = (ON,OFF);
  22.  
  23. {18**************************************************************************}
  24. PROCEDURE FRAME(                      {* FRAME THE SECTION OF SCREEN WITHIN *}
  25.                 UPPERLEFTX,           {* THESE BOUNDS                       *}
  26.                 UPPERLEFTY,           {**************************************}
  27.                 LOWERRIGHTX,
  28.                 LOWERRIGHTY: INTEGER);
  29.   VAR
  30.     I: INTEGER;
  31.  
  32. BEGIN
  33.   GOTOXY(UPPERLEFTX,UPPERLEFTY);
  34.   WRITE(CHR(201));
  35.   GOTOXY(UPPERLEFTX,LOWERRIGHTY);
  36.   WRITE(CHR(200));
  37.   GOTOXY(LOWERRIGHTX,UPPERLEFTY);
  38.   WRITE(CHR(187));
  39.   GOTOXY(LOWERRIGHTX,LOWERRIGHTY);
  40.   WRITE(CHR(188));
  41.   FOR I := UPPERLEFTX + 1 TO LOWERRIGHTX - 1 DO
  42.     BEGIN
  43.     GOTOXY(I,UPPERLEFTY);
  44.     WRITE(CHR(205));
  45.     GOTOXY(I,LOWERRIGHTY);
  46.     WRITE(CHR(205));
  47.     END;
  48.   FOR I := UPPERLEFTY + 1 TO LOWERRIGHTY - 1 DO
  49.     BEGIN
  50.     GOTOXY(UPPERLEFTX,I);
  51.     WRITE(CHR(186));
  52.     GOTOXY(LOWERRIGHTX,I);
  53.     WRITE(CHR(186));
  54.     END;
  55. END;  { FRAME }
  56.  
  57. {22**************************************************************************}
  58. PROCEDURE WINDOW_FRAME(X1,Y1,             {* CREATE, FRAME AND TITLE A      *}
  59.                        X2,Y2,             {* WINDOW                         *}
  60.                        COLOR : INTEGER;   {**********************************}
  61.                        TITLE : MENU_ITEM);
  62.  
  63. VAR
  64.   CENTER : INTEGER;
  65.  
  66. BEGIN
  67.   WINDOW(1,1,80,25);
  68.  
  69.   TEXTCOLOR(WHITE);
  70.   FRAME(X1 - 1, Y1 - 1,
  71.         X2 + 1, Y2 + 1);
  72.   CENTER := ((X2 - X1) DIV 2) + X1;
  73.   IF ODD(CENTER) AND FALSE THEN
  74.     GOTOXY(CENTER - (LENGTH(TITLE) DIV 2),Y1-1)
  75.   ELSE
  76.     GOTOXY(CENTER - ((LENGTH(TITLE) DIV 2) - 1),Y1-1);
  77.   IF COLOR = 0  THEN
  78.     BEGIN
  79.     TEXTCOLOR(WHITE);
  80.     TEXTBACKGROUND(RED);
  81.     END
  82.   ELSE RVSON;
  83.   WRITE(TITLE);
  84.   RVSOFF;
  85.   WINDOW(X1,Y1,X2,Y2);
  86.   CLRSCR;
  87. END;
  88.  
  89. {************************************************************************}
  90. PROCEDURE CURSOR (STATE : CURS_COND);
  91.  
  92.   TYPE
  93.     BIOSPARAMTYPE = RECORD
  94.                       AX,BX,CX,DX,BP,SI,DI,DS,ES,FLAGS : INTEGER;
  95.                     END;
  96.   VAR
  97.     BIOSPARAM  : BIOSPARAMTYPE;
  98.  
  99.   BEGIN
  100.     WITH BIOSPARAM DO BEGIN
  101.       AX := 1 SHL 8 + 0;     {LOAD AH WITH REQUEST TO SET CURSOR LINES}
  102.       CASE STATE OF
  103.         ON  : CX :=  6 SHL 8 + 7; { SET DEFAULT CURSOR TYPE }
  104.         OFF : CX := 32 SHL 8 + 0; { SET CURSOR OFF          }
  105.       END;
  106.     END;
  107.     INTR($10,BIOSPARAM);     {CALL VIDEO INTERUPT}
  108.   END;
  109.  
  110. {****************************************************************************}
  111. FUNCTION MENU (                               {* DISPLAYS A MENU            *}
  112.                                               {*                            *}
  113.                 ITEM_LIST  : MENU_SELECTIONS; {* LIST OF OPTIONS ON MENU    *}
  114.                                               {* LAST ITEM MUST BE NULL     *}
  115.                                               {* STRING FOR PROPER OPERATION*}
  116.                                               {* MAX 20 ITEMS PER MENU      *}
  117.                                               {*                            *}
  118.                 HL_CHAR    : HL_SELECTIONS;   {* HIGHLIGHTED LETTER         *}
  119.                                               {*       OF OPTION            *}
  120.                                               {*                            *}
  121.                 MENU_TITLE : MENU_ITEM;       {* TITLE OF MENU              *}
  122.                                               {*                            *}
  123.                                               {* IF   X=0 AND Y=0   THEN :  *}
  124.                                               {*   -- MENU CENTERED --      *}
  125.                 MENU_X     : INTEGER;         {* IF (78-MAX.OPTION LENGTH)  *}
  126.                                               {*       => X => 2  AND       *}
  127.                 MENU_Y     : INTEGER;         {* IF (24-MAX. NUM. OPTIONS)  *}
  128.                                               {*       => Y => 2  THEN:     *}
  129.                                               {*   X AND Y DEFINE UPPER     *}
  130.                                               {*    LEFT CORNER OF MENU     *}
  131.                                               {*                            *}
  132.                 COLOR      : INTEGER;         {*   0 = COLOR    1 = MONO    *}
  133.                                               {*                            *}
  134.                 DEFAULT    : INTEGER          {* DEFAULT OPTION SELECTION   *}
  135.                                               {*                            *}
  136.               )            : INTEGER;         {* RETURNS THE INDEX OF THE   *}
  137.                                               {* ITEM SELECTED BY THE USER  *}
  138.                                               {*                            *}
  139. {****************************************************************************}
  140.  
  141. TYPE
  142.   HI_LITE_CHAR     = SET OF #48..#122;
  143.   SPECIAL_KEYS     = SET OF #59..#68;
  144.   ITEM_KEY         = STRING[3];
  145.   STUFFINHEAP      = ^PUTINHEAP;                   {POINTER TO SCREEN IN HEAP}
  146.   PUTINHEAP        = RECORD
  147.                        SCREENIMAGE  : ARRAY[1..4096] OF CHAR;
  148.                      END;
  149.  
  150. VAR
  151.   HLCHARS          : HI_LITE_CHAR;
  152.   FKYS             : SPECIAL_KEYS;
  153.   INCHAR           : CHAR;
  154.   DONE,
  155.   FIRST_MENU,
  156.   FUNCKEY          : BOOLEAN;
  157.   MENU_POINTER,
  158.   MENU_LEN,
  159.   MENU_LENGTH      : 1..20;
  160.   FILL_CHAR        : STRING[80];
  161.   LEGEND           : STRING[80];
  162.   SEC_KEY          : ARRAY[1..10] OF CHAR;
  163.   HL_CHAR_POS      : ARRAY[1..20] OF INTEGER;
  164.   FKEY             : ARRAY[1..10] OF ITEM_KEY;
  165.   COLORPAGE        : ARRAY[1..4096] OF CHAR ABSOLUTE $B800:0000;
  166.   SCREEN           : ARRAY[0..0] OF STUFFINHEAP;
  167.   X,Y,
  168.   LAST,
  169.   M_X,M_Y,
  170.   MAX_TITLE_LENGTH : INTEGER;
  171.  
  172. BEGIN {MENU}
  173.  
  174.   FUNCKEY          := FALSE;
  175.   MENU_POINTER     := 1;
  176.   MAX_TITLE_LENGTH := 0;
  177.  
  178.   NEW(SCREEN[0]);                             { ALLOCATE SCREEN IN HEAPSPACE }
  179.   MOVE(COLORPAGE,SCREEN[0]^.SCREENIMAGE,4096);  {   STORE CURRENT SCREEN     }
  180.  
  181.   CURSOR(OFF);                       { IF MENU CENTERED DISPLAY INSTRUCTIONS }
  182.   IF ((MENU_X = 0) AND (MENU_Y = 0)) THEN
  183.     BEGIN
  184.     GOTOXY(1,25);
  185.     TEXTCOLOR(LIGHTGRAY);
  186.     IF COLOR = 0 THEN TEXTBACKGROUND(BLUE)
  187.     ELSE RVSON;
  188.     WRITE(' ',#24,'-',#25,'-move bar. Select by pressing a highlighted letter,'
  189.           ,' a function key, or ',#17,#196,#217,' ');
  190.     IF COLOR = 0 THEN TEXTCOLOR(WHITE);
  191.     GOTOXY(37,25);
  192.     WRITE('highlighted');
  193.     GOTOXY(59,25);
  194.     WRITE('function key');
  195.     TEXTCOLOR(BLACK);
  196.     TEXTBACKGROUND(LIGHTGRAY);
  197.     GOTOXY(2,25);
  198.     WRITE(#24);
  199.     GOTOXY(4,25);
  200.     WRITE(#25);
  201.     GOTOXY(76,25);
  202.     WRITE(#17,#196,#217);
  203.     NORMVIDEO;
  204.   END;
  205.                                                  { CALCULATE MAX_TITLE_LENGTH }
  206.   REPEAT                                         {       AND MENU_LENGTH      }
  207.     MENU_LENGTH := MENU_POINTER;
  208.       IF MAX_TITLE_LENGTH < LENGTH(ITEM_LIST[MENU_POINTER]) THEN
  209.         MAX_TITLE_LENGTH := LENGTH(ITEM_LIST[MENU_POINTER]);
  210.     MENU_POINTER := MENU_POINTER + 1;
  211.   UNTIL (MENU_POINTER =20) OR (LENGTH(ITEM_LIST[MENU_POINTER]) = 0);
  212.  
  213.   IF MAX_TITLE_LENGTH < 9  THEN
  214.     MAX_TITLE_LENGTH := 17
  215.   ELSE
  216.     MAX_TITLE_LENGTH := MAX_TITLE_LENGTH + 8 ;
  217.  
  218.   MENU_LENGTH := MENU_POINTER - 1 ;
  219.  
  220.   IF MENU_LENGTH <= 10 THEN MENU_LEN := MENU_LENGTH
  221.   ELSE MENU_LEN := 12;
  222.  
  223.                                                  { CALCULATE AND FRAME WINDOW }
  224.   IF (ODD(MAX_TITLE_LENGTH)) AND FALSE  THEN
  225.     M_X := ((80 - MAX_TITLE_LENGTH) DIV 2)
  226.   ELSE
  227.     M_X := ((80 - MAX_TITLE_LENGTH) DIV 2) + 1 ;
  228.   IF (ODD(MENU_LEN)) AND FALSE  THEN
  229.     M_Y := ((25 - MENU_LEN) DIV 2) - 1
  230.   ELSE
  231.     M_Y := (25 - MENU_LEN) DIV 2;
  232.  
  233.   MENU_TITLE := COPY(MENU_TITLE,1,MAX_TITLE_LENGTH);  {  TRUNCATE TITLE THAT  }
  234.                                                       { EXCEEDS ALLOWED WIDTH }
  235.   IF ((MENU_X = 0) AND (MENU_Y = 0)) THEN
  236.     WINDOW_FRAME
  237.          (M_X,M_Y,(M_X + MAX_TITLE_LENGTH),(M_Y + MENU_LEN),COLOR,MENU_TITLE)
  238.   ELSE
  239.     BEGIN
  240.     IF MENU_X < 2 THEN MENU_X := 2 ;
  241.     IF MENU_X > (78-MAX_TITLE_LENGTH) THEN MENU_X := (78-MAX_TITLE_LENGTH);
  242.     IF MENU_Y < 2 THEN MENU_Y := 2 ;
  243.     IF MENU_Y > (24-MENU_LENGTH) THEN MENU_Y := (24-MENU_LENGTH);
  244.     WINDOW_FRAME (MENU_X,MENU_Y,MENU_X + MAX_TITLE_LENGTH,
  245.                            MENU_Y + MENU_LEN,COLOR,MENU_TITLE);
  246.     END;
  247.  
  248.  
  249.   INCHAR := ' ';                                         {INITIALIZE VARIABLES}
  250.   MENU_POINTER := 1;
  251.   HLCHARS := [];
  252.   FKYS := [];
  253.   DONE := FALSE;
  254.   FIRST_MENU := TRUE;
  255.  
  256.   FKEY[1]     := 'F1';
  257.   FKEY[2]     := 'F2';
  258.   FKEY[3]     := 'F3';
  259.   FKEY[4]     := 'F4';
  260.   FKEY[5]     := 'F5';
  261.   FKEY[6]     := 'F6';
  262.   FKEY[7]     := 'F7';
  263.   FKEY[8]     := 'F8';
  264.   FKEY[9]     := 'F9';
  265.   FKEY[10]    := 'F10';
  266.  
  267.   SEC_KEY[1]  := #59;
  268.   SEC_KEY[2]  := #60;
  269.   SEC_KEY[3]  := #61;
  270.   SEC_KEY[4]  := #62;
  271.   SEC_KEY[5]  := #63;
  272.   SEC_KEY[6]  := #64;
  273.   SEC_KEY[7]  := #65;
  274.   SEC_KEY[8]  := #66;
  275.   SEC_KEY[9]  := #67;
  276.   SEC_KEY[10] := #68;
  277.  
  278.  
  279.  
  280. {///////////////////////////// BEGIN MAIN LOOP ///////////////////////////////}
  281.  
  282.   REPEAT
  283.  
  284.     IF FIRST_MENU THEN
  285.       BEGIN
  286.       X :=  1 ;
  287.       Y := 10
  288.       END
  289.     ELSE
  290.       BEGIN
  291.       X := 11 ;
  292.       Y := 20 ;
  293.       END;
  294.                                            {DISPLAY THE ACTUAL MENU SELECTIONS}
  295.  
  296.     WHILE ((MENU_POINTER >= X) AND (MENU_POINTER <= Y)
  297.                                AND (MENU_POINTER <= MENU_LENGTH)
  298.                                AND (NOT DONE))                      DO
  299.  
  300.     BEGIN
  301.       IF MENU_POINTER > 10 THEN GOTOXY(2,(MENU_POINTER - 9))
  302.       ELSE GOTOXY( 2, MENU_POINTER + 1 );
  303.       TEXTCOLOR(BLACK);
  304.       TEXTBACKGROUND(LIGHTGRAY);
  305.       IF MENU_POINTER <= 10 THEN
  306.         WRITE(FKEY[MENU_POINTER])
  307.       ELSE
  308.         WRITE(FKEY[MENU_POINTER - 10]);
  309.  
  310.       IF ((MENU_POINTER <= 10) AND (MENU_POINTER <= MENU_LENGTH ))  THEN
  311.         FKYS := FKYS + [SEC_KEY[MENU_POINTER]];
  312.       IF ((MENU_POINTER > 10) AND (MENU_POINTER <= MENU_LENGTH )) THEN
  313.         FKYS := FKYS + [SEC_KEY[MENU_POINTER - 10 ]];
  314.  
  315.       HLCHARS := HLCHARS + [HL_CHAR[MENU_POINTER]]
  316.                          + [CHR(ORD(HL_CHAR[MENU_POINTER]) + 32)];
  317.  
  318.       TEXTCOLOR(CYAN);
  319.       TEXTBACKGROUND(BLACK);
  320.       IF MENU_POINTER > 10 THEN GOTOXY(7,(MENU_POINTER - 9))
  321.       ELSE GOTOXY( 7 , MENU_POINTER + 1 );
  322.       WRITE(ITEM_LIST[MENU_POINTER]);
  323.       TEXTCOLOR(LIGHTCYAN);
  324.       HL_CHAR_POS[MENU_POINTER] :=
  325.                    POS(HL_CHAR[MENU_POINTER],ITEM_LIST[MENU_POINTER]);
  326.       IF MENU_POINTER > 10 THEN
  327.               GOTOXY( 6 + HL_CHAR_POS[MENU_POINTER],MENU_POINTER - 9 )
  328.       ELSE GOTOXY( 6 + HL_CHAR_POS[MENU_POINTER],MENU_POINTER + 1 );
  329.       WRITE(HL_CHAR[MENU_POINTER]);
  330.       MENU_POINTER := MENU_POINTER + 1;
  331.     END;  {WHILE}
  332.  
  333.                                                       {IF MORE THAN 10 OPTIONS}
  334.     IF MENU_LENGTH >10 THEN                           { PRINT NOTICE OF "MORE"}
  335.       BEGIN
  336.       LEGEND := CENTER(MAX_TITLE_LENGTH - 1,'more  spacebar');
  337.       RVSON;
  338.       GOTOXY(2,13);
  339.       WRITE(LEGEND);
  340.       GOTOXY((POS('e',LEGEND) + 2 ),13);
  341.       WRITE(#196,#16);
  342.       RVSOFF;
  343.       END;
  344.  
  345.  
  346.     IF NOT DONE THEN
  347.       BEGIN
  348.       IF ((DEFAULT < 1) OR (DEFAULT > MENU_LENGTH)) THEN DEFAULT := 1;
  349.       MENU_POINTER := DEFAULT;
  350.       END;
  351.     IF ((NOT FIRST_MENU) AND (NOT DONE)) THEN  MENU_POINTER := MENU_LENGTH ;
  352.     DONE := TRUE;
  353.     FUNCKEY := FALSE;
  354.  
  355.     IF COLOR = 0 THEN                                     {   HIGHLIGHT THE   }
  356.       BEGIN                                               { CURRENT MENU ITEM }
  357.       TEXTBACKGROUND(BLUE);
  358.       TEXTCOLOR(LIGHTGRAY);
  359.       END
  360.     ELSE RVSON;
  361.     IF MENU_POINTER > 10 THEN
  362.       FKEY[MENU_POINTER] := FKEY[MENU_POINTER - 10];
  363.     IF LENGTH(FKEY[MENU_POINTER]) <= 2  THEN
  364.       BEGIN
  365.       IF MENU_POINTER > 10 THEN
  366.         GOTOXY( 4 ,MENU_POINTER - 9 )
  367.       ELSE GOTOXY( 4 ,MENU_POINTER + 1 );
  368.       WRITE('   ');
  369.       END
  370.     ELSE
  371.       BEGIN
  372.       IF MENU_POINTER > 10 THEN
  373.         GOTOXY( 5 ,MENU_POINTER - 9 )
  374.       ELSE GOTOXY( 5 ,MENU_POINTER + 1 );
  375.       WRITE('  ');
  376.       END;
  377.     WRITE(ITEM_LIST[MENU_POINTER]);
  378.     FILL_CHAR := REPLICATE(((MAX_TITLE_LENGTH + 1 ) - WHEREX),' ');
  379.     WRITE(FILL_CHAR);
  380.     IF COLOR = 1 THEN TEXTBACKGROUND(BLACK);
  381.     TEXTCOLOR(WHITE);
  382.     IF MENU_POINTER > 10 THEN
  383.       GOTOXY( 6 + HL_CHAR_POS[MENU_POINTER],MENU_POINTER - 9 )
  384.     ELSE GOTOXY( 6 + HL_CHAR_POS[MENU_POINTER],MENU_POINTER + 1 );
  385.     WRITE(HL_CHAR[MENU_POINTER]);
  386.  
  387.     READ(KBD,INCHAR);                           {GET A CHARACTER FROM THE USER}
  388.  
  389.     LAST := MENU_POINTER;
  390.  
  391.     IF (INCHAR = ^[) AND KEYPRESSED  THEN            {IF FUNCTION KEY PRESSED }
  392.       BEGIN                                          {GET THE SECOND CHARACTER}
  393.       FUNCKEY := TRUE;
  394.       READ(KBD, INCHAR);
  395.       END;
  396.  
  397.     IF INCHAR = 'H' THEN                                     {UP ARROW PRESSED}
  398.       BEGIN
  399.       MENU_POINTER := MENU_POINTER - 1;
  400.       IF ((MENU_POINTER < 1) AND (FIRST_MENU)
  401.         AND (MENU_LENGTH <= 10)) THEN MENU_POINTER := MENU_LENGTH;
  402.       IF ((MENU_POINTER < 1) AND (FIRST_MENU)
  403.         AND (MENU_LENGTH > 10)) THEN MENU_POINTER := 10;
  404.       IF ((MENU_POINTER = 10) AND (NOT FIRST_MENU)
  405.         AND (MENU_LENGTH > 10 )) THEN MENU_POINTER := MENU_LENGTH;
  406.       END;  {IF}
  407.  
  408.     IF INCHAR = 'P' THEN                                   {DOWN ARROW PRESSED}
  409.       BEGIN                                               
  410.       MENU_POINTER := MENU_POINTER + 1;
  411.       IF ((MENU_POINTER > 10) AND (FIRST_MENU))
  412.          THEN MENU_POINTER := 1;
  413.       IF ((MENU_POINTER > MENU_LENGTH) AND (FIRST_MENU))
  414.          THEN MENU_POINTER := 1;
  415.       IF ((MENU_POINTER > 20) AND (NOT FIRST_MENU))
  416.          THEN MENU_POINTER := 11;
  417.       IF ((MENU_POINTER > MENU_LENGTH) AND (NOT FIRST_MENU))
  418.          THEN MENU_POINTER := 11;
  419.       END;  {IF}
  420.  
  421.  
  422.     IF COLOR = 0 THEN                           {UNHIGHLIGHT THE OLD SELECTION}
  423.       BEGIN
  424.       TEXTBACKGROUND(BLACK);
  425.       TEXTCOLOR(CYAN);
  426.       END
  427.     ELSE RVSOFF;
  428.     IF LENGTH(FKEY[LAST]) <= 2  THEN
  429.       BEGIN
  430.       IF MENU_POINTER > 10 THEN
  431.         GOTOXY( 4 ,LAST - 9 )
  432.       ELSE GOTOXY( 4 ,LAST + 1 );
  433.       WRITE('   ');
  434.       END
  435.     ELSE
  436.       BEGIN
  437.       IF MENU_POINTER > 10 THEN
  438.         GOTOXY( 5 ,LAST - 9 )
  439.       ELSE GOTOXY( 5 ,LAST + 1 );
  440.       WRITE('  ');
  441.       END;
  442.     WRITE(ITEM_LIST[LAST]);
  443.     FILL_CHAR := REPLICATE(((MAX_TITLE_LENGTH + 1 ) - WHEREX),' ');
  444.     WRITE(FILL_CHAR);
  445.     TEXTCOLOR(LIGHTCYAN);
  446.     IF MENU_POINTER > 10 THEN
  447.       GOTOXY( 6 + HL_CHAR_POS[LAST],LAST - 9 )
  448.     ELSE GOTOXY( 6 + HL_CHAR_POS[LAST],LAST + 1 );
  449.     WRITE(HL_CHAR[LAST]);
  450.  
  451.     IF ((INCHAR = #32) AND (MENU_LENGTH > 10)               {SPACEBAR PRESSED }
  452.                        AND (MENU_POINTER <= 10))  THEN      {GO TO SECOND MENU}
  453.       BEGIN
  454.       MENU_POINTER := 11;
  455.       FIRST_MENU := FALSE;
  456.       DONE := FALSE;
  457.       FKYS := [];
  458.       HLCHARS := [];
  459.       INCHAR := '0';
  460.       CLRSCR;
  461.       END;
  462.  
  463.     IF ((INCHAR = #32) AND (MENU_LENGTH > 10)                {SPACEBAR PRESSED}
  464.                        AND (MENU_POINTER >= 11))  THEN       {GO TO FIRST MENU}
  465.       BEGIN
  466.       MENU_POINTER := 1;
  467.       FIRST_MENU := TRUE;
  468.       DONE := FALSE;
  469.       FKYS := [];
  470.       HLCHARS := [];
  471.       CLRSCR;
  472.       END;
  473.  
  474.     MENU := MENU_POINTER;
  475.  
  476.   UNTIL ((INCHAR = #13)
  477.         OR ((NOT FUNCKEY) AND (INCHAR IN HLCHARS))
  478.         OR ((FUNCKEY) AND (INCHAR IN FKYS)));
  479.  
  480. {////////////////////////////// END MAIN LOOP ////////////////////////////////}
  481.  
  482.  
  483.   MENU_POINTER := 1;
  484.  
  485.   WHILE (MENU_POINTER <= MENU_LENGTH) AND (MENU_POINTER <= 10)
  486.                       AND ((NOT FUNCKEY)
  487.                       AND FIRST_MENU
  488.                       AND (INCHAR <> HL_CHAR[MENU_POINTER])
  489.                       AND (INCHAR <> (CHR(ORD(HL_CHAR[MENU_POINTER]) + 32))))
  490.                       DO MENU_POINTER := MENU_POINTER + 1;
  491.  
  492.   IF ((INCHAR = HL_CHAR[MENU_POINTER]) OR
  493.                (INCHAR = (CHR(ORD(HL_CHAR[MENU_POINTER]) + 32))))
  494.                THEN MENU := MENU_POINTER;
  495.  
  496.   MENU_POINTER := 11;
  497.  
  498.   WHILE (MENU_POINTER <= MENU_LENGTH) AND (MENU_POINTER > 10)
  499.                       AND ((NOT FUNCKEY)
  500.                       AND (NOT FIRST_MENU)
  501.                       AND (INCHAR <> HL_CHAR[MENU_POINTER])
  502.                       AND (INCHAR <> (CHR(ORD(HL_CHAR[MENU_POINTER]) + 32))))
  503.                       DO MENU_POINTER := MENU_POINTER + 1;
  504.  
  505.   IF ((INCHAR = HL_CHAR[MENU_POINTER]) OR
  506.                (INCHAR = (CHR(ORD(HL_CHAR[MENU_POINTER]) + 32))))
  507.                THEN MENU := MENU_POINTER;
  508.  
  509.   MENU_POINTER := 1;
  510.  
  511.   WHILE (MENU_POINTER <= MENU_LENGTH) AND ( FUNCKEY
  512.                              AND (INCHAR <> SEC_KEY[MENU_POINTER])) DO
  513.     MENU_POINTER := MENU_POINTER + 1;
  514.  
  515.   IF ((INCHAR = SEC_KEY[MENU_POINTER]) AND FIRST_MENU)
  516.     THEN MENU := MENU_POINTER;
  517.   IF ((INCHAR = SEC_KEY[MENU_POINTER]) AND NOT FIRST_MENU)
  518.     THEN MENU := MENU_POINTER + 10;
  519.  
  520.   MOVE(SCREEN[0]^.SCREENIMAGE,COLORPAGE,4096);         {RESTORE ORIGINAL SCREEN}
  521.  
  522.   WINDOW(1,1,80,25);                              {RESET FULL SCREEN AS WINDOW}
  523.  
  524.   RVSOFF;
  525.   CURSOR(ON);
  526.  
  527. END; {MENU}
  528.  
  529.  
  530.  
  531.