	       opt	  l+,c+,d+,y+
	       opt	  ow1+,ow2+,ow3+,ow4+,ow5+,ow6+

	       INCDIR ":Pspråk/asm/include/"

	       INCLUDE	  "exec/types.i"
	       INCLUDE	  "PopUpMenu.i"

	       xref	  @FixDown	 * In overlay root
	       xref	  @QueTimer	 * In overlay root
	       xref	  @Mystrlen	 * In overlay root

	       xref	  _PopUpSemaphore

	       xdef	  @PopUpMenu


VBORDERSIZE    EQU	  4
HBORDERSIZE    EQU	  2
OVERLAP        EQU	  8
POPUPMENUDONE  EQU	  0
NULL	       EQU	  0
MENUNULL       EQU	 -1
ITEMWINDOW     EQU	  0
ITEMFILL       EQU	  0
WORD_MAX       EQU	  $7fff
WORD_MIN       EQU	  $8000

	       section	  text,code
**********************************************
* PopUpMenu(InputSignals)   (A3)             *
*					     *
* Input:				     *
*   InputSignals  - Inputhandler signals.    *
* Output:				     *
*   none				     *
* Functions:				     *
*   FindWindow, InitGlobals, OpenMenuWindow, *
*   QueTimer, SelectItem, FinalSelect,	     *
*   SwapBits, FindWindow, RemoveBitMap,      *
*   CloseItemWindow, TellWindow 	     *
**********************************************
@PopUpMenu:    MOVEM.L	 D2-D7/A2-A3/A5-A6,-(SP)

* ------------ ObtainSemaphore(&PopUpSemaphore)
	       LEA	 _PopUpSemaphore,A0
	       MOVEA.L	 (A4),A6       * SysBase
	       JSR	 _LVOObtainSemaphore(A6)

* ------------ Is Window still open ?
	       JSR	 @FindWindow(PC)
	       TST.W	 D0
	       BEQ.W	 Abort

* ------------ Lock the screen.
	       MOVEA.L	 _Screen(A4),A2
	       ADDA.W	 #sc_LayerInfo,A2
	       MOVEA.L	 A2,A0
	       MOVEA.L	 _LayersBase(A4),A6
	       JSR	 _LVOLockLayers(A6)

* ------------ Init the global variables
* ------------ Menues = ActiveWindow->MenuStrip
	       MOVEA.L	 _ActiveWindow(A4),A0
	       MOVE.L	 wd_MenuStrip(A0),_Menues(A4)

* ------------ ActiveWindow->Flags |= MENUSTATE
	       BSET	 #MENUSTATEBIT,wd_Flags+2(A0)

* ------------ ItemWindow.BitMapOk = FALSE
	       MOVEQ.L	 #FALSE,D0
	       MOVE.W	 D0,_ItemWindow+wwd_BitMapOk(A4)

* ------------ SubWindow.BitMapOk = FALSE
	       MOVE.W	 D0,_SubWindow+wwd_BitMapOk(A4)

* ------------ MenuWindow.BitMapOk = FALSE
	       MOVE.W	 D0,_MenuWindow+wwd_BitMapOk(A4)

* ------------ CurrentMenuNr = 0
	       MOVE.W	 D0,_CurrentMenuNr(A4)

* ------------ MenuWindow.Current = NULL
	       MOVE.L	 D0,_MenuWindow+wwd_Current(A4)

* ------------ ItemWindow.Current = NULL
	       MOVE.L	 D0,_ItemWindow+wwd_Current(A4)

* ------------ SubWindow.Current = NULL
	       MOVE.L	 D0,_SubWindow+wwd_Current(A4)

* ------------ ScreenType = (Screen->ViewPort.Modes & HIRES) == 0
	       MOVEA.L	 _Screen(A4),A5
	       BTST	 #7,sc_ViewPort+vp_Modes(A5)  ********************
	       BNE.B	 1$
	       MOVEQ.L	 #TRUE,D0
1$	       MOVE.W	 D0,_ScreenType(A4)

* ------------ InitRastPort(&Rp)
	       LEA	 _Rp(A4),A1
	       MOVEA.L	 _GfxBase(A4),A6
	       JSR	 _LVOInitRastPort(A6)

* ------------ SetFont(&Rp,Screen->RastPort.Font)
	       LEA	 _Rp(A4),A1
	       MOVEA.L	 sc_RastPort+rp_Font(A5),A0
	       JSR	 _LVOSetFont(A6)

* ------------ Rp.BitMap = &Screen->BitMap
	       ADDA.W	 #sc_BitMap,A5
	       MOVE.L	 A5,_Rp+rp_BitMap(A4)

* ------------ MenuFontSize = Rp.TxHeight + 2
	       MOVE.W	 _Rp+rp_TxHeight(A4),D0
	       ADDQ.W	 #2,D0
	       MOVE.W	 D0,_MenuFontSize(A4)

* ------------ Any menues at all ?
	       TST.L	 _Menues(A4)
	       BEQ.W	 NoMenues

* ------------ Same menues as last time ?
	       MOVEQ.L	 #0,D0
	       MOVEA.L	 _ActiveWindow(A4),A0
	       CMPA.L	 _LastWindow(A4),A0
	       BNE.B	 OpenMenues

* ------------ Yes: Start at last menu selection.
	       MOVE.W	 _LastSelectedNum(A4),D0
	       BEQ.B	 OpenMenues
	       SUBQ.W	 #1,D0
	       MULU.W	 _MenuFontSize(A4),D0

* ------------ Open the menues.
OpenMenues:    JSR	 @OpenMenuWindow(PC)
	       TST.W	 D0
	       BEQ.W	 NoMenues

* ------------ MenuButtonSignals = MenuUpSig | MenuDownSig
	       MOVE.L	 sd_MenuUpSig(A3),D6
	       OR.L	 sd_MenuDownSig(A3),D6

* ------------ MouseMovedSignal = MouseMovedSig
	       MOVE.L	 sd_MouseMovedSig(A3),D5

* ------------ ButtonSignals = MenuButtonSignals | SelectDownSig
	       MOVE.L	 D6,D4
	       OR.L	 sd_SelectDownSig(A3),D4

* ------------ Waiting = FALSE
	       MOVEQ.L	 #FALSE,D3

* ------------ No selections done so far.
* ------------ MenuNumber = LastSelected = MENUNULL;
	       MOVEQ.L	 #MENUNULL,D7
	       MOVE.W	 D7,_LastSelected(A4)

* ------------ Clear old timermessages and set mousemoved signal.
* ------------ SetSignal(MouseMovedSignal,TimerSignal | MouseMovedSignal)
	       MOVE.L	 D5,D0
	       MOVE.L	 _TimerSignal(A4),D1
	       OR.L	 D5,D1
	       MOVEA.L	 (A4),A6       * SysBase
	       JSR	 _LVOSetSignal(A6)

* ------------ Is the timer already running.
* ------------ CheckIO(TimerReqBlock)
	       MOVEA.L	 _TimerReqBlock(A4),A1
	       JSR	 _LVOCheckIO(A6)
	       TST.L	 D0
	       BNE.B	 IOReady

* ------------ Yes: wait for the time.
* ------------ WaitIO(TimerReqBlock)
	       MOVEA.L	 _TimerReqBlock(A4),A1
	       JSR	 _LVOWaitIO(A6)

* ------------ Remove the message.
	       MOVEA.L	 _TimerPort(A4),A0
	       JSR	 _LVOGetMsg(A6)

* ------------ Start up the timer.
IOReady:       JSR	 @QueTimer(PC)

* ------------ Main loop starts here.
* ------------ SignalBits = Wait(MouseMovedSignal | ButtonSignals | TimerSignal)
WaitNextSig:   MOVE.L	 D5,D0
	       OR.L	 D4,D0
	       OR.L	 _TimerSignal(A4),D0
	       MOVEA.L	 (A4),A6       * SysBase
	       JSR	 _LVOWait(A6)
	       MOVE.L	 D0,D2

	       MOVEA.L	 _Screen(A4),A0
*********************************************
* D0 = SignalBits	  A2 = LayerInfo    *
* D2 = SignalBits	  A3 = InputSignals *
* D3 = Waiting		  A6 = ExecBase     *
* D4 = ButtonSignals	  A0 = Screen	    *
* D5 = MouseMovedSignal 		    *
* D6 = MenuButtonSignal 		    *
* D7 = MenuNumber			    *
*********************************************
* ------------ Mouse moved or Button pressed ?
	       MOVE.L	 D5,D1
	       OR.L	 D4,D1
	       AND.L	 D0,D1
	       BEQ.W	 NoButton      * No

* ------------ Waiting = FALSE
	       MOVEQ.L	 #FALSE,D3

* ------------ Clickmenues ?
	       BTST	 #CLICKMENUES,_Options(A4)
	       BEQ.B	 CheckMove     * No

* ------------ Select button pressed ?
	       MOVE.L	 sd_SelectDownSig(A3),D1
	       AND.L	 D1,D0
	       BEQ.B	 CheckButtons  * No

* ------------ Clear select button signal.
	       EOR.L	 D1,D2

* ------------ Do selection.
	       MOVE.W	 sc_MouseX(A0),_MouseX(A4)
	       MOVE.W	 sc_MouseY(A0),_MouseY(A4)

* ------------ SelectItem() == TRUE ?
	       JSR	 @SelectItem(PC)
	       TST.W	 D0
	       BEQ.B	 CheckButtons  * No

* ------------ MenuNumber = LastSelected = FinalSelect()
	       JSR	 @FinalSelect(PC)
	       MOVE.W	 D0,D7
	       MOVE.W	 D0,_LastSelected(A4)
	       BRA.W	 NoMoreSel

* ------------ MouseX = Screen->MouseX
* ------------ MouseY = Screen->MouseY
CheckMove:     MOVE.W	 sc_MouseX(A0),D0
	       MOVE.W	 sc_MouseY(A0),D1
	       CMP.W	 _MouseX(A4),D0
	       BNE.B	 MouseMoved
	       CMP.W	 _MouseY(A4),D1
	       BEQ.B	 CheckButtons

MouseMoved:    MOVE.W	 D0,_MouseX(A4)
	       MOVE.W	 D1,_MouseY(A4)

* ------------ Select the item under the mousepointer.
	       JSR	 @SelectItem(PC)

* ------------ Any button pressed ?
CheckButtons:  MOVE.L	 D2,D0
	       AND.L	 D4,D0
	       BEQ.B	 NoButton

* ------------ Find MENUPICK value for selected item.
	       JSR	 @FinalSelect(PC)

* ------------ Something selected ?  (New 4.1)
	       CMPI.W	 #MENUNULL,D0
	       BEQ.B	 NotSelected

	       MOVE.W	 D4,-(SP)
	       MOVE.W	 D0,D4

	       MOVE.W	 _LastSelected(A4),D1
**********************************************
* D0 = Selected 	   A2 = LayerInfo    *
* D1 = LastSelected	   A3 = InputSignals *
* D2 = SignalBits	   A6 = ExecBase     *
* D3 = Waiting				     *
* D4 = Selected 			     *
* D5 = MouseMovedSignal 		     *
* D6 = MenuButtonSignal 		     *
* D7 = MenuNumber			     *
**********************************************
* ------------ Same item selected as last time ?
	       CMP.W	 D0,D1
	       BEQ.B	 SameItem

* ------------ First selection ?
	       CMPI.W	 #MENUNULL,D7
	       BNE.B	 MultipSelect

* ------------ MenuNumber = Selected
	       MOVE.W	 D4,D7
	       BRA.B	 SelectionDone

* ------------ ItemAddress(Menues,LastSelected)->NextSelect = Selected
MultipSelect:  MOVEQ.L	 #0,D0
	       MOVE.W	 D1,D0
	       MOVEA.L	 _Menues(A4),A0
	       MOVEA.L	 _IntuitionBase(A4),A6
	       JSR	 _LVOItemAddress(A6)
	       MOVEA.L	 D0,A0
	       MOVE.W	 D4,mi_NextSelect(A0)

* ------------ LastSelected = Selected
SelectionDone: MOVE.W	 D4,_LastSelected(A4)
SameItem:      MOVE.W	 (SP)+,D4

* ------------ Selected with menubutton ?
NotSelected:   MOVE.L	 D2,D0
	       AND.L	 D6,D0
	       BNE.W	 NoMoreSel

********************************************
* D2 = SignalBits	 A2 = LayerInfo    *
* D3 = Waiting		 A3 = InputSignals *
* D4 = ButtonSignals			   *
* D5 = MouseMovedSignal 		   *
* D6 = MenuButtonSignal 		   *
* D7 = MenuNumber			   *
********************************************
* ------------ Timer ?
NoButton:      MOVE.L	 D2,D0
	       AND.L	 _TimerSignal(A4),D0
	       BEQ.W	 WaitNextSig

* ------------ Remove the message.
	       MOVEA.L	 _TimerPort(A4),A0
	       MOVEA.L	 (A4),A6       * SysBase
	       JSR	 _LVOGetMsg(A6)

* ------------ 2 TimerSignals in a row ?
	       TST.W	 D3
	       BEQ.B	 NoLockUp

* ------------ The input.device has stopped.
* ------------ Remove everything from the screen.
	       LEA	 _SubWindow(A4),A0
	       JSR	 @SwapBits(PC)
	       LEA	 _ItemWindow(A4),A0
	       JSR	 @SwapBits(PC)
	       LEA	 _MenuWindow(A4),A0
	       JSR	 @SwapBits(PC)

* ------------ Unlock the screen.
	       MOVEA.L	 A2,A0
	       MOVEA.L	 _LayersBase(A4),A6
	       JSR	 _LVOUnlockLayers(A6)

* ------------ Wait for the input.device.
	       MOVE.L	 D5,D0
	       MOVEA.L	 (A4),A6       * SysBase
	       JSR	 _LVOWait(A6)

* ------------ Is the window still open ?
	       JSR	 @FindWindow(PC)
	       TST.W	 D0
	       BNE.B	 OKToLock

* ------------ No: the window is gone. Abort.
	       LEA	 _SubWindow(A4),A0
	       JSR	 @RemoveBitMap(PC)
	       LEA	 _ItemWindow(A4),A0
	       JSR	 @RemoveBitMap(PC)
	       LEA	 _MenuWindow(A4),A0
	       JSR	 @RemoveBitMap(PC)
	       BRA.B	 Abort

* ------------ Lock the screen again.
OKToLock:      MOVEA.L	 A2,A0
	       MOVEA.L	 _LayersBase(A4),A6
	       JSR	 _LVOLockLayers(A6)

* ------------ Put everything back on the screen.
	       LEA	 _MenuWindow(A4),A0
	       JSR	 @SwapBits(PC)
	       LEA	 _ItemWindow(A4),A0
	       JSR	 @SwapBits(PC)
	       LEA	 _SubWindow(A4),A0
	       JSR	 @SwapBits(PC)

* ------------ Start a new timer.
NoLockUp:      JSR	 @QueTimer(PC)

* ------------ Waiting = !Waiting
	       NEG.W	 D3	       * 3.7
	       ADDQ.W	 #1,D3	       * 3.7
	       BRA.W	 WaitNextSig

* ------------ Selections done.
* ------------ Close all windows.
NoMoreSel:     JSR	 @CloseSubWindow(PC)
	       JSR	 @CloseItemWindow(PC)
	       JSR	 @CloseMenuWindow(PC)

* ------------ Remember the selection for next time.
NoMenues:      MOVEA.L	 _ActiveWindow(A4),A0
	       MOVE.L	 A0,_LastWindow(A4)

* ------------ ActiveWindow->Flags &= ~MENUSTATE
	       BCLR	 #MENUSTATEBIT,wd_Flags+2(A0)

* ------------ Unlock the screen.
	       MOVEA.L	 A2,A0
	       MOVEA.L	 _LayersBase(A4),A6
	       JSR	 _LVOUnlockLayers(A6)

* ------------ Tell the window the good news (MENUPICK).
	       MOVEA.L	 A3,A0
	       MOVE.L	 D7,D0
	       JSR	 @TellWindow(PC)

* ------------ ReleaseSemaphore(&PopUpSemaphore);
Abort:	       LEA	 _PopUpSemaphore,A0
	       MOVEA.L	 (A4),A6       * SysBase
	       JSR	 _LVOReleaseSemaphore(A6)

* ------------ FixDown(InputSignals)
	       MOVEA.L	 A3,A0
	       JSR	 @FixDown(PC)

* ------------ Free the sorted menulist 	 * New 3.42
	       LEA	 _SortRemember(A4),A0
	       MOVEQ.L	 #TRUE,D0
	       MOVEA.L	 _IntuitionBase(A4),A6
	       JSR	 _LVOFreeRemember(A6)

	       MOVEM.L	 (SP)+,D2-D7/A2-A3/A5-A6
	       RTS

************************************************
* FindMenuPtr(Number) - Find Menu structure.   *
*					       *
* Input:				       *
*   Number.W - Number of the menu to look for. *
* Output:				       *
*   return - Ptr to the Menu structure.        *
************************************************
@FindMenuPtr:	MOVEA.L   _MenuSorted+ms_Next(A4),A0

1$		SUBQ.W	  #1,D0
		BEQ.B	  2$

		MOVEA.L   (A0),A0     * ms_Next
		MOVE.L	  A0,D1
		BNE.B	  1$
		MOVEQ.L   #NULL,D0
		RTS

2$		MOVE.L	  ms_MenuPtr(A0),D0
		RTS

************************************************
* FindItemNr(Item,ItemList) - Find nr of item. *
*					       *
* Input:				       *
*   Item - Item to look for.		       *
*   ItemList - all items on same level.        *
* Output:				       *
*   return - Nr of Item.		       *
************************************************
* ------------ Count = 0
@FindItemNr:   MOVEQ.L	 #0,D0

* ------------ ItemList == NULL ?
1$	       MOVE.L	 A1,D1
	       BEQ.B	 2$

* ------------ ItemList == Item ?
	       CMPA.L	 A0,A1
	       BEQ.B	 3$

* ------------ Count++
	       ADDQ.W	 #1,D0

* ------------ ItemList = ItemList->NextItem
	       MOVEA.L	 (A1),A1
	       BRA.B	 1$

2$	       MOVEQ.L	 #NOITEM,D0
3$	       RTS

*************************************************
* FindWindow() - Check if window is still open. *
*						*
* Input:					*
*   none					*
* Output:					*
*   return  - TRUE if window is open.		*
*************************************************
@FindWindow:   MOVE.L	D2,-(SP)
	       MOVE.L	A6,-(SP)

* ------------ Lock = LockIBase(0)
	       MOVEQ.L	 #0,D0
	       MOVEA.L	 _IntuitionBase(A4),A6
	       JSR	 _LVOLockIBase(A6)

* ------------ TestScreen = IntuitionBase->FirstScreen
	       MOVEA.L	 ib_FirstScreen(A6),A0

* ------------ TestScreen == NULL ?
1$	       MOVE.L	 A0,D1
	       BEQ.B	 5$

* ------------ TestScreen == Screen ?
	       CMPA.L	 _Screen(A4),A0
	       BNE.B	 4$

* ------------ TestWindow = TestScreen->FirstWindow
	       MOVEA.L	 sc_FirstWindow(A0),A1

* ------------ TestWindow == NULL ?
2$	       MOVE.L	 A1,D1
	       BEQ.B	 5$

* ------------ TestWindow == ActiveWindow ?
	       CMPA.L	 _ActiveWindow(A4),A1
	       BNE.B	 3$

	       MOVEQ.L	 #TRUE,D2
	       BRA.B	 6$

* ------------ TestWindow = TestWindow->NextWindow
3$	       MOVEA.L	 (A1),A1
	       BRA.B	 2$

* ------------ TestScreen = TestScreen->NextScreen
4$	       MOVEA.L	 (A0),A0
	       BRA.B	 1$

5$	       MOVEQ.L	 #FALSE,D2

* ------------ UnlockIBase(Lock)
6$	       MOVEA.L	 D0,A0
	       JSR	 _LVOUnlockIBase(A6)

	       MOVE.L	 D2,D0

	       MOVEA.L	 (SP)+,A6
	       MOVE.L	 (SP)+,D2
	       RTS

***************************************************
* MouseInWindow(Window) - Is mouse inside window. *
*						  *
* Input:					  *
*   Window    - Window to check.		  *
* Output:					  *
*   return    - TRUE if mouse inside.		  *
***************************************************
@MouseInWindow:
	       MOVEQ.L	 #FALSE,D0

* ------------ MouseX > Window->LeftEdge ?
	       MOVE.W	 _MouseX(A4),D1
	       CMP.W	 wwd_LeftEdge(A0),D1
	       BLE.B	 1$

* ------------ MouseX < Window->RightEdge ?
	       CMP.W	 wwd_RightEdge(A0),D1
	       BGE.B	 1$

* ------------ MouseY > Window->TopEdge ?
	       MOVE.W	 _MouseY(A4),D1
	       CMP.W	 wwd_TopEdge(A0),D1
	       BLE.B	 1$

* ------------ MouseY < Window->Bottom ?
	       CMP.W	 wwd_Bottom(A0),D1
	       BGE.B	 1$

	       MOVEQ.L	 #TRUE,D0
1$	       RTS
****************************************************************
* FindMouseItem(Window) - Check if mouse inside an item.       *
*							       *
* Input:						       *
*   ItemWindow - Window with items			       *
* Output:						       *
*   return - Pointer to item under the mousepointer (or NULL). *
****************************************************************
@FindMouseItem:
	       MOVE.W	 D2,-(SP)

* ------------ MouseWinX = MouseX + Window->LeftValue
	       MOVE.W	 _MouseX(A4),D1
	       ADD.W	 wwd_LeftValue(A0),D1

* ------------ MouseWinY = MouseY + Window->TopValue
	       MOVE.W	 _MouseY(A4),D2
	       ADD.W	 wwd_TopValue(A0),D2

* ------------ Item = Window->Items
	       MOVEA.L	 wwd_Items(A0),A0

* ------------ MouseWinY >= Item->TopEdge ?
1$	       MOVE.W	 mi_TopEdge(A0),D0
	       CMP.W	 D0,D2
	       BLT.B	 2$

* ------------ MouseWinY <= Item->TopEdge + Item->Height ?
	       ADD.W	 mi_Height(A0),D0
	       CMP.W	 D0,D2
	       BGT.B	 2$

* ------------ MouseWinX >= Item->LeftEdge ?
	       MOVE.W	 mi_LeftEdge(A0),D0
	       CMP.W	 D0,D1
	       BLT.B	 2$

* ------------ MouseWinX <= Item->LeftEdge + Item->Width ?
	       ADD.W	 mi_Width(A0),D0
	       CMP.W	 D0,D1
	       BGT.B	 2$

* ------------ return Item.
	       MOVE.L	 A0,D0
	       BRA.B	 3$

* ------------ Try next item.
2$	       MOVEA.L	 (A0),A0
	       MOVE.L	 A0,D0
	       BNE.B	 1$

3$	       MOVE.W	(SP)+,D2
	       RTS

*********************************************************
* HighLightCurrItemBehind(Mode) - Highlight currentitem *
*				   behind subwindow.	*
* Input:						*
*   Mode.W - HIGHLIGHTON or HIGHLIGHTOFF.		*
* Output:						*
*   none						*
* Functions:						*
*   SwapBits, HighLightItem				*
*********************************************************
@HighLightCurrItemBehind:
	       MOVE.W	 D0,-(SP)

* ------------ SwapBits(SubWindow)
	       LEA	 _SubWindow(A4),A0
	       JSR	 @SwapBits(PC)

* ------------ HighLightItem(&ItemWindow,Mode)
	       MOVE.W	 (SP)+,D0
	       LEA	 _ItemWindow(A4),A0
	       JSR	 @HighLightItem(PC)

* ------------ SwapBits(SubWindow)
	       LEA	 _SubWindow(A4),A0
	       JSR	 @SwapBits(PC)

	       RTS

******************************************
* OpenMenuWindow(StartPos)               *
*					 *
* Input:				 *
*   StartPos  - Position from menutop.	 *
* Output:				 *
*   return    - TRUE if window opened.	 *
* Functions:				 *
*   Mystrlen, BuildBitMap, DrawAllMenues *
******************************************
@OpenMenuWindow:
	       MOVEM.L	 D4-D7/A3/A5,-(SP)
	       MOVE.W	 D0,D7

* ------------ Sort menues after their LeftEdge
	       JSR	 @SortMenues(PC)
	       TST.L	 D0
	       BEQ.W	 OpenMenuDone

	       MOVEA.L	 _GfxBase(A4),A6

* ------------ Just one menu ? (4.0)
	       MOVEA.L	 _Menues(A4),A3
	       TST.L	 mu_NextMenu(A3)
	       BNE.B	 2$		    * No

* ------------ Single menu name option set ?
	       BTST	 #SHOWSINGLEMENU,_Options(A4)
	       BNE.B	 2$		    * Yes

* ------------ ItemWindow.ItemsEnabled = Menues->Flags & MENUENABLED
	       LEA	 _ItemWindow(A4),A0
	       MOVEQ.L	 #MENUENABLED,D0
	       AND.W	 mu_Flags(A3),D0
	       MOVE.W	 D0,wwd_ItemsEnabled(A0)

* ------------ ItemWindow.Items = Menues->FirstItem
	       MOVE.L	 mu_FirstItem(A3),wwd_Items(A0)

* ------------ FindItemWinSize(ItemWindow, ITEMWINDOW)
	       MOVEQ.L	 #ITEMWINDOW,D0
	       JSR	 @FindItemWinSize(PC)

	       TST.L	 D0
	       BEQ.S	 2$		  * No items

* ------------ MenuWidth = Size.Right - Size.Left
	       MOVE.W	 _Size+ws_Right(A4),D6
	       SUB.W	 _Size+ws_Left(A4),D6

* ------------ Length = TextLength(&Rp,MenuPtr->MenuName,Mystrlen(MenuPtr->MenuName))
	       MOVEA.L	 mu_MenuName(A3),A0
	       JSR	 @Mystrlen(PC)
	       LEA	 _Rp(A4),A1
	       MOVEA.L	 mu_MenuName(A3),A0
	       JSR	 _LVOTextLength(A6)

* ------------ Length <= MenuWidth ?
	       CMP.W	 D0,D6
	       BGE.B	 1$		   * Yes

* ------------ Size.Right += Length - MenuWidth
	       MOVE.W	 _Size+ws_Right(A4),D1
	       ADD.W	 D0,D1
	       SUB.W	 D6,D1
	       MOVE.W	 D1,_Size+ws_Right(A4)

* ------------ MenuWidth = Length
	       MOVE.W	 D0,D6

* ------------ MenuWidth += 2 * VBORDERSIZE
1$	       ADDQ.W	 #2*VBORDERSIZE,D6

* ------------ MenuHeight = Size.Bottom - Size.Top + 2 * HBORDERSIZE + MenuFontSize
	       MOVE.W	 _Size+ws_Bottom(A4),D5
	       SUB.W	 _Size+ws_Top(A4),D5
	       ADDQ.W	 #2*HBORDERSIZE,D5
	       ADD.W	 _MenuFontSize(A4),D5

* ------------ MenuTop = 0
	       MOVEQ.L	 #0,D7

* ------------ Window = ItemWindow
	       LEA	 _ItemWindow(A4),A3
	       BRA.B	 PosLeft

* ------------ MenuWidth = 0
2$	       MOVEQ.L	 #0,D6

* ------------ MenuHeight = HBORDERSIZE + 1
	       MOVEQ.L	 #HBORDERSIZE+1,D5

****************************************
* Find width & height of window needed *
****************************************
***********************************
* D5 = MenuHeight    A3 = Menues  *
* D6 = MenuWidth     A6 = GfxBase *
* D7 = MenuTop			  *
***********************************
* ------------ Length = TextLength(&Rp,MenuPtr->MenuName,Mystrlen(MenuPtr->MenuName))
3$	       MOVEA.L	 mu_MenuName(A3),A0
	       JSR	 @Mystrlen(PC)
	       LEA	 _Rp(A4),A1
	       MOVEA.L	 mu_MenuName(A3),A0
	       JSR	 _LVOTextLength(A6)

* ------------ MenuPtr->Width > Length ?
	       MOVE.W	 mu_Width(A3),D1
	       CMP.W	 D0,D1
	       BLS.B	 4$	       * No

* ------------ Length = MenuPtr->Width
	       MOVE.L	 D1,D0

* ------------ Length > MenuWidth ?
4$	       CMP.W	 D6,D0
	       BLS.B	 5$	       * No

* ------------ MenuWidth = Length
	       MOVE.W	 D0,D6

* ------------ MenuHeight += MenuFontSize
5$	       ADD.W	 _MenuFontSize(A4),D5

* ------------ Check next menu.
	       MOVEA.L	 (A3),A3
	       MOVE.L	 A3,D0
	       BNE.B	 3$

* ------------ MenuWidth += (2 * VBORDERSIZE + 1)
	       ADDQ.W	 #2*VBORDERSIZE,D6
	       ADDQ.W	 #1,D6

* ------------ Window = MenuWindow
	       LEA	 _MenuWindow(A4),A3

************************************
* Position window on screen (Left) *
************************************
***********************************
*		     A3 = Window  *
* D5 = MenuHeight    A6 = GfxBase *
* D6 = MenuWidth		  *
* D7 = MenuTop			  *
***********************************
* ------------ MenuLeft = Screen->MouseX - MenuWidth / 2
PosLeft:       MOVE.W	 D6,D0
	       LSR.W	 #1,D0
	       MOVEA.L	 _Screen(A4),A0
	       MOVE.W	 sc_MouseX(A0),D1
	       SUB.W	 D0,D1

* ------------ MenuLeft < 0 ?
	       BGE.B	 1$	       * No

* ------------ MenuLeft = 0
	       MOVEQ.L	 #0,D1

* ------------ MenuLeft > Screen->Width - MenuWidth ?
1$	       MOVE.W	 sc_Width(A0),D0
	       SUB.W	 D6,D0
	       CMP.W	 D0,D1
	       BLE.B	 PosTop        * No

* ------------ MenuLeft = Screen->Width - MenuWidth
	       MOVE.W	 D0,D1

***********************************
* Position window on screen (Top) *
***********************************
***********************************
* D1 = MenuLeft      A3 = Window  *
* D5 = MenuHeight    A0 = Screen  *
* D6 = MenuWidth     A6 = GfxBase *
* D7 = MenuTop			  *
***********************************
* ------------ MenuTop > MenuHeight ? (Menues has changed)
PosTop:        CMP.W	 D5,D7
	       BLE.B	 1$	       * No

* ------------ MenuTop = 0
	       MOVEQ	 #0,D7

* ------------ MenuTop	= Screen->MouseY - MenuFontSize/2 - MenuTop
1$	       MOVE.W	 _MenuFontSize(A4),D0
	       LSR.W	 #1,D0
	       ADD.W	 D0,D7
	       SUB.W	 sc_MouseY(A0),D7
	       NEG.W	 D7

* ------------ MenuTop < 0 ?
	       BPL.B	 2$	       * No

* ------------ MenuTop = 0
	       MOVEQ.L	 #0,D7

* ------------ MenuTop > Screen->Height - MenuHeight ?
2$	       MOVE.W	 sc_Height(A0),D0
	       SUB.W	 D5,D0
	       CMP.W	 D0,D7
	       BLE.B	 3$	       * No

* ------------ MenuTop = Screen->Height - MenuHeight
	       MOVE.L	 D0,D7

* ------------ Window->TopEdge = MenuTop
3$	       MOVE.W	 D7,wwd_TopEdge(A3)

* ------------ Window->Height = MenuHeight
	       MOVE.W	 D5,wwd_Height(A3)

* ------------ Window->LeftEdge = MenuLeft
	       MOVE.W	 D1,wwd_LeftEdge(A3)

* ------------ Window->Width = MenuWidth;
	       MOVE.W	 D6,wwd_Width(A3)

*******************************
* Open window with right size *
*******************************
* ------------ BuildBitMap(Window)
Open:	       MOVEA.L	 A3,A0
	       JSR	 @BuildBitMap(PC)

* ------------ Window open ?
	       TST.W	 D0
	       BEQ.B	 OpenMenuDone  * No


* ------------ Window == ITEMWINDOW ?	[ Single menu ]
	       LEA	 _ItemWindow(A4),A0
	       CMPA.L	 A0,A3
	       BNE.S	 1$		    * No

* ------------ ItemWindow.LeftValue = Size.Left - WindowLeft - VBORDERSIZE
	       MOVE.W	 _Size+ws_Left(A4),D0
	       SUB.W	 wwd_LeftEdge(A3),D0
	       SUBQ.W	 #VBORDERSIZE,D0
	       MOVE.W	 D0,wwd_LeftValue(A3)

* ------------ ItemWindow.TopValue = Size.Top - WindowTop - HBORDERSIZE - MenuFontSize
	       MOVE.W	 _Size+ws_Top(A4),D0
	       SUB.W	 wwd_TopEdge(A3),D0
	       SUBQ.W	 #HBORDERSIZE,D0
	       SUB.W	 _MenuFontSize(A4),D0
	       MOVE.W	 D0,wwd_TopValue(A3)

* ------------ DrawAllItems(&ItemWindow)
	       MOVEA.L	 A3,A0
	       JSR	 @DrawAllItems(PC)

* ------------ CurrentMenuNr = 1
	       MOVEQ.L	 #1,D0
	       MOVE.W	 D0,_CurrentMenuNr(A4)

* ------------ DrawAllMenues(Window)
1$	       MOVEA.L	 A3,A0
	       JSR	 @DrawAllMenues(PC)

* ------------ return (TRUE)
	       MOVEQ.L	 #TRUE,D0

OpenMenuDone:  MOVEM.L	 (SP)+,D4-D7/A3/A6
	       RTS

**********************************
* BOOL SortMenues()              *
*				 *
* Input:			 *
*   none.			 *
* Output:			 *
*   TRUE    if everything is ok. *
**********************************
@SortMenues:   MOVEM.L	 A2-A3/A5-A6,-(SP)
	       MOVEA.L	 _IntuitionBase(A4),A6
	       MOVEQ.L	 #NULL,D1

* ------------ SortRemember = NULL
	       MOVE.L	 D1,_SortRemember(A4)

* ------------ MenuSorted.Next = NULL
	       MOVE.L	 D1,_MenuSorted+ms_Next(A4)

	       MOVEA.L	 _Menues(A4),A5

* ------------ SortData = AllocRemember(SortRemember,sizeof(struct MenuSort),0)
0$	       LEA	 _SortRemember(A4),A0
	       MOVEQ.L	 #ms_SIZEOF,D0
	       MOVEQ.L	 #0,D1
	       JSR	 _LVOAllocRemember(A6)
	       TST.L	 D0
	       BEQ.B	 3$
	       MOVE.L	 D0,A0

* ------------ SortData.MenuPtr = Menues
	       MOVE.L	 A5,ms_MenuPtr(A0)

	       MOVE.W	 mu_LeftEdge(A5),D1

* ------------ TempSort = Sorted
	       LEA	 _MenuSorted(A4),A3

**************************************************
* D1 = LeftEdge for TestMenu  A3 = MenuSorted	 *
*			      A5 = TestMenu	 *
*			      A6 = IntuitionBase *
**************************************************
1$	       MOVEA.L	 (A3),A1        * ms_Next(A3)
	       MOVE.L	 A1,D0
	       BEQ.B	 2$

	       MOVEA.L	 ms_MenuPtr(A1),A2
	       CMP.W	 mu_LeftEdge(A2),D1
	       BLE.B	 2$

	       MOVEA.L	 A1,A3
	       BRA.B	 1$

2$	       MOVE.L	 A1,(A0)        * ms_Next(A0)
	       MOVE.L	 A0,(A3)        * ms_Next(A3)

	       MOVEA.L	 (A5),A5        * mu_NextMenu
	       MOVE.L	 A5,D0
	       BNE.B	 0$
	       MOVEQ.L	 #TRUE,D0

3$	       MOVEM.L	 (SP)+,A2-A3/A5-A6
	       RTS

**************************************************************
* OpenItemWindow(ItemWindow,ParentWindow,TopPos,WindowType)  *
*							     *
* Input:						     *
*   Window	 - Window to open.			     *
*   ParentWindow -					     *
*   TopPos.W	 - Top position for new window. 	     *
*   WindowType.W - ITEMWINDOW or SUBWINDOW		     *
* Output:						     *
*   return	 - TRUE if OK				     *
* Functions:						     *
*   FindItemWinSize, PosItemWinLeft, PosItemWinTop,	     *
*   BuildBitMap, DrawAllItems				     *
**************************************************************
@OpenItemWindow:
	       MOVEM.L	 D6-D7/A2-A3,-(SP)
	       MOVEA.L	 A0,A3
	       MOVEA.L	 A1,A2
	       MOVE.W	 D0,D7
	       MOVE.W	 D1,D6

* ------------ FindItemWinSize(Window,WindowType)
	       MOVE.W	 D6,D0
	       JSR	 @FindItemWinSize(PC)

* ------------ Empty menu ?
	       TST.L	 D0
	       BEQ.B	 1$

* ------------ PosItemWinLeft(Window,ParentWindow,WindowType)
	       MOVE.W	 D6,D0
	       MOVEA.L	 A3,A0
	       MOVEA.L	 A2,A1
	       BSR.B	 @PosItemWinLeft

* ------------ PosItemWinTop(Window,TopPos, WindowType)
	       MOVE.W	 D7,D0
	       MOVE.W	 D6,D1
	       MOVEA.L	 A3,A0
	       JSR	 @PosItemWinTop(PC)

* ------------ BuildBitMap(Window)
	       MOVEA.L	 A3,A0
	       JSR	 @BuildBitMap(PC)

	       TST.W	 D0
	       BEQ.B	 1$

* ------------ DrawAllItems(Window)
	       MOVEA.L	 A3,A0
	       JSR	 @DrawAllItems(PC)

	       MOVEQ.L	 #TRUE,D0

1$	       MOVEM.L	 (SP)+,D6-D7/A2-A3
	       RTS

******************************************************
* PosItemWinLeft(Window,ParentWindow,WindowType) *
* - Position window on screen (left)                 *
*						     *
* Input:					     *
*   Window	 - Window to position.		     *
*   ParentWindow - Window to position next to.	     *
*   WindowType.W - ITEMWINDOW or SUBWINDOW.	     *
*						     *
* Possible positions:				     *
*   1. At real position (a'la intuition).            *
*   2. At right side of parent. 		     *
*   3. At left side of parent.			     *
*   4. On the side that covers parent least.	     *
******************************************************
@PosItemWinLeft:
	       MOVEM.L	 D3-D7/A2,-(SP)

* ------------ LeftValue = Size.Left - VBORDERSIZE
	       MOVE.W	 _Size+ws_Left(A4),D6
	       SUBQ.W	 #VBORDERSIZE,D6

* ------------ WindowWidth = Size.Right - LeftValue + VBORDERSIZE
	       MOVE.W	 _Size+ws_Right(A4),D5
	       SUB.W	 D6,D5
	       ADDQ.W	 #VBORDERSIZE,D5

* ------------ LeftPos2 = ParentWindow->LeftEdge - WindowWidth + OVERLAP
	       MOVE.W	 wwd_LeftEdge(A1),D1
	       MOVE.W	 D1,D4
	       SUB.W	 D5,D4
	       ADDQ.W	 #OVERLAP,D4

* ------------ MaxLeft = Screen->Width - WindowWidth
	       MOVEA.L	 _Screen(A4),A2
	       MOVE.W	 sc_Width(A2),D3
	       SUB.W	 D5,D3
**********************************************
* D0 = WindowType	  A0 = Window	     *
* D1 = Parent->LeftEdge   A1 = ParentWindow  *
* D2 =			  A2 = Screen	     *
* D3 = MaxLeft				     *
* D4 = LeftPos2 			     *
* D5 = WindowWidth			     *
* D6 = LeftValue			     *
* D7 = WindowLeft			     *
**********************************************
* ------------ WindowType == ITEMWINDOW ?
	       TST.W	 D0
	       BEQ.B	 1$    * Yes

* ------------ WindowLeft = ParentWindow->LeftEdge + LeftValue
	       MOVE.W	 D1,D7
	       ADD.W	 D6,D7

* ------------ WindowLeft > MaxLeft ?
	       CMP.W	 D7,D3
	       BLT.B	 1$    * Yes

* ------------ WindowLeft < 0 ?
	       TST.W	 D7
	       BPL.B	 2$    * No

* ------------ WindowLeft = ParentWindow->RightEdge - OVERLAP
1$	       MOVE.W	 wwd_RightEdge(A1),D7
	       SUBQ.W	 #OVERLAP,D7

* ------------ WindowLeft > MaxLeft ?
2$	       CMP.W	 D7,D3
	       BGE.B	 4$    * No

* ------------ LeftPos2 > MaxLeft - WindowLeft ?
	       MOVE.W	 D3,D0
	       SUB.W	 D7,D0
	       CMP.W	 D4,D0
	       BGE.B	 3$    * No

* ------------ WindowLeft = (LeftPos2 > 0) ? LeftPos2 : 0
	       MOVE.W	 D4,D7
	       BGT.B	 4$
	       MOVEQ.L	 #0,D7
	       BRA.B	 4$

* ------------ WindowLeft = MaxLeft
3$	       MOVE.W	 D3,D7

* ------------ WindowWidth < ParentWindow->LeftEdge + OVERLAP - WindowLeft ?
4$	       MOVE.W	 D1,D0
	       ADDQ.W	 #OVERLAP,D0
	       SUB.W	 D7,D0
	       CMP.W	 D5,D0
	       BLE.B	 5$	       * No

* ------------ WindowWidth = ParentWindow->LeftEdge + OVERLAP - WindowLeft
	       MOVE.W	 D0,D5

* ------------ Window->LeftEdge = WindowLeft
5$	       MOVE.W	 D7,wwd_LeftEdge(A0)

* ------------ Window->LeftValue = LeftValue - WindowLeft
	       SUB.W	 D7,D6
	       MOVE.W	 D6,wwd_LeftValue(A0)

* ------------ Window->Width = WindowWidth
	       MOVE.W	 D5,wwd_Width(A0)

	       MOVEM.L	 (SP)+,D3-D7/A2
	       RTS

*****************************************************
* PosItemWinTop(Window,TopPos, WindowType)          *
* - Position Window on screen (Top).                *
*						    *
* Input:					    *
*   Window	 - Window to position. (A0)         *
*   TopPos.W	 -		       (D0)         *
*   WindowType.W - ITEMWINDOW or SUBITEMWINDOW (D1) *
*****************************************************
@PosItemWinTop:
	       MOVEM.L	 D4-D7,-(SP)

* ------------ TopValue = Size.Top - HBORDERSIZE
	       MOVE.W	 _Size+ws_Top(A4),D6
	       SUBQ.W	 #HBORDERSIZE,D6

* ------------ WindowHeight = Size.Bottom - TopValue + HBORDERSIZE
	       MOVE.W	 _Size+ws_Bottom(A4),D4
	       SUB.W	 D6,D4
	       ADDQ.W	 #HBORDERSIZE,D4
	       MOVEA.L	 _Screen(A4),A1

* ------------ WindowTop = TopPos
	       MOVE.W	 D0,D5

* ------------ WindowType == ITEMWINDOW ?
	       TST.W	 D1
	       BNE.B	 1$	       * No

* ------------ Center Items ?
	       BTST	 #ITEMSCENTERED,_Options(A4)
	       BEQ.B	 1$	       * No

* ------------ WindowTop += (MenuFontSize - WindowHeight) / 2
	       MOVE.W	 _MenuFontSize(A4),D1
	       SUB.W	 D4,D1
	       ASR.W	 #1,D1
	       ADD.W	 D1,D5
	       BRA.B	 2$

* ------------ WindowTop = TopPos + TopValue
1$	       ADD.W	 D6,D5

***********************************
* D0 = TopPos	     A0 = Window  *
* D4 = WindowHeight  A1 = Screen  *
* D5 = WindowTop		  *
* D6 = TopValue 		  *
***********************************
* ------------ WindowTop > Screen->Height - WindowHeight ?
2$	       MOVE.W	 sc_Height(A1),D0
	       SUB.W	 D4,D0
	       CMP.W	 D5,D0
	       BGE.B	 3$	       * No

* ------------ WindowTop = Screen->Height - WindowHeight
	       MOVE.W	 D0,D5

* ------------ WindowTop < 0 ?
3$	       TST.W	 D5
	       BPL.B	 4$	       * No

* ------------ WindowTop = 0
	       MOVEQ.L	 #0,D5

* ------------ Window->TopEdge = WindowTop
4$	       MOVE.W	 D5,wwd_TopEdge(A0)

* ------------ Window->TopValue = TopValue - WindowTop
	       SUB.W	 D5,D6
	       MOVE.W	 D6,wwd_TopValue(A0)

* ------------ Window->Height = WindowHeight
	       MOVE.W	 D4,wwd_Height(A0)

	       MOVEM.L	 (SP)+,D4-D7
	       RTS

*************************************************************
*  TellWindow(InputSignals,MenuNum) - Send Fake Menu Event. *
*		 A0	    D0				    *
* Input:						    *
*   MenuNum -	Menu number to send.			    *
*   InputSignals - InputHandler data for Qualifiers	    *
* Output:						    *
*   none						    *
* Functions:						    *
*   FindWindow						    *
*************************************************************
@TellWindow:   MOVE.L	A2,-(SP)
	       MOVE.L	A6,-(SP)
	       LEA	 -ie_SIZEOF(SP),SP

* ------------ MyFakeEvent.ie_Class = IECLASS_MENULIST
	       MOVE.B	 #IECLASS_MENULIST,ie_Class(SP)

* ------------ MyFakeEvent.ie_Code = MenuNumber
	       MOVE.W	 D0,ie_Code(SP)

* ------------ MyFakeEvent.ie_Qualifier = InputSignals.EndQualifier
	       MOVE.W	 sd_EndQualifier(A0),ie_Qualifier(SP)

* ------------ MyFakeEvent.ie_NextEvent = NULL
	       CLR.L	 (SP)

* ------------ MyFakeEvent.ie_EventAddress = NULL
	       CLR.L	 ie_EventAddress(SP)

* ------------ Get current time.
	       LEA	 ie_TimeStamp+TV_SECS(SP),A0
	       LEA	 ie_TimeStamp+TV_MICRO(SP),A1
	       MOVEA.L	 _IntuitionBase(A4),A6
	       JSR	 _LVOCurrentTime(A6)

* ------------ InputReqBlock->io_Command = IND_WRITEEVENT
	       MOVEA.L	 _InputReqBlock(A4),A2
	       MOVE.W	 #IND_WRITEEVENT,IO_COMMAND(A2)

* ------------ InputReqBlock->io_Flags	 = 0
	       CLR.B	 IO_FLAGS(A2)

* ------------ InputReqBlock->io_Length = sizeof(struct InputEvent)
	       MOVEQ.L	 #ie_SIZEOF,D0
	       MOVE.L	 D0,IO_LENGTH(A2)

* ------------ InputReqBlock->io_Data = &MyFakeEvent
	       MOVE.L	 SP,IO_DATA(A2)

* ------------ Be sure the right window will get the message.
	       JSR	 @FindWindow(PC)
	       TST.W	 D0
	       BEQ.B	 1$

	       MOVEA.L	 _ActiveWindow(A4),A0
	       JSR	 _LVOActivateWindow(A6)

* ------------ DoIO(InputReqBlock)
	       MOVEA.L	 A2,A1
	       MOVEA.L	 (A4),A6       * SysBase
	       JSR	 _LVODoIO(A6)

1$	       LEA	 ie_SIZEOF(SP),SP
	       MOVEA.L	 (SP)+,A6
	       MOVEA.L	 (SP)+,A2
	       RTS

****************************************
* DrawAllItems(Window)                 *
*				       *
* Input:			       *
*   Window  - Window to draw into.     *
*				       *
* Output:			       *
*   none			       *
* Functions:			       *
*   ClearWindow, DrawMenuItem	       *
****************************************
@DrawAllItems: MOVE.L	 A2,-(SP)
	       MOVE.L	 A3,-(SP)

	       MOVEA.L	 A0,A3

* ------------ Item = Window->Items
	       MOVEA.L	 wwd_Items(A3),A2

* ------------ ClearWindow(Window)
	       BSR.B	 @ClearWindow

* ------------ DrawMenuItem(Window, Item, ITEMFILL)
1$	       MOVEQ.L	 #ITEMFILL,D0
	       MOVEA.L	 A3,A0
	       MOVEA.L	 A2,A1
	       JSR	 @DrawMenuItem(PC)

* ------------ Item = Item->NextItem
	       MOVEA.L	 (A2),A2
	       MOVE.L	 A2,D0
	       BNE.B	 1$

	       MOVEA.L	 (SP)+,A3
	       MOVEA.L	 (SP)+,A2
	       RTS

*********************************
* ClearWindow(window)           *
*				*
* Input:			*
*   Window   - Window to clear. *
* Output:			*
*   none			*
*********************************
@ClearWindow:  MOVEM.L	 D2-D5/A2-A3/A5-A6,-(SP)
	       MOVEA.L	 A0,A3

	       LEA	 _Rp(A4),A2
	       MOVEA.L	 _ActiveWindow(A4),A5
	       MOVEA.L	 _GfxBase(A4),A6
*********************
* A2 = Rp	    *
* A3 = Window	    *
* A5 = ActiveWindow *
* A6 = GfxBase	    *
*********************
* ------------ SetDrMd(Rp, JAM1)
	       MOVEA.L	 A2,A1
	       MOVEQ.L	 #RP_JAM1,D0
	       JSR	 _LVOSetDrMd(A6)

* ------------ SetAPen(Rp,ActiveWindow->DetailPen)
	       MOVEA.L	 A2,A1
	       MOVEQ.L	 #0,D0
	       MOVE.B	 wd_DetailPen(A5),D0
	       JSR	 _LVOSetAPen(A6)

* ------------ Left = Window->LeftEdge
	       MOVEQ.L	 #0,D0
	       MOVE.W	 wwd_LeftEdge(A3),D0

* ------------ Top = Window->TopEdge
	       MOVEQ.L	 #0,D1
	       MOVE.W	 wwd_TopEdge(A3),D1

* ------------ Right = Window->RightEdge
	       MOVEQ.L	 #0,D2
	       MOVE.W	 wwd_RightEdge(A3),D2

* ------------ Bottom = Window->Bottom
	       MOVEQ.L	 #0,D3
	       MOVE.W	 wwd_Bottom(A3),D3

* ------------ DrawRect(Left, Top, Right, Bottom)
	       MOVEA.L	 A2,A1
	       JSR	 @DrawRect(PC)

* ------------ Save Left & Top.
	       MOVE.L	 D0,D4
	       MOVE.L	 D1,D5

* ------------ SetAPen(Rp,ActiveWindow->BlockPen)
	       MOVEA.L	 A2,A1
	       MOVEQ.L	 #0,D0
	       MOVE.B	 wd_BlockPen(A5),D0
	       JSR	 _LVOSetAPen(A6)

* ------------ RectFill(Left, Top, Right, Bottom)
	       MOVEA.L	 A2,A1
	       MOVE.L	 D4,D0
	       MOVE.L	 D5,D1
	       JSR	 _LVORectFill(A6)

	       MOVEM.L	 (SP)+,D2-D5/A2-A3/A5-A6
	       RTS

*******************************
* CloseSubWindow()            *
* CloseItemWindow()           *
* CloseMenuWindow()           *
*			      *
* Input:		      *
*   none		      *
* Output:		      *
*   none		      *
* Functions:		      *
*   SwapBits, RemoveBitMap    *
*******************************
@CloseSubWindow:
	       LEA	 _SubWindow(A4),A0
	       TST.W	 (A0)          * wwd_BitMapOK
	       BEQ.B	 CloseQuit

	       MOVEA.L	 wwd_Current(A0),A1
	       MOVE.L	 A1,D0
	       BEQ.B	 1$
	       BCLR	 #HIGHITEMBIT,mi_Flags(A1)

1$	       MOVEA.L	 _ItemWindow+wwd_Current(A4),A1   * This must be something
	       BCLR	 #ISDRAWNBIT,mi_Flags(A1)
	       BRA.B	 Close

@CloseItemWindow:
	       LEA	 _ItemWindow(A4),A0
	       TST.W	 (A0)          * wwd_BitMapOK
	       BEQ.B	 CloseQuit

	       MOVEA.L	 wwd_Current(A0),A1
	       MOVE.L	 A1,D0
	       BEQ.B	 1$
	       BCLR	 #HIGHITEMBIT,mi_Flags(A1)

1$	       MOVEA.L	 _MenuWindow+wwd_Current(A4),A1
	       BCLR	 #MIDRAWNBIT,mu_Flags(A1)
	       BRA.B	 Close

@CloseMenuWindow:
	       LEA	 _MenuWindow(A4),A0

Close:	       MOVE.L	 A0,-(SP)

* ------------ Remove window from screen.
	       JSR	 @SwapBits(PC)

* ------------ Remove all bitplanes.
	       MOVEA.L	 (SP)+,A0
	       JSR	 @RemoveBitMap(PC)

CloseQuit:     RTS


****************************************
* BuildBitMap(Window)  - OpenWindow    *
*				       *
* Input:			       *
*   Window    - Window to open.        *
* Output:			       *
*   return    - TRUE if window opened. *
****************************************

@BuildBitMap:  MOVEM.L	 D2-D5/A2-A3/A6,-(SP)
	       MOVEA.L	 A0,A3

* ------------ WindowWidth = Window->Width
	       MOVE.W	 wwd_Width(A3),D3
	       EXT.L	 D3

* ------------ WindowHeight = Window->Height
	       MOVE.W	 wwd_Height(A3),D2
	       EXT.L	 D2

	       MOVEA.L	 _Screen(A4),A0

**************************************
* D2 = WindowHeight	 A0 = Screen *
* D3 = WindowWidth	 A3 = Window *
**************************************

* ------------ Is window to big for screen ?
* ------------ WindowWidth > Screen->Width
	       CMP.W	 sc_Width(A0),D3
	       BGT.B	 Fail	       * Yes

* ------------ WindowHeight > Screen->Height
	       CMP.W	 sc_Height(A0),D2
	       BGT.B	 Fail	       * Yes

* ------------ Window->RightEdge = Window->LeftEdge + WindowWidth  - 1
	       MOVE.L	 D3,D0
	       ADD.W	 wwd_LeftEdge(A3),D0
	       SUBQ.L	 #1,D0
	       MOVE.W	 D0,wwd_RightEdge(A3)

* ------------ Window->Bottom	 = Window->TopEdge  + WindowHeight - 1
	       MOVE.L	 D2,D0
	       ADD.W	 wwd_TopEdge(A3),D0
	       SUBQ.L	 #1,D0
	       MOVE.W	 D0,wwd_Bottom(A3)

* ------------ Depth = Screen->BitMap.Depth
	       MOVEQ.L	 #0,D5
	       MOVE.B	 sc_BitMap+bm_Depth(A0),D5

	       MOVEA.L	 _GfxBase(A4),A6

***************************************
* D2 = WindowHeight	 A0 = Screen  *
* D3 = WindowWidth	 A3 = Window  *
* D5 = Depth		 A6 = GfxBase *
***************************************

* ------------ InitBitMap(&Window->Bm,Depth,WindowWidth,WindowHeight)
	       LEA	 wwd_Bm(A3),A0
	       MOVE.L	 D5,D0
	       MOVE.L	 D3,D1
	       JSR	 _LVOInitBitMap(A6)

* ------------ Window->BitMapOk = TRUE
	       MOVE.W	 #TRUE,(A3)

* ------------ Counter = 0
	       MOVEQ.L	 #0,D4

* ------------ Plane = &Window->Bm.Planes[0]
	       LEA	 wwd_Bm+bm_Planes(A3),A2

***************************************
* D2 = WindowHeight	 A2 = Planen  *
* D3 = WindowWidth	 A3 = Window  *
* D4 = Counter		 A6 = GfxBase *
* D5 = Depth			      *
***************************************

* ------------ More planes to allocate ?
BuildNextPl:   CMP.W	 D4,D5
	       BEQ.B	 AllRastersOK
	       ADDQ.W	 #1,D4

* ------------ Plane++ = AllocRaster(WindowWidth,WindowHeight)
	       MOVE.L	 D3,D0
	       MOVE.L	 D2,D1
	       JSR	 _LVOAllocRaster(A6)
	       MOVE.L	 D0,(A2)+

* ------------ Out of ChipRam ?
	       BNE.B	 BuildNextPl   * No

* ------------ RemoveBitMap(Window)
	       MOVEA.L	 A3,A0
	       BSR.B	 @RemoveBitMap

* ------------ return FALSE
Fail:	       MOVEQ.L	 #FALSE,D0
	       BRA.B	 BuildDone

* ------------ Make window visible.
AllRastersOK:  MOVEA.L	 A3,A0
	       BSR.B	 @SwapBits

* ------------ ClearWindow(Window)
	       MOVEA.L	 A3,A0
	       JSR	 @ClearWindow(PC)

* ------------ return TRUE
	       MOVEQ.L	 #TRUE,D0

BuildDone:     MOVEM.L	 (SP)+,D2-D5/A2-A3/A6
	       RTS

****************************************************************************
* RemoveBitMap(Window) - Remove allocated rasters in the BitMap structure. *
*									   *
* Input:								   *
*   Window   - Window with bitmap.					   *
* Output:								   *
*   none								   *
****************************************************************************
@RemoveBitMap: MOVEM.L	 D4-D7/A2/A6,-(SP)

* ------------ Anything to remove ?
	       TST.W	 (A0)          * BitMapOK
	       BEQ.B	 RemoveDone
	       CLR.W	 (A0)          * BitMapOK

* ------------ Remove all allocated rasters.
	       MOVEQ.L	 #0,D7
	       LEA	 wwd_Bm(A0),A2
	       MOVE.B	 bm_Depth(A2),D7

	       MOVE.W	 wwd_Width(A0),D6
	       EXT.L	 D6

	       MOVE.W	 wwd_Height(A0),D5
	       EXT.L	 D5

	       ADDQ.L	 #bm_Planes,A2

	       MOVEA.L	 _GfxBase(A4),A6

* ------------ Counter = 0
	       MOVEQ.L	 #0,D4
*************************************
* D4 = Counter	       A2 = Planes  *
* D5 = WindowHeight    A0 = Window  *
* D6 = WindowWidth     A6 = GfxBase *
* D7 = Depth			    *
*************************************
RemoveNextPl:  CMP.W	 D4,D7
	       BEQ.B	 RemoveDone
	       ADDQ.W	 #1,D4

* ------------ This raster allocated ?
	       MOVEA.L	 (A2)+,A0
	       MOVE.L	 A0,D0
	       BEQ.B	 RemoveDone

* ------------ FreeRaster(Planes++,Width,Height);

	       MOVE.L	 D6,D0
	       MOVE.L	 D5,D1
	       JSR	 _LVOFreeRaster(A6)
	       BRA.B	 RemoveNextPl

RemoveDone:    MOVEM.L	 (SP)+,D4-D7/A2/A6
	       RTS

*****************************************************************************
* SwapBits(Window) - Works like SwapBitsRastPortClipRect() without bugs :-) *
*									    *
*****************************************************************************
ALLPLANES      EQU	 -1
B_XOR_C        EQU	 ABNC+ANBC

* ------------ Check to see that window is open
@SwapBits:     TST.W	  (A0)
	       BEQ.B	  NoWindow

	       MOVEM.L	  D2-D7/A2/A6,-(SP)

* ------------ SrcX
	       MOVEQ.L	  #0,D0
	       MOVE.W	  wwd_LeftEdge(A0),D0

* ------------ SrcY
	       MOVEQ.L	  #0,D1
	       MOVE.W	  wwd_TopEdge(A0),D1

* ------------ SizeX
	       MOVEQ.L	  #0,D4
	       MOVE.W	  wwd_Width(A0),D4

* ------------ SizeY
	       MOVEQ.L	  #0,D5
	       MOVE.W	  wwd_Height(A0),D5

* ------------ MinTerm
	       MOVEQ.L	  #B_XOR_C,D6

* ------------ Mask
	       MOVEQ.L	  #ALLPLANES,D7

* ------------ TempA = NULL
	       SUB.L	  A2,A2

	       MOVE.L	  _GfxBase(A4),A6

* ------------ Off-screen bitmap
	       LEA	  wwd_Bm(A0),A1

* ------------ On-screen bitmap
	       MOVE.L	  _Rp+rp_BitMap(A4),A0

* ------------ DestX = 0
	       MOVEQ.L	  #0,D2

* ------------ DestY = 0
	       MOVEQ.L	  #0,D3

* ------------ OffScreen = OffScreen XOR OnScreen
	       BSR.B	  Swap
* ------------ OnScreen = OnScreen XOR OffScreen  (= OffScreen)
	       BSR.B	  Swap
* ------------ OffScreen = OffScreen XOR OnScreen  (= OnScreen)
	       BSR.B	  Swap

	       MOVEM.L	  (SP)+,D2-D7/A2/A6
NoWindow:      RTS


Swap:	       MOVEM.L	  D0/D1/A0/A1,-(SP)
	       JSR	  _LVOBltBitMap(A6)
	       MOVEM.L	  (SP)+,D0/D1/A0/A1

	       EXG.L	  A0,A1
	       EXG.L	  D0,D2
	       EXG.L	  D1,D3

	       RTS

********************************************
* FindItemWinSize(Window,WindowType)       *
*					   *
* Find with and hight needed for all items *
********************************************
@FindItemWinSize:
	       MOVE.L	A2,-(SP)
	       MOVE.L	D2,-(SP)

* ------------ SizeOk = FALSE
	       MOVEQ.L	#FALSE,D2

* ------------ Item = Window->Items
	       MOVEA.L	 wwd_Items(A0),A2

* ------------ Size.Left  = WORD_MAX
	       MOVE.W	 #WORD_MAX,_Size+ws_Left(A4)

* ------------ Size.Top   = WindowType (ITEMWINDOW -> TopPos >= 0), SUBWINDOW -> no limit */
	       MOVE.W	 D0,_Size+ws_Top(A4)

* ------------ Size.Right = Size.Bottom = WORD_MIN
	       MOVE.W	 #WORD_MIN,D0
	       MOVE.W	 D0,_Size+ws_Right(A4)
	       MOVE.W	 D0,_Size+ws_Bottom(A4)

* ------------ SizeOk |= CheckItemSize(Item,Item->ItemFill)
1$	       MOVEA.L	 A2,A0
	       MOVEA.L	 mi_ItemFill(A0),A1
	       BSR.B	 @CheckItemSize
	       OR.L	 D0,D2

* ------------ Item->Flags & HIGHFLAGS == HIGHIMAGE ?
	       MOVE.W	 #HIGHFLAGS,D0
	       AND.W	 mi_Flags(A2),D0
	       BNE.B	 2$

* ------------ SizeOk |= CheckItemSize(Item,Item->SelectFill)
	       MOVEA.L	 A2,A0
	       MOVEA.L	 mi_SelectFill(A0),A1
	       BSR.B	 @CheckItemSize
	       OR.L	 D0,D2

* ------------ Check next item.
2$	       MOVEA.L	 (A2),A2
	       MOVE.L	 A2,D0
	       BNE.B	 1$

* ------------ return SizeOK
	       MOVE.L	 D2,D0

	       MOVE.L	 (SP)+,D2
	       MOVE.L	 (SP)+,A2
	       RTS

*********************************************************
* CheckItemSize(Item,Contents) -                        *
*  find the size needed to include Item in window.	*
*							*
* Input:						*
*   Item      (A0)  Item to check.                      *
*   Contents  (A1)  What to fill (ItemFill/SelectFill). *
* Output:						*
*   Size	    New size of window			*
*   return	    TRUE if anything is found.		*
*********************************************************
@CheckItemSize:
* ------------ Anything to check ?
	       MOVE.L	  A1,D0
	       BNE.B	  1$		      * Yes
	       RTS

1$	       MOVEM.L	  D2-D7/A2-A3/A5-A6,-(SP)

	       MOVEA.L	  A0,A2 	      * A2 = Item to check
	       MOVEA.L	  A1,A5 	      * A5 = What to check
	       LEA	  _Size(A4),A3        * A3 = SizeSoFar

* ------------ ImTxLeft = ItemLeft = Item->LeftEdge
Check:	       MOVE.W	  mi_LeftEdge(A2),D3
	       MOVE.W	  D3,D7

* ------------ ImTxTop = ItemTop = Item->TopEdge
	       MOVE.W	  mi_TopEdge(A2),D2
	       MOVE.W	  D2,D6

* ------------ ITEMTEXT or ITEMIMAGE ?
	       MOVEQ.L	  #ITEMTEXT,D0
	       AND.W	  mi_Flags(A2),D0
	       BEQ.B	  ItemImage

* ------------ Add IText position to left and top.
* ------------ ImTxLeft += IText.LeftEdge
	       ADD.W	  it_LeftEdge(A5),D7

* ------------ ImTxTop += IText.TopEdge
	       ADD.W	  it_TopEdge(A5),D6

* ------------ ImTxRight = ImTxLeft
	       MOVE.W	  D7,D5

* ------------ ImTxBottom = ImTxTop
	       MOVE.W	  D6,D4

* ------------ What font to use ?
	       MOVE.L	  it_ITextFont(A5),D0
	       BEQ.B	  DefaultFont

* ------------ Add height and length of string.
* ------------ ImTxBottom += IText.ITextFont.YSize
	       MOVEA.L	  D0,A0
	       ADD.W	  ta_YSize(A0),D4

* ------------ ImTxRight += IntuiTextLength(IText)
	       MOVEA.L	  A5,A0
	       MOVEA.L	  _IntuitionBase(A4),A6
	       JSR	  _LVOIntuiTextLength(A6)

	       BRA.B	  NextText

* ------------ Add hight and length of string with default font.
* ------------ ImTxBottom += Rp.TxHeight
DefaultFont:   ADD.W	  _Rp+rp_TxHeight(A4),D4

* ------------ ItemTextRight += TextLength(Rp,IText,strlen(IText))
	       MOVEA.L	  it_IText(A5),A0
	       JSR	  @Mystrlen(PC)
	       LEA	  _Rp(A4),A1
	       MOVEA.L	  it_IText(A5),A0
	       MOVEA.L	  _GfxBase(A4),A6
	       JSR	  _LVOTextLength(A6)

NextText:      ADD.W	  D0,D5

* ------------ Move to next text.
	       MOVEA.L	  it_NextText(A5),A5
	       BRA.B	  CheckLeft

* ------------ ImTxLeft += Image.LeftEdge
ItemImage:     ADD.W	  (A5),D7

* ------------ ImTxTop += Image.TopEdge
	       ADD.W	  ig_TopEdge(A5),D6

* ------------ ImTxRight = ImTxLeft + Image.Width
	       MOVE.W	  D7,D5
	       ADD.W	  ig_Width(A5),D5

* ------------ ImTxBottom = ImTxTop + Image.Height
	       MOVE.W	  D6,D4
	       ADD.W	  ig_Height(A5),D4

* ------------ Move to next image
	       MOVE.L	  ig_NextImage(A5),A5

* ------------ Compare with size in SizeSoFar
* ------------ ItemLeft = Min(ImTxLeft, ItemLeft)
CheckLeft:     CMP.W	  D7,D3
	       BGE.B	  1$
	       MOVE.W	  D3,D7

* ------------ SizeSoFar.Left = Min(SizeSoFar.Left, ItemLeft)
1$:	       CMP.W	  (A3),D7
	       BGE.B	  CheckRight
	       MOVE.W	  D7,(A3)

* ------------ ItemRight = Max(ItemLeft + Item.Width, ImTxRight)
CheckRight:    ADD.W	  mi_Width(A2),D3
	       CMP.W	  D5,D3
	       BLE.B	  1$
	       MOVE.W	  D3,D5

* ------------ Item has sub-item ?
1$:	       TST.L	  mi_SubItem(A2)
	       BEQ.B	  2$		       * No

* ------------ Sub-item pointer enabled ?
	       BTST	  #SUBITEMPOINTER,_Options(A4)
	       BEQ.B	  2$		       * No

* ------------ Make room for pointer
* ------------ ItemRight += (ScreenType & HIRESSCREEN) ? 10 : 6
	       ADDQ.W	  #6,D5
	       TST.W	  _ScreenType(A4)
	       BNE.B	  2$		       * LORES
	       ADDQ.W	  #4,D5

* ------------ SizeSoFar.Right = Max(SizeSoFar.Right, ItemRight)
2$:	       CMP.W	  ws_Right(A3),D5
	       BLE.B	  CheckTop
	       MOVE.W	  D5,ws_Right(A3)

* ------------ ItemTop = Min(ItemTop, ImTxTop).
CheckTop:      CMP.W	  D6,D2
	       BGE.B	  1$
	       MOVE.W	  D2,D6

* ------------ SizeSoFar.Top = Min(SizeSoFar.Top, ItemTop)
1$:	       CMP.W	  ws_Top(A3),D6
	       BGE.B	  CheckBottom
	       MOVE.W	  D6,ws_Top(A3)

* ------------ ItemBottom = Max(ItemLeft + Item.Height, ImTxBottom)
CheckBottom:   ADD.W	  mi_Height(A2),D2
	       CMP.W	  D4,D2
	       BLE.B	  1$
	       MOVE.W	  D2,D4

* ------------ SizeSoFar.Bottom = Max(SizeSoFar.Bottom, ItemBottom)
1$:	       CMP.W	  ws_Bottom(A3),D4
	       BLE.B	  2$
	       MOVE.W	  D4,ws_Bottom(A3)

* ------------ Anything more to check
2$	       MOVE.L	  A5,D0
	       BNE.W	  Check

	       MOVEM.L	  (SP)+,D2-D7/A2-A3/A5-A6
	       MOVEQ.L	  #TRUE,D0
	       RTS

*****************************************
* SelectItem() - Do selection           *
*****************************************
@SelectItem:   MOVEM.L	 D2-D3/A2-A3/A5,-(SP)
********************
* Check subwindow. *
********************
* ------------ SubWindow.BitMapOk == TRUE ?
	       LEA	 _SubWindow(A4),A2
	       TST.W	 (A2)                  * wwd_BitMapOk
	       BEQ.B	 CheckItem     * No

* ------------ NewSubItem = FindMouseItem(&SubWindow)
	       MOVEA.L	 A2,A0
	       JSR	 @FindMouseItem(PC)
	       MOVEA.L	 D0,A3

********************
* A2 = SubWindow   *
* A3 = NewSubItem  *
********************
* ------------ NewSubItem == SubWindow.Current ?
	       MOVEA.L	 wwd_Current(A2),A0
	       CMPA.L	 A0,A3
	       BEQ.B	 4$	       * Yes
***********************
* A0 = CurrentSubItem *
* A2 = SubWindow      *
* A3 = NewSubItem     *
***********************

* ------------ SubWindow.Current == NULL ?
	       MOVE.L	 A0,D0
	       BEQ.B	 1$	       * Yes

* ------------ HighLightItem(&SubWindow,HIGHLIGHTOFF)
	       MOVEQ.L	 #1,D0
	       MOVEA.L	 A2,A0
	       JSR	 @HighLightItem(PC)
	       BRA.B	 2$

* ------------ TempItem == NULL ?
1$	       MOVE.L	 _TempItem(A4),D2
	       BEQ.B	 2$	       * Yes

* ------------ ItemWindow.Current = TempItem.
	       MOVE.L	 D2,_ItemWindow+wwd_Current(A4)

* ------------ TempItem = NULL.
	       CLR.L	 _TempItem(A4)

* ------------ HighLightCurrItemBehind(HIGHLIGHTON)
	       MOVEQ.L	 #0,D0
	       JSR	 @HighLightCurrItemBehind(PC)

* ------------ SubWindow.Current = NewSubItem.
2$	       MOVE.L	 A3,wwd_Current(A2)

* ------------ SubWindow.Current == NULL ?
	       BEQ.B	 3$	       * Yes

* ------------ HighLightItem(&SubWindow,HIGHLIGHTON)
	       MOVEQ.L	 #0,D0
	       MOVEA.L	 A2,A0
	       JSR	 @HighLightItem(PC)

* ------------ Options & CLICKMENUES ?
	       BTST	 #CLICKMENUES,_Options(A4)
	       BEQ.W	 SelectDone    * No

* ------------ Selectable item ?
	       TST.W	 D0
	       BEQ.W	 SelectDone    * No

* ------------ return TRUE
	       MOVEQ.L	 #TRUE,D0
	       BRA.W	 SelectQuit

* ------------ HighLightCurrItemBehind(HIGHLIGHTOFF)
3$	       MOVEQ.L	 #1,D0
	       JSR	 @HighLightCurrItemBehind(PC)

* ------------ TempItem = ItemWindow.Current.
	       MOVE.L	 _ItemWindow+wwd_Current(A4),_TempItem(A4)

* ------------ ItemWindow.Current = NULL.
	       CLR.L	 _ItemWindow+wwd_Current(A4)

* ------------ Mouse in SubWindow ?
4$	       MOVEA.L	 A2,A0
	       JSR	 @MouseInWindow(PC)
	       TST.W	 D0
	       BNE.W	 SelectDone    * Yes

*********************
* Check itemwindow. *
*********************
* ------------ ItemWindow.BitMapOk == TRUE ?
CheckItem:     LEA	 _ItemWindow(A4),A3
	       TST.W	 (A3)
	       BEQ.W	 CheckMenu     * No

* ------------ Mouse in ItemWindow ?
	       MOVEA.L	 A3,A0
	       JSR	 @MouseInWindow(PC)
	       TST.W	 D0
	       BEQ.W	 3$	       * No

* ------------ NewItem = FindMouseItem(&ItemWindow).
	       MOVEA.L	 A3,A0
	       JSR	 @FindMouseItem(PC)
	       MOVEA.L	 D0,A5

	       MOVE.L	 wwd_Current(A3),D2

***************************************
* A2 = SubWindow     D2 = CurrentItem *
* A3 = ItemWindow		      *
* A5 = NewItem			      *
***************************************

* ------------ NewItem == CurrentItem ?
	       CMP.L	 D2,A5
	       BEQ.W	 SelectDone    * Yes

* ------------ SubWindow open ?
	       TST.W	 (A2)          * wwd_BitMapOk
	       BEQ.B	 1$	       * No

* ------------ CloseSubWindow()
	       JSR	 @CloseSubWindow(PC)

* ------------ TempItem = NULL.
	       CLR.L	 _TempItem(A4)

* ------------ CurrentItem == NULL ?
1$	       TST.L	 D2
	       BEQ.B	 2$	       * Yes

* ------------ HighLightItem(&ItemWindow,HIGHLIGHTOFF)
	       MOVEQ.L	 #1,D0
	       MOVEA.L	 A3,A0
	       JSR	 @HighLightItem(PC)

* ------------ ItemWindow.Current = NewItem.
2$	       MOVE.L	 A5,_ItemWindow+wwd_Current(A4)

* ------------ NewItem == NULL ?
	       MOVE.L	 A5,D2
	       BEQ.W	 SelectDone    * Yes

* ------------ HighLightItem(&ItemWindow,HIGHLIGHTON)
	       MOVEQ	 #0,D0
	       MOVEA.L	 A3,A0
	       JSR	 @HighLightItem(PC)

* ------------ SubWindow.ItemsEnabled = ItemWindow.ItemsEnabled ?
* ------------	(NewItem->Flags & ITEMENABLED) : 0
	       TST.W	 _ItemWindow+wwd_ItemsEnabled(A4)
	       BEQ.B	 25$
	       MOVEQ.L	 #ITEMENABLED,D1
	       AND.W	 mi_Flags(A5),D1
25$	       MOVE.W	 D1,_SubWindow+wwd_ItemsEnabled(A4)

* ------------ SubWindow.Items = NewItem->SubItem.
	       MOVE.L	 mi_SubItem(A5),_SubWindow+wwd_Items(A4)

* ------------ SubWindow.Items == NULL ?
	       BNE.W	 28$	       * No

* ------------ Options & CLICKMENUES ?
	       BTST	 #CLICKMENUES,_Options(A4)
	       BEQ.W	 SelectDone    * No

* ------------ Possible to highlight item ?
	       TST.W	 D0
	       BEQ.W	 SelectDone    * No

* ------------ return TRUE
	       MOVEQ.L	 #TRUE,D0
	       BRA.W	 SelectQuit

* ------------ Open item window
28$	       MOVE.L	 D2,A0
	       MOVE.W	 mi_TopEdge(A0),D0
	       SUB.W	 _ItemWindow+wwd_TopValue(A4),D0
	       MOVE.W	 #$7FFF,D1
	       MOVEA.L	 A2,A0
	       MOVEA.L	 A3,A1
	       JSR	 @OpenItemWindow(PC)

* ------------ Window opened ?
	       TST.W	 D0
	       BEQ.B	 29$	       * No

* ------------ Set ISDRAWN bit
	       BSET	 #ISDRAWNBIT,mi_Flags(A5)
29$	       BRA.W	 SelectDone

* ------------ ItemWindow.Current == NULL ?
3$	       TST.L	 wwd_Current(A3)
	       BEQ.B	 CheckMenu     * Yes

* ------------ SubWindow open ?
	       TST.W	 (A2)          * wwd_BitMapOk
	       BEQ.B	 4$	       * No

* ------------ HighLightCurrItemBehind(HIGHLIGHTOFF)
	       MOVEQ.L	 #1,D0
	       JSR	 @HighLightCurrItemBehind(PC)

* ------------ TempItem = ItemWindow.Current.
	       MOVE.L	 wwd_Current(A3),_TempItem(A4)
	       BRA.B	 5$

* ------------ HighLightItem(&ItemWindow,HIGHLIGHTOFF)
4$	       MOVEQ.L	 #1,D0
	       MOVEA.L	 A3,A0
	       JSR	 @HighLightItem(PC)

* ------------ ItemWindow.Current = NULL.
5$	       CLR.L	 wwd_Current(A3)

*********************
* Check menuwindow. *
*********************

CheckMenu:     LEA	 _MenuWindow(A4),A5

**********************
* A2 = SubWindow     *
* A3 = ItemWindow    *
* A5 = MenuWindow    *
**********************
* ------------ MenuWindow.BitMapOK ?
	       TST.W	 (A5)
	       BEQ.W	 SelectDone    * No

* ------------ MouseInWindow(MenuWindow) ?
	       MOVEA.L	 A5,A0
	       JSR	 @MouseInWindow(PC)
	       TST.W	 D0
	       BEQ.W	 SelectDone    * No

* ------------ NewMenuNr = (MouseY - MenuWindow.TopEdge - HBORDERSIZE)/MenuFontSize + 1
	       MOVE.W	 _MouseY(A4),D2
	       SUB.W	 wwd_TopEdge(A5),D2
	       SUBQ.W	 #HBORDERSIZE,D2
	       ANDI.L	 #$0000FFFF,D2
	       DIVU.W	 _MenuFontSize(A4),D2
	       ADDQ.W	 #1,D2

* ------------ NewMenuNr == CurrentMenuNr ?
	       MOVE.W	 _CurrentMenuNr(A4),D3
	       CMP.W	 D3,D2
	       BEQ.W	 SelectDone    * Yes

****************************************
* A2 = SubWindow    D2 = NewMenuNr     *
* A3 = ItemWindow   D3 = CurrentMenuNr *
* A5 = MenuWindow		       *
****************************************

* ------------ CurrentMenuNr == 0 ?
	       TST.W	 D3
	       BEQ.B	 2$	       * Yes

* ------------ ItemWindow.BitMapOk
	       TST.W	 (A3)
	       BEQ.B	 1$	       * No

* ------------ CloseSubWindow()
	       JSR	 @CloseSubWindow(PC)

* ------------ CloseItemWindow();
	       JSR	 @CloseItemWindow(PC)

* ------------ TempItem = NULL
	       CLR.L	 _TempItem(A4)

* ------------ ToggleMenu(CurrentMenuNr,MenuWindow.Current) - HIGHLIGHTOFF -
1$	       MOVE.W	 D3,D0
	       MOVEA.L	 wwd_Current(A5),A0
	       JSR	 @ToggleMenu(PC)

* ------------ MenuWindow.Current = FindMenuPtr(NewMenuNr)
2$	       MOVE.W	 D2,D0
	       JSR	 @FindMenuPtr(PC)
	       MOVE.L	 D0,wwd_Current(A5)

* ------------ MenuWindow.Current == NULL ?
	       TST.L	 D0
	       BNE.B	 3$	       * No

* ------------ CurrentMenuNr = 0
	       CLR.W	 _CurrentMenuNr(A4)
	       BRA.B	 SelectDone

* ------------ CurrentMenuNr = LastSelectedNum = NewMenuNr
3$	       MOVE.W	 D2,_CurrentMenuNr(A4)
	       MOVE.W	 D2,_LastSelectedNum(A4)
	       MOVE.W	 D2,D3

* ------------ ItemWindow.ItemsEnabled = MenuWindow.Current->Flags & MENUENABLED
	       MOVEA.L	 wwd_Current(A5),A0
	       MOVEQ.L	 #MENUENABLED,D0
	       AND.W	 mu_Flags(A0),D0
	       MOVE.W	 D0,wwd_ItemsEnabled(A3)

* ------------ ItemWindow.Items = MenuWindow.Current->FirstItem
	       MOVE.L	 mu_FirstItem(A0),wwd_Items(A3)

* ------------ ToggleMenu(NewMenuNr,MenuWindow.Current)  - HIGHLIGHTON -
	       MOVE.W	 D2,D0
	       JSR	 @ToggleMenu(PC)

* ------------ ItemWindow->Items == NULL ?
	       TST.L	 wwd_Items(A3)
	       BEQ.B	 SelectDone    * Yes

* ------------ ItemsTopPos = (CurrentMenuNr - 1) * MenuFontSize + MenuWindow.TopEdge
	       MOVE.W	 D3,D0
	       SUBQ.W	 #1,D0
	       MULU.W	 _MenuFontSize(A4),D0
	       ADD.W	 _MenuWindow+wwd_TopEdge(A4),D0

* ------------ OpenItemWindow(ItemWindow,MenuWindow,ItemsTopPos,ITEMWINDOW)
	       MOVEA.L	 A3,A0
	       MOVEA.L	 A5,A1
	       MOVEQ.L	 #0,D1
	       JSR	 @OpenItemWindow(PC)

* ------------ Window opened ?
	       TST.W	 D0
	       BEQ.B	 SelectDone    * NO

* ------------ Set MIDRAWN flag
	       MOVEA.L	 wwd_Current(A5),A0
	       BSET	 #MIDRAWNBIT,mu_Flags(A0)

SelectDone:    MOVEQ.L	 #FALSE,D0
SelectQuit:    MOVEM.L	 (SP)+,D2-D3/A2-A3/A5
	       RTS

*****************************************************************
* FinalSelect() - Do checkmarking and calculate Menupick value. *
*								*
* Input:							*
*   none							*
* Output:							*
*   return  - MenuPick-value or MENUNULL.			*
*****************************************************************
@FinalSelect:  MOVEM.L	 D6-D7/A2-A3,-(SP)

* ------------ SubItemNr = NOSUB
	       MOVEQ	 #$1F,D7

	       MOVEA.L	 _SubWindow+wwd_Current(A4),A2
	       MOVEA.L	 _ItemWindow+wwd_Current(A4),A3

* ------------ SubWindow.Current == NULL ?
	       MOVE.L	 A2,D0
	       BEQ.B	 1$	       * Yes

* ------------ SubWindow.Current->Flags & SubWindow.ItemsEnabled & ITEMENABLED ?
	       MOVEQ.L	 #ITEMENABLED,D0
	       AND.W	 mi_Flags(A2),D0
	       AND.W	 _SubWindow+wwd_ItemsEnabled(A4),D0
	       BEQ.B	 1$	       * No

* ------------ Subitem selected -> checkmark and draw all subitems again.
* ------------ CheckMark(&SubWindow)
	       LEA	 _SubWindow(A4),A0
	       JSR	 @CheckMark(PC)
	       TST.W	 D0
	       BEQ.B	 05$

* ------------ DrawAllItems(&SubWindow)
	       LEA	 _SubWindow(A4),A0
	       JSR	 @DrawAllItems(PC)

* ------------ HighLightItem(&SubWindow,HIGHLIGHTON)
	       MOVEQ.L	 #0,D0
	       LEA	 _SubWindow(A4),A0
	       JSR	 @HighLightItem(PC)

* ------------ SubWindow.Current->NextSelect = MENUNULL
05$	       MOVE.W	 #$FFFF,mi_NextSelect(A2)

* ------------ Find the number of the selected subitem
	       MOVEA.L	 A2,A0
	       MOVEA.L	 _SubWindow+wwd_Items(A4),A1
	       JSR	 @FindItemNr(PC)
	       MOVE.L	 D0,D7
	       BRA.B	 3$

* ------------ ItemWindow.Current == NULL ?
1$	       MOVE.L	 A3,D0
	       BEQ.B	 2$	       * Yes

* ------------ ItemWindow.Current->Flags & ITEMENABLED ?
	       MOVEQ.L	 #ITEMENABLED,D0
	       AND.W	 mi_Flags(A3),D0
	       BEQ.B	 2$	       * No

* ------------ ItemWindow.ItemsEnabled & MENUENABLED ?
	       TST.W	 _ItemWindow+wwd_ItemsEnabled(A4)
	       BEQ.B	 2$	       * No

* ------------ ItemWindow.Current->SubItem == NULL ?
	       TST.L	 mi_SubItem(A3)
	       BNE.B	 2$	       * No

* ------------ ItemWindow.Current->NextSelect = MENUNULL
	       MOVE.W	 #$FFFF,mi_NextSelect(A3)
	       BRA.B	 3$

* ------------ Nothing is selected -> exit
2$	       MOVEQ.L	 #-1,D0
	       BRA.B	 6$

* ------------ CheckMark(ItemWindow)
3$	       LEA	 _ItemWindow(A4),A0
	       BSR.B	 @CheckMark
	       TST.W	 D0
	       BEQ.B	 38$

* ------------ Remove SubWindow (if any).
	       LEA	 _SubWindow(A4),A0
	       JSR	 @SwapBits(PC)

* ------------ DrawAllItems(&ItemWindow)
	       LEA	 _ItemWindow(A4),A0
	       JSR	 @DrawAllItems(PC)

* ------------ Check if ItemWindow & MenuWindow is Same (4.0)
	       TST.W	 _MenuWindow(A4)        * BitMapOk
	       BNE.B	 35$

* ------------ DrawAllMenues(ItemWindow)
	       LEA	 _ItemWindow(A4),A0
	       JSR	 @DrawAllMenues

* ------------ HighLightItem(&ItemWindow,HIGHLIGHTON)
35$	       MOVEQ.L	 #0,D0
	       LEA	 _ItemWindow(A4),A0
	       JSR	 @HighLightItem(PC)

* ------------ Restore subwindow. (if any)
	       LEA	 _SubWindow(A4),A0
	       JSR	 @SwapBits(PC)

* ------------ Find number of selected item,
38$	       MOVEA.L	 A3,A0
	       MOVEA.L	 _ItemWindow+wwd_Items(A4),A1
	       JSR	 @FindItemNr(PC)
	       MOVE.L	 D0,D6

* ------------ MenuNum = SHIFTMENU(FindRealMenuNum(CurrentMenuNr)) |
* ------------		 SHIFTITEM(ItemNr) |
* ------------		 SHIFTSUB(SubItemNr)
	       MOVE.W	 _CurrentMenuNr(A4),D0

	       JSR	 @FindMenuPtr(PC)
	       MOVEA.L	 D0,A1
	       MOVEA.L	 _Menues(A4),A0

	       MOVEQ.L	 #0,D0

4$	       CMPA.L	 A0,A1
	       BEQ.B	 5$

	       MOVEA.L	 (A0),A0        * mu_NextMenu(A0)
	       ADDQ.L	 #1,D0
	       BRA.B	 4$

* ------------ SHIFTITEM(ItemNr)
5$	       ANDI.W	 #$3F,D6
	       ASL.W	 #5,D6
	       OR.W	 D6,D0

* ------------ SHIFTSUB(SubItemNr)
	       ANDI.W	 #$1F,D7
	       ASL.W	 #8,D7
	       ASL.W	 #3,D7
	       OR.W	 D7,D0

6$	       MOVEM.L	 (SP)+,D6-D7/A2-A3
	       RTS

**************************************************
* CheckMark(Window) - Checkmark selected item.   *
*						 *
* Input:					 *
*   Window     - Window to checkmark		 *
* Output:					 *
*   return.W   - TRUE if checkmarked		 *
**************************************************
@CheckMark:    MOVEA.L	 wwd_Items(A0),A1
	       MOVEA.L	 wwd_Current(A0),A0

	       MOVE.W	 mi_Flags(A0),D1

* ------------ Selected->Flags & CHECKIT ?
	       MOVEQ.L	 #CHECKIT,D0
	       AND.W	 D1,D0
	       BEQ.B	 4$	       * No

* ------------ Selected->Flags & CHECKED ?
	       MOVE.W	 #CHECKED,D0
	       AND.W	 D1,D0
	       BEQ.B	 1$	       * No

* ------------ Selected->Flags & MENUTOGGLE ?
	       MOVEQ.L	 #MENUTOGGLE,D0
	       AND.W	 D1,D0
	       BEQ.B	 4$	       * No

* ------------ Selected->Flags &= ~CHECKED   - Togglemenu -
	       BCLR	 #0,mi_Flags(A0)
	       BRA.B	 35$

* ------------ Selected->Flags |= CHECKED
1$	       BSET	 #0,mi_Flags(A0)

* ------------ Handle mutual exclusion.
* ------------ Exclude = Selected->MutualExclude
	       MOVE.L	 mi_MutualExclude(A0),D0
	       BEQ.B	 35$

* ------------ Exclude >>= 1
2$	       LSR.L	 #1,D0
	       BCC.B	 3$

* ------------ Items->Flags &= ~CHECKED
	       BCLR	 #0,mi_Flags(A1)

* ------------ Items = Items->NextItem
3$	       MOVEA.L	 (A1),A1

* ------------ More items ?
	       MOVE.L	 A1,D1
	       BNE.B	 2$	       * Yes

35$	       MOVEQ.L	 #TRUE,D0
4$	       RTS

************************************************************
* DrawMenuItem(Window, Item, Mode)                         *
*							   *
* Input:						   *
*   Window  -	  Data about window to draw item into.	   *
*   Item    -	  Item to draw. 			   *
*   Mode.W  -	  ITEMFILL = Draw Item. 		   *
*		  SELECTFILL = Draw selected item (if any).*
* OUTPUT						   *
*   none						   *
************************************************************
@DrawMenuItem: MOVEM.L	 D2-D7/A2-A3/A5-A6,-(SP)
	       MOVEA.L	 A1,A3

	       MOVE.L	 A0,-(SP)
********************************************************
* D0 = Mode	      A0 = Window	   (SP) Window *
*		      A1 = Item 		       *
*		      A3 = Item 		       *
********************************************************
* ------------ Left = Item->LeftEdge - Window->LeftValue
	       MOVE.W	 mi_LeftEdge(A3),D7
	       SUB.W	 wwd_LeftValue(A0),D7
	       EXT.L	 D7

* ------------ Right = Left + Item->Width - 1
	       MOVE.L	 D7,D2
	       ADD.W	 mi_Width(A3),D2
	       SUBQ.L	 #1,D2

* ------------ ItemTop = Top = Item->TopEdge - Window->TopValue
	       MOVE.W	 mi_TopEdge(A3),D6
	       SUB.W	 wwd_TopValue(A0),D6
	       EXT.L	 D6
	       MOVE.L	 D6,D4

* ------------ Bottom = Top + Item->Height - 1
	       MOVE.L	 D6,D3
	       ADD.W	 mi_Height(A3),D3
	       SUBQ.L	 #1,D3

	       LEA	 _Rp(A4),A5
	       MOVEA.L	 _IntuitionBase(A4),A6

* ------------ Find what to Draw.
	       MOVEA.L	 mi_ItemFill(A3),A2

	       TST.W	 D0	      * Mode == ITEMFILL ?
	       BEQ.B	 CheckDraw

* ------------ Use selectfill.
	       MOVEA.L	 mi_SelectFill(A3),A2

***************************************************************
* D0 = Mode		     A0 = Window	  (SP) Window *
*			     A1 = Item			      *
* D2 = Right		     A2 = Fill			      *
* D3 = Bottom		     A3 = Item			      *
* D4 = ItemTop						      *
* D6 = Top		     A5 = Rp			      *
* D7 = Left		     A6 = IntuitionBase 	      *
***************************************************************
* ------------ Anything to draw ?
CheckDraw:     MOVE.L	 A2,D0
	       BEQ.W	 DrawDone

* ------------ Draw the item.
DrawItem:      MOVEA.L	 A5,A0	       * Rp
	       MOVEA.L	 A2,A1	       * Fill
	       MOVE.L	 D7,D0	       * Left
	       MOVE.L	 D6,D1	       * Top

	       MOVEQ.L	 #ITEMTEXT,D5
	       AND.W	 mi_Flags(A3),D5
	       BEQ.B	 DrawImage

* ------------ PrintIText(Fill, Left, Top)
	       JSR	 _LVOPrintIText(A6)

* ------------ ItemTop	+= Fill.TopEdge
	       ADD.W	 it_TopEdge(A2),D4

	       BRA.B	 DrawCheckMark

* ------------ DrawImage(Fill, Left, Top)
DrawImage:     JSR	 _LVODrawImage(A6)

* ------------ ItemTop += Fill.TopEdge
	       ADD.W	 ig_TopEdge(A2),D4

***********************************************************
* D2 = Right		 A2 = Fill	      (SP) Window *
* D3 = Bottom		 A3 = Item			  *
* D4 = ItemTop		 A5 = Rp			  *
* D6 = Top		 A6 = IntuitionBase		  *
* D7 = Left						  *
***********************************************************
* ------------ Draw CheckMark ?
DrawCheckMark: MOVE.W	 #CHECKIT+CHECKED,D0
	       AND.W	 mi_Flags(A3),D0
	       CMPI.W	 #CHECKIT+CHECKED,D0
	       BNE.B	 DrawCommKey

* ------------ DrawImage(ActiveWindow->CheckMark, Left, ItemTop)
	       MOVEA.L	 _ActiveWindow(A4),A0
	       MOVEA.L	 wd_CheckMark(A0),A1   * CheckMark
	       MOVE.L	 D7,D0		       * Left
	       MOVE.L	 D4,D1		       * ItemTop (New 3.7)
	       MOVEA.L	 A5,A0		       * Rp
	       JSR	 _LVODrawImage(A6)

*********************************************
* D2 = Right		 A2 = Fill	    *
* D3 = Bottom		 A3 = Item	    *
* D4 = ItemTop		 A5 = Rp	    *
* D6 = Top		 A6 = IntuitionBase *
* D7 = Left				    *
*********************************************
* ------------ SetDrMd(JAM1)
DrawCommKey:   MOVEA.L	 _GfxBase(A4),A6
	       MOVEA.L	 A5,A1		       * Rp
	       MOVEQ.L	 #RP_JAM1,D0	       * JAM1
	       JSR	 _LVOSetDrMd(A6)

* ------------ Has item CommadKey ?
	       MOVEQ.L	 #COMMSEQ,D0
	       AND.W	 mi_Flags(A3),D0
	       BEQ.B	 GhostItem

* ------------ KeyLeft = Right - Rp.TxWidth
	       MOVE.L	 D2,D5
	       SUB.W	 _Rp+rp_TxWidth(A4),D5

*******************************************
* D2 = Right		     A2 = Fill	  *
* D3 = Bottom		     A3 = Item	  *
* D4 = ItemTop		     A5 = Rp	  *
* D5 = KeyLeft		     A6 = GfxBase *
* D6 = Top				  *
* D7 = Left				  *
*******************************************
* ------------ Move(KeyLeft, ItemTop + Rp.TxHeight - 2);
	       MOVE.L	 D5,D0
	       MOVE.L	 D4,D1
	       ADD.W	 _Rp+rp_TxHeight(A4),D1
	       SUBQ.L	 #2,D1
	       MOVEA.L	 A5,A1
	       JSR	 _LVOMove(A6)

* ------------ SetAPen(ActiveWindow->DetailPen)
	       MOVEQ	 #00,D0
	       MOVEA.L	 _ActiveWindow(A4),A0
	       MOVE.B	 wd_DetailPen(A0),D0
	       MOVEA.L	 A5,A1
	       JSR	 _LVOSetAPen(A6)

* ------------ Text(&Item->Command,1);
	       LEA	 mi_Command(A3),A0
	       MOVEA.L	 A5,A1
	       MOVEQ	 #1,D0
	       JSR	 _LVOText(A6)

* ------------ DrawImage(&MyAmigaKeyImage[ScreenType],KeyLeft, ItemTop);
	       LEA	 _MyAmigaKeyImage(PC),A1
	       MOVE.L	 D5,D0
	       BSR.B	 DrawMyImage

	       MOVEA.L	 _GfxBase(A4),A6

*******************************************
* D2 = Right		     A2 = Fill	  *
* D3 = Bottom		     A3 = Item	  *
* D4 = ItemTop		     A5 = Rp	  *
* D6 = Top		     A6 = GfxBase *
* D7 = Left				  *
*******************************************
* ------------ Ghost Item ?
GhostItem:     MOVEQ.L	 #ITEMENABLED,D0
	       AND.W	 mi_Flags(A3),D0
	       BEQ.B	 1$

	       MOVEA.L	 (SP),A2
	       TST.W	 wwd_ItemsEnabled(A2)
	       BNE.B	 SubItem

* ------------ SetAfPt(&Rp, GhostPattern, 1)
1$	       LEA	 _GhostPattern(PC),A0
	       MOVE.L	 A0,_Rp+rp_AreaPtrn(A4)

	       MOVE.B	 #01,_Rp+rp_AreaPtSz(A4)

* ------------ SetAPen(ActiveWindow->BlockPen)
	       MOVEQ	 #0,D0
	       MOVEA.L	 _ActiveWindow(A4),A0
	       MOVE.B	 wd_BlockPen(A0),D0
	       MOVEA.L	 A5,A1
	       JSR	 _LVOSetAPen(A6)

* ------------ RectFill(Left, Top, Right, Bottom)
	       MOVEA.L	 A5,A1
	       MOVE.L	 D7,D0
	       MOVE.L	 D6,D1
	       JSR	 _LVORectFill(A6)

* ------------ SetAfPt(NormalPattern, 1)
	       LEA	 _NormalPattern(PC),A0
	       MOVE.L	 A0,_Rp+rp_AreaPtrn(A4)

*******************************************
* D2 = Right				  *
* D3 = Bottom		     A3 = Item	  *
* D4 = ItemTop		     A5 = Rp	  *
* D6 = Top		     A6 = GfxBase *
* D7 = Left				  *
*******************************************
* ------------ SubItem ?
SubItem:       TST.L	 mi_SubItem(A3)
	       BEQ.B	 DrawDone

* ------------ Option & SUBITEMPOINTER
	       BTST	 #SUBITEMPOINTER,_Options(A4)
	       BEQ.B	 DrawDone

* ------------ DrawImage(&MySubItemImage[ScreenType],Right,ItemTop);
	       LEA	 _MySubItemImage(PC),A1
	       MOVE.L	 D2,D0
	       BSR.B	 DrawMyImage

DrawDone:      ADDQ.L	 #4,SP

	       MOVEM.L	 (SP)+,D2-D7/A2-A3/A5-A6
	       RTS

******************************
* DrawMyImage		     *
* A1 - What to draw	     *
* A5 - Rp		     *
* D0 - Left		     *
* D4 - Top		     *
*			     *
* Destroyed: D0-D1/A0-A1/A6  *
******************************
DrawMyImage:   TST.W	 _ScreenType(A4)
	       BEQ.B	 1$
	       MOVEQ.L	 #ig_SIZEOF,D1
	       ADDA.L	 D1,A1

1$	       MOVEA.L	 A5,A0
	       MOVE.L	 D4,D1
	       MOVEA.L	 _IntuitionBase(A4),A6
	       JMP	 _LVODrawImage(A6)

***************************************************
* HighLightItem(Window, Mode)                     *
*						  *
* Input:					  *
*   Window     -  Data for the window to draw in. *
*   Mode.W     -  HIGHLIGHTON or HIGHLIGHTOFF.	  *
* Output:					  *
*   return     -  TRUE if item highlighted	  *
*		  (may be HIGHNONE)               *
***************************************************
@HighLightItem:
	       MOVEM.L	 D2-D5/A2-A3/A5-A6,-(SP)

	       MOVEA.L	 wwd_Current(A0),A3

* ------------ Possible to highlight item ?
	       MOVEQ.L	 #ITEMENABLED,D1
	       AND.W	 mi_Flags(A3),D1
	       BEQ.B	 1$		      * No

	       TST.W	 wwd_ItemsEnabled(A0)
	       BNE.B	 15$		      * Yes

* ------------ return FALSE
1$	       MOVEQ.L	 #FALSE,D0
	       BRA.W	 HighLightQuit

* ------------ start highlighting
15$	       MOVEA.L	 A0,A2

* ------------ Start highlighting.
	       LEA	 _Rp(A4),A5
	       MOVEA.L	 _GfxBase(A4),A6

* ------------ Set or clear HIGHITEM flag
	       MOVE.W	 mi_Flags(A3),D5
	       BCLR	 #HIGHITEMBIT,D5

* ------------ Mode = !Mode
	       MOVEQ.L	 #1,D1
	       ADDQ.W	 #1,D0
	       AND.W	 D1,D0

* ------------ !Mode = HIGHLIGHTOFF ?
	       BEQ.B	 2$	       * Yes

	       BSET	 #HIGHITEMBIT,D5

2$	       MOVE.W	 D5,mi_Flags(A3)
***********************************************
* D0 = !Mode		      A0 = Window     *
* D5 = Window.Current.Flags   A2 = Window     *
*			      A3 = Item       *
*			      A5 = Rp	      *
*			      A6 = GfxBase    *
***********************************************
	       AND.W	 #HIGHFLAGS,D5
	       BNE.B	 NotHighImage

* ------------ DrawMenuItem(Window, Item, !Mode);
HighImage:     MOVEA.L	 A3,A1
	       JSR	 @DrawMenuItem(PC)
	       BRA.B	 HighlightDone

* ------------ SetDrMd(COMPLEMENT)
NotHighImage:  MOVEQ.L	 #RP_COMPLEMENT,D0
	       MOVEA.L	 A5,A1
	       JSR	 _LVOSetDrMd(A6)

* ------------ Left   = Item->LeftEdge - Window->LeftValue
	       MOVE.W	 mi_LeftEdge(A3),D0
	       SUB.W	 wwd_LeftValue(A2),D0
	       EXT.L	 D0

* ------------ Right  = Left + Item->Width - 1
	       MOVE.W	 mi_Width(A3),D2
	       EXT.L	 D2
	       ADD.L	 D0,D2
	       SUBQ.L	 #1,D2

* ------------ Top    = Item->TopEdge - Window->TopValue
	       MOVE.W	 mi_TopEdge(A3),D1
	       SUB.W	 wwd_TopValue(A2),D1
	       EXT.L	 D1

* ------------ Bottom = Top + Item->Height - 1
	       MOVE.W	 mi_Height(A3),D3
	       EXT.L	 D3
	       ADD.L	 D1,D3
	       SUBQ.L	 #1,D3

	       MOVEA.L	 A5,A1

***********************************
* D0 = Left			  *
* D1 = Top			  *
* D2 = Right			  *
* D3 = Bottom	   A5 = Rp	  *
* D5 = HighFlags   A6 = GfxBase   *
***********************************
* ------------ Check out kind of highlighting.
	       CMPI.W	 #HIGHBOX,D5
	       BEQ.B	 HighBox
	       CMPI.W	 #HIGHCOMP,D5
	       BNE.B	 HighlightDone

* ------------ RectFill(Left, Top, Right, Bottom)
HighComp:      JSR	 _LVORectFill(A6)
	       BRA.B	 HighlightDone

* ------------ DrawRect(Left-4, Top-2, Right + 4, Bottom + 2)
HighBox:       SUBQ.L	 #4,D0
	       SUBQ.L	 #2,D1
	       ADDQ.L	 #4,D2
	       ADDQ.L	 #2,D3
	       JSR	 @DrawRect(PC)
	       JSR	 @DrawRect(PC)

* ------------ return TRUE
HighlightDone: MOVEQ.L	 #TRUE,D0
HighLightQuit: MOVEM.L	 (SP)+,D2-D5/A2-A3/A5-A6
	       RTS

*********************************************
* ToggleMenu(Number,Menu)                   *
*					    *
* Input:				    *
*   Number.W -	Menu to highlight.	    *
*   Menu   - Pointer to the Menu structure. *
* Output:				    *
*   none				    *
*********************************************
@ToggleMenu:   MOVEM.L	 D2-D3/A6,-(SP)

* ------------ Menu enabled ?
	       MOVEQ.L	 #MENUENABLED,D2
	       AND.W	 mu_Flags(A0),D2
	       BEQ.B	 ToggleDone

	       MOVE.W	 D0,D3

* ------------ Set drawmode = COMPLEMENT.
	       LEA	 _Rp(A4),A1
	       MOVEQ	 #RP_COMPLEMENT,D0
	       MOVEA.L	 _GfxBase(A4),A6
	       JSR	 _LVOSetDrMd(A6)

* ------------ Invert menu.
* ------------ Bottom = Number * MenuFontSize + MenuWindow.TopEdge.
	       MOVE.W	 _MenuFontSize(A4),D2
	       MULU.W	 D2,D3
	       ADD.W	 _MenuWindow+wwd_TopEdge(A4),D3

* ------------ Top = Bottom - MenuFontSize + HBORDERSIZE.
	       MOVE.L	 D3,D1
	       SUB.L	 D2,D1
	       ADDQ.L	 #HBORDERSIZE,D1

* ------------ Left = MenuWindow.LeftEdge + VBORDERSIZE.
	       MOVEQ.L	 #VBORDERSIZE,D0
	       ADD.W	 _MenuWindow+wwd_LeftEdge(A4),D0

* ------------ Right = MenuWindow.RightEdge - VBORDERSIZE.
	       MOVE.W	 _MenuWindow+wwd_RightEdge(A4),D2
	       SUBQ.L	 #VBORDERSIZE,D2

	       LEA	 _Rp(A4),A1
	       JSR	 _LVORectFill(A6)

ToggleDone:    MOVEM.L	 (SP)+,D2-D3/A6
	       RTS

************************
* DrawAllMenus(Window) *
*		       *
************************
@DrawAllMenues:
	       MOVEM.L	 D2-D4/D7/A2-A3/A5-A6,-(SP)

* ------------ MenuLeft = Window.LeftEdge + VBORDERSIZE
	       MOVE.W	 wwd_LeftEdge(A0),D7                * 4.0
	       ADDQ.W	 #VBORDERSIZE,D7
	       EXT.L	 D7

* ------------ MenuTop = Window.TopEdge
	       MOVE.W	 wwd_TopEdge(A0),D3                 * 4.0
	       EXT.L	 D3

* ------------ MenuRight = Window.RightEdge - VBORDERSIZE
	       MOVE.W	 wwd_RightEdge(A0),D2               * 4.0
	       SUBQ.W	 #VBORDERSIZE,D2
	       EXT.L	 D2

* ------------ MenuPtr = MenuSorted;
	       MOVEA.L	 _MenuSorted(A4),A3
	       MOVEA.L	 _ActiveWindow(A4),A2
	       LEA	 _Rp(A4),A5
	       MOVEA.L	 _GfxBase(A4),A6

****************************************
* D2 = MenuRight     A2 = ActiveWindow *
* D3 = MenuTop	     A3 = MenuPtr      *
* D7 = MenuLeft      A5 = Rp	       *
*		     A6 = GfxBase      *
****************************************
* ------------ MenuTopOld = MenuTop;
NextMenu:      MOVE.L	 D3,D4

* ------------ MenuTop += MenuFontSize;
	       ADD.W	 _MenuFontSize(A4),D3

* ------------ SetAPen(Rp,ActiveWindow->DetailPen)
	       MOVEQ.L	 #0,D0
	       MOVE.B	 wd_DetailPen(A2),D0
	       MOVEA.L	 A5,A1
	       JSR	 _LVOSetAPen(A6)

* ------------ Move(Rp, MenuLeft, MenuTop - 1)
	       MOVE.L	 D7,D0
	       MOVE.L	 D3,D1
	       SUBQ.L	 #1,D1
	       MOVEA.L	 A5,A1
	       JSR	 _LVOMove(A6)

* ------------ Text(Rp,MenuSorted->MenuPtr->MenuName,Mystrlen(MenuSorted->MenuPtr->MenuName))
	       MOVE.L	 ms_MenuPtr(A3),A0
	       MOVEA.L	 mu_MenuName(A0),A0
	       MOVE.L	 A0,-(SP)
	       JSR	 @Mystrlen(PC)
	       MOVEA.L	 A5,A1
	       MOVEA.L	 (SP)+,A0
	       JSR	 _LVOText(A6)

* ------------ GhostItem ?
	       MOVEQ.L	 #MENUENABLED,D0
	       MOVE.L	 ms_MenuPtr(A3),A0
	       AND.W	 mu_Flags(A0),D0
	       BNE.B	 NoMenuGhost

* ------------ SetAfPt(Rp, GhostPattern, 1)
	       LEA	 _GhostPattern(PC),A0
	       MOVE.L	 A0,_Rp+rp_AreaPtrn(A4)

	       MOVE.B	 #1,_Rp+rp_AreaPtSz(A4)

* ------------ SetAPen(Rp,ActiveWindow->BlockPen)
	       MOVE.B	 wd_BlockPen(A2),D0
	       MOVEA.L	 A5,A1
	       JSR	 _LVOSetAPen(A6)

* ------------ RectFill(Rp,MenuLeft,MenuTopOld + HBORDERSIZE,MenuRight,MenuTop)
	       MOVE.L	 D7,D0
	       MOVE.L	 D4,D1
	       ADDQ.W	 #HBORDERSIZE,D1
	       MOVEA.L	 A5,A1
	       JSR	 _LVORectFill(A6)

* ------------ SetAfPt(&Rp,NormalPattern,1);
	       LEA	 _NormalPattern(PC),A0
	       MOVE.L	 A0,_Rp+rp_AreaPtrn(A4)

* ------------ MenuSaved = MenuSaved->Next
NoMenuGhost:   MOVEA.L	 (A3),A3        * ms_Next(A3)

* ------------ More menues ?
	       MOVE.L	 A3,D0
	       BNE.B	 NextMenu

	       MOVEM.L	 (SP)+,D2-D4/D7/A2-A3/A5-A6
	       RTS

**********************************************
* DrawRect(Rp,Left+2,Top+1,Right-2,Bottom-1) *
*	   A1	D0   D1     D2	     D3      *
**********************************************
@DrawRect:     MOVEM.L	 D4-D5/A5-A6,-(SP)

	       MOVE.L	 D0,D4
	       MOVE.L	 D1,D5
	       MOVEA.L	 A1,A5
	       MOVEA.L	 _GfxBase(A4),A6

* ------------ Move(Rp,Left,Top)
	       JSR	 _LVOMove(A6)

* ------------ Draw(Rp,Left++,Bottom)
	       MOVE.L	 D4,D0
	       MOVE.L	 D3,D1
	       MOVEA.L	 A5,A1
	       JSR	 _LVODraw(A6)
	       ADDQ.L	 #1,D4

* ------------ Draw(Rp,Right,Bottom--)
	       MOVE.L	 D2,D0
	       MOVE.L	 D3,D1
	       MOVEA.L	 A5,A1
	       JSR	 _LVODraw(A6)
	       SUBQ.L	 #1,D3

* ------------ Draw(Rp,Right--,Top)
	       MOVE.L	 D2,D0
	       MOVE.L	 D5,D1
	       MOVEA.L	 A5,A1
	       JSR	 _LVODraw(A6)
	       SUBQ.L	 #1,D2

* ------------ Draw(Rp,Left,Top++)
	       MOVE.L	 D4,D0
	       MOVE.L	 D5,D1
	       MOVEA.L	 A5,A1
	       JSR	 _LVODraw(A6)
	       ADDQ.L	 #1,D5

* ------------ Draw(Rp,Left++,Bottom)
	       MOVE.L	 D4,D0
	       MOVE.L	 D3,D1
	       MOVEA.L	 A5,A1
	       JSR	 _LVODraw(A6)
	       ADDQ.L	 #1,D4

* ------------ Move(Rp,Right,Bottom)
	       MOVE.L	 D2,D0
	       MOVE.L	 D3,D1
	       MOVEA.L	 A5,A1
	       JSR	 _LVOMove(A6)

* ------------ Draw(Rp,Right--,Top)
	       MOVE.L	 D2,D0
	       MOVE.L	 D5,D1
	       MOVEA.L	 A5,A1
	       JSR	 _LVODraw(A6)
	       SUBQ.L	 #1,D2

	       MOVE.L	 D4,D0
	       MOVE.L	 D5,D1
	       MOVEM.L	 (SP)+,D4-D5/A5-A6
	       RTS

* Put these images in the code segment

_MyAmigaKeyImage:
	       dc.w	 -25,0,23,8,1
	       dc.l	 _AmigaKeyHighRes
	       dc.b	 1,0
	       dc.l	 0
	       dc.w	 -16,0,14,8,1
	       dc.l	 _AmigaKeyLoRes
	       dc.b	 1,0
	       dc.l	 0
_MySubItemImage:
	       dc.w	 2,0,8,7,1
	       dc.l	 _SubItemPointerH
	       dc.b	 1,0
	       dc.l	 0
	       dc.w	 1,0,4,7,1
	       dc.l	 _SubItemPointerL
	       dc.b	 1,0
	       dc.l	 0

_GhostPattern:	dc.w	  $1111,$4444
_NormalPattern: dc.w	  $ffff,$ffff

	       SECTION ImageData,DATA_C

_AmigaKeyHighRes:
	       dc.l    %11000000000000000000011000000000
	       dc.l    %00000000000000111100000000000000
	       dc.l    %00000000000011111100000000000000
	       dc.l    %00000000001110011100000000000000
	       dc.l    %00000000111000011100000000000000
	       dc.l    %00000011111111111100000000000000
	       dc.l    %00011111100000111111000000000000
	       dc.l    %11000000000000000000011000000000

_AmigaKeyLoRes:
	       dc.w    %1000000000000100
	       dc.w    %0000000011100000
	       dc.w    %0000000111100000
	       dc.w    %0000001101100000
	       dc.w    %0000011001100000
	       dc.w    %0000111111100000
	       dc.w    %0011110011110000
	       dc.w    %1000000000000100

_SubItemPointerL:
	       dc.w    %0111000000000000
	       dc.w    %0011000000000000
	       dc.w    %0001000000000000
	       dc.w    %0000000000000000
	       dc.w    %0001000000000000
	       dc.w    %0011000000000000
	       dc.w    %0111000000000000

_SubItemPointerH:
	       dc.w    %0011111100000000
	       dc.w    %0000111100000000
	       dc.w    %0000001100000000
	       dc.w    %0000000000000000
	       dc.w    %0000001100000000
	       dc.w    %0000111100000000
	       dc.w    %0011111100000000
	       END

