home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 607.lha / PopUpMenu_v4.3 / Source.LZH / Source / PopUpMenu.a < prev    next >
Text File  |  1992-01-05  |  84KB  |  3,136 lines

  1.            opt      l+,c+,d+,y+
  2.            opt      ow1+,ow2+,ow3+,ow4+,ow5+,ow6+
  3.  
  4.            INCDIR ":Pspråk/asm/include/"
  5.  
  6.            INCLUDE      "exec/types.i"
  7.            INCLUDE      "PopUpMenu.i"
  8.  
  9.            xref      @FixDown     * In overlay root
  10.            xref      @QueTimer     * In overlay root
  11.            xref      @Mystrlen     * In overlay root
  12.  
  13.            xref      _PopUpSemaphore
  14.  
  15.            xdef      @PopUpMenu
  16.  
  17.  
  18. VBORDERSIZE    EQU      4
  19. HBORDERSIZE    EQU      2
  20. OVERLAP        EQU      8
  21. POPUPMENUDONE  EQU      0
  22. NULL           EQU      0
  23. MENUNULL       EQU     -1
  24. ITEMWINDOW     EQU      0
  25. ITEMFILL       EQU      0
  26. WORD_MAX       EQU      $7fff
  27. WORD_MIN       EQU      $8000
  28.  
  29.            section      text,code
  30. **********************************************
  31. * PopUpMenu(InputSignals)   (A3)             *
  32. *                         *
  33. * Input:                     *
  34. *   InputSignals  - Inputhandler signals.    *
  35. * Output:                     *
  36. *   none                     *
  37. * Functions:                     *
  38. *   FindWindow, InitGlobals, OpenMenuWindow, *
  39. *   QueTimer, SelectItem, FinalSelect,         *
  40. *   SwapBits, FindWindow, RemoveBitMap,      *
  41. *   CloseItemWindow, TellWindow          *
  42. **********************************************
  43. @PopUpMenu:    MOVEM.L     D2-D7/A2-A3/A5-A6,-(SP)
  44.  
  45. * ------------ ObtainSemaphore(&PopUpSemaphore)
  46.            LEA     _PopUpSemaphore,A0
  47.            MOVEA.L     (A4),A6       * SysBase
  48.            JSR     _LVOObtainSemaphore(A6)
  49.  
  50. * ------------ Is Window still open ?
  51.            JSR     @FindWindow(PC)
  52.            TST.W     D0
  53.            BEQ.W     Abort
  54.  
  55. * ------------ Lock the screen.
  56.            MOVEA.L     _Screen(A4),A2
  57.            ADDA.W     #sc_LayerInfo,A2
  58.            MOVEA.L     A2,A0
  59.            MOVEA.L     _LayersBase(A4),A6
  60.            JSR     _LVOLockLayers(A6)
  61.  
  62. * ------------ Init the global variables
  63. * ------------ Menues = ActiveWindow->MenuStrip
  64.            MOVEA.L     _ActiveWindow(A4),A0
  65.            MOVE.L     wd_MenuStrip(A0),_Menues(A4)
  66.  
  67. * ------------ ActiveWindow->Flags |= MENUSTATE
  68.            BSET     #MENUSTATEBIT,wd_Flags+2(A0)
  69.  
  70. * ------------ ItemWindow.BitMapOk = FALSE
  71.            MOVEQ.L     #FALSE,D0
  72.            MOVE.W     D0,_ItemWindow+wwd_BitMapOk(A4)
  73.  
  74. * ------------ SubWindow.BitMapOk = FALSE
  75.            MOVE.W     D0,_SubWindow+wwd_BitMapOk(A4)
  76.  
  77. * ------------ MenuWindow.BitMapOk = FALSE
  78.            MOVE.W     D0,_MenuWindow+wwd_BitMapOk(A4)
  79.  
  80. * ------------ CurrentMenuNr = 0
  81.            MOVE.W     D0,_CurrentMenuNr(A4)
  82.  
  83. * ------------ MenuWindow.Current = NULL
  84.            MOVE.L     D0,_MenuWindow+wwd_Current(A4)
  85.  
  86. * ------------ ItemWindow.Current = NULL
  87.            MOVE.L     D0,_ItemWindow+wwd_Current(A4)
  88.  
  89. * ------------ SubWindow.Current = NULL
  90.            MOVE.L     D0,_SubWindow+wwd_Current(A4)
  91.  
  92. * ------------ ScreenType = (Screen->ViewPort.Modes & HIRES) == 0
  93.            MOVEA.L     _Screen(A4),A5
  94.            BTST     #7,sc_ViewPort+vp_Modes(A5)  ********************
  95.            BNE.B     1$
  96.            MOVEQ.L     #TRUE,D0
  97. 1$           MOVE.W     D0,_ScreenType(A4)
  98.  
  99. * ------------ InitRastPort(&Rp)
  100.            LEA     _Rp(A4),A1
  101.            MOVEA.L     _GfxBase(A4),A6
  102.            JSR     _LVOInitRastPort(A6)
  103.  
  104. * ------------ SetFont(&Rp,Screen->RastPort.Font)
  105.            LEA     _Rp(A4),A1
  106.            MOVEA.L     sc_RastPort+rp_Font(A5),A0
  107.            JSR     _LVOSetFont(A6)
  108.  
  109. * ------------ Rp.BitMap = &Screen->BitMap
  110.            ADDA.W     #sc_BitMap,A5
  111.            MOVE.L     A5,_Rp+rp_BitMap(A4)
  112.  
  113. * ------------ MenuFontSize = Rp.TxHeight + 2
  114.            MOVE.W     _Rp+rp_TxHeight(A4),D0
  115.            ADDQ.W     #2,D0
  116.            MOVE.W     D0,_MenuFontSize(A4)
  117.  
  118. * ------------ Any menues at all ?
  119.            TST.L     _Menues(A4)
  120.            BEQ.W     NoMenues
  121.  
  122. * ------------ Same menues as last time ?
  123.            MOVEQ.L     #0,D0
  124.            MOVEA.L     _ActiveWindow(A4),A0
  125.            CMPA.L     _LastWindow(A4),A0
  126.            BNE.B     OpenMenues
  127.  
  128. * ------------ Yes: Start at last menu selection.
  129.            MOVE.W     _LastSelectedNum(A4),D0
  130.            BEQ.B     OpenMenues
  131.            SUBQ.W     #1,D0
  132.            MULU.W     _MenuFontSize(A4),D0
  133.  
  134. * ------------ Open the menues.
  135. OpenMenues:    JSR     @OpenMenuWindow(PC)
  136.            TST.W     D0
  137.            BEQ.W     NoMenues
  138.  
  139. * ------------ MenuButtonSignals = MenuUpSig | MenuDownSig
  140.            MOVE.L     sd_MenuUpSig(A3),D6
  141.            OR.L     sd_MenuDownSig(A3),D6
  142.  
  143. * ------------ MouseMovedSignal = MouseMovedSig
  144.            MOVE.L     sd_MouseMovedSig(A3),D5
  145.  
  146. * ------------ ButtonSignals = MenuButtonSignals | SelectDownSig
  147.            MOVE.L     D6,D4
  148.            OR.L     sd_SelectDownSig(A3),D4
  149.  
  150. * ------------ Waiting = FALSE
  151.            MOVEQ.L     #FALSE,D3
  152.  
  153. * ------------ No selections done so far.
  154. * ------------ MenuNumber = LastSelected = MENUNULL;
  155.            MOVEQ.L     #MENUNULL,D7
  156.            MOVE.W     D7,_LastSelected(A4)
  157.  
  158. * ------------ Clear old timermessages and set mousemoved signal.
  159. * ------------ SetSignal(MouseMovedSignal,TimerSignal | MouseMovedSignal)
  160.            MOVE.L     D5,D0
  161.            MOVE.L     _TimerSignal(A4),D1
  162.            OR.L     D5,D1
  163.            MOVEA.L     (A4),A6       * SysBase
  164.            JSR     _LVOSetSignal(A6)
  165.  
  166. * ------------ Is the timer already running.
  167. * ------------ CheckIO(TimerReqBlock)
  168.            MOVEA.L     _TimerReqBlock(A4),A1
  169.            JSR     _LVOCheckIO(A6)
  170.            TST.L     D0
  171.            BNE.B     IOReady
  172.  
  173. * ------------ Yes: wait for the time.
  174. * ------------ WaitIO(TimerReqBlock)
  175.            MOVEA.L     _TimerReqBlock(A4),A1
  176.            JSR     _LVOWaitIO(A6)
  177.  
  178. * ------------ Remove the message.
  179.            MOVEA.L     _TimerPort(A4),A0
  180.            JSR     _LVOGetMsg(A6)
  181.  
  182. * ------------ Start up the timer.
  183. IOReady:       JSR     @QueTimer(PC)
  184.  
  185. * ------------ Main loop starts here.
  186. * ------------ SignalBits = Wait(MouseMovedSignal | ButtonSignals | TimerSignal)
  187. WaitNextSig:   MOVE.L     D5,D0
  188.            OR.L     D4,D0
  189.            OR.L     _TimerSignal(A4),D0
  190.            MOVEA.L     (A4),A6       * SysBase
  191.            JSR     _LVOWait(A6)
  192.            MOVE.L     D0,D2
  193.  
  194.            MOVEA.L     _Screen(A4),A0
  195. *********************************************
  196. * D0 = SignalBits      A2 = LayerInfo    *
  197. * D2 = SignalBits      A3 = InputSignals *
  198. * D3 = Waiting          A6 = ExecBase     *
  199. * D4 = ButtonSignals      A0 = Screen        *
  200. * D5 = MouseMovedSignal             *
  201. * D6 = MenuButtonSignal             *
  202. * D7 = MenuNumber                *
  203. *********************************************
  204. * ------------ Mouse moved or Button pressed ?
  205.            MOVE.L     D5,D1
  206.            OR.L     D4,D1
  207.            AND.L     D0,D1
  208.            BEQ.W     NoButton      * No
  209.  
  210. * ------------ Waiting = FALSE
  211.            MOVEQ.L     #FALSE,D3
  212.  
  213. * ------------ Clickmenues ?
  214.            BTST     #CLICKMENUES,_Options(A4)
  215.            BEQ.B     CheckMove     * No
  216.  
  217. * ------------ Select button pressed ?
  218.            MOVE.L     sd_SelectDownSig(A3),D1
  219.            AND.L     D1,D0
  220.            BEQ.B     CheckButtons  * No
  221.  
  222. * ------------ Clear select button signal.
  223.            EOR.L     D1,D2
  224.  
  225. * ------------ Do selection.
  226.            MOVE.W     sc_MouseX(A0),_MouseX(A4)
  227.            MOVE.W     sc_MouseY(A0),_MouseY(A4)
  228.  
  229. * ------------ SelectItem() == TRUE ?
  230.            JSR     @SelectItem(PC)
  231.            TST.W     D0
  232.            BEQ.B     CheckButtons  * No
  233.  
  234. * ------------ MenuNumber = LastSelected = FinalSelect()
  235.            JSR     @FinalSelect(PC)
  236.            MOVE.W     D0,D7
  237.            MOVE.W     D0,_LastSelected(A4)
  238.            BRA.W     NoMoreSel
  239.  
  240. * ------------ MouseX = Screen->MouseX
  241. * ------------ MouseY = Screen->MouseY
  242. CheckMove:     MOVE.W     sc_MouseX(A0),D0
  243.            MOVE.W     sc_MouseY(A0),D1
  244.            CMP.W     _MouseX(A4),D0
  245.            BNE.B     MouseMoved
  246.            CMP.W     _MouseY(A4),D1
  247.            BEQ.B     CheckButtons
  248.  
  249. MouseMoved:    MOVE.W     D0,_MouseX(A4)
  250.            MOVE.W     D1,_MouseY(A4)
  251.  
  252. * ------------ Select the item under the mousepointer.
  253.            JSR     @SelectItem(PC)
  254.  
  255. * ------------ Any button pressed ?
  256. CheckButtons:  MOVE.L     D2,D0
  257.            AND.L     D4,D0
  258.            BEQ.B     NoButton
  259.  
  260. * ------------ Find MENUPICK value for selected item.
  261.            JSR     @FinalSelect(PC)
  262.  
  263. * ------------ Something selected ?  (New 4.1)
  264.            CMPI.W     #MENUNULL,D0
  265.            BEQ.B     NotSelected
  266.  
  267.            MOVE.W     D4,-(SP)
  268.            MOVE.W     D0,D4
  269.  
  270.            MOVE.W     _LastSelected(A4),D1
  271. **********************************************
  272. * D0 = Selected        A2 = LayerInfo    *
  273. * D1 = LastSelected       A3 = InputSignals *
  274. * D2 = SignalBits       A6 = ExecBase     *
  275. * D3 = Waiting                     *
  276. * D4 = Selected                  *
  277. * D5 = MouseMovedSignal              *
  278. * D6 = MenuButtonSignal              *
  279. * D7 = MenuNumber                 *
  280. **********************************************
  281. * ------------ Same item selected as last time ?
  282.            CMP.W     D0,D1
  283.            BEQ.B     SameItem
  284.  
  285. * ------------ First selection ?
  286.            CMPI.W     #MENUNULL,D7
  287.            BNE.B     MultipSelect
  288.  
  289. * ------------ MenuNumber = Selected
  290.            MOVE.W     D4,D7
  291.            BRA.B     SelectionDone
  292.  
  293. * ------------ ItemAddress(Menues,LastSelected)->NextSelect = Selected
  294. MultipSelect:  MOVEQ.L     #0,D0
  295.            MOVE.W     D1,D0
  296.            MOVEA.L     _Menues(A4),A0
  297.            MOVEA.L     _IntuitionBase(A4),A6
  298.            JSR     _LVOItemAddress(A6)
  299.            MOVEA.L     D0,A0
  300.            MOVE.W     D4,mi_NextSelect(A0)
  301.  
  302. * ------------ LastSelected = Selected
  303. SelectionDone: MOVE.W     D4,_LastSelected(A4)
  304. SameItem:      MOVE.W     (SP)+,D4
  305.  
  306. * ------------ Selected with menubutton ?
  307. NotSelected:   MOVE.L     D2,D0
  308.            AND.L     D6,D0
  309.            BNE.W     NoMoreSel
  310.  
  311. ********************************************
  312. * D2 = SignalBits     A2 = LayerInfo    *
  313. * D3 = Waiting         A3 = InputSignals *
  314. * D4 = ButtonSignals               *
  315. * D5 = MouseMovedSignal            *
  316. * D6 = MenuButtonSignal            *
  317. * D7 = MenuNumber               *
  318. ********************************************
  319. * ------------ Timer ?
  320. NoButton:      MOVE.L     D2,D0
  321.            AND.L     _TimerSignal(A4),D0
  322.            BEQ.W     WaitNextSig
  323.  
  324. * ------------ Remove the message.
  325.            MOVEA.L     _TimerPort(A4),A0
  326.            MOVEA.L     (A4),A6       * SysBase
  327.            JSR     _LVOGetMsg(A6)
  328.  
  329. * ------------ 2 TimerSignals in a row ?
  330.            TST.W     D3
  331.            BEQ.B     NoLockUp
  332.  
  333. * ------------ The input.device has stopped.
  334. * ------------ Remove everything from the screen.
  335.            LEA     _SubWindow(A4),A0
  336.            JSR     @SwapBits(PC)
  337.            LEA     _ItemWindow(A4),A0
  338.            JSR     @SwapBits(PC)
  339.            LEA     _MenuWindow(A4),A0
  340.            JSR     @SwapBits(PC)
  341.  
  342. * ------------ Unlock the screen.
  343.            MOVEA.L     A2,A0
  344.            MOVEA.L     _LayersBase(A4),A6
  345.            JSR     _LVOUnlockLayers(A6)
  346.  
  347. * ------------ Wait for the input.device.
  348.            MOVE.L     D5,D0
  349.            MOVEA.L     (A4),A6       * SysBase
  350.            JSR     _LVOWait(A6)
  351.  
  352. * ------------ Is the window still open ?
  353.            JSR     @FindWindow(PC)
  354.            TST.W     D0
  355.            BNE.B     OKToLock
  356.  
  357. * ------------ No: the window is gone. Abort.
  358.            LEA     _SubWindow(A4),A0
  359.            JSR     @RemoveBitMap(PC)
  360.            LEA     _ItemWindow(A4),A0
  361.            JSR     @RemoveBitMap(PC)
  362.            LEA     _MenuWindow(A4),A0
  363.            JSR     @RemoveBitMap(PC)
  364.            BRA.B     Abort
  365.  
  366. * ------------ Lock the screen again.
  367. OKToLock:      MOVEA.L     A2,A0
  368.            MOVEA.L     _LayersBase(A4),A6
  369.            JSR     _LVOLockLayers(A6)
  370.  
  371. * ------------ Put everything back on the screen.
  372.            LEA     _MenuWindow(A4),A0
  373.            JSR     @SwapBits(PC)
  374.            LEA     _ItemWindow(A4),A0
  375.            JSR     @SwapBits(PC)
  376.            LEA     _SubWindow(A4),A0
  377.            JSR     @SwapBits(PC)
  378.  
  379. * ------------ Start a new timer.
  380. NoLockUp:      JSR     @QueTimer(PC)
  381.  
  382. * ------------ Waiting = !Waiting
  383.            NEG.W     D3           * 3.7
  384.            ADDQ.W     #1,D3           * 3.7
  385.            BRA.W     WaitNextSig
  386.  
  387. * ------------ Selections done.
  388. * ------------ Close all windows.
  389. NoMoreSel:     JSR     @CloseSubWindow(PC)
  390.            JSR     @CloseItemWindow(PC)
  391.            JSR     @CloseMenuWindow(PC)
  392.  
  393. * ------------ Remember the selection for next time.
  394. NoMenues:      MOVEA.L     _ActiveWindow(A4),A0
  395.            MOVE.L     A0,_LastWindow(A4)
  396.  
  397. * ------------ ActiveWindow->Flags &= ~MENUSTATE
  398.            BCLR     #MENUSTATEBIT,wd_Flags+2(A0)
  399.  
  400. * ------------ Unlock the screen.
  401.            MOVEA.L     A2,A0
  402.            MOVEA.L     _LayersBase(A4),A6
  403.            JSR     _LVOUnlockLayers(A6)
  404.  
  405. * ------------ Tell the window the good news (MENUPICK).
  406.            MOVEA.L     A3,A0
  407.            MOVE.L     D7,D0
  408.            JSR     @TellWindow(PC)
  409.  
  410. * ------------ ReleaseSemaphore(&PopUpSemaphore);
  411. Abort:           LEA     _PopUpSemaphore,A0
  412.            MOVEA.L     (A4),A6       * SysBase
  413.            JSR     _LVOReleaseSemaphore(A6)
  414.  
  415. * ------------ FixDown(InputSignals)
  416.            MOVEA.L     A3,A0
  417.            JSR     @FixDown(PC)
  418.  
  419. * ------------ Free the sorted menulist      * New 3.42
  420.            LEA     _SortRemember(A4),A0
  421.            MOVEQ.L     #TRUE,D0
  422.            MOVEA.L     _IntuitionBase(A4),A6
  423.            JSR     _LVOFreeRemember(A6)
  424.  
  425.            MOVEM.L     (SP)+,D2-D7/A2-A3/A5-A6
  426.            RTS
  427.  
  428. ************************************************
  429. * FindMenuPtr(Number) - Find Menu structure.   *
  430. *                           *
  431. * Input:                       *
  432. *   Number.W - Number of the menu to look for. *
  433. * Output:                       *
  434. *   return - Ptr to the Menu structure.        *
  435. ************************************************
  436. @FindMenuPtr:    MOVEA.L   _MenuSorted+ms_Next(A4),A0
  437.  
  438. 1$        SUBQ.W      #1,D0
  439.         BEQ.B      2$
  440.  
  441.         MOVEA.L   (A0),A0     * ms_Next
  442.         MOVE.L      A0,D1
  443.         BNE.B      1$
  444.         MOVEQ.L   #NULL,D0
  445.         RTS
  446.  
  447. 2$        MOVE.L      ms_MenuPtr(A0),D0
  448.         RTS
  449.  
  450. ************************************************
  451. * FindItemNr(Item,ItemList) - Find nr of item. *
  452. *                           *
  453. * Input:                       *
  454. *   Item - Item to look for.               *
  455. *   ItemList - all items on same level.        *
  456. * Output:                       *
  457. *   return - Nr of Item.               *
  458. ************************************************
  459. * ------------ Count = 0
  460. @FindItemNr:   MOVEQ.L     #0,D0
  461.  
  462. * ------------ ItemList == NULL ?
  463. 1$           MOVE.L     A1,D1
  464.            BEQ.B     2$
  465.  
  466. * ------------ ItemList == Item ?
  467.            CMPA.L     A0,A1
  468.            BEQ.B     3$
  469.  
  470. * ------------ Count++
  471.            ADDQ.W     #1,D0
  472.  
  473. * ------------ ItemList = ItemList->NextItem
  474.            MOVEA.L     (A1),A1
  475.            BRA.B     1$
  476.  
  477. 2$           MOVEQ.L     #NOITEM,D0
  478. 3$           RTS
  479.  
  480. *************************************************
  481. * FindWindow() - Check if window is still open. *
  482. *                        *
  483. * Input:                    *
  484. *   none                    *
  485. * Output:                    *
  486. *   return  - TRUE if window is open.        *
  487. *************************************************
  488. @FindWindow:   MOVE.L    D2,-(SP)
  489.            MOVE.L    A6,-(SP)
  490.  
  491. * ------------ Lock = LockIBase(0)
  492.            MOVEQ.L     #0,D0
  493.            MOVEA.L     _IntuitionBase(A4),A6
  494.            JSR     _LVOLockIBase(A6)
  495.  
  496. * ------------ TestScreen = IntuitionBase->FirstScreen
  497.            MOVEA.L     ib_FirstScreen(A6),A0
  498.  
  499. * ------------ TestScreen == NULL ?
  500. 1$           MOVE.L     A0,D1
  501.            BEQ.B     5$
  502.  
  503. * ------------ TestScreen == Screen ?
  504.            CMPA.L     _Screen(A4),A0
  505.            BNE.B     4$
  506.  
  507. * ------------ TestWindow = TestScreen->FirstWindow
  508.            MOVEA.L     sc_FirstWindow(A0),A1
  509.  
  510. * ------------ TestWindow == NULL ?
  511. 2$           MOVE.L     A1,D1
  512.            BEQ.B     5$
  513.  
  514. * ------------ TestWindow == ActiveWindow ?
  515.            CMPA.L     _ActiveWindow(A4),A1
  516.            BNE.B     3$
  517.  
  518.            MOVEQ.L     #TRUE,D2
  519.            BRA.B     6$
  520.  
  521. * ------------ TestWindow = TestWindow->NextWindow
  522. 3$           MOVEA.L     (A1),A1
  523.            BRA.B     2$
  524.  
  525. * ------------ TestScreen = TestScreen->NextScreen
  526. 4$           MOVEA.L     (A0),A0
  527.            BRA.B     1$
  528.  
  529. 5$           MOVEQ.L     #FALSE,D2
  530.  
  531. * ------------ UnlockIBase(Lock)
  532. 6$           MOVEA.L     D0,A0
  533.            JSR     _LVOUnlockIBase(A6)
  534.  
  535.            MOVE.L     D2,D0
  536.  
  537.            MOVEA.L     (SP)+,A6
  538.            MOVE.L     (SP)+,D2
  539.            RTS
  540.  
  541. ***************************************************
  542. * MouseInWindow(Window) - Is mouse inside window. *
  543. *                          *
  544. * Input:                      *
  545. *   Window    - Window to check.          *
  546. * Output:                      *
  547. *   return    - TRUE if mouse inside.          *
  548. ***************************************************
  549. @MouseInWindow:
  550.            MOVEQ.L     #FALSE,D0
  551.  
  552. * ------------ MouseX > Window->LeftEdge ?
  553.            MOVE.W     _MouseX(A4),D1
  554.            CMP.W     wwd_LeftEdge(A0),D1
  555.            BLE.B     1$
  556.  
  557. * ------------ MouseX < Window->RightEdge ?
  558.            CMP.W     wwd_RightEdge(A0),D1
  559.            BGE.B     1$
  560.  
  561. * ------------ MouseY > Window->TopEdge ?
  562.            MOVE.W     _MouseY(A4),D1
  563.            CMP.W     wwd_TopEdge(A0),D1
  564.            BLE.B     1$
  565.  
  566. * ------------ MouseY < Window->Bottom ?
  567.            CMP.W     wwd_Bottom(A0),D1
  568.            BGE.B     1$
  569.  
  570.            MOVEQ.L     #TRUE,D0
  571. 1$           RTS
  572. ****************************************************************
  573. * FindMouseItem(Window) - Check if mouse inside an item.       *
  574. *                                   *
  575. * Input:                               *
  576. *   ItemWindow - Window with items                   *
  577. * Output:                               *
  578. *   return - Pointer to item under the mousepointer (or NULL). *
  579. ****************************************************************
  580. @FindMouseItem:
  581.            MOVE.W     D2,-(SP)
  582.  
  583. * ------------ MouseWinX = MouseX + Window->LeftValue
  584.            MOVE.W     _MouseX(A4),D1
  585.            ADD.W     wwd_LeftValue(A0),D1
  586.  
  587. * ------------ MouseWinY = MouseY + Window->TopValue
  588.            MOVE.W     _MouseY(A4),D2
  589.            ADD.W     wwd_TopValue(A0),D2
  590.  
  591. * ------------ Item = Window->Items
  592.            MOVEA.L     wwd_Items(A0),A0
  593.  
  594. * ------------ MouseWinY >= Item->TopEdge ?
  595. 1$           MOVE.W     mi_TopEdge(A0),D0
  596.            CMP.W     D0,D2
  597.            BLT.B     2$
  598.  
  599. * ------------ MouseWinY <= Item->TopEdge + Item->Height ?
  600.            ADD.W     mi_Height(A0),D0
  601.            CMP.W     D0,D2
  602.            BGT.B     2$
  603.  
  604. * ------------ MouseWinX >= Item->LeftEdge ?
  605.            MOVE.W     mi_LeftEdge(A0),D0
  606.            CMP.W     D0,D1
  607.            BLT.B     2$
  608.  
  609. * ------------ MouseWinX <= Item->LeftEdge + Item->Width ?
  610.            ADD.W     mi_Width(A0),D0
  611.            CMP.W     D0,D1
  612.            BGT.B     2$
  613.  
  614. * ------------ return Item.
  615.            MOVE.L     A0,D0
  616.            BRA.B     3$
  617.  
  618. * ------------ Try next item.
  619. 2$           MOVEA.L     (A0),A0
  620.            MOVE.L     A0,D0
  621.            BNE.B     1$
  622.  
  623. 3$           MOVE.W    (SP)+,D2
  624.            RTS
  625.  
  626. *********************************************************
  627. * HighLightCurrItemBehind(Mode) - Highlight currentitem *
  628. *                   behind subwindow.    *
  629. * Input:                        *
  630. *   Mode.W - HIGHLIGHTON or HIGHLIGHTOFF.        *
  631. * Output:                        *
  632. *   none                        *
  633. * Functions:                        *
  634. *   SwapBits, HighLightItem                *
  635. *********************************************************
  636. @HighLightCurrItemBehind:
  637.            MOVE.W     D0,-(SP)
  638.  
  639. * ------------ SwapBits(SubWindow)
  640.            LEA     _SubWindow(A4),A0
  641.            JSR     @SwapBits(PC)
  642.  
  643. * ------------ HighLightItem(&ItemWindow,Mode)
  644.            MOVE.W     (SP)+,D0
  645.            LEA     _ItemWindow(A4),A0
  646.            JSR     @HighLightItem(PC)
  647.  
  648. * ------------ SwapBits(SubWindow)
  649.            LEA     _SubWindow(A4),A0
  650.            JSR     @SwapBits(PC)
  651.  
  652.            RTS
  653.  
  654. ******************************************
  655. * OpenMenuWindow(StartPos)               *
  656. *                     *
  657. * Input:                 *
  658. *   StartPos  - Position from menutop.     *
  659. * Output:                 *
  660. *   return    - TRUE if window opened.     *
  661. * Functions:                 *
  662. *   Mystrlen, BuildBitMap, DrawAllMenues *
  663. ******************************************
  664. @OpenMenuWindow:
  665.            MOVEM.L     D4-D7/A3/A5,-(SP)
  666.            MOVE.W     D0,D7
  667.  
  668. * ------------ Sort menues after their LeftEdge
  669.            JSR     @SortMenues(PC)
  670.            TST.L     D0
  671.            BEQ.W     OpenMenuDone
  672.  
  673.            MOVEA.L     _GfxBase(A4),A6
  674.  
  675. * ------------ Just one menu ? (4.0)
  676.            MOVEA.L     _Menues(A4),A3
  677.            TST.L     mu_NextMenu(A3)
  678.            BNE.B     2$            * No
  679.  
  680. * ------------ Single menu name option set ?
  681.            BTST     #SHOWSINGLEMENU,_Options(A4)
  682.            BNE.B     2$            * Yes
  683.  
  684. * ------------ ItemWindow.ItemsEnabled = Menues->Flags & MENUENABLED
  685.            LEA     _ItemWindow(A4),A0
  686.            MOVEQ.L     #MENUENABLED,D0
  687.            AND.W     mu_Flags(A3),D0
  688.            MOVE.W     D0,wwd_ItemsEnabled(A0)
  689.  
  690. * ------------ ItemWindow.Items = Menues->FirstItem
  691.            MOVE.L     mu_FirstItem(A3),wwd_Items(A0)
  692.  
  693. * ------------ FindItemWinSize(ItemWindow, ITEMWINDOW)
  694.            MOVEQ.L     #ITEMWINDOW,D0
  695.            JSR     @FindItemWinSize(PC)
  696.  
  697.            TST.L     D0
  698.            BEQ.S     2$          * No items
  699.  
  700. * ------------ MenuWidth = Size.Right - Size.Left
  701.            MOVE.W     _Size+ws_Right(A4),D6
  702.            SUB.W     _Size+ws_Left(A4),D6
  703.  
  704. * ------------ Length = TextLength(&Rp,MenuPtr->MenuName,Mystrlen(MenuPtr->MenuName))
  705.            MOVEA.L     mu_MenuName(A3),A0
  706.            JSR     @Mystrlen(PC)
  707.            LEA     _Rp(A4),A1
  708.            MOVEA.L     mu_MenuName(A3),A0
  709.            JSR     _LVOTextLength(A6)
  710.  
  711. * ------------ Length <= MenuWidth ?
  712.            CMP.W     D0,D6
  713.            BGE.B     1$           * Yes
  714.  
  715. * ------------ Size.Right += Length - MenuWidth
  716.            MOVE.W     _Size+ws_Right(A4),D1
  717.            ADD.W     D0,D1
  718.            SUB.W     D6,D1
  719.            MOVE.W     D1,_Size+ws_Right(A4)
  720.  
  721. * ------------ MenuWidth = Length
  722.            MOVE.W     D0,D6
  723.  
  724. * ------------ MenuWidth += 2 * VBORDERSIZE
  725. 1$           ADDQ.W     #2*VBORDERSIZE,D6
  726.  
  727. * ------------ MenuHeight = Size.Bottom - Size.Top + 2 * HBORDERSIZE + MenuFontSize
  728.            MOVE.W     _Size+ws_Bottom(A4),D5
  729.            SUB.W     _Size+ws_Top(A4),D5
  730.            ADDQ.W     #2*HBORDERSIZE,D5
  731.            ADD.W     _MenuFontSize(A4),D5
  732.  
  733. * ------------ MenuTop = 0
  734.            MOVEQ.L     #0,D7
  735.  
  736. * ------------ Window = ItemWindow
  737.            LEA     _ItemWindow(A4),A3
  738.            BRA.B     PosLeft
  739.  
  740. * ------------ MenuWidth = 0
  741. 2$           MOVEQ.L     #0,D6
  742.  
  743. * ------------ MenuHeight = HBORDERSIZE + 1
  744.            MOVEQ.L     #HBORDERSIZE+1,D5
  745.  
  746. ****************************************
  747. * Find width & height of window needed *
  748. ****************************************
  749. ***********************************
  750. * D5 = MenuHeight    A3 = Menues  *
  751. * D6 = MenuWidth     A6 = GfxBase *
  752. * D7 = MenuTop              *
  753. ***********************************
  754. * ------------ Length = TextLength(&Rp,MenuPtr->MenuName,Mystrlen(MenuPtr->MenuName))
  755. 3$           MOVEA.L     mu_MenuName(A3),A0
  756.            JSR     @Mystrlen(PC)
  757.            LEA     _Rp(A4),A1
  758.            MOVEA.L     mu_MenuName(A3),A0
  759.            JSR     _LVOTextLength(A6)
  760.  
  761. * ------------ MenuPtr->Width > Length ?
  762.            MOVE.W     mu_Width(A3),D1
  763.            CMP.W     D0,D1
  764.            BLS.B     4$           * No
  765.  
  766. * ------------ Length = MenuPtr->Width
  767.            MOVE.L     D1,D0
  768.  
  769. * ------------ Length > MenuWidth ?
  770. 4$           CMP.W     D6,D0
  771.            BLS.B     5$           * No
  772.  
  773. * ------------ MenuWidth = Length
  774.            MOVE.W     D0,D6
  775.  
  776. * ------------ MenuHeight += MenuFontSize
  777. 5$           ADD.W     _MenuFontSize(A4),D5
  778.  
  779. * ------------ Check next menu.
  780.            MOVEA.L     (A3),A3
  781.            MOVE.L     A3,D0
  782.            BNE.B     3$
  783.  
  784. * ------------ MenuWidth += (2 * VBORDERSIZE + 1)
  785.            ADDQ.W     #2*VBORDERSIZE,D6
  786.            ADDQ.W     #1,D6
  787.  
  788. * ------------ Window = MenuWindow
  789.            LEA     _MenuWindow(A4),A3
  790.  
  791. ************************************
  792. * Position window on screen (Left) *
  793. ************************************
  794. ***********************************
  795. *             A3 = Window  *
  796. * D5 = MenuHeight    A6 = GfxBase *
  797. * D6 = MenuWidth          *
  798. * D7 = MenuTop              *
  799. ***********************************
  800. * ------------ MenuLeft = Screen->MouseX - MenuWidth / 2
  801. PosLeft:       MOVE.W     D6,D0
  802.            LSR.W     #1,D0
  803.            MOVEA.L     _Screen(A4),A0
  804.            MOVE.W     sc_MouseX(A0),D1
  805.            SUB.W     D0,D1
  806.  
  807. * ------------ MenuLeft < 0 ?
  808.            BGE.B     1$           * No
  809.  
  810. * ------------ MenuLeft = 0
  811.            MOVEQ.L     #0,D1
  812.  
  813. * ------------ MenuLeft > Screen->Width - MenuWidth ?
  814. 1$           MOVE.W     sc_Width(A0),D0
  815.            SUB.W     D6,D0
  816.            CMP.W     D0,D1
  817.            BLE.B     PosTop        * No
  818.  
  819. * ------------ MenuLeft = Screen->Width - MenuWidth
  820.            MOVE.W     D0,D1
  821.  
  822. ***********************************
  823. * Position window on screen (Top) *
  824. ***********************************
  825. ***********************************
  826. * D1 = MenuLeft      A3 = Window  *
  827. * D5 = MenuHeight    A0 = Screen  *
  828. * D6 = MenuWidth     A6 = GfxBase *
  829. * D7 = MenuTop              *
  830. ***********************************
  831. * ------------ MenuTop > MenuHeight ? (Menues has changed)
  832. PosTop:        CMP.W     D5,D7
  833.            BLE.B     1$           * No
  834.  
  835. * ------------ MenuTop = 0
  836.            MOVEQ     #0,D7
  837.  
  838. * ------------ MenuTop    = Screen->MouseY - MenuFontSize/2 - MenuTop
  839. 1$           MOVE.W     _MenuFontSize(A4),D0
  840.            LSR.W     #1,D0
  841.            ADD.W     D0,D7
  842.            SUB.W     sc_MouseY(A0),D7
  843.            NEG.W     D7
  844.  
  845. * ------------ MenuTop < 0 ?
  846.            BPL.B     2$           * No
  847.  
  848. * ------------ MenuTop = 0
  849.            MOVEQ.L     #0,D7
  850.  
  851. * ------------ MenuTop > Screen->Height - MenuHeight ?
  852. 2$           MOVE.W     sc_Height(A0),D0
  853.            SUB.W     D5,D0
  854.            CMP.W     D0,D7
  855.            BLE.B     3$           * No
  856.  
  857. * ------------ MenuTop = Screen->Height - MenuHeight
  858.            MOVE.L     D0,D7
  859.  
  860. * ------------ Window->TopEdge = MenuTop
  861. 3$           MOVE.W     D7,wwd_TopEdge(A3)
  862.  
  863. * ------------ Window->Height = MenuHeight
  864.            MOVE.W     D5,wwd_Height(A3)
  865.  
  866. * ------------ Window->LeftEdge = MenuLeft
  867.            MOVE.W     D1,wwd_LeftEdge(A3)
  868.  
  869. * ------------ Window->Width = MenuWidth;
  870.            MOVE.W     D6,wwd_Width(A3)
  871.  
  872. *******************************
  873. * Open window with right size *
  874. *******************************
  875. * ------------ BuildBitMap(Window)
  876. Open:           MOVEA.L     A3,A0
  877.            JSR     @BuildBitMap(PC)
  878.  
  879. * ------------ Window open ?
  880.            TST.W     D0
  881.            BEQ.B     OpenMenuDone  * No
  882.  
  883.  
  884. * ------------ Window == ITEMWINDOW ?    [ Single menu ]
  885.            LEA     _ItemWindow(A4),A0
  886.            CMPA.L     A0,A3
  887.            BNE.S     1$            * No
  888.  
  889. * ------------ ItemWindow.LeftValue = Size.Left - WindowLeft - VBORDERSIZE
  890.            MOVE.W     _Size+ws_Left(A4),D0
  891.            SUB.W     wwd_LeftEdge(A3),D0
  892.            SUBQ.W     #VBORDERSIZE,D0
  893.            MOVE.W     D0,wwd_LeftValue(A3)
  894.  
  895. * ------------ ItemWindow.TopValue = Size.Top - WindowTop - HBORDERSIZE - MenuFontSize
  896.            MOVE.W     _Size+ws_Top(A4),D0
  897.            SUB.W     wwd_TopEdge(A3),D0
  898.            SUBQ.W     #HBORDERSIZE,D0
  899.            SUB.W     _MenuFontSize(A4),D0
  900.            MOVE.W     D0,wwd_TopValue(A3)
  901.  
  902. * ------------ DrawAllItems(&ItemWindow)
  903.            MOVEA.L     A3,A0
  904.            JSR     @DrawAllItems(PC)
  905.  
  906. * ------------ CurrentMenuNr = 1
  907.            MOVEQ.L     #1,D0
  908.            MOVE.W     D0,_CurrentMenuNr(A4)
  909.  
  910. * ------------ DrawAllMenues(Window)
  911. 1$           MOVEA.L     A3,A0
  912.            JSR     @DrawAllMenues(PC)
  913.  
  914. * ------------ return (TRUE)
  915.            MOVEQ.L     #TRUE,D0
  916.  
  917. OpenMenuDone:  MOVEM.L     (SP)+,D4-D7/A3/A6
  918.            RTS
  919.  
  920. **********************************
  921. * BOOL SortMenues()              *
  922. *                 *
  923. * Input:             *
  924. *   none.             *
  925. * Output:             *
  926. *   TRUE    if everything is ok. *
  927. **********************************
  928. @SortMenues:   MOVEM.L     A2-A3/A5-A6,-(SP)
  929.            MOVEA.L     _IntuitionBase(A4),A6
  930.            MOVEQ.L     #NULL,D1
  931.  
  932. * ------------ SortRemember = NULL
  933.            MOVE.L     D1,_SortRemember(A4)
  934.  
  935. * ------------ MenuSorted.Next = NULL
  936.            MOVE.L     D1,_MenuSorted+ms_Next(A4)
  937.  
  938.            MOVEA.L     _Menues(A4),A5
  939.  
  940. * ------------ SortData = AllocRemember(SortRemember,sizeof(struct MenuSort),0)
  941. 0$           LEA     _SortRemember(A4),A0
  942.            MOVEQ.L     #ms_SIZEOF,D0
  943.            MOVEQ.L     #0,D1
  944.            JSR     _LVOAllocRemember(A6)
  945.            TST.L     D0
  946.            BEQ.B     3$
  947.            MOVE.L     D0,A0
  948.  
  949. * ------------ SortData.MenuPtr = Menues
  950.            MOVE.L     A5,ms_MenuPtr(A0)
  951.  
  952.            MOVE.W     mu_LeftEdge(A5),D1
  953.  
  954. * ------------ TempSort = Sorted
  955.            LEA     _MenuSorted(A4),A3
  956.  
  957. **************************************************
  958. * D1 = LeftEdge for TestMenu  A3 = MenuSorted     *
  959. *                  A5 = TestMenu     *
  960. *                  A6 = IntuitionBase *
  961. **************************************************
  962. 1$           MOVEA.L     (A3),A1        * ms_Next(A3)
  963.            MOVE.L     A1,D0
  964.            BEQ.B     2$
  965.  
  966.            MOVEA.L     ms_MenuPtr(A1),A2
  967.            CMP.W     mu_LeftEdge(A2),D1
  968.            BLE.B     2$
  969.  
  970.            MOVEA.L     A1,A3
  971.            BRA.B     1$
  972.  
  973. 2$           MOVE.L     A1,(A0)        * ms_Next(A0)
  974.            MOVE.L     A0,(A3)        * ms_Next(A3)
  975.  
  976.            MOVEA.L     (A5),A5        * mu_NextMenu
  977.            MOVE.L     A5,D0
  978.            BNE.B     0$
  979.            MOVEQ.L     #TRUE,D0
  980.  
  981. 3$           MOVEM.L     (SP)+,A2-A3/A5-A6
  982.            RTS
  983.  
  984. **************************************************************
  985. * OpenItemWindow(ItemWindow,ParentWindow,TopPos,WindowType)  *
  986. *                                 *
  987. * Input:                             *
  988. *   Window     - Window to open.                 *
  989. *   ParentWindow -                         *
  990. *   TopPos.W     - Top position for new window.          *
  991. *   WindowType.W - ITEMWINDOW or SUBWINDOW             *
  992. * Output:                             *
  993. *   return     - TRUE if OK                     *
  994. * Functions:                             *
  995. *   FindItemWinSize, PosItemWinLeft, PosItemWinTop,         *
  996. *   BuildBitMap, DrawAllItems                     *
  997. **************************************************************
  998. @OpenItemWindow:
  999.            MOVEM.L     D6-D7/A2-A3,-(SP)
  1000.            MOVEA.L     A0,A3
  1001.            MOVEA.L     A1,A2
  1002.            MOVE.W     D0,D7
  1003.            MOVE.W     D1,D6
  1004.  
  1005. * ------------ FindItemWinSize(Window,WindowType)
  1006.            MOVE.W     D6,D0
  1007.            JSR     @FindItemWinSize(PC)
  1008.  
  1009. * ------------ Empty menu ?
  1010.            TST.L     D0
  1011.            BEQ.B     1$
  1012.  
  1013. * ------------ PosItemWinLeft(Window,ParentWindow,WindowType)
  1014.            MOVE.W     D6,D0
  1015.            MOVEA.L     A3,A0
  1016.            MOVEA.L     A2,A1
  1017.            BSR.B     @PosItemWinLeft
  1018.  
  1019. * ------------ PosItemWinTop(Window,TopPos, WindowType)
  1020.            MOVE.W     D7,D0
  1021.            MOVE.W     D6,D1
  1022.            MOVEA.L     A3,A0
  1023.            JSR     @PosItemWinTop(PC)
  1024.  
  1025. * ------------ BuildBitMap(Window)
  1026.            MOVEA.L     A3,A0
  1027.            JSR     @BuildBitMap(PC)
  1028.  
  1029.            TST.W     D0
  1030.            BEQ.B     1$
  1031.  
  1032. * ------------ DrawAllItems(Window)
  1033.            MOVEA.L     A3,A0
  1034.            JSR     @DrawAllItems(PC)
  1035.  
  1036.            MOVEQ.L     #TRUE,D0
  1037.  
  1038. 1$           MOVEM.L     (SP)+,D6-D7/A2-A3
  1039.            RTS
  1040.  
  1041. ******************************************************
  1042. * PosItemWinLeft(Window,ParentWindow,WindowType) *
  1043. * - Position window on screen (left)                 *
  1044. *                             *
  1045. * Input:                         *
  1046. *   Window     - Window to position.             *
  1047. *   ParentWindow - Window to position next to.         *
  1048. *   WindowType.W - ITEMWINDOW or SUBWINDOW.         *
  1049. *                             *
  1050. * Possible positions:                     *
  1051. *   1. At real position (a'la intuition).            *
  1052. *   2. At right side of parent.              *
  1053. *   3. At left side of parent.                 *
  1054. *   4. On the side that covers parent least.         *
  1055. ******************************************************
  1056. @PosItemWinLeft:
  1057.            MOVEM.L     D3-D7/A2,-(SP)
  1058.  
  1059. * ------------ LeftValue = Size.Left - VBORDERSIZE
  1060.            MOVE.W     _Size+ws_Left(A4),D6
  1061.            SUBQ.W     #VBORDERSIZE,D6
  1062.  
  1063. * ------------ WindowWidth = Size.Right - LeftValue + VBORDERSIZE
  1064.            MOVE.W     _Size+ws_Right(A4),D5
  1065.            SUB.W     D6,D5
  1066.            ADDQ.W     #VBORDERSIZE,D5
  1067.  
  1068. * ------------ LeftPos2 = ParentWindow->LeftEdge - WindowWidth + OVERLAP
  1069.            MOVE.W     wwd_LeftEdge(A1),D1
  1070.            MOVE.W     D1,D4
  1071.            SUB.W     D5,D4
  1072.            ADDQ.W     #OVERLAP,D4
  1073.  
  1074. * ------------ MaxLeft = Screen->Width - WindowWidth
  1075.            MOVEA.L     _Screen(A4),A2
  1076.            MOVE.W     sc_Width(A2),D3
  1077.            SUB.W     D5,D3
  1078. **********************************************
  1079. * D0 = WindowType      A0 = Window         *
  1080. * D1 = Parent->LeftEdge   A1 = ParentWindow  *
  1081. * D2 =              A2 = Screen         *
  1082. * D3 = MaxLeft                     *
  1083. * D4 = LeftPos2                  *
  1084. * D5 = WindowWidth                 *
  1085. * D6 = LeftValue                 *
  1086. * D7 = WindowLeft                 *
  1087. **********************************************
  1088. * ------------ WindowType == ITEMWINDOW ?
  1089.            TST.W     D0
  1090.            BEQ.B     1$    * Yes
  1091.  
  1092. * ------------ WindowLeft = ParentWindow->LeftEdge + LeftValue
  1093.            MOVE.W     D1,D7
  1094.            ADD.W     D6,D7
  1095.  
  1096. * ------------ WindowLeft > MaxLeft ?
  1097.            CMP.W     D7,D3
  1098.            BLT.B     1$    * Yes
  1099.  
  1100. * ------------ WindowLeft < 0 ?
  1101.            TST.W     D7
  1102.            BPL.B     2$    * No
  1103.  
  1104. * ------------ WindowLeft = ParentWindow->RightEdge - OVERLAP
  1105. 1$           MOVE.W     wwd_RightEdge(A1),D7
  1106.            SUBQ.W     #OVERLAP,D7
  1107.  
  1108. * ------------ WindowLeft > MaxLeft ?
  1109. 2$           CMP.W     D7,D3
  1110.            BGE.B     4$    * No
  1111.  
  1112. * ------------ LeftPos2 > MaxLeft - WindowLeft ?
  1113.            MOVE.W     D3,D0
  1114.            SUB.W     D7,D0
  1115.            CMP.W     D4,D0
  1116.            BGE.B     3$    * No
  1117.  
  1118. * ------------ WindowLeft = (LeftPos2 > 0) ? LeftPos2 : 0
  1119.            MOVE.W     D4,D7
  1120.            BGT.B     4$
  1121.            MOVEQ.L     #0,D7
  1122.            BRA.B     4$
  1123.  
  1124. * ------------ WindowLeft = MaxLeft
  1125. 3$           MOVE.W     D3,D7
  1126.  
  1127. * ------------ WindowWidth < ParentWindow->LeftEdge + OVERLAP - WindowLeft ?
  1128. 4$           MOVE.W     D1,D0
  1129.            ADDQ.W     #OVERLAP,D0
  1130.            SUB.W     D7,D0
  1131.            CMP.W     D5,D0
  1132.            BLE.B     5$           * No
  1133.  
  1134. * ------------ WindowWidth = ParentWindow->LeftEdge + OVERLAP - WindowLeft
  1135.            MOVE.W     D0,D5
  1136.  
  1137. * ------------ Window->LeftEdge = WindowLeft
  1138. 5$           MOVE.W     D7,wwd_LeftEdge(A0)
  1139.  
  1140. * ------------ Window->LeftValue = LeftValue - WindowLeft
  1141.            SUB.W     D7,D6
  1142.            MOVE.W     D6,wwd_LeftValue(A0)
  1143.  
  1144. * ------------ Window->Width = WindowWidth
  1145.            MOVE.W     D5,wwd_Width(A0)
  1146.  
  1147.            MOVEM.L     (SP)+,D3-D7/A2
  1148.            RTS
  1149.  
  1150. *****************************************************
  1151. * PosItemWinTop(Window,TopPos, WindowType)          *
  1152. * - Position Window on screen (Top).                *
  1153. *                            *
  1154. * Input:                        *
  1155. *   Window     - Window to position. (A0)         *
  1156. *   TopPos.W     -               (D0)         *
  1157. *   WindowType.W - ITEMWINDOW or SUBITEMWINDOW (D1) *
  1158. *****************************************************
  1159. @PosItemWinTop:
  1160.            MOVEM.L     D4-D7,-(SP)
  1161.  
  1162. * ------------ TopValue = Size.Top - HBORDERSIZE
  1163.            MOVE.W     _Size+ws_Top(A4),D6
  1164.            SUBQ.W     #HBORDERSIZE,D6
  1165.  
  1166. * ------------ WindowHeight = Size.Bottom - TopValue + HBORDERSIZE
  1167.            MOVE.W     _Size+ws_Bottom(A4),D4
  1168.            SUB.W     D6,D4
  1169.            ADDQ.W     #HBORDERSIZE,D4
  1170.            MOVEA.L     _Screen(A4),A1
  1171.  
  1172. * ------------ WindowTop = TopPos
  1173.            MOVE.W     D0,D5
  1174.  
  1175. * ------------ WindowType == ITEMWINDOW ?
  1176.            TST.W     D1
  1177.            BNE.B     1$           * No
  1178.  
  1179. * ------------ Center Items ?
  1180.            BTST     #ITEMSCENTERED,_Options(A4)
  1181.            BEQ.B     1$           * No
  1182.  
  1183. * ------------ WindowTop += (MenuFontSize - WindowHeight) / 2
  1184.            MOVE.W     _MenuFontSize(A4),D1
  1185.            SUB.W     D4,D1
  1186.            ASR.W     #1,D1
  1187.            ADD.W     D1,D5
  1188.            BRA.B     2$
  1189.  
  1190. * ------------ WindowTop = TopPos + TopValue
  1191. 1$           ADD.W     D6,D5
  1192.  
  1193. ***********************************
  1194. * D0 = TopPos         A0 = Window  *
  1195. * D4 = WindowHeight  A1 = Screen  *
  1196. * D5 = WindowTop          *
  1197. * D6 = TopValue           *
  1198. ***********************************
  1199. * ------------ WindowTop > Screen->Height - WindowHeight ?
  1200. 2$           MOVE.W     sc_Height(A1),D0
  1201.            SUB.W     D4,D0
  1202.            CMP.W     D5,D0
  1203.            BGE.B     3$           * No
  1204.  
  1205. * ------------ WindowTop = Screen->Height - WindowHeight
  1206.            MOVE.W     D0,D5
  1207.  
  1208. * ------------ WindowTop < 0 ?
  1209. 3$           TST.W     D5
  1210.            BPL.B     4$           * No
  1211.  
  1212. * ------------ WindowTop = 0
  1213.            MOVEQ.L     #0,D5
  1214.  
  1215. * ------------ Window->TopEdge = WindowTop
  1216. 4$           MOVE.W     D5,wwd_TopEdge(A0)
  1217.  
  1218. * ------------ Window->TopValue = TopValue - WindowTop
  1219.            SUB.W     D5,D6
  1220.            MOVE.W     D6,wwd_TopValue(A0)
  1221.  
  1222. * ------------ Window->Height = WindowHeight
  1223.            MOVE.W     D4,wwd_Height(A0)
  1224.  
  1225.            MOVEM.L     (SP)+,D4-D7
  1226.            RTS
  1227.  
  1228. *************************************************************
  1229. *  TellWindow(InputSignals,MenuNum) - Send Fake Menu Event. *
  1230. *         A0        D0                    *
  1231. * Input:                            *
  1232. *   MenuNum -    Menu number to send.                *
  1233. *   InputSignals - InputHandler data for Qualifiers        *
  1234. * Output:                            *
  1235. *   none                            *
  1236. * Functions:                            *
  1237. *   FindWindow                            *
  1238. *************************************************************
  1239. @TellWindow:   MOVE.L    A2,-(SP)
  1240.            MOVE.L    A6,-(SP)
  1241.            LEA     -ie_SIZEOF(SP),SP
  1242.  
  1243. * ------------ MyFakeEvent.ie_Class = IECLASS_MENULIST
  1244.            MOVE.B     #IECLASS_MENULIST,ie_Class(SP)
  1245.  
  1246. * ------------ MyFakeEvent.ie_Code = MenuNumber
  1247.            MOVE.W     D0,ie_Code(SP)
  1248.  
  1249. * ------------ MyFakeEvent.ie_Qualifier = InputSignals.EndQualifier
  1250.            MOVE.W     sd_EndQualifier(A0),ie_Qualifier(SP)
  1251.  
  1252. * ------------ MyFakeEvent.ie_NextEvent = NULL
  1253.            CLR.L     (SP)
  1254.  
  1255. * ------------ MyFakeEvent.ie_EventAddress = NULL
  1256.            CLR.L     ie_EventAddress(SP)
  1257.  
  1258. * ------------ Get current time.
  1259.            LEA     ie_TimeStamp+TV_SECS(SP),A0
  1260.            LEA     ie_TimeStamp+TV_MICRO(SP),A1
  1261.            MOVEA.L     _IntuitionBase(A4),A6
  1262.            JSR     _LVOCurrentTime(A6)
  1263.  
  1264. * ------------ InputReqBlock->io_Command = IND_WRITEEVENT
  1265.            MOVEA.L     _InputReqBlock(A4),A2
  1266.            MOVE.W     #IND_WRITEEVENT,IO_COMMAND(A2)
  1267.  
  1268. * ------------ InputReqBlock->io_Flags     = 0
  1269.            CLR.B     IO_FLAGS(A2)
  1270.  
  1271. * ------------ InputReqBlock->io_Length = sizeof(struct InputEvent)
  1272.            MOVEQ.L     #ie_SIZEOF,D0
  1273.            MOVE.L     D0,IO_LENGTH(A2)
  1274.  
  1275. * ------------ InputReqBlock->io_Data = &MyFakeEvent
  1276.            MOVE.L     SP,IO_DATA(A2)
  1277.  
  1278. * ------------ Be sure the right window will get the message.
  1279.            JSR     @FindWindow(PC)
  1280.            TST.W     D0
  1281.            BEQ.B     1$
  1282.  
  1283.            MOVEA.L     _ActiveWindow(A4),A0
  1284.            JSR     _LVOActivateWindow(A6)
  1285.  
  1286. * ------------ DoIO(InputReqBlock)
  1287.            MOVEA.L     A2,A1
  1288.            MOVEA.L     (A4),A6       * SysBase
  1289.            JSR     _LVODoIO(A6)
  1290.  
  1291. 1$           LEA     ie_SIZEOF(SP),SP
  1292.            MOVEA.L     (SP)+,A6
  1293.            MOVEA.L     (SP)+,A2
  1294.            RTS
  1295.  
  1296. ****************************************
  1297. * DrawAllItems(Window)                 *
  1298. *                       *
  1299. * Input:                   *
  1300. *   Window  - Window to draw into.     *
  1301. *                       *
  1302. * Output:                   *
  1303. *   none                   *
  1304. * Functions:                   *
  1305. *   ClearWindow, DrawMenuItem           *
  1306. ****************************************
  1307. @DrawAllItems: MOVE.L     A2,-(SP)
  1308.            MOVE.L     A3,-(SP)
  1309.  
  1310.            MOVEA.L     A0,A3
  1311.  
  1312. * ------------ Item = Window->Items
  1313.            MOVEA.L     wwd_Items(A3),A2
  1314.  
  1315. * ------------ ClearWindow(Window)
  1316.            BSR.B     @ClearWindow
  1317.  
  1318. * ------------ DrawMenuItem(Window, Item, ITEMFILL)
  1319. 1$           MOVEQ.L     #ITEMFILL,D0
  1320.            MOVEA.L     A3,A0
  1321.            MOVEA.L     A2,A1
  1322.            JSR     @DrawMenuItem(PC)
  1323.  
  1324. * ------------ Item = Item->NextItem
  1325.            MOVEA.L     (A2),A2
  1326.            MOVE.L     A2,D0
  1327.            BNE.B     1$
  1328.  
  1329.            MOVEA.L     (SP)+,A3
  1330.            MOVEA.L     (SP)+,A2
  1331.            RTS
  1332.  
  1333. *********************************
  1334. * ClearWindow(window)           *
  1335. *                *
  1336. * Input:            *
  1337. *   Window   - Window to clear. *
  1338. * Output:            *
  1339. *   none            *
  1340. *********************************
  1341. @ClearWindow:  MOVEM.L     D2-D5/A2-A3/A5-A6,-(SP)
  1342.            MOVEA.L     A0,A3
  1343.  
  1344.            LEA     _Rp(A4),A2
  1345.            MOVEA.L     _ActiveWindow(A4),A5
  1346.            MOVEA.L     _GfxBase(A4),A6
  1347. *********************
  1348. * A2 = Rp        *
  1349. * A3 = Window        *
  1350. * A5 = ActiveWindow *
  1351. * A6 = GfxBase        *
  1352. *********************
  1353. * ------------ SetDrMd(Rp, JAM1)
  1354.            MOVEA.L     A2,A1
  1355.            MOVEQ.L     #RP_JAM1,D0
  1356.            JSR     _LVOSetDrMd(A6)
  1357.  
  1358. * ------------ SetAPen(Rp,ActiveWindow->DetailPen)
  1359.            MOVEA.L     A2,A1
  1360.            MOVEQ.L     #0,D0
  1361.            MOVE.B     wd_DetailPen(A5),D0
  1362.            JSR     _LVOSetAPen(A6)
  1363.  
  1364. * ------------ Left = Window->LeftEdge
  1365.            MOVEQ.L     #0,D0
  1366.            MOVE.W     wwd_LeftEdge(A3),D0
  1367.  
  1368. * ------------ Top = Window->TopEdge
  1369.            MOVEQ.L     #0,D1
  1370.            MOVE.W     wwd_TopEdge(A3),D1
  1371.  
  1372. * ------------ Right = Window->RightEdge
  1373.            MOVEQ.L     #0,D2
  1374.            MOVE.W     wwd_RightEdge(A3),D2
  1375.  
  1376. * ------------ Bottom = Window->Bottom
  1377.            MOVEQ.L     #0,D3
  1378.            MOVE.W     wwd_Bottom(A3),D3
  1379.  
  1380. * ------------ DrawRect(Left, Top, Right, Bottom)
  1381.            MOVEA.L     A2,A1
  1382.            JSR     @DrawRect(PC)
  1383.  
  1384. * ------------ Save Left & Top.
  1385.            MOVE.L     D0,D4
  1386.            MOVE.L     D1,D5
  1387.  
  1388. * ------------ SetAPen(Rp,ActiveWindow->BlockPen)
  1389.            MOVEA.L     A2,A1
  1390.            MOVEQ.L     #0,D0
  1391.            MOVE.B     wd_BlockPen(A5),D0
  1392.            JSR     _LVOSetAPen(A6)
  1393.  
  1394. * ------------ RectFill(Left, Top, Right, Bottom)
  1395.            MOVEA.L     A2,A1
  1396.            MOVE.L     D4,D0
  1397.            MOVE.L     D5,D1
  1398.            JSR     _LVORectFill(A6)
  1399.  
  1400.            MOVEM.L     (SP)+,D2-D5/A2-A3/A5-A6
  1401.            RTS
  1402.  
  1403. *******************************
  1404. * CloseSubWindow()            *
  1405. * CloseItemWindow()           *
  1406. * CloseMenuWindow()           *
  1407. *                  *
  1408. * Input:              *
  1409. *   none              *
  1410. * Output:              *
  1411. *   none              *
  1412. * Functions:              *
  1413. *   SwapBits, RemoveBitMap    *
  1414. *******************************
  1415. @CloseSubWindow:
  1416.            LEA     _SubWindow(A4),A0
  1417.            TST.W     (A0)          * wwd_BitMapOK
  1418.            BEQ.B     CloseQuit
  1419.  
  1420.            MOVEA.L     wwd_Current(A0),A1
  1421.            MOVE.L     A1,D0
  1422.            BEQ.B     1$
  1423.            BCLR     #HIGHITEMBIT,mi_Flags(A1)
  1424.  
  1425. * ------------ If subitems are shown either Current or TempItem must be something.
  1426. 1$           MOVEA.L     _ItemWindow+wwd_Current(A4),A1
  1427.            MOVE.L     A1,D0
  1428.            BNE.B     2$                 * 4.21
  1429.            MOVEA.L     _TempItem(A4),A1            * 4.21
  1430. 2$           BCLR     #ISDRAWNBIT,mi_Flags(A1)
  1431.            BRA.B     Close
  1432.  
  1433. @CloseItemWindow:
  1434.            LEA     _ItemWindow(A4),A0
  1435.            TST.W     (A0)          * wwd_BitMapOK
  1436.            BEQ.B     CloseQuit
  1437.  
  1438.            MOVE.L     wwd_Current(A0),D0
  1439.            BNE.B     1$
  1440.            MOVE.L    _TempItem(A4),D0
  1441.            BEQ.B     2$
  1442.  
  1443. 1$           MOVE.L     D0,A1
  1444.            BCLR     #HIGHITEMBIT,mi_Flags(A1)
  1445.  
  1446. 2$           MOVEA.L     _MenuWindow+wwd_Current(A4),A1
  1447.            BCLR     #MIDRAWNBIT,mu_Flags(A1)
  1448.            BRA.B     Close
  1449.  
  1450. @CloseMenuWindow:
  1451.            LEA     _MenuWindow(A4),A0
  1452.  
  1453. Close:           MOVE.L     A0,-(SP)
  1454.  
  1455. * ------------ Remove window from screen.
  1456.            JSR     @SwapBits(PC)
  1457.  
  1458. * ------------ Remove all bitplanes.
  1459.            MOVEA.L     (SP)+,A0
  1460.            JSR     @RemoveBitMap(PC)
  1461.  
  1462. CloseQuit:     RTS
  1463.  
  1464.  
  1465. ****************************************
  1466. * BuildBitMap(Window)  - OpenWindow    *
  1467. *                       *
  1468. * Input:                   *
  1469. *   Window    - Window to open.        *
  1470. * Output:                   *
  1471. *   return    - TRUE if window opened. *
  1472. ****************************************
  1473.  
  1474. @BuildBitMap:  MOVEM.L     D2-D5/A2-A3/A6,-(SP)
  1475.            MOVEA.L     A0,A3
  1476.  
  1477. * ------------ WindowWidth = Window->Width
  1478.            MOVE.W     wwd_Width(A3),D3
  1479.            EXT.L     D3
  1480.  
  1481. * ------------ WindowHeight = Window->Height
  1482.            MOVE.W     wwd_Height(A3),D2
  1483.            EXT.L     D2
  1484.  
  1485.            MOVEA.L     _Screen(A4),A0
  1486.  
  1487. **************************************
  1488. * D2 = WindowHeight     A0 = Screen *
  1489. * D3 = WindowWidth     A3 = Window *
  1490. **************************************
  1491.  
  1492. * ------------ Is window to big for screen ?
  1493. * ------------ WindowWidth > Screen->Width
  1494.            CMP.W     sc_Width(A0),D3
  1495.            BGT.B     Fail           * Yes
  1496.  
  1497. * ------------ WindowHeight > Screen->Height
  1498.            CMP.W     sc_Height(A0),D2
  1499.            BGT.B     Fail           * Yes
  1500.  
  1501. * ------------ Window->RightEdge = Window->LeftEdge + WindowWidth  - 1
  1502.            MOVE.L     D3,D0
  1503.            ADD.W     wwd_LeftEdge(A3),D0
  1504.            SUBQ.L     #1,D0
  1505.            MOVE.W     D0,wwd_RightEdge(A3)
  1506.  
  1507. * ------------ Window->Bottom     = Window->TopEdge  + WindowHeight - 1
  1508.            MOVE.L     D2,D0
  1509.            ADD.W     wwd_TopEdge(A3),D0
  1510.            SUBQ.L     #1,D0
  1511.            MOVE.W     D0,wwd_Bottom(A3)
  1512.  
  1513. * ------------ Depth = Screen->BitMap.Depth
  1514.            MOVEQ.L     #0,D5
  1515.            MOVE.B     sc_BitMap+bm_Depth(A0),D5
  1516.  
  1517.            MOVEA.L     _GfxBase(A4),A6
  1518.  
  1519. ***************************************
  1520. * D2 = WindowHeight     A0 = Screen  *
  1521. * D3 = WindowWidth     A3 = Window  *
  1522. * D5 = Depth         A6 = GfxBase *
  1523. ***************************************
  1524.  
  1525. * ------------ InitBitMap(&Window->Bm,Depth,WindowWidth,WindowHeight)
  1526.            LEA     wwd_Bm(A3),A0
  1527.            MOVE.L     D5,D0
  1528.            MOVE.L     D3,D1
  1529.            JSR     _LVOInitBitMap(A6)
  1530.  
  1531. * ------------ Window->BitMapOk = TRUE
  1532.            MOVE.W     #TRUE,(A3)
  1533.  
  1534. * ------------ Counter = 0
  1535.            MOVEQ.L     #0,D4
  1536.  
  1537. * ------------ Plane = &Window->Bm.Planes[0]
  1538.            LEA     wwd_Bm+bm_Planes(A3),A2
  1539.  
  1540. ***************************************
  1541. * D2 = WindowHeight     A2 = Planen  *
  1542. * D3 = WindowWidth     A3 = Window  *
  1543. * D4 = Counter         A6 = GfxBase *
  1544. * D5 = Depth                  *
  1545. ***************************************
  1546.  
  1547. * ------------ More planes to allocate ?
  1548. BuildNextPl:   CMP.W     D4,D5
  1549.            BEQ.B     AllRastersOK
  1550.            ADDQ.W     #1,D4
  1551.  
  1552. * ------------ Plane++ = AllocRaster(WindowWidth,WindowHeight)
  1553.            MOVE.L     D3,D0
  1554.            MOVE.L     D2,D1
  1555.            JSR     _LVOAllocRaster(A6)
  1556.            MOVE.L     D0,(A2)+
  1557.  
  1558. * ------------ Out of ChipRam ?
  1559.            BNE.B     BuildNextPl   * No
  1560.  
  1561. * ------------ RemoveBitMap(Window)
  1562.            MOVEA.L     A3,A0
  1563.            BSR.B     @RemoveBitMap
  1564.  
  1565. * ------------ return FALSE
  1566. Fail:           MOVEQ.L     #FALSE,D0
  1567.            BRA.B     BuildDone
  1568.  
  1569. * ------------ Make window visible.
  1570. AllRastersOK:  MOVEA.L     A3,A0
  1571.            BSR.B     @SwapBits
  1572.  
  1573. * ------------ ClearWindow(Window)
  1574.            MOVEA.L     A3,A0
  1575.            JSR     @ClearWindow(PC)
  1576.  
  1577. * ------------ return TRUE
  1578.            MOVEQ.L     #TRUE,D0
  1579.  
  1580. BuildDone:     MOVEM.L     (SP)+,D2-D5/A2-A3/A6
  1581.            RTS
  1582.  
  1583. ****************************************************************************
  1584. * RemoveBitMap(Window) - Remove allocated rasters in the BitMap structure. *
  1585. *                                       *
  1586. * Input:                                   *
  1587. *   Window   - Window with bitmap.                       *
  1588. * Output:                                   *
  1589. *   none                                   *
  1590. ****************************************************************************
  1591. @RemoveBitMap: MOVEM.L     D4-D7/A2/A6,-(SP)
  1592.  
  1593. * ------------ Anything to remove ?
  1594.            TST.W     (A0)          * BitMapOK
  1595.            BEQ.B     RemoveDone
  1596.            CLR.W     (A0)          * BitMapOK
  1597.  
  1598. * ------------ Remove all allocated rasters.
  1599.            MOVEQ.L     #0,D7
  1600.            LEA     wwd_Bm(A0),A2
  1601.            MOVE.B     bm_Depth(A2),D7
  1602.  
  1603.            MOVE.W     wwd_Width(A0),D6
  1604.            EXT.L     D6
  1605.  
  1606.            MOVE.W     wwd_Height(A0),D5
  1607.            EXT.L     D5
  1608.  
  1609.            ADDQ.L     #bm_Planes,A2
  1610.  
  1611.            MOVEA.L     _GfxBase(A4),A6
  1612.  
  1613. * ------------ Counter = 0
  1614.            MOVEQ.L     #0,D4
  1615. *************************************
  1616. * D4 = Counter           A2 = Planes  *
  1617. * D5 = WindowHeight    A0 = Window  *
  1618. * D6 = WindowWidth     A6 = GfxBase *
  1619. * D7 = Depth                *
  1620. *************************************
  1621. RemoveNextPl:  CMP.W     D4,D7
  1622.            BEQ.B     RemoveDone
  1623.            ADDQ.W     #1,D4
  1624.  
  1625. * ------------ This raster allocated ?
  1626.            MOVEA.L     (A2)+,A0
  1627.            MOVE.L     A0,D0
  1628.            BEQ.B     RemoveDone
  1629.  
  1630. * ------------ FreeRaster(Planes++,Width,Height);
  1631.  
  1632.            MOVE.L     D6,D0
  1633.            MOVE.L     D5,D1
  1634.            JSR     _LVOFreeRaster(A6)
  1635.            BRA.B     RemoveNextPl
  1636.  
  1637. RemoveDone:    MOVEM.L     (SP)+,D4-D7/A2/A6
  1638.            RTS
  1639.  
  1640. *****************************************************************************
  1641. * SwapBits(Window) - Works like SwapBitsRastPortClipRect() without bugs :-) *
  1642. *                                        *
  1643. *****************************************************************************
  1644. ALLPLANES      EQU     -1
  1645. B_XOR_C        EQU     ABNC+ANBC
  1646.  
  1647. * ------------ Check to see that window is open
  1648. @SwapBits:     TST.W      (A0)
  1649.            BEQ.B      NoWindow
  1650.  
  1651.            MOVEM.L      D2-D7/A2/A6,-(SP)
  1652.  
  1653. * ------------ SrcX
  1654.            MOVEQ.L      #0,D0
  1655.            MOVE.W      wwd_LeftEdge(A0),D0
  1656.  
  1657. * ------------ SrcY
  1658.            MOVEQ.L      #0,D1
  1659.            MOVE.W      wwd_TopEdge(A0),D1
  1660.  
  1661. * ------------ SizeX
  1662.            MOVEQ.L      #0,D4
  1663.            MOVE.W      wwd_Width(A0),D4
  1664.  
  1665. * ------------ SizeY
  1666.            MOVEQ.L      #0,D5
  1667.            MOVE.W      wwd_Height(A0),D5
  1668.  
  1669. * ------------ MinTerm
  1670.            MOVEQ.L      #B_XOR_C,D6
  1671.  
  1672. * ------------ Mask
  1673.            MOVEQ.L      #ALLPLANES,D7
  1674.  
  1675. * ------------ TempA = NULL
  1676.            SUB.L      A2,A2
  1677.  
  1678.            MOVE.L      _GfxBase(A4),A6
  1679.  
  1680. * ------------ Off-screen bitmap
  1681.            LEA      wwd_Bm(A0),A1
  1682.  
  1683. * ------------ On-screen bitmap
  1684.            MOVE.L      _Rp+rp_BitMap(A4),A0
  1685.  
  1686. * ------------ DestX = 0
  1687.            MOVEQ.L      #0,D2
  1688.  
  1689. * ------------ DestY = 0
  1690.            MOVEQ.L      #0,D3
  1691.  
  1692. * ------------ OffScreen = OffScreen XOR OnScreen
  1693.            BSR.B      Swap
  1694. * ------------ OnScreen = OnScreen XOR OffScreen  (= OffScreen)
  1695.            BSR.B      Swap
  1696. * ------------ OffScreen = OffScreen XOR OnScreen  (= OnScreen)
  1697.            BSR.B      Swap
  1698.  
  1699.            MOVEM.L      (SP)+,D2-D7/A2/A6
  1700. NoWindow:      RTS
  1701.  
  1702.  
  1703. Swap:           MOVEM.L      D0/D1/A0/A1,-(SP)
  1704.            JSR      _LVOBltBitMap(A6)
  1705.            MOVEM.L      (SP)+,D0/D1/A0/A1
  1706.  
  1707.            EXG.L      A0,A1
  1708.            EXG.L      D0,D2
  1709.            EXG.L      D1,D3
  1710.  
  1711.            RTS
  1712.  
  1713. ********************************************
  1714. * FindItemWinSize(Window,WindowType)       *
  1715. *                       *
  1716. * Find with and hight needed for all items *
  1717. ********************************************
  1718. @FindItemWinSize:
  1719.            MOVE.L    A2,-(SP)
  1720.            MOVE.L    D2,-(SP)
  1721.  
  1722. * ------------ SizeOk = FALSE
  1723.            MOVEQ.L    #FALSE,D2
  1724.  
  1725. * ------------ Item = Window->Items
  1726.            MOVEA.L     wwd_Items(A0),A2
  1727.  
  1728. * ------------ Size.Left  = WORD_MAX
  1729.            MOVE.W     #WORD_MAX,_Size+ws_Left(A4)
  1730.  
  1731. * ------------ Size.Top   = WindowType (ITEMWINDOW -> TopPos >= 0), SUBWINDOW -> no limit */
  1732.            MOVE.W     D0,_Size+ws_Top(A4)
  1733.  
  1734. * ------------ Size.Right = Size.Bottom = WORD_MIN
  1735.            MOVE.W     #WORD_MIN,D0
  1736.            MOVE.W     D0,_Size+ws_Right(A4)
  1737.            MOVE.W     D0,_Size+ws_Bottom(A4)
  1738.  
  1739. * ------------ SizeOk |= CheckItemSize(Item,Item->ItemFill)
  1740. 1$           MOVEA.L     A2,A0
  1741.            MOVEA.L     mi_ItemFill(A0),A1
  1742.            BSR.B     @CheckItemSize
  1743.            OR.L     D0,D2
  1744.  
  1745. * ------------ Item->Flags & HIGHFLAGS == HIGHIMAGE ?
  1746.            MOVE.W     #HIGHFLAGS,D0
  1747.            AND.W     mi_Flags(A2),D0
  1748.            BNE.B     2$
  1749.  
  1750. * ------------ SizeOk |= CheckItemSize(Item,Item->SelectFill)
  1751.            MOVEA.L     A2,A0
  1752.            MOVEA.L     mi_SelectFill(A0),A1
  1753.            BSR.B     @CheckItemSize
  1754.            OR.L     D0,D2
  1755.  
  1756. * ------------ Check next item.
  1757. 2$           MOVEA.L     (A2),A2
  1758.            MOVE.L     A2,D0
  1759.            BNE.B     1$
  1760.  
  1761. * ------------ return SizeOK
  1762.            MOVE.L     D2,D0
  1763.  
  1764.            MOVE.L     (SP)+,D2
  1765.            MOVE.L     (SP)+,A2
  1766.            RTS
  1767.  
  1768. *********************************************************
  1769. * CheckItemSize(Item,Contents) -                        *
  1770. *  find the size needed to include Item in window.    *
  1771. *                            *
  1772. * Input:                        *
  1773. *   Item      (A0)  Item to check.                      *
  1774. *   Contents  (A1)  What to fill (ItemFill/SelectFill). *
  1775. * Output:                        *
  1776. *   Size        New size of window            *
  1777. *   return        TRUE if anything is found.        *
  1778. *********************************************************
  1779. @CheckItemSize:
  1780. * ------------ Anything to check ?
  1781.            MOVE.L      A1,D0
  1782.            BNE.B      1$              * Yes
  1783.            RTS
  1784.  
  1785. 1$           MOVEM.L      D2-D7/A2-A3/A5-A6,-(SP)
  1786.  
  1787.            MOVEA.L      A0,A2           * A2 = Item to check
  1788.            MOVEA.L      A1,A5           * A5 = What to check
  1789.            LEA      _Size(A4),A3        * A3 = SizeSoFar
  1790.  
  1791. * ------------ ImTxLeft = ItemLeft = Item->LeftEdge
  1792. Check:           MOVE.W      mi_LeftEdge(A2),D3
  1793.            MOVE.W      D3,D7
  1794.  
  1795. * ------------ ImTxTop = ItemTop = Item->TopEdge
  1796.            MOVE.W      mi_TopEdge(A2),D2
  1797.            MOVE.W      D2,D6
  1798.  
  1799. * ------------ ITEMTEXT or ITEMIMAGE ?
  1800.            MOVEQ.L      #ITEMTEXT,D0
  1801.            AND.W      mi_Flags(A2),D0
  1802.            BEQ.B      ItemImage
  1803.  
  1804. * ------------ Add IText position to left and top.
  1805. * ------------ ImTxLeft += IText.LeftEdge
  1806.            ADD.W      it_LeftEdge(A5),D7
  1807.  
  1808. * ------------ ImTxTop += IText.TopEdge
  1809.            ADD.W      it_TopEdge(A5),D6
  1810.  
  1811. * ------------ ImTxRight = ImTxLeft
  1812.            MOVE.W      D7,D5
  1813.  
  1814. * ------------ ImTxBottom = ImTxTop
  1815.            MOVE.W      D6,D4
  1816.  
  1817. * ------------ What font to use ?
  1818.            MOVE.L      it_ITextFont(A5),D0
  1819.            BEQ.B      DefaultFont
  1820.  
  1821. * ------------ Add height and length of string.
  1822. * ------------ ImTxBottom += IText.ITextFont.YSize
  1823.            MOVEA.L      D0,A0
  1824.            ADD.W      ta_YSize(A0),D4
  1825.  
  1826. * ------------ ImTxRight += IntuiTextLength(IText)
  1827.            MOVEA.L      A5,A0
  1828.            MOVEA.L      _IntuitionBase(A4),A6
  1829.            JSR      _LVOIntuiTextLength(A6)
  1830.  
  1831.            BRA.B      NextText
  1832.  
  1833. * ------------ Add hight and length of string with default font.
  1834. * ------------ ImTxBottom += Rp.TxHeight
  1835. DefaultFont:   ADD.W      _Rp+rp_TxHeight(A4),D4
  1836.  
  1837. * ------------ ItemTextRight += TextLength(Rp,IText,strlen(IText))
  1838.            MOVEA.L      it_IText(A5),A0
  1839.            JSR      @Mystrlen(PC)
  1840.            LEA      _Rp(A4),A1
  1841.            MOVEA.L      it_IText(A5),A0
  1842.            MOVEA.L      _GfxBase(A4),A6
  1843.            JSR      _LVOTextLength(A6)
  1844.  
  1845. NextText:      ADD.W      D0,D5
  1846.  
  1847. * ------------ Move to next text.
  1848.            MOVEA.L      it_NextText(A5),A5
  1849.            BRA.B      CheckLeft
  1850.  
  1851. * ------------ ImTxLeft += Image.LeftEdge
  1852. ItemImage:     ADD.W      (A5),D7
  1853.  
  1854. * ------------ ImTxTop += Image.TopEdge
  1855.            ADD.W      ig_TopEdge(A5),D6
  1856.  
  1857. * ------------ ImTxRight = ImTxLeft + Image.Width
  1858.            MOVE.W      D7,D5
  1859.            ADD.W      ig_Width(A5),D5
  1860.  
  1861. * ------------ ImTxBottom = ImTxTop + Image.Height
  1862.            MOVE.W      D6,D4
  1863.            ADD.W      ig_Height(A5),D4
  1864.  
  1865. * ------------ Move to next image
  1866.            MOVE.L      ig_NextImage(A5),A5
  1867.  
  1868. * ------------ Compare with size in SizeSoFar
  1869. * ------------ ItemLeft = Min(ImTxLeft, ItemLeft)
  1870. CheckLeft:     CMP.W      D7,D3
  1871.            BGE.B      1$
  1872.            MOVE.W      D3,D7
  1873.  
  1874. * ------------ SizeSoFar.Left = Min(SizeSoFar.Left, ItemLeft)
  1875. 1$:           CMP.W      (A3),D7
  1876.            BGE.B      CheckRight
  1877.            MOVE.W      D7,(A3)
  1878.  
  1879. * ------------ ItemRight = Max(ItemLeft + Item.Width, ImTxRight)
  1880. CheckRight:    ADD.W      mi_Width(A2),D3
  1881.            CMP.W      D5,D3
  1882.            BLE.B      1$
  1883.            MOVE.W      D3,D5
  1884.  
  1885. * ------------ Item has sub-item ?
  1886. 1$:           TST.L      mi_SubItem(A2)
  1887.            BEQ.B      2$               * No
  1888.  
  1889. * ------------ Sub-item pointer enabled ?
  1890.            BTST      #SUBITEMPOINTER,_Options(A4)
  1891.            BEQ.B      2$               * No
  1892.  
  1893. * ------------ Make room for pointer
  1894. * ------------ ItemRight += (ScreenType & HIRESSCREEN) ? 10 : 6
  1895.            ADDQ.W      #6,D5
  1896.            TST.W      _ScreenType(A4)
  1897.            BNE.B      2$               * LORES
  1898.            ADDQ.W      #4,D5
  1899.  
  1900. * ------------ SizeSoFar.Right = Max(SizeSoFar.Right, ItemRight)
  1901. 2$:           CMP.W      ws_Right(A3),D5
  1902.            BLE.B      CheckTop
  1903.            MOVE.W      D5,ws_Right(A3)
  1904.  
  1905. * ------------ ItemTop = Min(ItemTop, ImTxTop).
  1906. CheckTop:      CMP.W      D6,D2
  1907.            BGE.B      1$
  1908.            MOVE.W      D2,D6
  1909.  
  1910. * ------------ SizeSoFar.Top = Min(SizeSoFar.Top, ItemTop)
  1911. 1$:           CMP.W      ws_Top(A3),D6
  1912.            BGE.B      CheckBottom
  1913.            MOVE.W      D6,ws_Top(A3)
  1914.  
  1915. * ------------ ItemBottom = Max(ItemLeft + Item.Height, ImTxBottom)
  1916. CheckBottom:   ADD.W      mi_Height(A2),D2
  1917.            CMP.W      D4,D2
  1918.            BLE.B      1$
  1919.            MOVE.W      D2,D4
  1920.  
  1921. * ------------ SizeSoFar.Bottom = Max(SizeSoFar.Bottom, ItemBottom)
  1922. 1$:           CMP.W      ws_Bottom(A3),D4
  1923.            BLE.B      2$
  1924.            MOVE.W      D4,ws_Bottom(A3)
  1925.  
  1926. * ------------ Anything more to check
  1927. 2$           MOVE.L      A5,D0
  1928.            BNE.W      Check
  1929.  
  1930.            MOVEM.L      (SP)+,D2-D7/A2-A3/A5-A6
  1931.            MOVEQ.L      #TRUE,D0
  1932.            RTS
  1933.  
  1934. *****************************************
  1935. * SelectItem() - Do selection           *
  1936. *****************************************
  1937. @SelectItem:   MOVEM.L     D2-D3/A2-A3/A5,-(SP)
  1938. ********************
  1939. * Check subwindow. *
  1940. ********************
  1941. * ------------ SubWindow.BitMapOk == TRUE ?
  1942.            LEA     _SubWindow(A4),A2
  1943.            TST.W     (A2)                  * wwd_BitMapOk
  1944.            BEQ.B     CheckItem     * No
  1945.  
  1946. * ------------ NewSubItem = FindMouseItem(&SubWindow)
  1947.            MOVEA.L     A2,A0
  1948.            JSR     @FindMouseItem(PC)
  1949.            MOVEA.L     D0,A3
  1950.  
  1951. ********************
  1952. * A2 = SubWindow   *
  1953. * A3 = NewSubItem  *
  1954. ********************
  1955. * ------------ NewSubItem == SubWindow.Current ?
  1956.            MOVEA.L     wwd_Current(A2),A0
  1957.            CMPA.L     A0,A3
  1958.            BEQ.B     4$           * Yes
  1959. ***********************
  1960. * A0 = CurrentSubItem *
  1961. * A2 = SubWindow      *
  1962. * A3 = NewSubItem     *
  1963. ***********************
  1964.  
  1965. * ------------ SubWindow.Current == NULL ?
  1966.            MOVE.L     A0,D0
  1967.            BEQ.B     1$           * Yes
  1968.  
  1969. * ------------ HighLightItem(&SubWindow,HIGHLIGHTOFF)
  1970.            MOVEQ.L     #1,D0
  1971.            MOVEA.L     A2,A0
  1972.            JSR     @HighLightItem(PC)
  1973.            BRA.B     2$
  1974.  
  1975. * ------------ TempItem == NULL ?
  1976. 1$           MOVE.L     _TempItem(A4),D2
  1977.            BEQ.B     2$           * Yes
  1978.  
  1979. * ------------ ItemWindow.Current = TempItem.
  1980.            MOVE.L     D2,_ItemWindow+wwd_Current(A4)
  1981.  
  1982. * ------------ TempItem = NULL.
  1983.            CLR.L     _TempItem(A4)
  1984.  
  1985. * ------------ HighLightCurrItemBehind(HIGHLIGHTON)
  1986.            MOVEQ.L     #0,D0
  1987.            JSR     @HighLightCurrItemBehind(PC)
  1988.  
  1989. * ------------ SubWindow.Current = NewSubItem.
  1990. 2$           MOVE.L     A3,wwd_Current(A2)
  1991.  
  1992. * ------------ SubWindow.Current == NULL ?
  1993.            BEQ.B     3$           * Yes
  1994.  
  1995. * ------------ HighLightItem(&SubWindow,HIGHLIGHTON)
  1996.            MOVEQ.L     #0,D0
  1997.            MOVEA.L     A2,A0
  1998.            JSR     @HighLightItem(PC)
  1999.  
  2000. * ------------ Options & CLICKMENUES ?
  2001.            BTST     #CLICKMENUES,_Options(A4)
  2002.            BEQ.W     SelectDone    * No
  2003.  
  2004. * ------------ Selectable item ?
  2005.            TST.W     D0
  2006.            BEQ.W     SelectDone    * No
  2007.  
  2008. * ------------ return TRUE
  2009.            MOVEQ.L     #TRUE,D0
  2010.            BRA.W     SelectQuit
  2011.  
  2012. * ------------ HighLightCurrItemBehind(HIGHLIGHTOFF)
  2013. 3$           MOVEQ.L     #1,D0
  2014.            JSR     @HighLightCurrItemBehind(PC)
  2015.  
  2016. * ------------ TempItem = ItemWindow.Current.
  2017.            MOVE.L     _ItemWindow+wwd_Current(A4),_TempItem(A4)
  2018.  
  2019. * ------------ ItemWindow.Current = NULL.
  2020.            CLR.L     _ItemWindow+wwd_Current(A4)
  2021.  
  2022. * ------------ Mouse in SubWindow ?
  2023. 4$           MOVEA.L     A2,A0
  2024.            JSR     @MouseInWindow(PC)
  2025.            TST.W     D0
  2026.            BNE.W     SelectDone    * Yes
  2027.  
  2028. *********************
  2029. * Check itemwindow. *
  2030. *********************
  2031. * ------------ ItemWindow.BitMapOk == TRUE ?
  2032. CheckItem:     LEA     _ItemWindow(A4),A3
  2033.            TST.W     (A3)
  2034.            BEQ.W     CheckMenu     * No
  2035.  
  2036. * ------------ Mouse in ItemWindow ?
  2037.            MOVEA.L     A3,A0
  2038.            JSR     @MouseInWindow(PC)
  2039.            TST.W     D0
  2040.            BEQ.W     3$           * No
  2041.  
  2042. * ------------ NewItem = FindMouseItem(&ItemWindow).
  2043.            MOVEA.L     A3,A0
  2044.            JSR     @FindMouseItem(PC)
  2045.            MOVEA.L     D0,A5
  2046.  
  2047.            MOVE.L     wwd_Current(A3),D2
  2048.  
  2049. ***************************************
  2050. * A2 = SubWindow     D2 = CurrentItem *
  2051. * A3 = ItemWindow              *
  2052. * A5 = NewItem                  *
  2053. ***************************************
  2054.  
  2055. * ------------ NewItem == CurrentItem ?
  2056.            CMP.L     D2,A5
  2057.            BEQ.W     SelectDone    * Yes
  2058.  
  2059. * ------------ SubWindow open ?
  2060.            TST.W     (A2)          * wwd_BitMapOk
  2061.            BEQ.B     1$           * No
  2062.  
  2063. * ------------ CloseSubWindow()
  2064.            JSR     @CloseSubWindow(PC)
  2065.  
  2066. * ------------ TempItem = NULL.
  2067.            CLR.L     _TempItem(A4)
  2068.  
  2069. * ------------ CurrentItem == NULL ?
  2070. 1$           TST.L     D2
  2071.            BEQ.B     2$           * Yes
  2072.  
  2073. * ------------ HighLightItem(&ItemWindow,HIGHLIGHTOFF)
  2074.            MOVEQ.L     #1,D0
  2075.            MOVEA.L     A3,A0
  2076.            JSR     @HighLightItem(PC)
  2077.  
  2078. * ------------ ItemWindow.Current = NewItem.
  2079. 2$           MOVE.L     A5,_ItemWindow+wwd_Current(A4)
  2080.  
  2081. * ------------ NewItem == NULL ?
  2082.            MOVE.L     A5,D2
  2083.            BEQ.W     SelectDone    * Yes
  2084.  
  2085. * ------------ HighLightItem(&ItemWindow,HIGHLIGHTON)
  2086.            MOVEQ     #0,D0
  2087.            MOVEA.L     A3,A0
  2088.            JSR     @HighLightItem(PC)
  2089.  
  2090. * ------------ SubWindow.ItemsEnabled = ItemWindow.ItemsEnabled ?
  2091. * ------------    (NewItem->Flags & ITEMENABLED) : 0
  2092.            TST.W     _ItemWindow+wwd_ItemsEnabled(A4)
  2093.            BEQ.B     25$
  2094.            MOVEQ.L     #ITEMENABLED,D1
  2095.            AND.W     mi_Flags(A5),D1
  2096. 25$           MOVE.W     D1,_SubWindow+wwd_ItemsEnabled(A4)
  2097.  
  2098. * ------------ SubWindow.Items = NewItem->SubItem.
  2099.            MOVE.L     mi_SubItem(A5),_SubWindow+wwd_Items(A4)
  2100.  
  2101. * ------------ SubWindow.Items == NULL ?
  2102.            BNE.W     28$           * No
  2103.  
  2104. * ------------ Options & CLICKMENUES ?
  2105.            BTST     #CLICKMENUES,_Options(A4)
  2106.            BEQ.W     SelectDone    * No
  2107.  
  2108. * ------------ Possible to highlight item ?
  2109.            TST.W     D0
  2110.            BEQ.W     SelectDone    * No
  2111.  
  2112. * ------------ return TRUE
  2113.            MOVEQ.L     #TRUE,D0
  2114.            BRA.W     SelectQuit
  2115.  
  2116. * ------------ Open item window
  2117. 28$           MOVE.L     D2,A0
  2118.            MOVE.W     mi_TopEdge(A0),D0
  2119.            SUB.W     _ItemWindow+wwd_TopValue(A4),D0
  2120.            MOVE.W     #$7FFF,D1
  2121.            MOVEA.L     A2,A0
  2122.            MOVEA.L     A3,A1
  2123.            JSR     @OpenItemWindow(PC)
  2124.  
  2125. * ------------ Window opened ?
  2126.            TST.W     D0
  2127.            BEQ.B     29$           * No
  2128.  
  2129. * ------------ Set ISDRAWN bit
  2130.            BSET     #ISDRAWNBIT,mi_Flags(A5)
  2131. 29$           BRA.W     SelectDone
  2132.  
  2133. * ------------ ItemWindow.Current == NULL ?
  2134. 3$           TST.L     wwd_Current(A3)
  2135.            BEQ.B     CheckMenu     * Yes
  2136.  
  2137. * ------------ SubWindow open ?
  2138.            TST.W     (A2)          * wwd_BitMapOk
  2139.            BEQ.B     4$           * No
  2140.  
  2141. * ------------ HighLightCurrItemBehind(HIGHLIGHTOFF)
  2142.            MOVEQ.L     #1,D0
  2143.            JSR     @HighLightCurrItemBehind(PC)
  2144.  
  2145. * ------------ TempItem = ItemWindow.Current.
  2146.            MOVE.L     wwd_Current(A3),_TempItem(A4)
  2147.            BRA.B     5$
  2148.  
  2149. * ------------ HighLightItem(&ItemWindow,HIGHLIGHTOFF)
  2150. 4$           MOVEQ.L     #1,D0
  2151.            MOVEA.L     A3,A0
  2152.            JSR     @HighLightItem(PC)
  2153.  
  2154. * ------------ ItemWindow.Current = NULL.
  2155. 5$           CLR.L     wwd_Current(A3)
  2156.  
  2157. *********************
  2158. * Check menuwindow. *
  2159. *********************
  2160.  
  2161. CheckMenu:     LEA     _MenuWindow(A4),A5
  2162.  
  2163. **********************
  2164. * A2 = SubWindow     *
  2165. * A3 = ItemWindow    *
  2166. * A5 = MenuWindow    *
  2167. **********************
  2168. * ------------ MenuWindow.BitMapOK ?
  2169.            TST.W     (A5)
  2170.            BEQ.W     SelectDone    * No
  2171.  
  2172. * ------------ MouseInWindow(MenuWindow) ?
  2173.            MOVEA.L     A5,A0
  2174.            JSR     @MouseInWindow(PC)
  2175.            TST.W     D0
  2176.            BEQ.W     SelectDone    * No
  2177.  
  2178. * ------------ NewMenuNr = (MouseY - MenuWindow.TopEdge - HBORDERSIZE)/MenuFontSize + 1
  2179.            MOVE.W     _MouseY(A4),D2
  2180.            SUB.W     wwd_TopEdge(A5),D2
  2181.            SUBQ.W     #HBORDERSIZE,D2
  2182.            ANDI.L     #$0000FFFF,D2
  2183.            DIVU.W     _MenuFontSize(A4),D2
  2184.            ADDQ.W     #1,D2
  2185.  
  2186. * ------------ NewMenuNr == CurrentMenuNr ?
  2187.            MOVE.W     _CurrentMenuNr(A4),D3
  2188.            CMP.W     D3,D2
  2189.            BEQ.W     SelectDone    * Yes
  2190.  
  2191. ****************************************
  2192. * A2 = SubWindow    D2 = NewMenuNr     *
  2193. * A3 = ItemWindow   D3 = CurrentMenuNr *
  2194. * A5 = MenuWindow               *
  2195. ****************************************
  2196.  
  2197. * ------------ CurrentMenuNr == 0 ?
  2198.            TST.W     D3
  2199.            BEQ.B     2$           * Yes
  2200.  
  2201. * ------------ ItemWindow.BitMapOk
  2202.            TST.W     (A3)
  2203.            BEQ.B     1$           * No
  2204.  
  2205. * ------------ CloseSubWindow()
  2206.            JSR     @CloseSubWindow(PC)
  2207.  
  2208. * ------------ CloseItemWindow();
  2209.            JSR     @CloseItemWindow(PC)
  2210.  
  2211. * ------------ TempItem = NULL
  2212.            CLR.L     _TempItem(A4)
  2213.  
  2214. * ------------ ToggleMenu(CurrentMenuNr,MenuWindow.Current) - HIGHLIGHTOFF -
  2215. 1$           MOVE.W     D3,D0
  2216.            MOVEA.L     wwd_Current(A5),A0
  2217.            JSR     @ToggleMenu(PC)
  2218.  
  2219. * ------------ MenuWindow.Current = FindMenuPtr(NewMenuNr)
  2220. 2$           MOVE.W     D2,D0
  2221.            JSR     @FindMenuPtr(PC)
  2222.            MOVE.L     D0,wwd_Current(A5)
  2223.  
  2224. * ------------ MenuWindow.Current == NULL ?
  2225.            TST.L     D0
  2226.            BNE.B     3$           * No
  2227.  
  2228. * ------------ CurrentMenuNr = 0
  2229.            CLR.W     _CurrentMenuNr(A4)
  2230.            BRA.B     SelectDone
  2231.  
  2232. * ------------ CurrentMenuNr = LastSelectedNum = NewMenuNr
  2233. 3$           MOVE.W     D2,_CurrentMenuNr(A4)
  2234.            MOVE.W     D2,_LastSelectedNum(A4)
  2235.            MOVE.W     D2,D3
  2236.  
  2237. * ------------ ItemWindow.ItemsEnabled = MenuWindow.Current->Flags & MENUENABLED
  2238.            MOVEA.L     wwd_Current(A5),A0
  2239.            MOVEQ.L     #MENUENABLED,D0
  2240.            AND.W     mu_Flags(A0),D0
  2241.            MOVE.W     D0,wwd_ItemsEnabled(A3)
  2242.  
  2243. * ------------ ItemWindow.Items = MenuWindow.Current->FirstItem
  2244.            MOVE.L     mu_FirstItem(A0),wwd_Items(A3)
  2245.  
  2246. * ------------ ToggleMenu(NewMenuNr,MenuWindow.Current)  - HIGHLIGHTON -
  2247.            MOVE.W     D2,D0
  2248.            JSR     @ToggleMenu(PC)
  2249.  
  2250. * ------------ ItemWindow->Items == NULL ?
  2251.            TST.L     wwd_Items(A3)
  2252.            BEQ.B     SelectDone    * Yes
  2253.  
  2254. * ------------ ItemsTopPos = (CurrentMenuNr - 1) * MenuFontSize + MenuWindow.TopEdge
  2255.            MOVE.W     D3,D0
  2256.            SUBQ.W     #1,D0
  2257.            MULU.W     _MenuFontSize(A4),D0
  2258.            ADD.W     _MenuWindow+wwd_TopEdge(A4),D0
  2259.  
  2260. * ------------ OpenItemWindow(ItemWindow,MenuWindow,ItemsTopPos,ITEMWINDOW)
  2261.            MOVEA.L     A3,A0
  2262.            MOVEA.L     A5,A1
  2263.            MOVEQ.L     #0,D1
  2264.            JSR     @OpenItemWindow(PC)
  2265.  
  2266. * ------------ Window opened ?
  2267.            TST.W     D0
  2268.            BEQ.B     SelectDone    * NO
  2269.  
  2270. * ------------ Set MIDRAWN flag
  2271.            MOVEA.L     wwd_Current(A5),A0
  2272.            BSET     #MIDRAWNBIT,mu_Flags(A0)
  2273.  
  2274. SelectDone:    MOVEQ.L     #FALSE,D0
  2275. SelectQuit:    MOVEM.L     (SP)+,D2-D3/A2-A3/A5
  2276.            RTS
  2277.  
  2278. *****************************************************************
  2279. * FinalSelect() - Do checkmarking and calculate Menupick value. *
  2280. *                                *
  2281. * Input:                            *
  2282. *   none                            *
  2283. * Output:                            *
  2284. *   return  - MenuPick-value or MENUNULL.            *
  2285. *****************************************************************
  2286. @FinalSelect:  MOVEM.L     D6-D7/A2-A3,-(SP)
  2287.  
  2288. * ------------ SubItemNr = NOSUB
  2289.            MOVEQ     #$1F,D7
  2290.  
  2291.            MOVEA.L     _SubWindow+wwd_Current(A4),A2
  2292.            MOVEA.L     _ItemWindow+wwd_Current(A4),A3
  2293.  
  2294. * ------------ SubWindow.Current == NULL ?
  2295.            MOVE.L     A2,D0
  2296.            BEQ.B     1$           * Yes
  2297.  
  2298. * ------------ SubWindow.Current->Flags & SubWindow.ItemsEnabled & ITEMENABLED ?
  2299.            MOVEQ.L     #ITEMENABLED,D0
  2300.            AND.W     mi_Flags(A2),D0
  2301.            AND.W     _SubWindow+wwd_ItemsEnabled(A4),D0
  2302.            BEQ.B     1$           * No
  2303.  
  2304. * ------------ Subitem selected -> checkmark and draw all subitems again.
  2305. * ------------ CheckMark(&SubWindow)
  2306.            LEA     _SubWindow(A4),A0
  2307.            JSR     @CheckMark(PC)
  2308.            TST.W     D0
  2309.            BEQ.B     05$
  2310.  
  2311. * ------------ DrawAllItems(&SubWindow)
  2312.            LEA     _SubWindow(A4),A0
  2313.            JSR     @DrawAllItems(PC)
  2314.  
  2315. * ------------ HighLightItem(&SubWindow,HIGHLIGHTON)
  2316.            MOVEQ.L     #0,D0
  2317.            LEA     _SubWindow(A4),A0
  2318.            JSR     @HighLightItem(PC)
  2319.  
  2320. * ------------ SubWindow.Current->NextSelect = MENUNULL
  2321. 05$           MOVE.W     #$FFFF,mi_NextSelect(A2)
  2322.  
  2323. * ------------ Find the number of the selected subitem
  2324.            MOVEA.L     A2,A0
  2325.            MOVEA.L     _SubWindow+wwd_Items(A4),A1
  2326.            JSR     @FindItemNr(PC)
  2327.            MOVE.L     D0,D7
  2328.            BRA.B     3$
  2329.  
  2330. * ------------ ItemWindow.Current == NULL ?
  2331. 1$           MOVE.L     A3,D0
  2332.            BEQ.B     2$           * Yes
  2333.  
  2334. * ------------ ItemWindow.Current->Flags & ITEMENABLED ?
  2335.            MOVEQ.L     #ITEMENABLED,D0
  2336.            AND.W     mi_Flags(A3),D0
  2337.            BEQ.B     2$           * No
  2338.  
  2339. * ------------ ItemWindow.ItemsEnabled & MENUENABLED ?
  2340.            TST.W     _ItemWindow+wwd_ItemsEnabled(A4)
  2341.            BEQ.B     2$           * No
  2342.  
  2343. * ------------ ItemWindow.Current->SubItem == NULL ?
  2344.            TST.L     mi_SubItem(A3)
  2345.            BNE.B     2$           * No
  2346.  
  2347. * ------------ ItemWindow.Current->NextSelect = MENUNULL
  2348.            MOVE.W     #$FFFF,mi_NextSelect(A3)
  2349.            BRA.B     3$
  2350.  
  2351. * ------------ Nothing is selected -> exit
  2352. 2$           MOVEQ.L     #-1,D0
  2353.            BRA.B     6$
  2354.  
  2355. * ------------ CheckMark(ItemWindow)
  2356. 3$           LEA     _ItemWindow(A4),A0
  2357.            BSR.B     @CheckMark
  2358.            TST.W     D0
  2359.            BEQ.B     38$
  2360.  
  2361. * ------------ Remove SubWindow (if any).
  2362.            LEA     _SubWindow(A4),A0
  2363.            JSR     @SwapBits(PC)
  2364.  
  2365. * ------------ DrawAllItems(&ItemWindow)
  2366.            LEA     _ItemWindow(A4),A0
  2367.            JSR     @DrawAllItems(PC)
  2368.  
  2369. * ------------ Check if ItemWindow & MenuWindow is Same (4.0)
  2370.            TST.W     _MenuWindow(A4)        * BitMapOk
  2371.            BNE.B     35$
  2372.  
  2373. * ------------ DrawAllMenues(ItemWindow)
  2374.            LEA     _ItemWindow(A4),A0
  2375.            JSR     @DrawAllMenues
  2376.  
  2377. * ------------ HighLightItem(&ItemWindow,HIGHLIGHTON)
  2378. 35$           MOVEQ.L     #0,D0
  2379.            LEA     _ItemWindow(A4),A0
  2380.            JSR     @HighLightItem(PC)
  2381.  
  2382. * ------------ Restore subwindow. (if any)
  2383.            LEA     _SubWindow(A4),A0
  2384.            JSR     @SwapBits(PC)
  2385.  
  2386. * ------------ Find number of selected item,
  2387. 38$           MOVEA.L     A3,A0
  2388.            MOVEA.L     _ItemWindow+wwd_Items(A4),A1
  2389.            JSR     @FindItemNr(PC)
  2390.            MOVE.L     D0,D6
  2391.  
  2392. * ------------ MenuNum = SHIFTMENU(FindRealMenuNum(CurrentMenuNr)) |
  2393. * ------------         SHIFTITEM(ItemNr) |
  2394. * ------------         SHIFTSUB(SubItemNr)
  2395.            MOVE.W     _CurrentMenuNr(A4),D0
  2396.  
  2397.            JSR     @FindMenuPtr(PC)
  2398.            MOVEA.L     D0,A1
  2399.            MOVEA.L     _Menues(A4),A0
  2400.  
  2401.            MOVEQ.L     #0,D0
  2402.  
  2403. 4$           CMPA.L     A0,A1
  2404.            BEQ.B     5$
  2405.  
  2406.            MOVEA.L     (A0),A0        * mu_NextMenu(A0)
  2407.            ADDQ.L     #1,D0
  2408.            BRA.B     4$
  2409.  
  2410. * ------------ SHIFTITEM(ItemNr)
  2411. 5$           ANDI.W     #$3F,D6
  2412.            ASL.W     #5,D6
  2413.            OR.W     D6,D0
  2414.  
  2415. * ------------ SHIFTSUB(SubItemNr)
  2416.            ANDI.W     #$1F,D7
  2417.            ASL.W     #8,D7
  2418.            ASL.W     #3,D7
  2419.            OR.W     D7,D0
  2420.  
  2421. 6$           MOVEM.L     (SP)+,D6-D7/A2-A3
  2422.            RTS
  2423.  
  2424. **************************************************
  2425. * CheckMark(Window) - Checkmark selected item.   *
  2426. *                         *
  2427. * Input:                     *
  2428. *   Window     - Window to checkmark         *
  2429. * Output:                     *
  2430. *   return.W   - TRUE if checkmarked         *
  2431. **************************************************
  2432. @CheckMark:    MOVEA.L     wwd_Items(A0),A1
  2433.            MOVEA.L     wwd_Current(A0),A0
  2434.  
  2435.            MOVE.W     mi_Flags(A0),D1
  2436.  
  2437. * ------------ Selected->Flags & CHECKIT ?
  2438.            MOVEQ.L     #CHECKIT,D0
  2439.            AND.W     D1,D0
  2440.            BEQ.B     4$           * No
  2441.  
  2442. * ------------ Selected->Flags & CHECKED ?
  2443.            MOVE.W     #CHECKED,D0
  2444.            AND.W     D1,D0
  2445.            BEQ.B     1$           * No
  2446.  
  2447. * ------------ Selected->Flags & MENUTOGGLE ?
  2448.            MOVEQ.L     #MENUTOGGLE,D0
  2449.            AND.W     D1,D0
  2450.            BEQ.B     4$           * No
  2451.  
  2452. * ------------ Selected->Flags &= ~CHECKED   - Togglemenu -
  2453.            BCLR     #0,mi_Flags(A0)
  2454.            BRA.B     35$
  2455.  
  2456. * ------------ Selected->Flags |= CHECKED
  2457. 1$           BSET     #0,mi_Flags(A0)
  2458.  
  2459. * ------------ Handle mutual exclusion.
  2460. * ------------ Exclude = Selected->MutualExclude
  2461.            MOVE.L     mi_MutualExclude(A0),D0
  2462.            BEQ.B     35$
  2463.  
  2464. * ------------ Exclude >>= 1
  2465. 2$           LSR.L     #1,D0
  2466.            BCC.B     3$
  2467.  
  2468. * ------------ Items->Flags &= ~CHECKED
  2469.            BCLR     #0,mi_Flags(A1)
  2470.  
  2471. * ------------ Items = Items->NextItem
  2472. 3$           MOVEA.L     (A1),A1
  2473.  
  2474. * ------------ More items ?
  2475.            MOVE.L     A1,D1
  2476.            BNE.B     2$           * Yes
  2477.  
  2478. 35$           MOVEQ.L     #TRUE,D0
  2479. 4$           RTS
  2480.  
  2481. ************************************************************
  2482. * DrawMenuItem(Window, Item, Mode)                         *
  2483. *                               *
  2484. * Input:                           *
  2485. *   Window  -      Data about window to draw item into.       *
  2486. *   Item    -      Item to draw.                *
  2487. *   Mode.W  -      ITEMFILL = Draw Item.            *
  2488. *          SELECTFILL = Draw selected item (if any).*
  2489. * OUTPUT                           *
  2490. *   none                           *
  2491. ************************************************************
  2492. @DrawMenuItem: MOVEM.L     D2-D7/A2-A3/A5-A6,-(SP)
  2493.            MOVEA.L     A1,A3
  2494.  
  2495.            MOVE.L     A0,-(SP)
  2496. ********************************************************
  2497. * D0 = Mode          A0 = Window       (SP) Window *
  2498. *              A1 = Item                *
  2499. *              A3 = Item                *
  2500. ********************************************************
  2501. * ------------ Left = Item->LeftEdge - Window->LeftValue
  2502.            MOVE.W     mi_LeftEdge(A3),D7
  2503.            SUB.W     wwd_LeftValue(A0),D7
  2504.            EXT.L     D7
  2505.  
  2506. * ------------ Right = Left + Item->Width - 1
  2507.            MOVE.L     D7,D2
  2508.            ADD.W     mi_Width(A3),D2
  2509.            SUBQ.L     #1,D2
  2510.  
  2511. * ------------ ItemTop = Top = Item->TopEdge - Window->TopValue
  2512.            MOVE.W     mi_TopEdge(A3),D6
  2513.            SUB.W     wwd_TopValue(A0),D6
  2514.            EXT.L     D6
  2515.            MOVE.L     D6,D4
  2516.  
  2517. * ------------ Bottom = Top + Item->Height - 1
  2518.            MOVE.L     D6,D3
  2519.            ADD.W     mi_Height(A3),D3
  2520.            SUBQ.L     #1,D3
  2521.  
  2522.            LEA     _Rp(A4),A5
  2523.            MOVEA.L     _IntuitionBase(A4),A6
  2524.  
  2525. * ------------ Find what to Draw.
  2526.            MOVEA.L     mi_ItemFill(A3),A2
  2527.  
  2528.            TST.W     D0          * Mode == ITEMFILL ?
  2529.            BEQ.B     CheckDraw
  2530.  
  2531. * ------------ Use selectfill.
  2532.            MOVEA.L     mi_SelectFill(A3),A2
  2533.  
  2534. ***************************************************************
  2535. * D0 = Mode             A0 = Window      (SP) Window *
  2536. *                 A1 = Item                  *
  2537. * D2 = Right             A2 = Fill                  *
  2538. * D3 = Bottom             A3 = Item                  *
  2539. * D4 = ItemTop                              *
  2540. * D6 = Top             A5 = Rp                  *
  2541. * D7 = Left             A6 = IntuitionBase           *
  2542. ***************************************************************
  2543. * ------------ Anything to draw ?
  2544. CheckDraw:     MOVE.L     A2,D0
  2545.            BEQ.W     DrawDone
  2546.  
  2547. * ------------ Draw the item.
  2548. DrawItem:      MOVEA.L     A5,A0           * Rp
  2549.            MOVEA.L     A2,A1           * Fill
  2550.            MOVE.L     D7,D0           * Left
  2551.            MOVE.L     D6,D1           * Top
  2552.  
  2553.            MOVEQ.L     #ITEMTEXT,D5
  2554.            AND.W     mi_Flags(A3),D5
  2555.            BEQ.B     DrawImage
  2556.  
  2557. * ------------ PrintIText(Fill, Left, Top)
  2558.            JSR     _LVOPrintIText(A6)
  2559.  
  2560. * ------------ ItemTop    += Fill.TopEdge
  2561.            ADD.W     it_TopEdge(A2),D4
  2562.  
  2563.            BRA.B     DrawCheckMark
  2564.  
  2565. * ------------ DrawImage(Fill, Left, Top)
  2566. DrawImage:     JSR     _LVODrawImage(A6)
  2567.  
  2568. * ------------ ItemTop += Fill.TopEdge
  2569.            ADD.W     ig_TopEdge(A2),D4
  2570.  
  2571. ***********************************************************
  2572. * D2 = Right         A2 = Fill          (SP) Window *
  2573. * D3 = Bottom         A3 = Item              *
  2574. * D4 = ItemTop         A5 = Rp              *
  2575. * D6 = Top         A6 = IntuitionBase          *
  2576. * D7 = Left                          *
  2577. ***********************************************************
  2578. * ------------ Draw CheckMark ?
  2579. DrawCheckMark: MOVE.W     #CHECKIT+CHECKED,D0
  2580.            AND.W     mi_Flags(A3),D0
  2581.            CMPI.W     #CHECKIT+CHECKED,D0
  2582.            BNE.B     DrawCommKey
  2583.  
  2584. * ------------ DrawImage(ActiveWindow->CheckMark, Left, ItemTop)
  2585.            MOVEA.L     _ActiveWindow(A4),A0
  2586.            MOVEA.L     wd_CheckMark(A0),A1   * CheckMark
  2587.            MOVE.L     D7,D0               * Left
  2588.            MOVE.L     D4,D1               * ItemTop (New 3.7)
  2589.            MOVEA.L     A5,A0               * Rp
  2590.            JSR     _LVODrawImage(A6)
  2591.  
  2592. *********************************************
  2593. * D2 = Right         A2 = Fill        *
  2594. * D3 = Bottom         A3 = Item        *
  2595. * D4 = ItemTop         A5 = Rp        *
  2596. * D6 = Top         A6 = IntuitionBase *
  2597. * D7 = Left                    *
  2598. *********************************************
  2599. * ------------ SetDrMd(JAM1)
  2600. DrawCommKey:   MOVEA.L     _GfxBase(A4),A6
  2601.            MOVEA.L     A5,A1               * Rp
  2602.            MOVEQ.L     #RP_JAM1,D0           * JAM1
  2603.            JSR     _LVOSetDrMd(A6)
  2604.  
  2605. * ------------ Has item CommadKey ?
  2606.            MOVEQ.L     #COMMSEQ,D0
  2607.            AND.W     mi_Flags(A3),D0
  2608.            BEQ.B     GhostItem
  2609.  
  2610. * ------------ KeyLeft = Right - Rp.TxWidth
  2611.            MOVE.L     D2,D5
  2612.            SUB.W     _Rp+rp_TxWidth(A4),D5
  2613.  
  2614. *******************************************
  2615. * D2 = Right             A2 = Fill      *
  2616. * D3 = Bottom             A3 = Item      *
  2617. * D4 = ItemTop             A5 = Rp      *
  2618. * D5 = KeyLeft             A6 = GfxBase *
  2619. * D6 = Top                  *
  2620. * D7 = Left                  *
  2621. *******************************************
  2622. * ------------ Move(KeyLeft, ItemTop + Rp.TxHeight - 2);
  2623.            MOVE.L     D5,D0
  2624.            MOVE.L     D4,D1
  2625.            ADD.W     _Rp+rp_TxHeight(A4),D1
  2626.            SUBQ.L     #2,D1
  2627.            MOVEA.L     A5,A1
  2628.            JSR     _LVOMove(A6)
  2629.  
  2630. * ------------ SetAPen(ActiveWindow->DetailPen)
  2631.            MOVEQ     #00,D0
  2632.            MOVEA.L     _ActiveWindow(A4),A0
  2633.            MOVE.B     wd_DetailPen(A0),D0
  2634.            MOVEA.L     A5,A1
  2635.            JSR     _LVOSetAPen(A6)
  2636.  
  2637. * ------------ Text(&Item->Command,1);
  2638.            LEA     mi_Command(A3),A0
  2639.            MOVEA.L     A5,A1
  2640.            MOVEQ     #1,D0
  2641.            JSR     _LVOText(A6)
  2642.  
  2643. * ------------ DrawImage(&MyAmigaKeyImage[ScreenType],KeyLeft, ItemTop);
  2644.            LEA     _MyAmigaKeyImage(PC),A1
  2645.            MOVE.L     D5,D0
  2646.            BSR.B     DrawMyImage
  2647.  
  2648.            MOVEA.L     _GfxBase(A4),A6
  2649.  
  2650. *******************************************
  2651. * D2 = Right             A2 = Fill      *
  2652. * D3 = Bottom             A3 = Item      *
  2653. * D4 = ItemTop             A5 = Rp      *
  2654. * D6 = Top             A6 = GfxBase *
  2655. * D7 = Left                  *
  2656. *******************************************
  2657. * ------------ Ghost Item ?
  2658. GhostItem:     MOVEQ.L     #ITEMENABLED,D0
  2659.            AND.W     mi_Flags(A3),D0
  2660.            BEQ.B     1$
  2661.  
  2662.            MOVEA.L     (SP),A2
  2663.            TST.W     wwd_ItemsEnabled(A2)
  2664.            BNE.B     SubItem
  2665.  
  2666. * ------------ SetAfPt(&Rp, GhostPattern, 1)
  2667. 1$           LEA     _GhostPattern(PC),A0
  2668.            MOVE.L     A0,_Rp+rp_AreaPtrn(A4)
  2669.  
  2670.            MOVE.B     #01,_Rp+rp_AreaPtSz(A4)
  2671.  
  2672. * ------------ SetAPen(ActiveWindow->BlockPen)
  2673.            MOVEQ     #0,D0
  2674.            MOVEA.L     _ActiveWindow(A4),A0
  2675.            MOVE.B     wd_BlockPen(A0),D0
  2676.            MOVEA.L     A5,A1
  2677.            JSR     _LVOSetAPen(A6)
  2678.  
  2679. * ------------ RectFill(Left, Top, Right, Bottom)
  2680.            MOVEA.L     A5,A1
  2681.            MOVE.L     D7,D0
  2682.            MOVE.L     D6,D1
  2683.            JSR     _LVORectFill(A6)
  2684.  
  2685. * ------------ SetAfPt(NormalPattern, 1)
  2686.            LEA     _NormalPattern(PC),A0
  2687.            MOVE.L     A0,_Rp+rp_AreaPtrn(A4)
  2688.  
  2689. *******************************************
  2690. * D2 = Right                  *
  2691. * D3 = Bottom             A3 = Item      *
  2692. * D4 = ItemTop             A5 = Rp      *
  2693. * D6 = Top             A6 = GfxBase *
  2694. * D7 = Left                  *
  2695. *******************************************
  2696. * ------------ SubItem ?
  2697. SubItem:       TST.L     mi_SubItem(A3)
  2698.            BEQ.B     DrawDone
  2699.  
  2700. * ------------ Option & SUBITEMPOINTER
  2701.            BTST     #SUBITEMPOINTER,_Options(A4)
  2702.            BEQ.B     DrawDone
  2703.  
  2704. * ------------ DrawImage(&MySubItemImage[ScreenType],Right,ItemTop);
  2705.            LEA     _MySubItemImage(PC),A1
  2706.            MOVE.L     D2,D0
  2707.            BSR.B     DrawMyImage
  2708.  
  2709. DrawDone:      ADDQ.L     #4,SP
  2710.  
  2711.            MOVEM.L     (SP)+,D2-D7/A2-A3/A5-A6
  2712.            RTS
  2713.  
  2714. ******************************
  2715. * DrawMyImage             *
  2716. * A1 - What to draw         *
  2717. * A5 - Rp             *
  2718. * D0 - Left             *
  2719. * D4 - Top             *
  2720. *                 *
  2721. * Destroyed: D0-D1/A0-A1/A6  *
  2722. ******************************
  2723. DrawMyImage:   TST.W     _ScreenType(A4)
  2724.            BEQ.B     1$
  2725.            MOVEQ.L     #ig_SIZEOF,D1
  2726.            ADDA.L     D1,A1
  2727.  
  2728. 1$           MOVEA.L     A5,A0
  2729.            MOVE.L     D4,D1
  2730.            MOVEA.L     _IntuitionBase(A4),A6
  2731.            JMP     _LVODrawImage(A6)
  2732.  
  2733. ***************************************************
  2734. * HighLightItem(Window, Mode)                     *
  2735. *                          *
  2736. * Input:                      *
  2737. *   Window     -  Data for the window to draw in. *
  2738. *   Mode.W     -  HIGHLIGHTON or HIGHLIGHTOFF.      *
  2739. * Output:                      *
  2740. *   return     -  TRUE if item highlighted      *
  2741. *          (may be HIGHNONE)               *
  2742. ***************************************************
  2743. @HighLightItem:
  2744.            MOVEM.L     D2-D5/A2-A3/A5-A6,-(SP)
  2745.  
  2746.            MOVEA.L     wwd_Current(A0),A3
  2747.  
  2748. * ------------ Possible to highlight item ?
  2749.            MOVEQ.L     #ITEMENABLED,D1
  2750.            AND.W     mi_Flags(A3),D1
  2751.            BEQ.B     1$              * No
  2752.  
  2753.            TST.W     wwd_ItemsEnabled(A0)
  2754.            BNE.B     15$              * Yes
  2755.  
  2756. * ------------ return FALSE
  2757. 1$           MOVEQ.L     #FALSE,D0
  2758.            BRA.W     HighLightQuit
  2759.  
  2760. * ------------ start highlighting
  2761. 15$           MOVEA.L     A0,A2
  2762.  
  2763. * ------------ Start highlighting.
  2764.            LEA     _Rp(A4),A5
  2765.            MOVEA.L     _GfxBase(A4),A6
  2766.  
  2767. * ------------ Set or clear HIGHITEM flag
  2768.            MOVE.W     mi_Flags(A3),D5
  2769.            BCLR     #HIGHITEMBIT,D5
  2770.  
  2771. * ------------ Mode = !Mode
  2772.            MOVEQ.L     #1,D1
  2773.            ADDQ.W     #1,D0
  2774.            AND.W     D1,D0
  2775.  
  2776. * ------------ !Mode = HIGHLIGHTOFF ?
  2777.            BEQ.B     2$           * Yes
  2778.  
  2779.            BSET     #HIGHITEMBIT,D5
  2780.  
  2781. 2$           MOVE.W     D5,mi_Flags(A3)
  2782. ***********************************************
  2783. * D0 = !Mode              A0 = Window     *
  2784. * D5 = Window.Current.Flags   A2 = Window     *
  2785. *                  A3 = Item       *
  2786. *                  A5 = Rp          *
  2787. *                  A6 = GfxBase    *
  2788. ***********************************************
  2789.            AND.W     #HIGHFLAGS,D5
  2790.            BNE.B     NotHighImage
  2791.  
  2792. * ------------ DrawMenuItem(Window, Item, !Mode);
  2793. HighImage:     MOVEA.L     A3,A1
  2794.            JSR     @DrawMenuItem(PC)
  2795.            BRA.B     HighlightDone
  2796.  
  2797. * ------------ SetDrMd(COMPLEMENT)
  2798. NotHighImage:  MOVEQ.L     #RP_COMPLEMENT,D0
  2799.            MOVEA.L     A5,A1
  2800.            JSR     _LVOSetDrMd(A6)
  2801.  
  2802. * ------------ Left   = Item->LeftEdge - Window->LeftValue
  2803.            MOVE.W     mi_LeftEdge(A3),D0
  2804.            SUB.W     wwd_LeftValue(A2),D0
  2805.            EXT.L     D0
  2806.  
  2807. * ------------ Right  = Left + Item->Width - 1
  2808.            MOVE.W     mi_Width(A3),D2
  2809.            EXT.L     D2
  2810.            ADD.L     D0,D2
  2811.            SUBQ.L     #1,D2
  2812.  
  2813. * ------------ Top    = Item->TopEdge - Window->TopValue
  2814.            MOVE.W     mi_TopEdge(A3),D1
  2815.            SUB.W     wwd_TopValue(A2),D1
  2816.            EXT.L     D1
  2817.  
  2818. * ------------ Bottom = Top + Item->Height - 1
  2819.            MOVE.W     mi_Height(A3),D3
  2820.            EXT.L     D3
  2821.            ADD.L     D1,D3
  2822.            SUBQ.L     #1,D3
  2823.  
  2824.            MOVEA.L     A5,A1
  2825.  
  2826. ***********************************
  2827. * D0 = Left              *
  2828. * D1 = Top              *
  2829. * D2 = Right              *
  2830. * D3 = Bottom       A5 = Rp      *
  2831. * D5 = HighFlags   A6 = GfxBase   *
  2832. ***********************************
  2833. * ------------ Check out kind of highlighting.
  2834.            CMPI.W     #HIGHBOX,D5
  2835.            BEQ.B     HighBox
  2836.            CMPI.W     #HIGHCOMP,D5
  2837.            BNE.B     HighlightDone
  2838.  
  2839. * ------------ RectFill(Left, Top, Right, Bottom)
  2840. HighComp:      JSR     _LVORectFill(A6)
  2841.            BRA.B     HighlightDone
  2842.  
  2843. * ------------ DrawRect(Left-4, Top-2, Right + 4, Bottom + 2)
  2844. HighBox:       SUBQ.L     #4,D0
  2845.            SUBQ.L     #2,D1
  2846.            ADDQ.L     #4,D2
  2847.            ADDQ.L     #2,D3
  2848.            JSR     @DrawRect(PC)
  2849.            JSR     @DrawRect(PC)
  2850.  
  2851. * ------------ return TRUE
  2852. HighlightDone: MOVEQ.L     #TRUE,D0
  2853. HighLightQuit: MOVEM.L     (SP)+,D2-D5/A2-A3/A5-A6
  2854.            RTS
  2855.  
  2856. *********************************************
  2857. * ToggleMenu(Number,Menu)                   *
  2858. *                        *
  2859. * Input:                    *
  2860. *   Number.W -    Menu to highlight.        *
  2861. *   Menu   - Pointer to the Menu structure. *
  2862. * Output:                    *
  2863. *   none                    *
  2864. *********************************************
  2865. @ToggleMenu:   MOVEM.L     D2-D3/A6,-(SP)
  2866.  
  2867. * ------------ Menu enabled ?
  2868.            MOVEQ.L     #MENUENABLED,D2
  2869.            AND.W     mu_Flags(A0),D2
  2870.            BEQ.B     ToggleDone
  2871.  
  2872.            MOVE.W     D0,D3
  2873.  
  2874. * ------------ Set drawmode = COMPLEMENT.
  2875.            LEA     _Rp(A4),A1
  2876.            MOVEQ     #RP_COMPLEMENT,D0
  2877.            MOVEA.L     _GfxBase(A4),A6
  2878.            JSR     _LVOSetDrMd(A6)
  2879.  
  2880. * ------------ Invert menu.
  2881. * ------------ Bottom = Number * MenuFontSize + MenuWindow.TopEdge.
  2882.            MOVE.W     _MenuFontSize(A4),D2
  2883.            MULU.W     D2,D3
  2884.            ADD.W     _MenuWindow+wwd_TopEdge(A4),D3
  2885.  
  2886. * ------------ Top = Bottom - MenuFontSize + HBORDERSIZE.
  2887.            MOVE.L     D3,D1
  2888.            SUB.L     D2,D1
  2889.            ADDQ.L     #HBORDERSIZE,D1
  2890.  
  2891. * ------------ Left = MenuWindow.LeftEdge + VBORDERSIZE.
  2892.            MOVEQ.L     #VBORDERSIZE,D0
  2893.            ADD.W     _MenuWindow+wwd_LeftEdge(A4),D0
  2894.  
  2895. * ------------ Right = MenuWindow.RightEdge - VBORDERSIZE.
  2896.            MOVE.W     _MenuWindow+wwd_RightEdge(A4),D2
  2897.            SUBQ.L     #VBORDERSIZE,D2
  2898.  
  2899.            LEA     _Rp(A4),A1
  2900.            JSR     _LVORectFill(A6)
  2901.  
  2902. ToggleDone:    MOVEM.L     (SP)+,D2-D3/A6
  2903.            RTS
  2904.  
  2905. ************************
  2906. * DrawAllMenus(Window) *
  2907. *               *
  2908. ************************
  2909. @DrawAllMenues:
  2910.            MOVEM.L     D2-D4/D7/A2-A3/A5-A6,-(SP)
  2911.  
  2912. * ------------ MenuLeft = Window.LeftEdge + VBORDERSIZE
  2913.            MOVE.W     wwd_LeftEdge(A0),D7                * 4.0
  2914.            ADDQ.W     #VBORDERSIZE,D7
  2915.            EXT.L     D7
  2916.  
  2917. * ------------ MenuTop = Window.TopEdge
  2918.            MOVE.W     wwd_TopEdge(A0),D3                 * 4.0
  2919.            EXT.L     D3
  2920.  
  2921. * ------------ MenuRight = Window.RightEdge - VBORDERSIZE
  2922.            MOVE.W     wwd_RightEdge(A0),D2               * 4.0
  2923.            SUBQ.W     #VBORDERSIZE,D2
  2924.            EXT.L     D2
  2925.  
  2926. * ------------ MenuPtr = MenuSorted;
  2927.            MOVEA.L     _MenuSorted(A4),A3
  2928.            MOVEA.L     _ActiveWindow(A4),A2
  2929.            LEA     _Rp(A4),A5
  2930.            MOVEA.L     _GfxBase(A4),A6
  2931.  
  2932. ****************************************
  2933. * D2 = MenuRight     A2 = ActiveWindow *
  2934. * D3 = MenuTop         A3 = MenuPtr      *
  2935. * D7 = MenuLeft      A5 = Rp           *
  2936. *             A6 = GfxBase      *
  2937. ****************************************
  2938. * ------------ MenuTopOld = MenuTop;
  2939. NextMenu:      MOVE.L     D3,D4
  2940.  
  2941. * ------------ MenuTop += MenuFontSize;
  2942.            ADD.W     _MenuFontSize(A4),D3
  2943.  
  2944. * ------------ SetAPen(Rp,ActiveWindow->DetailPen)
  2945.            MOVEQ.L     #0,D0
  2946.            MOVE.B     wd_DetailPen(A2),D0
  2947.            MOVEA.L     A5,A1
  2948.            JSR     _LVOSetAPen(A6)
  2949.  
  2950. * ------------ Move(Rp, MenuLeft, MenuTop - 1)
  2951.            MOVE.L     D7,D0
  2952.            MOVE.L     D3,D1
  2953.            SUBQ.L     #1,D1
  2954.            MOVEA.L     A5,A1
  2955.            JSR     _LVOMove(A6)
  2956.  
  2957. * ------------ Text(Rp,MenuSorted->MenuPtr->MenuName,Mystrlen(MenuSorted->MenuPtr->MenuName))
  2958.            MOVE.L     ms_MenuPtr(A3),A0
  2959.            MOVEA.L     mu_MenuName(A0),A0
  2960.            MOVE.L     A0,-(SP)
  2961.            JSR     @Mystrlen(PC)
  2962.            MOVEA.L     A5,A1
  2963.            MOVEA.L     (SP)+,A0
  2964.            JSR     _LVOText(A6)
  2965.  
  2966. * ------------ GhostItem ?
  2967.            MOVEQ.L     #MENUENABLED,D0
  2968.            MOVE.L     ms_MenuPtr(A3),A0
  2969.            AND.W     mu_Flags(A0),D0
  2970.            BNE.B     NoMenuGhost
  2971.  
  2972. * ------------ SetAfPt(Rp, GhostPattern, 1)
  2973.            LEA     _GhostPattern(PC),A0
  2974.            MOVE.L     A0,_Rp+rp_AreaPtrn(A4)
  2975.  
  2976.            MOVE.B     #1,_Rp+rp_AreaPtSz(A4)
  2977.  
  2978. * ------------ SetAPen(Rp,ActiveWindow->BlockPen)
  2979.            MOVE.B     wd_BlockPen(A2),D0
  2980.            MOVEA.L     A5,A1
  2981.            JSR     _LVOSetAPen(A6)
  2982.  
  2983. * ------------ RectFill(Rp,MenuLeft,MenuTopOld + HBORDERSIZE,MenuRight,MenuTop)
  2984.            MOVE.L     D7,D0
  2985.            MOVE.L     D4,D1
  2986.            ADDQ.W     #HBORDERSIZE,D1
  2987.            MOVEA.L     A5,A1
  2988.            JSR     _LVORectFill(A6)
  2989.  
  2990. * ------------ SetAfPt(&Rp,NormalPattern,1);
  2991.            LEA     _NormalPattern(PC),A0
  2992.            MOVE.L     A0,_Rp+rp_AreaPtrn(A4)
  2993.  
  2994. * ------------ MenuSaved = MenuSaved->Next
  2995. NoMenuGhost:   MOVEA.L     (A3),A3        * ms_Next(A3)
  2996.  
  2997. * ------------ More menues ?
  2998.            MOVE.L     A3,D0
  2999.            BNE.B     NextMenu
  3000.  
  3001.            MOVEM.L     (SP)+,D2-D4/D7/A2-A3/A5-A6
  3002.            RTS
  3003.  
  3004. **********************************************
  3005. * DrawRect(Rp,Left+2,Top+1,Right-2,Bottom-1) *
  3006. *       A1    D0   D1     D2         D3      *
  3007. **********************************************
  3008. @DrawRect:     MOVEM.L     D4-D5/A5-A6,-(SP)
  3009.  
  3010.            MOVE.L     D0,D4
  3011.            MOVE.L     D1,D5
  3012.            MOVEA.L     A1,A5
  3013.            MOVEA.L     _GfxBase(A4),A6
  3014.  
  3015. * ------------ Move(Rp,Left,Top)
  3016.            JSR     _LVOMove(A6)
  3017.  
  3018. * ------------ Draw(Rp,Left++,Bottom)
  3019.            MOVE.L     D4,D0
  3020.            MOVE.L     D3,D1
  3021.            MOVEA.L     A5,A1
  3022.            JSR     _LVODraw(A6)
  3023.            ADDQ.L     #1,D4
  3024.  
  3025. * ------------ Draw(Rp,Right,Bottom--)
  3026.            MOVE.L     D2,D0
  3027.            MOVE.L     D3,D1
  3028.            MOVEA.L     A5,A1
  3029.            JSR     _LVODraw(A6)
  3030.            SUBQ.L     #1,D3
  3031.  
  3032. * ------------ Draw(Rp,Right--,Top)
  3033.            MOVE.L     D2,D0
  3034.            MOVE.L     D5,D1
  3035.            MOVEA.L     A5,A1
  3036.            JSR     _LVODraw(A6)
  3037.            SUBQ.L     #1,D2
  3038.  
  3039. * ------------ Draw(Rp,Left,Top++)
  3040.            MOVE.L     D4,D0
  3041.            MOVE.L     D5,D1
  3042.            MOVEA.L     A5,A1
  3043.            JSR     _LVODraw(A6)
  3044.            ADDQ.L     #1,D5
  3045.  
  3046. * ------------ Draw(Rp,Left++,Bottom)
  3047.            MOVE.L     D4,D0
  3048.            MOVE.L     D3,D1
  3049.            MOVEA.L     A5,A1
  3050.            JSR     _LVODraw(A6)
  3051.            ADDQ.L     #1,D4
  3052.  
  3053. * ------------ Move(Rp,Right,Bottom)
  3054.            MOVE.L     D2,D0
  3055.            MOVE.L     D3,D1
  3056.            MOVEA.L     A5,A1
  3057.            JSR     _LVOMove(A6)
  3058.  
  3059. * ------------ Draw(Rp,Right--,Top)
  3060.            MOVE.L     D2,D0
  3061.            MOVE.L     D5,D1
  3062.            MOVEA.L     A5,A1
  3063.            JSR     _LVODraw(A6)
  3064.            SUBQ.L     #1,D2
  3065.  
  3066.            MOVE.L     D4,D0
  3067.            MOVE.L     D5,D1
  3068.            MOVEM.L     (SP)+,D4-D5/A5-A6
  3069.            RTS
  3070.  
  3071. * Put these images in the code segment
  3072.  
  3073. _MyAmigaKeyImage:
  3074.            dc.w     -25,0,23,8,1
  3075.            dc.l     _AmigaKeyHighRes
  3076.            dc.b     1,0
  3077.            dc.l     0
  3078.            dc.w     -16,0,14,8,1
  3079.            dc.l     _AmigaKeyLoRes
  3080.            dc.b     1,0
  3081.            dc.l     0
  3082. _MySubItemImage:
  3083.            dc.w     2,0,8,7,1
  3084.            dc.l     _SubItemPointerH
  3085.            dc.b     1,0
  3086.            dc.l     0
  3087.            dc.w     1,0,4,7,1
  3088.            dc.l     _SubItemPointerL
  3089.            dc.b     1,0
  3090.            dc.l     0
  3091.  
  3092. _GhostPattern:    dc.w      $1111,$4444
  3093. _NormalPattern: dc.w      $ffff,$ffff
  3094.  
  3095.            SECTION ImageData,DATA_C
  3096.  
  3097. _AmigaKeyHighRes:
  3098.            dc.l    %11000000000000000000011000000000
  3099.            dc.l    %00000000000000111100000000000000
  3100.            dc.l    %00000000000011111100000000000000
  3101.            dc.l    %00000000001110011100000000000000
  3102.            dc.l    %00000000111000011100000000000000
  3103.            dc.l    %00000011111111111100000000000000
  3104.            dc.l    %00011111100000111111000000000000
  3105.            dc.l    %11000000000000000000011000000000
  3106.  
  3107. _AmigaKeyLoRes:
  3108.            dc.w    %1000000000000100
  3109.            dc.w    %0000000011100000
  3110.            dc.w    %0000000111100000
  3111.            dc.w    %0000001101100000
  3112.            dc.w    %0000011001100000
  3113.            dc.w    %0000111111100000
  3114.            dc.w    %0011110011110000
  3115.            dc.w    %1000000000000100
  3116.  
  3117. _SubItemPointerL:
  3118.            dc.w    %0111000000000000
  3119.            dc.w    %0011000000000000
  3120.            dc.w    %0001000000000000
  3121.            dc.w    %0000000000000000
  3122.            dc.w    %0001000000000000
  3123.            dc.w    %0011000000000000
  3124.            dc.w    %0111000000000000
  3125.  
  3126. _SubItemPointerH:
  3127.            dc.w    %0011111100000000
  3128.            dc.w    %0000111100000000
  3129.            dc.w    %0000001100000000
  3130.            dc.w    %0000000000000000
  3131.            dc.w    %0000001100000000
  3132.            dc.w    %0000111100000000
  3133.            dc.w    %0011111100000000
  3134.            END
  3135.  
  3136.