home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
600-699
/
ff667.lha
/
PopUpMenu
/
Source
/
PopUpMenu.a
< prev
next >
Wrap
Text File
|
1992-05-21
|
84KB
|
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