home *** CD-ROM | disk | FTP | other *** search
/ Boston 2 / boston-2.iso / DOS / PROGRAM / BASIC / POWBASIC / LIBRARY4 / APLIB.ZIP / MENUS-U.BAS < prev    next >
BASIC Source File  |  1990-09-16  |  19KB  |  577 lines

  1.  
  2. '==============================================================================
  3. '                     THE NEW IMPROVED MENUS-U.BAS
  4. '==============================================================================
  5. '                                                               -- 2-18-90
  6.                             $COMPILE UNIT
  7.                             $ERROR ALL OFF
  8.  
  9.  
  10.  DEFINT A-Z
  11.  
  12.  EXTERNAL RD$, VideoSeg&, ColorDisplay, NeedDCon
  13.  EXTERNAL BoxColor, FldColor, WinColor, MenuColor, BarColor
  14.  EXTERNAL PressAKeyBeep$, OopsBeep$, TinyBeep$
  15.  EXTERNAL ButtonsActive, TimeOut
  16.  EXTERNAL BXScreenSaved, PMScreenSaved
  17.  EXTERNAL MenuHelpLine$()
  18.  EXTERNAL UseRArrow, UseLArrow, UsePgUp, UsePgDn, PullDown
  19.  
  20.  %False = 0
  21.  %True = NOT %False
  22.  %ButtonsDefined = 0
  23.  
  24.  %ResetRodent = 0 '        mouse routine and humor (??) courtesy of Barry Erick
  25.  %ReadRodent = 3
  26.  %LeftButton = 1
  27.  %RightButton = 2
  28.  %Wht = 15
  29.  %MouseVertSensit = 1 '                   controls mouse sensitivity in POPMENU
  30.  %MouseHorizSensit = 10 '                controls mouse sensitivity in POPMENU
  31.  %MouseIcon = 15 '              ... a little sun or bug character
  32.  
  33.  %MaxMenuWidth = 40
  34.  
  35. '  MENU RETURN CODES (KEY PRESSED.)
  36.       %CR = 0:    %Esc = &H20:          %F1 = &H100:           %F2 = &H200
  37.             %PgUp = &H400:              %PgDn = &H600
  38.             %RArrow = &H800:            %LArrow = &HA00
  39.  
  40.  
  41.  
  42.  DECLARE SUB Mouse (integer, integer, integer, integer)
  43.  
  44.  
  45. ' ----------------------------------------------------------------------------
  46.  
  47. SUB TOPMENU (Lines% ,Choice, TLine$) PUBLIC
  48.  
  49.  
  50.  LOCAL I$(), K$(), Choices%, D$, LEach, L, SpacesLeftOver, I%, B$, Att,_
  51.   Choice$, Click, Ln, Col, RefTime&
  52.  
  53.  STATIC mcsrX, mcsrY
  54.  IF %ButtonsDefined THEN ButtonActive = %False
  55.  
  56. TReadlines:
  57.  DIM I$(6): DIM K$(6)
  58.  Choices% = 0
  59.  
  60.  READ D$
  61.  
  62.  DO WHILE D$ <> "END"
  63.    INCR Choices%
  64.    I$(Choices%) = D$
  65.    K$(Choices%) = LEFT$(D$,1)
  66.    READ D$
  67.  LOOP
  68.  
  69.  
  70.  LOCATE ,,0
  71.  
  72.  
  73. TSetVars:
  74.  IF Choice = 0 THEN Choice = 1
  75.  LEach = 80\Choices%
  76.  SpacesLeftOver = 80 - Choices% * LEach
  77.  
  78.  FOR I% = 1 TO Choices% '                      create menu elements
  79.   B$ = I$(I%)
  80.   L = ((LEach - LEN(B$))/2) + 1: IF L<2 THEN L=2 '               fixed 12-88
  81.   I$(I%) = SPACE$(LEach)
  82.   MID$ (I$(I%), L) = B$
  83.   IF SpacesLeftOver THEN I$(I%) = I$(I%)+" ": DECR SpacesLeftOver
  84.  NEXT I%
  85. '                                      making their total length = 80 chrs
  86.  COLOR MenuColor MOD 16, MenuColor \ 16
  87.  LOCATE 25,1: PRINT "CHOOSE MAIN PROGRAM FUNCTION FROM TOP ROW.";
  88.                PRINT " USE ARROWS TO SELECT THEN PRESS [CR]";
  89.  DEF SEG = VideoSeg&
  90.  POKE 3998, ASC("."): POKE 3999,PEEK (3997)
  91.  DEF SEG '                                  menu borders & help line printed
  92.  
  93.  LOCATE 1,1
  94.  IF Lines% > 2 THEN PRINT STRING$ (80, 205)
  95.  IF TLine$ <> "" THEN LOCATE 1, (40 - LEN(TLine$)\2): PRINT TLine$;
  96. TDisp:
  97.  Att = 16
  98.  GOSUB TPrint '                                     print menu elements
  99.  COLOR MenuColor MOD 16, MenuColor \ 16
  100.  IF Lines% > 1 THEN LOCATE 3,1:PRINT STRING$ (80, 205)
  101.  
  102. TGetChoice:
  103.  IF NeedDCon THEN
  104.    Cheese = 0
  105.    Choice$ = ""
  106.    DEF SEG = VideoSeg&
  107.    StoredChr = PEEK (Addr): StoredAttr = PEEK (Addr+1)
  108.    DO
  109.      CALL Mouse (%ReadRodent, Click, mcsrX, mcsrY)
  110.  
  111.      IF Addr <> mcsrX/4 + 160*INT(mcsrY/8) THEN
  112.        POKE Addr, StoredChr
  113.        POKE Addr+1, StoredAttr
  114.        Addr = mcsrX/4 + 160*INT(mcsrY/8)
  115.        StoredChr = PEEK (Addr)
  116.        StoredAttr = PEEK (Addr+1)
  117.        POKE Addr, %MouseIcon '                         move the mouse cursor if nec.
  118.        POKE Addr+1, %Wht OR PEEK (Addr+1)
  119.      END IF
  120.  
  121.      IF (Click = %LeftButton) AND (mcsrY < 60) THEN '   you clicked on top bar:
  122.        Choice = INT (mcsrX * Choices% / 640) + 1  '       so move cursor ...
  123.        Att = 16
  124.        GOSUB TPrint '                                  &  reprint menu elements
  125.        IF mcsrY > 0 AND mcsrY < 30 THEN
  126.          Choice$ = CHR$(13)
  127.          POKE Addr, StoredChr
  128.          POKE Addr+1, StoredAttr
  129.          EXIT LOOP
  130.        END IF
  131.      END IF
  132.  
  133.    IF ButtonsDefined THEN                        ' ---------------------------|
  134.      IF Click AND mcsrY > 112 THEN
  135.        Ln = mcsrY / 8 + 1 '                    8 mickeys per line
  136.        Col = mcsrX / 8 + 1 '                     8 mickeys per column
  137.        IF Ln > 18 AND Ln < 25 THEN
  138.          IF Col > 8 AND Col < 23 THEN ButtonActive = %DirButton: EXIT LOOP
  139.          IF Col > 30 AND Col < 44 THEN ButtonActive = %TreeButton: EXIT LOOP
  140.        END IF
  141.        IF (Ln > 14 AND Ln < 18) AND (Col > 68 AND Col < 75) THEN _
  142.                                          ButtonActive = %HelpButton: EXIT LOOP
  143.      END IF
  144.  
  145.    END IF                                 ' ----------------------------------|
  146.  
  147.      IF TimeOut AND (TIMER > RefTime& + TimeOut) THEN
  148.        TimeUp = %True
  149.        EXIT LOOP
  150.      END IF
  151.  
  152.    LOOP UNTIL INSTAT
  153. '   LPRINT "ButtonActive ="; ButtonActive
  154.    IF Choice$ = "" THEN Choice$ = INKEY$
  155.    DEF SEG
  156.  
  157.  ELSE
  158.  
  159.    DO
  160.      IF TimeOut AND (TIMER > RefTime& + TimeOut) THEN
  161.        TimeUp = %True
  162.        EXIT LOOP
  163.      END IF
  164.    LOOP UNTIL INSTAT
  165.  
  166. '                                                         ****************
  167.    Choice$ = INKEY$ '                                   ** GET KEYSTROKE **
  168. '                                                         ****************
  169.  END IF
  170.  
  171.  IF TimeUp OR ButtonActive THEN BEEP:BEEP: Choice = 1 : GOTO TDone
  172.  
  173.  IF LEN(Choice$) > 1 THEN '                        you pressed an arrow key ...
  174.    SELECT CASE RIGHT$(Choice$,1)
  175.      CASE CHR$(&H4D)
  176.        GOSUB TRightArrow
  177.      CASE CHR$(&H4B)
  178.        GOSUB TLeftArrow
  179.      CASE CHR$(&H50)
  180.        Choice$ = CHR$(13)
  181.      CASE CHR$(59)
  182.        TLine$ = "HELP!"
  183.        GOTO TDone
  184.      CASE ELSE
  185.        GOTO TError
  186.    END SELECT
  187.  END IF
  188.  
  189.  IF Choice$ = CHR$(13) THEN Choice$ = K$(Choice): GOTO TDone
  190.  IF Choice$ = CHR$(27) THEN Choice = Choices%: GOTO TDone
  191.  Choice$ = UCASE$(Choice$)
  192.  FOR I = 1 TO Choices%
  193.    IF Choice$ = K$(I) THEN Choice = I:GOTO TDone
  194.  NEXT
  195.  GOTO TError
  196.  
  197. TError:
  198.  
  199.  PLAY OopsBeep$
  200.  GOTO TGetChoice
  201.  
  202. TLeftArrow:
  203.    DECR Choice
  204.    IF Choice < 1 THEN Choice = Choices%
  205.    RETURN TDisp
  206.  
  207. TRightArrow:
  208.    INCR Choice
  209.    IF Choice > Choices% THEN Choice = 1
  210.    RETURN TDisp
  211.  
  212. TDone:
  213.   Att = 0: GOSUB TPrint
  214.   TLine$ = RTRIM$ (LTRIM$ (I$ (Choice)))
  215.   LOCATE ,,1
  216.   EXIT SUB
  217.  
  218. TPrint:
  219.  LOCATE Lines%-1,1
  220. '                          IF Choice < 1 OR Choice > Choices% THEN Choice = 1
  221.  FOR I% = 1 TO Choices%
  222.    IF I% = Choice THEN
  223.      COLOR Att + (BarColor MOD 16), BarColor \ 16
  224.    ELSE
  225.      COLOR MenuColor MOD 16, MenuColor \ 16
  226.    END IF
  227.    PRINT I$(I%);
  228.  NEXT
  229.  RETURN
  230.  
  231.  END SUB                                                    REM TOPMENU
  232.  
  233. ' ==============================================================================
  234.  
  235. SUB POPMENU (TopKey$,MenuRight,MenuDown,Choice,MLine$,MCode$) PUBLIC
  236. '   ====
  237.  
  238.  LOCAL Choices%, D$,A$, Maxx, Title$, MKeyPressed$, PopRead$ ()
  239.  DIM DYNAMIC PopRead$ (24)
  240.  
  241.  
  242. MReadlines:
  243.  
  244.  Choices% = 0: A$ = ""
  245.  
  246.  READ D$ '                   read 2 $'s- the menu line & the assoc. memo
  247.  
  248.  DO WHILE D$ <> "END" AND A$ <> "END" '                     (from data list)
  249.    READ A$
  250.    IF Choices% < 24 THEN INCR Choices% '                          count 1 item
  251.    PopRead$(Choices%) = D$
  252.    IF TopKey$ <> "" THEN PopRead$(Choices%) = "  " + PopRead$(Choices%)
  253.    MenuHelpLine$(Choices%) = A$                          '     plug arrays --
  254.    READ D$ '                                                 ... longest $ is
  255.  LOOP
  256.  PopRead$ (Choices% + 1) = "END"
  257.  
  258.  Title$ = MLine$
  259.  
  260.        CALL SUPERMENU (PopRead$ (), MenuRight, MenuDown, Choice, Title$, Ky%)
  261.  
  262.  MCode$ = MenuHelpLine$(Choice)
  263.  MLine$ = PopRead$ (Choice)
  264.  ERASE PopRead$
  265.  
  266. END SUB                                                           REM POPMENU
  267. '______________________________________________________________________________
  268.  
  269. SUB SUPERMENU (MenuData$ (), MenuRight, MenuDown, Choice, Title$, Ky%) PUBLIC
  270. '   ====
  271. '
  272. '                               ===================
  273. '
  274. '     BRIEF SYNTAX:   MenuData$ () ARRAY holds items in menu
  275. '
  276. '          ferexample, MenuData$ (1) = "L LOAD" (pressing L will select)
  277. '                or ... MenuData$ (1) = "  LOAD" (pressing 1 will select)
  278. '
  279. '           After all menu lines are defined, the next array item must be "END"
  280. '
  281. '                     MenuRight may be >0 for right of center, <0 for left.
  282. '                     MenuDown = 0 places menu at screen top; >24 centers it.
  283. '
  284. '                     Choice is usually set as 1 before calling menu
  285. '
  286. '                     Title$ is just a menu title
  287. '
  288. '
  289. '
  290. '*** AFTER SUPERMENU CALL: Choice will hold the choice # (according to array passed)
  291. '
  292. '                     Ky% will encode the key used to exit the menu process --
  293. '                       %CR, %Esc, %PgUp, %PgDn, %RArrow, %LArrow, %F1, %F2
  294. '
  295. '        (PgUp key will only function if the global var UsePgUp = %Yes, and
  296. '         similarly for the others. If there is another page, cursoring or
  297. '         mousing past the bottom of the displayed page will simulate
  298. '         pressing PgDn, etc. All these globals are reset to %False after exit,
  299. '         but UseF1 isn't.
  300. '
  301.  
  302.  
  303.  
  304.  LOCAL Choices%, D$, A$, K$(), Longest, HelpLines, TopKey
  305.  LOCAL Wid, Height, K$, CornerLin, CornerCol, N, C
  306.  DIM K$ (24)
  307.  Ky% = 0
  308.  
  309.  
  310. '      ======= START; GET WIDTH OF ITEMS AND HOW MANY ===============
  311.  
  312.  LOCATE ,,0
  313.  ArrayNum = 1
  314.  DO UNTIL UCASE$ (RTRIM$ (LTRIM$ (MenuData$(ArrayNum) ))) =  "END"
  315.    INCR Choices%
  316.    IF LEN (RTRIM$ (MenuData$(ArrayNum))) > Longest THEN_
  317.                       Longest = LEN (RTRIM$ (MenuData$(ArrayNum)))
  318.      'keep track of how long the items are ...
  319.    K$ (ArrayNum) = LEFT$ (MenuData$ (ArrayNum), 1)
  320.    IF MenuHelpLine$ (ArrayNum) <> "" THEN INCR HelpLines
  321.    INCR ArrayNum
  322.  LOOP
  323.  DECR Longest, 2  '          clip off the 2 chrs which are not part of the item
  324.  
  325. '      ==================== DO CALCULATIONS FOR MENU ===========================
  326.  
  327. MSetVars:
  328.  
  329.  VCentered = (MenuDown > 23) '                           trap hi MenuDown value
  330.  Wid = Longest + 6  '                                       compute box size --
  331.  Height = Choices%+2
  332.  MenuDown = MAX% (0, MenuDown)
  333.  MenuDown = MIN% ((23-Choices%), MenuDown)
  334.  MenuRight = MIN% ((40 - Wid\2), MenuRight)
  335.  MenuRight = MAX% (-39, MenuRight)
  336.  CornerCol = INT((80-Wid)/2 + MenuRight)'            & the top left corner --
  337.  CornerCol = MAX% (1, CornerCol)
  338.  CornerLin = INT(1 + MenuDown)
  339.  CornerLin = MAX% (1, CornerLin)
  340.  IF VCentered THEN CornerLin = (24-Height)/2 + 1 '  trap hi MenuDown value
  341.  IF TopKey$ <> "" THEN TopKey = ASC(TopKey$)'         (means center vertically)
  342.  BAR$ = "\"+SPACE$(Wid-8)+"\"
  343.  Choice = MAX% (1, Choice)
  344.  Choice = MIN% (Choices% , Choice)
  345.  IF LEFT$ (MenuData$ (1), 1) = " " THEN
  346.    IF Choices% > 10 THEN TopKey = ASCII ("A") ELSE TopKey = ASCII ("1")
  347.  END IF
  348.  
  349. MPrint:
  350.  
  351.  L0 = CSRLIN: C0 = POS
  352.  COLOR MenuColor MOD 16, MenuColor \ 16
  353.  
  354. '      =================== BEGIN PRINTING MENU =====================
  355.  
  356.  LOCATE CornerLin,CornerCol: PRINT CHR$(201); STRING$((Wid-1),205); CHR$(187)
  357.  IF MLine$ <> "" THEN LOCATE CornerLin,CornerCol+2: PRINT " ";MLine$;" "
  358. '                                                top of menu frame is complete
  359.  
  360.  '                                                             print menu lines
  361.  FOR N = 1 TO Choices%
  362.    IF TopKey > 0 THEN K$ (N) = CHR$(TopKey-1+N)
  363.    LOCATE N+CornerLin, CornerCol
  364.    PRINT CHR$(186); " "; K$(N); " - ";
  365.    PRINT USING BAR$; MID$(MenuData$(N),3); : PRINT CHR$(186);
  366.  NEXT
  367.  '                                                             print bottom bar
  368.  LOCATE N+CornerLin,CornerCol:PRINT CHR$(200); STRING$((Wid-1),205); CHR$(188);
  369.  
  370.  IF PullDown THEN '                                  hold here if clicking ...
  371.    Click = %False
  372.    DO
  373.      IF NeedDCon THEN CALL Mouse (%ReadRodent, Click, X, Y)
  374.      IF Y0 = 0 THEN Y0 = Y
  375.      IF Click THEN
  376.        IF Y - Y0 > %MouseVertSensit THEN
  377.          MouseNotMoved = %False '                     unless mouse moved down.
  378.          EXIT LOOP
  379.        ELSE
  380.          MouseNotMoved = %True
  381.        END IF
  382.      END IF
  383.    LOOP WHILE Click
  384.    IF MouseNotMoved THEN Choice = 0: GOTO ExitMenu
  385.  END IF
  386.  
  387.  GOSUB DrawHighlightedBar
  388.  
  389. MGetChoice:
  390.  DO '                                         ********************************
  391.    Click = %False '                          ** GET KEYSTROKE OR MOUSE INPUT **
  392.    WasClick = %False '                        ********************************
  393.    Choice$ = ""
  394.    DO
  395.      IF NeedDCon THEN
  396.        CALL Mouse (%ReadRodent, Click, X, Y)
  397.        IF Click THEN
  398.          IF Click >= %RightButton THEN
  399.            Choice$ = CHR$(27)
  400.            EXIT LOOP
  401.          END IF
  402.          IF WasClick THEN
  403.            IF X - X0 > %MouseHorizSensit THEN
  404.              Choice$ = CHR$(0) + CHR$ (&H4D)
  405.            ELSEIF X0 - X > %MouseHorizSensit THEN
  406.              Choice$ = CHR$(0) + CHR$ (&H4B)
  407.            ELSEIF Y - Y0 > %MouseVertSensit THEN
  408.              Choice$ = CHR$(0) + CHR$ (&H50)
  409.            ELSEIF Y0 - Y > %MouseVertSensit THEN
  410.              Choice$ = CHR$(0) + CHR$ (&H48)
  411.            END IF
  412.          END IF
  413.          X0 = X: Y0 = Y: WasClick = Click
  414.        ELSE
  415.          IF WasClick THEN
  416.            Choice$ = CHR$(13)
  417.            FOR I = 1 TO 5 '                            this builds in a slight
  418.              DELAY .05 '                               delay (1/4 sec.) after
  419.              CALL Mouse (%ReadRodent, Click, X, Y) '   mouse button is released
  420.              IF Click >= %RightButton THEN '           during which the right
  421.                Choice$ = CHR$(27) '                    (cancel) button can be
  422.                EXIT FOR '                              pressed if you change
  423.              END IF '                                  your mind.
  424.            NEXT
  425.          ELSE
  426.            Choice$ = UCASE$(INKEY$)
  427.          END IF
  428.        END IF
  429.      ELSE
  430.        Choice$ = UCASE$(INKEY$)
  431.      END IF
  432.      OldChoice = Choice
  433.    LOOP UNTIL Choice$ <> ""
  434.  
  435.  '                  ======================== CHOICE HAS BEEN MADE ...
  436.  
  437.    SELECT CASE Choice$
  438.          CASE CHR$ (0 ) + CHR$(&H48 )
  439.            GOSUB MUpArrow
  440.          CASE CHR$ (0 ) + CHR$(&H50 )
  441.            GOSUB MDownArrow
  442.          CASE CHR$ (0 ) + CHR$(&H4B )
  443.            IF UseLArrow THEN GOSUB MLArrow
  444.          CASE CHR$ (0 ) + CHR$(&H4D )
  445.            IF UseRArrow THEN GOSUB MRArrow
  446.          CASE CHR$ (0 ) + CHR$(&H3B )
  447.            GOSUB MF1Key
  448. '    deleted       CASE CHR$ (0 ) + CHR$(&H3C )
  449. '    deleted         GOSUB MF2Key
  450.          CASE CHR$ (0 ) + CHR$(&H49 )
  451.            IF UsePgUp THEN GOSUB MPgUpKey
  452.          CASE CHR$ (0 ) + CHR$(&H51 )
  453.            IF UsePgDn THEN GOSUB MPgDnKey
  454.          CASE CHR$(13)
  455.             Choice$ = K$(Choice) '                    you pressed [CR]
  456.  
  457.          CASE CHR$(27)'     you pressed [ESC]. Sets return var as 0 and exits.
  458. '                           First erase the highlighted bar by rewriting it ...
  459.             COLOR MenuColor MOD 16, MenuColor \ 16
  460.             LOCATE (Choice+CornerLin),(CornerCol+1)
  461.             PRINT " ";K$(Choice);" - ";
  462.             PRINT USING BAR$;MID$(MenuData$(Choice),3);
  463.             Choice = 0
  464.             Ky% = %Esc
  465.             EXIT LOOP ' --------------------------------------------------------
  466.    END SELECT
  467.  
  468. '                                                              & chose Choice$
  469. '                Your entry is checked vs. list of K$'s,  If it's valid
  470. '                                             then Choice is set appropriately.
  471.      FOR I = 1 TO Choices%
  472.        IF Choice$ = K$(I) THEN Choice = I: EXIT LOOP
  473.      NEXT
  474.  
  475.  LOOP
  476.  
  477. ExitMenu:
  478.  IF Choice > 0 THEN GOSUB MoveBar
  479.  MenuDown = 0: MenuRight = 0
  480.  UsePgUp = 0: UsePgDn = 0: UseRArrow = 0: UseLArrow = 0: PullDown = 0
  481.  FOR N = 1 TO Choices%: MenuHelpLine$(N) = "": NEXT
  482.  LOCATE L0,C0,1
  483.  EXIT SUB
  484.  
  485.  
  486.  
  487. MoveBar:
  488.    COLOR MenuColor MOD 16, MenuColor \ 16 '                 NOTE: THIS IS ONE
  489.    LOCATE (OldChoice+CornerLin),(CornerCol+1) '             OF THOSE DREADED
  490.    PRINT " ";K$(OldChoice);" - "; '                         TWO-HEADED SUB-
  491.    PRINT USING BAR$;MID$(MenuData$(OldChoice),3); '         ROUTINES. MoveBar
  492. '                                                           RUNS RIGHT INTO
  493. DrawHighlightedBar: '                                       DrawHighLightedBar!
  494.    COLOR BarColor MOD 16, BarColor \ 16 '                   (works just Fine!)
  495.    LOCATE (Choice + CornerLin),(CornerCol+1)
  496.    PRINT " ";K$(Choice);" - ";
  497.    PRINT USING BAR$;MID$(MenuData$(Choice),3);
  498.                                            ''  print bottom line on screen
  499.    IF HelpLines THEN GOSUB MClearLine
  500.    IF LEN(MenuHelpLine$(Choice)) > 9 THEN
  501.        MenuHelpLine$(Choice) = Left$(MenuHelpLine$(Choice), 78)  ' trap long ln
  502.        COLOR MenuColor MOD 16, BarColor \ 16
  503.        LOCATE 25, (41-LEN(MenuHelpLine$(Choice))/2)
  504.        PRINT MenuHelpLine$(Choice);
  505.    END IF
  506.    RETURN
  507.  
  508. MUpArrow:
  509.    DECR Choice
  510.    IF Choice < 1 THEN
  511.      IF PullDown THEN
  512.         '                                   an up-arrow when the bar is at
  513.        Choice = 0 '                           the top will clear the menu
  514.        RETURN ExitMenu
  515.      ELSEIF UsePgUp THEN
  516.        Ky% = %PgUp
  517.        RETURN ExitMenu
  518.      ELSE
  519.        Choice = Choices%
  520.      END IF
  521.    END IF
  522.    GOSUB MoveBar: RETURN
  523.  
  524. MDownArrow:
  525.    INCR Choice
  526.    IF Choice > Choices% THEN
  527.      IF PullDown THEN
  528.        DECR Choice
  529.      ELSEIF UsePgDn THEN
  530. '                             erase the highlighted bar by rewriting it ...
  531.        COLOR MenuColor MOD 16, MenuColor \ 16
  532.        DECR Choice
  533.        LOCATE (Choice + CornerLin), (CornerCol+1)
  534.        PRINT " "; K$ (Choice); " - ";
  535.        PRINT USING BAR$; MID$ (MenuData$ (Choice), 3);
  536.        Choice = 0
  537.        Ky% = %PgDn
  538.        RETURN ExitMenu
  539.      ELSE
  540.        Choice = 1
  541.      END IF
  542. '                               IF PullDown THEN DECR Choice ELSE Choice = 1
  543.    END IF
  544.    GOSUB MoveBar: RETURN
  545.  
  546. MF1Key:
  547.    Ky% = %F1
  548.    Choice = 0 '                  just as if ESC had been pressed
  549.    RETURN ExitMenu
  550.  
  551. MF2Key:
  552.    Ky% = %F2
  553.    RETURN ExitMenu
  554.  
  555. MPgUpKey:
  556.    Ky% = %PgUp
  557.    RETURN ExitMenu
  558.  
  559. MPgDnKey:
  560.    Ky% = %PgDn
  561.    RETURN ExitMenu
  562.  
  563. MRArrow:
  564.    Ky% = %RArrow
  565.    RETURN ExitMenu
  566.  
  567. MLArrow:
  568.    Ky% = %LArrow
  569.    RETURN ExitMenu
  570.  
  571. MClearLine:
  572.    LOCATE 25,1
  573.    PRINT STRING$ (80," ");
  574.    RETURN
  575.  
  576.  END SUB                                                         REM SUPERMENU
  577.