home *** CD-ROM | disk | FTP | other *** search
Text File | 1978-02-08 | 82.4 KB | 3,136 lines |
- 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)
-
- * ------------ If subitems are shown either Current or TempItem must be something.
- 1$ MOVEA.L _ItemWindow+wwd_Current(A4),A1
- MOVE.L A1,D0
- BNE.B 2$ * 4.21
- MOVEA.L _TempItem(A4),A1 * 4.21
- 2$ BCLR #ISDRAWNBIT,mi_Flags(A1)
- BRA.B Close
-
- @CloseItemWindow:
- LEA _ItemWindow(A4),A0
- TST.W (A0) * wwd_BitMapOK
- BEQ.B CloseQuit
-
- MOVE.L wwd_Current(A0),D0
- BNE.B 1$
- MOVE.L _TempItem(A4),D0
- BEQ.B 2$
-
- 1$ MOVE.L D0,A1
- BCLR #HIGHITEMBIT,mi_Flags(A1)
-
- 2$ 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
-
-