home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 607.lha / PopUpMenu_v4.3 / Source.LZH / Source / NewStartUp.a < prev    next >
Text File  |  1991-10-23  |  39KB  |  1,374 lines

  1.            opt      l+,c+,d+,y+
  2.            opt      ow1+,ow2+,ow3+,ow4+,ow5+,ow6+
  3.            INCDIR      ":Pspråk/asm/include/"
  4.  
  5.            INCLUDE      "exec/types.i"
  6.            INCLUDE      "PopUpMenu.i"
  7.  
  8.            xref     _LinkerDB
  9.  
  10.            xref     @PopUpHandler        * Inputhandler
  11.  
  12.            xref     @SelectOptions     * Overlay (OldOptions)
  13.                         *          D2
  14.            xref     @GetCommandLine    * Overlay (OldOptions,CommandLine,Length)
  15.                         *          D3         A5        D2
  16.            xref     @GetWBCommandLine  * Overlay (OldOptions)
  17.                         *          D3
  18.            xref     @MyWrite        * Overlay (TextNumber, Options)
  19.                         *          D2          D3
  20.            xref     @PopUpMenu        * Overlay (MySignals)
  21.                         *          A3
  22.  
  23.            xdef     @FixDown
  24.            xdef     @QueTimer
  25.            xdef     @Mystrlen
  26.  
  27.            xdef     _PopUpSemaphore
  28.            xdef     _IBase
  29.  
  30. INPHANDLPRI    EQU     60    * Should be first in list
  31. POPUPTASKPRI   EQU     3
  32.  
  33.            section     text,code
  34. Start:           MOVEM.L     D2-D7/A2-A6,-(SP)
  35.            MOVE.L     A0,A5           * A5 = Command Line
  36.            MOVE.L     D0,D2           * D2 = Command Length
  37.  
  38. * ------------ Make room for global data on stack
  39.            LEA     -Globals_SIZEOF(SP),SP
  40.            MOVEA.L     SP,A4
  41.  
  42.            MOVE.L     (AbsExecBase).W,A6
  43.            MOVE.L     A6,(A4)             * Lets hope this is FAST RAM
  44.  
  45.            CLR.L     _WBenchMsg(A4)
  46.            MOVE.W     #1,_Error(A4)
  47.  
  48. * ------------ Open Dos library
  49.            LEA     DOSNAME(PC),A1
  50.            MOVEQ.L     #LIBVERSION,D0
  51.            JSR     _LVOOpenLibrary(A6)
  52.            MOVE.L     D0,_DOSBase(A4)     * Checked later
  53.  
  54. *------------- Get the address of our task
  55.            MOVE.L     eb_ThisTask(A6),A3
  56.  
  57. * ------------ Set task priority
  58.            MOVEA.L     A3,A1
  59.            MOVEQ.L     #POPUPTASKPRI,D0
  60.            JSR     _LVOSetTaskPri(A6)
  61.  
  62. *------------- Started form CLI ?
  63.            TST.L   pr_CLI(A3)
  64.            BNE.B   FromCLI           * Yes
  65.  
  66. * ------------ Workbench Startup
  67. * ------------ Wait for startup message.
  68. FromWorkbench: LEA     pr_MsgPort(A3),A0
  69.            JSR     _LVOWaitPort(A6)
  70.            LEA     pr_MsgPort(A3),A0
  71.            JSR     _LVOGetMsg(A6)
  72.            MOVE.L     D0,_WBenchMsg(A4)
  73.  
  74. * ------------ Dos opened alright ?
  75. FromCLI:       TST.L     _DOSBase(A4)
  76.            BEQ.W     NoDos           * No
  77.  
  78. * ------------ See if we are already installed
  79. * ------------ ReplyPort = FindPort(REPLYPORTNAME)
  80.            LEA     REPLYPORTNAME(PC),A1
  81.            JSR     _LVOFindPort(A6)
  82.            MOVE.L     D0,_ReplyPort(A4)
  83.  
  84. * ------------ ReplyPort == NULL ? [ not installed ]
  85.            TST.L     D0
  86.            BEQ.W     NotInstalled      * Yes
  87.  
  88. * ------------ PopUpMenues already installed, ask running task for options
  89. * ------------ QuitPort = MyCreatePort(QUITPORTNAME)
  90. Installed:     LEA     QUITPORTNAME(PC),A0
  91.            JSR     @MyCreatePort(PC)
  92.            MOVEA.L     D0,A2
  93.  
  94. * ------------ QuitPort == NULL  ?
  95.            MOVE.L     A2,D0
  96.            BEQ.W     CleanUp13     * Yes
  97.  
  98. * ------------ Message = BuildIntuiMsg(QuitPort,GETOPTIONS,0)
  99.            MOVEQ.L     #GETOPTIONS,D0
  100.            MOVEQ.L     #0,D1
  101.            MOVEA.L     A2,A0
  102.            JSR     @BuildIntuiMsg(PC)
  103.            MOVEA.L     D0,A3
  104.  
  105. * ------------ Message == NULL    ?
  106.            MOVE.L     A3,D0
  107.            BEQ.B     4$
  108.  
  109. * ------------ PutMsg(ReplyPort,Message)  [ Send message ]
  110.            MOVEA.L     _ReplyPort(A4),A0
  111.            MOVEA.L     A3,A1
  112.            JSR     _LVOPutMsg(A6)
  113.  
  114. * ------------ WaitPort(QuitPort)  [ Wait for reply ]
  115.            MOVEA.L     A2,A0
  116.            JSR     _LVOWaitPort(A6)
  117.  
  118. * ------------ GetMsg(QuitPort)  [ Get the reply ]
  119.            MOVEA.L     A2,A0
  120.            JSR     _LVOGetMsg(A6)
  121.            MOVE.W     im_Code(A3),D0   * Current options
  122.  
  123. * ------------ Started from CLI ?
  124.            TST.L     _WBenchMsg(A4)
  125.            BNE.B     2$          * No
  126.  
  127. * ------------ Get command line
  128.            MOVE.W     D0,D3
  129.            JSR     @GetCommandLine
  130.  
  131. * ------------ Wrong options ?
  132.            TST.W     D0
  133.            BNE.B     3$          * No
  134.  
  135.            BRA.B     35$
  136.  
  137. * ------------ if started from WB just open window
  138. 2$           BSET     #OPENWINDOW+8,D0
  139.  
  140. * ------------ Store new option in message
  141. 3$           MOVE.W     D0,im_Code(A3)
  142.  
  143. * ------------ if user wants to open window don't output any text
  144.            BTST     #OPENWINDOW+8,D0
  145.            BNE.B     33$
  146.  
  147. * ------------ Output exit text ?
  148.            MOVEQ.L     #2,D2           * removed message
  149.            BTST     #EXIT+8,D0
  150.            BNE.B     32$
  151.  
  152.            MOVEQ.L     #1,D2           * options message
  153.            MOVE.L     D0,D3           * options
  154.  
  155. 32$           JSR     @MyWrite
  156.  
  157. * ------------ Prepare to send message
  158. 33$           MOVEQ.L     #NEWOPTIONS,D0
  159.            MOVE.L     D0,im_Class(A3)
  160.  
  161. * ------------ PutMsg(ReplyPort,Message)  [ Send message ]
  162.            MOVEA.L     _ReplyPort(A4),A0
  163.            MOVEA.L     A3,A1
  164.            JSR     _LVOPutMsg(A6)
  165.  
  166. * ------------ WaitPort(QuitPort)  [ Wait for reply ]
  167.            MOVEA.L     A2,A0
  168.            JSR     _LVOWaitPort(A6)
  169.  
  170. * ------------ GetMsg(QuitPort)  [ Get the reply ]
  171.            MOVEA.L     A2,A0
  172.            JSR     _LVOGetMsg(A6)
  173.  
  174. * ------------ FreeMem(Message,sizeof(struct IntuiMessage))
  175. 35$           MOVEA.L     A3,A1
  176.            MOVEQ.L     #im_SIZEOF,D0
  177.            JSR     _LVOFreeMem(A6)
  178.  
  179. * ------------ MyDeletePort(QuitPort);
  180. 4$           MOVEA.L     A2,A0
  181.            JSR     @MyDeletePort(PC)
  182.  
  183.            BRA.W     NoError
  184.  
  185. ****************************
  186. * PopUpMenu not installed  *
  187. * Start initialization.    *
  188. ****************************
  189. * ------------ Default options
  190. NotInstalled:  MOVE.W     #DEFAULTOPTIONS*256+DEFAULTHOTKEY,D3
  191.  
  192. * ------------ Running from Workbench ?
  193.            TST.L     _WBenchMsg(A4)
  194.            BEQ.B     GetCLIArgs
  195.  
  196.            JSR     @GetWBCommandLine
  197.            BRA.B     aaaa
  198.  
  199. * ------------ GetCommandLine(DEFAULT,CommandLine, CommandLength)
  200. GetCLIArgs:    JSR     @GetCommandLine
  201. aaaa:           MOVE.W     D0,_Options(A4)
  202.  
  203. * ------------ Wrong or help options ?
  204.            BEQ.W     NoError    * Yes
  205.  
  206.            LEA     DT,A5           * Our BSS segment
  207.  
  208. ************************ libraries  ***********************
  209. * ------------ IntuitionBase = OpenLibrary("intuition.library", LIBVERSION)
  210.            LEA     INTUITIONNAME(PC),A1
  211.            MOVEQ.L     #LIBVERSION,D0
  212.            JSR     _LVOOpenLibrary(A6)
  213.            MOVE.L     D0,_IntuitionBase(A4)
  214.            MOVE.L     D0,_IBase(A5)         * Global intuitionbase
  215.  
  216. * ------------ IntuitionBase == NULL  ?
  217.            TST.L     D0
  218.            BEQ.W     CleanUp13     * Yes
  219.  
  220. * ------------ GfxBase = OpenLibrary("graphics.library", LIBVERSION)
  221.            LEA     GFXNAME(PC),A1
  222.            MOVEQ.L     #LIBVERSION,D0
  223.            JSR     _LVOOpenLibrary(A6)
  224.            MOVE.L     D0,_GfxBase(A4)
  225.  
  226. * ------------ GfxBase == NULL    ?
  227.            TST.L     D0
  228.            BEQ.W     CleanUp11     * Yes
  229.  
  230. * ------------ LayersBase = OpenLibrary("layers.library", LIBVERSION)
  231.            LEA     LAYERSNAME(PC),A1
  232.            MOVEQ     #LIBVERSION,D0
  233.            JSR     _LVOOpenLibrary(A6)
  234.            MOVE.L     D0,_LayersBase(A4)
  235.  
  236. * ------------ LayersBase == NULL  ?
  237.            TST.L     D0
  238.            BEQ.W     CleanUp10
  239.  
  240. ************ Check if user wants to select options ****************
  241.            MOVE.W     _Options(A4),D0
  242.            BTST     #OPENWINDOW+8,D0
  243.            BEQ.B     1$           * No
  244.  
  245.            MOVE.W     D0,D2
  246.            JSR     @SelectOptions
  247.            MOVE.W     D0,_Options(A4)
  248.  
  249. 1$           BTST     #EXIT+8,D0
  250.            BEQ.B     2$
  251.  
  252. * ------------ Error = FALSE
  253.            CLR.W     _Error(A4)
  254.            BRA.W     CleanUp9
  255.  
  256. ************************* Signals *******************************
  257. * ------------ MenuUpSigNum = AllocSignal(-1)
  258. 2$           MOVEQ.L     #-1,D0
  259.            JSR     _LVOAllocSignal(A6)
  260.            MOVE.L     D0,D7
  261.  
  262. * ------------ MenuUpSigNum < 0  ?
  263.            BMI.W     CleanUp9      * Yes
  264.  
  265. * ------------ MenuDownSigNum = AllocSignal(-1)
  266.            MOVEQ.L     #-1,D0
  267.            JSR     _LVOAllocSignal(A6)
  268.            MOVE.L     D0,D6
  269.  
  270. * ------------ MenuDownSigNum < 0  ?
  271.            BMI.W     CleanUp8      * Yes
  272.  
  273. * ------------ MouseMovedSigNum = AllocSignal(-1)
  274.            MOVEQ.L     #-1,D0
  275.            JSR     _LVOAllocSignal(A6)
  276.            MOVE.L     D0,D5
  277.  
  278. * ------------ MouseMovedSigNum < 0  ?
  279.            BMI.W     CleanUp7      * Yes
  280.  
  281. * ------------ SelectDownSigNum = AllocSignal(-1)
  282.            MOVEQ.L     #-1,D0
  283.            JSR     _LVOAllocSignal(A6)
  284.            MOVE.L     D0,D4
  285.  
  286. * ------------ SelectDownSigNum < 0  ?
  287.            BMI.W     CleanUp6      * Yes
  288.  
  289. * ------------ HotKeySigNum = AllocSignal(-1)
  290.            MOVEQ.L     #-1,D0
  291.            JSR     _LVOAllocSignal(A6)
  292.            MOVE.L     D0,D3
  293.  
  294. * ------------ HotKeySigNum < 0 ?
  295.            BMI.W     CleanUp5x5    * Yes
  296.  
  297. *************** Build connection to the input.device ***************
  298. * ------------ InputDevPort  = MyCreatePort(IMPDEVPORTNAME)
  299.            LEA     INPDEVPORTNAME(PC),A0
  300.            JSR     @MyCreatePort(PC)
  301.            MOVEA.L     D0,A3
  302.  
  303. * ------------ InputDevPort == NULL  ?
  304.            MOVE.L     A3,D0
  305.            BEQ.W     CleanUp5      * Yes
  306.  
  307. * ------------ InputReqBlock = AllocMem(sizeof(struct IOStdReq),MEMF_CLEAR | MEMF_PUBLIC)
  308.            MOVEQ.L     #io_SIZEOF,D0
  309.            MOVE.L     #MEMF_PUBLIC!MEMF_CLEAR,D1
  310.            JSR     _LVOAllocMem(A6)
  311.            MOVE.L     D0,_InputReqBlock(A4)
  312.  
  313. * ------------ InputReqBlock == NULL  ?
  314.            TST.L     D0
  315.            BEQ.W     CleanUp4
  316.  
  317. * ------------ InputReqBlock->io_Message.mn_Node.ln_Type = NT_MESSAGE;
  318.            MOVEA.L     D0,A1
  319.            MOVE.B     #NT_MESSAGE,io_Message+mn_Node+ln_Type(A1)
  320.  
  321. * ------------ InputReqBlock->io_Message.mn_Length = sizeof(struct IOStdReq);
  322.            MOVE.W     #$30,io_Message+mn_Length(A1)
  323.  
  324. * ------------ InputReqBlock->io_Message.mn_ReplyPort = InputDevPort;
  325.            MOVE.L     A3,io_Message+mn_ReplyPort(A1)
  326.  
  327. * ------------ OpenDevice("input.device",0,InputReqBlock,0)
  328.            LEA     INPUTNAME(PC),A0
  329.            MOVEQ.L     #0,D0
  330.            MOVEQ.L     #0,D1
  331.            JSR     _LVOOpenDevice(A6)
  332.  
  333. * ------------ OpenDevice failed  ?
  334.            TST.L     D0
  335.            BNE.W     CleanUp3      * Yes
  336.  
  337. ****************** Bulid connection to the timer.device ****************
  338. * ------------ TimerPort = MyCreatePort(TIMERPORTNAME)
  339.            LEA     TIMERPORTNAME(PC),A0
  340.            JSR     @MyCreatePort(PC)
  341.            MOVE.L     D0,_TimerPort(A4)
  342.  
  343. * ------------ TimerPort == NULL  ?
  344.            TST.L     D0
  345.            BEQ.W     CleanUp3x3    * Yes
  346.  
  347. * ------------ TimerSignal = 1L << TimerPort->mp_SigBit
  348.            MOVEA.L     D0,A0
  349.            MOVEQ.L     #0,D0
  350.            MOVE.B     mp_SigBit(A0),D0
  351.            MOVEQ.L     #1,D1
  352.            ASL.L     D0,D1
  353.            MOVE.L     D1,_TimerSignal(A4)
  354.  
  355. * ------------ TimerReqBlock = AllocMem(sizeof(struct timerequest),MEMF_CLEAR | MEMF_PUBLIC)
  356.            MOVEQ     #tr_SIZEOF,D0
  357.            MOVE.L     #MEMF_CLEAR!MEMF_PUBLIC,D1
  358.            JSR     _LVOAllocMem(A6)
  359.            MOVE.L     D0,_TimerReqBlock(A4)
  360.  
  361. * ------------ TimerReqBlock == NULL  ?
  362.            TST.L     D0
  363.            BEQ.W     CleanUp3x2    * Yes
  364.  
  365. * ------------ TimerReqBlock->tr_node.io_Message.mn_Node.ln_Type = NT_MESSAGE
  366.            MOVEA.L     D0,A1
  367.            MOVE.B     #NT_MESSAGE,tr_Node+io_Message+mn_Node+ln_Type(A1)
  368.  
  369. * ------------ TimerReqBlock->tr_node.io_Message.mn_Length = sizeof(struct timerequest)
  370.            MOVE.W     #tr_SIZEOF,tr_Node+io_Message+mn_Length(A1)
  371.  
  372. * ------------ TimerReqBlock->tr_node.io_Message.mn_ReplyPort = TimerPort;
  373.            MOVE.L     _TimerPort(A4),tr_Node+io_Message+mn_ReplyPort(A1)
  374.  
  375. * ------------ OpenDevice(TIMERNAME,UNIT_VBLANK,(struct IORequest *)TimerReqBlock,0)
  376.            LEA     TIMERNAME(PC),A0
  377.            MOVEQ.L     #UNIT_VBLANK,D0
  378.            MOVEQ.L     #0,D1
  379.            JSR     _LVOOpenDevice(A6)
  380.  
  381. * ------------ OpenDevice failed  ?
  382.            TST.L     D0
  383.            BNE.W     CleanUp3x1    * Yes
  384.  
  385. * ------------ QueTimer()  [ Start timer ]
  386.            JSR     @QueTimer(PC)
  387.  
  388. ********************** Make a semaphore for intuition patch ***********************
  389. * ------------ PopUpSemaphore is located in this segment.
  390. * ------------ PopUpSemaphore.ss_Link.ln_Name = /*SEMAPHORENAME*/ NULL
  391. *           CLR.L     _PopUpSemaphore+ss_Link+ln_Name(PC)
  392.  
  393. * ------------ PopUpSemaphore.ss_Link.ln_Pri = 0
  394.            CLR.B     _PopUpSemaphore+ss_Link+ln_Pri(A5)
  395.  
  396. * ------------ InitSemaphore(&PopUpSemaphore)
  397.            LEA     _PopUpSemaphore(A5),A0
  398.            JSR     _LVOInitSemaphore(A6)
  399.  
  400. ********************** Patch intuition functions to use our semaphore *************
  401. * ------------ OldSetMenuStrip = SetFunction(IntuitionBase,_LVOSetMenuStrip,MySetMenuStrip)
  402.            LEA     @MySetMenuStrip(PC),A0
  403.            MOVE.L     A0,D0
  404.            MOVEA.L     _IntuitionBase(A4),A1
  405.            MOVEA.W     #_LVOSetMenuStrip,A0
  406.            JSR     _LVOSetFunction(A6)
  407.            MOVE.L     D0,_OldSetMenuStrip(A5)
  408.  
  409. * ------------ OldSetMenuStrip == NULL    ?
  410.            TST.L     D0
  411.            BEQ.W     CleanUp2x4
  412.  
  413. * ------------ OldClearMenuStrip = SetFunction(IntuitionBase,_LVOClearMenuStrip,MyClearMenuStrip)
  414.            LEA     @MyClearMenuStrip(PC),A0
  415.            MOVE.L     A0,D0
  416.            MOVEA.L     _IntuitionBase(A4),A1
  417.            MOVEA.W     #_LVOClearMenuStrip,A0
  418.            JSR     _LVOSetFunction(A6)
  419.            MOVE.L     D0,_OldClearMenuStrip(A5)
  420.  
  421. * ------------ OldClearMenuStrip == NULL  ?
  422.            TST.L     D0
  423.            BEQ.W     CleanUp2x3    * Yes
  424.  
  425. * ------------ OldOnMenu = SetFunction(IntuitionBase,_LVOOnMenu,MyOnMenu)
  426.            LEA     @MyOnMenu(PC),A0
  427.            MOVE.L     A0,D0
  428.            MOVEA.L     _IntuitionBase(A4),A1
  429.            MOVEA.W     #_LVOOnMenu,A0
  430.            JSR     _LVOSetFunction(A6)
  431.            MOVE.L     D0,_OldOnMenu(A5)
  432.  
  433. * ------------ OldOnMenu == NULL  ?
  434.            TST.L     D0
  435.            BEQ.W     CleanUp2x2    * Yes
  436.  
  437. * ------------ OldOffMenu = SetFunction(IntuitionBase,_LVOOffMenu,MyOffMenu)
  438.            LEA     @MyOffMenu(PC),A0
  439.            MOVE.L     A0,D0
  440.            MOVEA.L     _IntuitionBase(A4),A1
  441.            MOVEA.W     #_LVOOffMenu,A0
  442.            JSR     _LVOSetFunction(A6)
  443.            MOVE.L     D0,_OldOffMenu(A5)
  444.  
  445. * ------------ OldOffMenu == NULL  ?
  446.            TST.L     D0
  447.            BEQ.W     CleanUp2x1
  448.  
  449. *********************** Input handler *************************
  450. * ------------ Init data for the inputhandler
  451.            LEA     -sd_SIZEOF(SP),SP
  452.            MOVEA.L     SP,A2
  453.  
  454. * ------------ InputSignals.Semaphore.ss_Link.ln_Name = NULL
  455. *           CLR.L     sd_Semaphore+ss_Link+ln_Name(A2)
  456.  
  457. * ------------ InputSignals.Semaphore.ss_Link.ln_Pri = 0
  458.            CLR.B     sd_Semaphore+ss_Link+ln_Pri(A2)
  459.  
  460. * ------------ InitSemaphore(&InputSignals.Semaphore)
  461.            LEA     sd_Semaphore(A2),A0
  462.            JSR     _LVOInitSemaphore(A6)
  463.  
  464. * ------------ InputSignals.PopUpMenuTask = ExecBase->ThisTask;
  465.            MOVE.L     eb_ThisTask(A6),sd_PopUpMenuTask(A2)
  466.  
  467. * ------------ InputSignals.MenuUpSig = 1 << MenuUpSigNum
  468.            MOVEQ.L     #1,D0
  469.            ASL.L     D7,D0
  470.            MOVE.L     D0,sd_MenuUpSig(A2)
  471.  
  472. * ------------ InputSignals.MenuDownSig = 1 << MenuDownSigNum
  473.            MOVEQ.L     #1,D0
  474.            ASL.L     D6,D0
  475.            MOVE.L     D0,sd_MenuDownSig(A2)
  476.  
  477. * ------------ InputSignals.MouseMovedSig = 1 << MouseMovedSigNum
  478.            MOVEQ.L     #1,D0
  479.            ASL.L     D5,D0
  480.            MOVE.L     D0,sd_MouseMovedSig(A2)
  481.  
  482. * ------------ InputSignals.SelectDownSig = 1 << SelectDownSigNum
  483.            MOVEQ.L     #1,D0
  484.            ASL.L     D4,D0
  485.            MOVE.L     D0,sd_SelectDownSig(A2)
  486.  
  487. * ------------ InputSignals.HotKeySig = 1 << HotKeySigNum
  488.            MOVEQ.L     #1,D0
  489.            ASL.L     D3,D0
  490.            MOVE.L     D0,sd_HotKeySig(A2)
  491.  
  492. * ------------ InputSignals.Down = FALSE   [ Menubutton is not down ]
  493.            CLR.W     sd_Down(A2)
  494.  
  495. * ------------ InputSignals.Options = Options
  496.            MOVE.W     _Options(A4),sd_Options(A2)
  497.  
  498. * ------------ Startup the inputhandler
  499. * ------------ struct Interrupt InputReqData
  500.            LEA     -is_SIZEOF(SP),SP
  501.  
  502. * ------------ InputReqData.is_Node.ln_Pri  = INPHANDLPRI [ Must come before intuition ]
  503.            MOVE.B     #INPHANDLPRI,is_Node+ln_Pri(SP)
  504.  
  505. * ------------ InputReqData.is_Node.ln_Name = INPHANDLNAME
  506.            LEA     INPHANDLNAME(PC),A1
  507.            MOVE.L     A1,is_Node+ln_Name(SP)
  508.  
  509. * ------------ InputReqData.is_Data = (APTR)&InputSignals
  510.            MOVE.L     A2,is_Data(SP)
  511.  
  512. * ------------ InputReqData.is_Code = PopUpHandler
  513.            LEA     @PopUpHandler(PC),A1
  514.            MOVE.L     A1,is_Code(SP)
  515.  
  516. * ------------ InputReqBlock->io_Command = IND_ADDHANDLER
  517.            MOVEA.L     _InputReqBlock(A4),A1
  518.            MOVE.W     #IND_ADDHANDLER,io_Command(A1)
  519.  
  520. * ------------ InputReqBlock->io_Data = &InputReqData
  521.            MOVE.L     SP,io_Data(A1)
  522.  
  523. * ------------ DoIO(InputReqBlock)
  524.            JSR     _LVODoIO(A6)
  525.  
  526. ***************** Create a reply port for intuimessages *********
  527. * ------------ ReplyPort = MyCreatePort(REPLYPORTNAME)
  528.            LEA     REPLYPORTNAME(PC),A0
  529.            JSR     @MyCreatePort(PC)
  530.            MOVE.L     D0,_ReplyPort(A4)
  531.  
  532. * ------------ ReplyPort == NULL ?
  533.            TST.L     D0
  534.            BEQ.W     CleanUp1      * Yes
  535.  
  536. ****************** Everything is OK ***************************
  537.            CLR.W     _Error(A4)
  538.            MOVEQ.L     #0,D2         * Installed message
  539.            JSR     @MyWrite
  540.  
  541. * ------------ PopUpMainLoop(&InputSignals)
  542.            MOVEA.L     A2,A0
  543.            JSR     @PopUpMainLoop(PC)
  544.  
  545. *********************** Remove Port *****************************
  546. * this must be done first otherwise it is impossible to restart *
  547. * popupmenu if the intuition functions can't be restored        *
  548. *****************************************************************
  549. * ------------ MyDeletePort(ReplyPort)
  550.            MOVEA.L     _ReplyPort(A4),A0
  551.            JSR     @MyDeletePort(PC)
  552.  
  553. *********************** Remove inputhandler *********************
  554. * ------------ InputReqBlock->io_Command = IND_REMHANDLER
  555. CleanUp1:      MOVEA.L     _InputReqBlock(A4),A1
  556.            MOVE.W     #IND_REMHANDLER,io_Command(A1)
  557.  
  558. * ------------ InputReqBlock->io_Data = &InputReqData
  559.            MOVE.L     SP,io_Data(A1)
  560.  
  561. * ------------ DoIO(InputReqBlock)
  562.            JSR     _LVODoIO(A6)
  563.  
  564.            LEA     is_SIZEOF+sd_SIZEOF(SP),SP
  565.  
  566. ******************* Restore intuition functions ********************
  567. * ------------ RestoreFunction(IntuitionBase, _LVOOffMenu, OldOffMenu, MyOffMenu)
  568.            MOVEA.L     _IntuitionBase(A4),A0
  569.            MOVE.W     #_LVOOffMenu,D0
  570.            MOVEA.L     _OldOffMenu(A5),A1
  571.            LEA     @MyOffMenu(PC),A2
  572.            JSR     @RestoreFunction(PC)
  573.  
  574. * ------------ RestoreFunction(IntuitionBase, _LVOOnMenu, OldOnMenu, MyOnMenu)
  575. CleanUp2x1:    MOVEA.L     _IntuitionBase(A4),A0
  576.            MOVE.W     #_LVOOnMenu,D0
  577.            MOVEA.L     _OldOnMenu(A5),A1
  578.            LEA     @MyOnMenu(PC),A2
  579.            JSR     @RestoreFunction(PC)
  580.  
  581. * ------------ RestoreFunction(IntuitionBase, _LVOClearMenuStrip, OldClearMenuStrip, MyClearMenuStrip)
  582. CleanUp2x2:    MOVEA.L     _IntuitionBase(A4),A0
  583.            MOVE.W     #_LVOClearMenuStrip,D0
  584.            MOVEA.L     _OldClearMenuStrip(A5),A1
  585.            LEA     @MyClearMenuStrip(PC),A2
  586.            JSR     @RestoreFunction(PC)
  587.  
  588. * ------------ RestoreFunction(IntuitionBase, _LVOSetMenuStrip, OldSetMenuStrip, MySetMenuStrip)
  589. CleanUp2x3:    MOVEA.L     _IntuitionBase(A4),A0
  590.            MOVE.W     #_LVOSetMenuStrip,D0
  591.            MOVEA.L     _OldSetMenuStrip(A5),A1
  592.            LEA     @MySetMenuStrip(PC),A2
  593.            JSR     @RestoreFunction(PC)
  594.  
  595. ********************* Close timer.device *********************
  596. * ------------ CloseDevice(TimerReqBlock)
  597. CleanUp2x4:    MOVEA.L     _TimerReqBlock(A4),A1
  598.            JSR     _LVOCloseDevice(A6)
  599.  
  600. * ------------ FreeMem(TimerReqBlock,sizeof(struct timerequest))
  601. CleanUp3x1:    MOVEA.L     _TimerReqBlock(A4),A1
  602.            MOVEQ.L     #tr_SIZEOF,D0
  603.            JSR     _LVOFreeMem(A6)
  604.  
  605. * ------------ MyDeletePort(TimerPort)
  606. CleanUp3x2:    MOVEA.L     _TimerPort(A4),A0
  607.            JSR     @MyDeletePort(PC)
  608.  
  609. ********************* Close input.device ***********************
  610. * ------------ CloseDevice(InputReqBlock)
  611. CleanUp3x3:    MOVEA.L     _InputReqBlock(A4),A1
  612.            JSR     _LVOCloseDevice(A6)
  613.  
  614. * ------------ DeleteStdIO(InputReqBlock)
  615. CleanUp3:      MOVEA.L     _InputReqBlock(A4),A1
  616.            MOVEQ     #io_SIZEOF,D0
  617.            JSR     _LVOFreeMem(A6)
  618.  
  619. * ------------ MyDeletePort(InputDevPort)
  620. CleanUp4:      MOVEA.L     A3,A0
  621.            JSR     @MyDeletePort(PC)
  622.  
  623. *********************** Free allocated signals *************************
  624. CleanUp5:      MOVE.L     D3,D0
  625.            JSR     _LVOFreeSignal(A6)
  626.  
  627. * ------------ FreeSignal(SelectDownSigNum)
  628. CleanUp5x5:    MOVE.L     D4,D0
  629.            JSR     _LVOFreeSignal(A6)
  630.  
  631. * ------------ FreeSignal(MouseMovedSigNum)
  632. CleanUp6:      MOVE.L     D5,D0
  633.            JSR     _LVOFreeSignal(A6)
  634.  
  635. * ------------ FreeSignal(MenuDownSigNum)
  636. CleanUp7:      MOVE.L     D6,D0
  637.            JSR     _LVOFreeSignal(A6)
  638.  
  639. * ------------ FreeSignal(MenuUpSigNum)
  640. CleanUp8:      MOVE.L     D7,D0
  641.            JSR     _LVOFreeSignal(A6)
  642.  
  643. ********************* Close libraries **************************
  644. * ------------ CloseLibrary(LayersBase)
  645. CleanUp9:      MOVEA.L     _LayersBase(A4),A1
  646.            JSR     _LVOCloseLibrary(A6)
  647.  
  648. * ------------ CloseLibrary(GfxBase)
  649. CleanUp10:     MOVEA.L     _GfxBase(A4),A1
  650.            JSR     _LVOCloseLibrary(A6)
  651.  
  652. * ------------ CloseLibrary(IntuitionBase)
  653. CleanUp11:     MOVEA.L     _IntuitionBase(A4),A1
  654.            JSR     _LVOCloseLibrary(A6)
  655.  
  656. CleanUp13:     TST.W     _Error(A4)
  657.            BEQ.B     NoError
  658.            MOVEQ.L     #3,D2        * Error message
  659.            JSR     @MyWrite
  660.  
  661. *********************** Close Dos.library ********************
  662. NoError:       MOVEA.L     _DOSBase(A4),A1
  663.            JSR     _LVOCloseLibrary(A6)
  664.  
  665. * ------------ Started from Workbench ?
  666. NoDos:           MOVE.L      _WBenchMsg(A4),D2
  667.            BEQ.B     1$           * No
  668.  
  669.            JSR     _LVOForbid(A6)
  670.            MOVE.L     D2,A1
  671.            JSR     _LVOReplyMsg(A6)
  672.  
  673. * ------------ Remove our data area from stack
  674. 1$           LEA     Globals_SIZEOF(SP),SP
  675.  
  676. * ------------ return RETURN_OK
  677.            MOVEQ.L     #0,D0
  678.  
  679.            MOVEM.L     (SP)+,D2-D7/A2-A6
  680.            RTS
  681.  
  682. INPDEVPORTNAME:  dc.b      "InpDev",0
  683. TIMERPORTNAME:     dc.b      "Timer",0
  684. QUITPORTNAME:     dc.b      "Quit",0
  685. REPLYPORTNAME:
  686. INPHANDLNAME:     dc.b      "PopUpMenu",0
  687. DOSNAME      dc.b      "dos.library",0
  688. INTUITIONNAME:     dc.b      "intuition.library",0
  689. GFXNAME:     dc.b      "graphics.library",0
  690. LAYERSNAME:     dc.b      "layers.library",0
  691. INPUTNAME:     dc.b      "input.device",0
  692. TIMERNAME:     dc.b      "timer.device",0
  693.  
  694. ************************************************
  695. * PopUpMainLoop(InputSignals)                  *
  696. *                           *
  697. * Input:                       *
  698. *   InputSignals - Allocated signals.           *
  699. * Output:                       *
  700. *   none                       *
  701. ************************************************
  702. @PopUpMainLoop:
  703.            MOVEM.L     D2-D7/A2-A3/A6,-(SP)
  704.            MOVEA.L     A0,A3
  705.  
  706. * ------------ ReplySig = 1 << ReplyPort->mp_SigBit
  707.            MOVEQ.L     #0,D0
  708.            MOVEA.L     _ReplyPort(A4),A0
  709.            MOVE.B     mp_SigBit(A0),D0
  710.            MOVEQ.L     #1,D7
  711.            ASL.L     D0,D7
  712.  
  713. * ------------ MenuUpSig = InputSignals->MenuUpSig
  714.            MOVE.L     sd_MenuUpSig(A3),D3
  715.  
  716. * ------------ NrOfMessages = 0
  717.            MOVEQ.L     #0,D6
  718.  
  719. * ------------ Quit = FALSE
  720.            MOVEQ.L     #FALSE,D2
  721.  
  722. * ------------ VerifyOk = FALSE
  723.            MOVEQ.L     #FALSE,D5
  724.  
  725. * ------------ SignalBits = Wait(ReplySig | MenuUpSig | MenuDownSig | HotKeySig)
  726. LoopAgain:     MOVEA.L     (A4),A6       * SysBase
  727.            MOVE.L     D7,D0
  728.            OR.L     D3,D0
  729.            OR.L     sd_MenuDownSig(A3),D0
  730.            OR.L     sd_HotKeySig(A3),D0
  731.            JSR     _LVOWait(A6)
  732.            MOVE.L     D0,D4
  733.  
  734. *******************************************
  735. * D0   SignalBits      A3 InputSignals      *
  736. * D2   Quit           A6 ExecBase      *
  737. * D3   MenuUpSig              *
  738. * D4   SignalBits              *
  739. * D5   VerifyOk               *
  740. * D6.W NrOfMessages              *
  741. * D7   ReplySig               *
  742. *******************************************
  743. * ------------ SignalBits & InputSignals->MenuUpSig ?  [ Menubutton released ]
  744.            AND.L     D3,D0
  745.            BEQ.B     CheckReply    * No
  746.  
  747. * ------------ ActiveWindow = NULL  [ To be sure VERIFYOK can't be set ]
  748.            CLR.L     _ActiveWindow(A4)
  749.  
  750. * ------------ VerifyOk = FALSE
  751.            MOVEQ.L      #FALSE,D5
  752.  
  753. * ------------ SignalBits & ReplySig ?
  754. CheckReply:    MOVE.L     D4,D0
  755.            AND.L     D7,D0
  756.            BEQ.W     CheckMenuDown * No
  757.  
  758. * ------------ Message = GetMsg(ReplyPort)
  759.            MOVE.L     D7,-(SP)
  760. GetMessage:    MOVEA.L     _ReplyPort(A4),A0
  761.            JSR     _LVOGetMsg(A6)
  762.            MOVEA.L     D0,A1
  763.  
  764. ****************************************
  765. * D2   Quit                   *
  766. * D3   MenuUpSig               *
  767. * D4   SignalBits      A1 Message      *
  768. * D5   VerifyOk        A3 InputSignals *
  769. * D6.W NrOfMessages    A6 ExecBase     *
  770. ****************************************
  771. * ------------ Message == NULL ?
  772.            MOVE.L     A1,D0
  773.            BEQ.B     NoMessages    * Yes
  774.  
  775. * ------------ New Option message ?
  776.            MOVE.L     im_Class(A1),D0
  777.            BNE.B     2$           * No
  778.  
  779. * ------------ NewOptions = Message->Code
  780.            MOVE.W     im_Code(A1),D7
  781.  
  782. * ------------ ReplyMsg(Message)
  783.            JSR     _LVOReplyMsg(A6)
  784.  
  785. * ------------ HandleNewOpt(NewOptions)
  786.            MOVE.W     D7,D0
  787.            JSR     HandleNewOpt(PC)
  788.  
  789. * ------------ Exit ?
  790.            BTST     #EXIT,_Options(A4)
  791.            BEQ.B     GetMessage    * No
  792.  
  793. * ------------ Quit = TRUE
  794.            MOVEQ.L     #TRUE,D2
  795.            BRA.B     GetMessage
  796.  
  797. * ------------ Asking for options ?
  798. 2$           BTST     #0,D0
  799.            BEQ.B     VerifyMsg    * No
  800.  
  801. * ------------ Reply current options.
  802.            MOVE.W     _Options(A4),im_Code(A1)
  803.  
  804. * ------------ ReplyMsg(Message)  [Message does not belong to this task]
  805.            JSR     _LVOReplyMsg(A6)
  806.            BRA.B     GetMessage
  807.  
  808. * ------------ MENUVERIFY message ?  *************************
  809. VerifyMsg:     BTST     #13,D0
  810.            BEQ.B     GetMessage    * No
  811.  
  812. * ------------ Message->IDCMPWindow == ActiveWindow ?  [ Only this window can cancel ]
  813.            MOVEA.L     im_IDCMPWindow(A1),A0
  814.            CMP.L     _ActiveWindow(A4),A0
  815.            BNE.B     1$           * No
  816.  
  817. * ------------ VerifyOk = TRUE
  818.            MOVEQ.L     #TRUE,D5
  819.  
  820. * ------------ Message->Code == MENUCANCEL ?  [ Cancel menu-operation ]
  821.            MOVEQ.L     #MENUCANCEL,D0
  822.            CMP.W     im_Code(A1),D0
  823.            BNE.B     1$           * No
  824.  
  825. * ------------ VerifyOk = FALSE  [ Menues cancelled ]
  826.            MOVEQ.L     #FALSE,D5
  827.  
  828. * ------------ NrOfMessages--
  829. 1$           SUBQ.W     #1,D6
  830.  
  831. * ------------ FreeMem(Message,sizeof(struct IntuiMessage))
  832.            MOVEQ.L     #im_SIZEOF,D0
  833.            JSR     _LVOFreeMem(A6)
  834.            BRA.W     GetMessage
  835.  
  836. * ------------ NrOfMessages == 0 ?  [ All windows has replied ]
  837. NoMessages:    MOVE.L     (SP)+,D7
  838.            TST.W     D6
  839.            BNE.B     CheckMenuDown    * No
  840.  
  841. * ------------ Quit == TRUE ?
  842.            TST.L     D2
  843.            BNE.W     QuitLoop    * Yes
  844.  
  845. * ------------ VerifyOk == TRUE ?
  846.            TST.L     D5
  847.            BEQ.B     1$           * No
  848.  
  849. * ------------ PopUpMenu(InputSignals)    * (A3)
  850.            JSR     @PopUpMenu
  851.  
  852. * ------------ VerifyOk = FALSE
  853.            MOVEQ.L     #FALSE,D5
  854.            BRA.B     CheckMenuDown
  855.  
  856. 1$           MOVEA.L     A3,A0
  857.            JSR     @FixDown(PC)
  858.  
  859. *******************************************
  860. * D2   Quit           A3 InputSignals      *
  861. * D3   MenuUpSig              *
  862. * D4   SignalBits      A6 ExecBase      *
  863. * D5   VerifyOk               *
  864. * D6.W NrOfMessages              *
  865. * D7   ReplySig               *
  866. *******************************************
  867. * ------------ SignalBits & (MenuUpSig | MenuDownSig) == MenuDownSig) ?
  868. CheckMenuDown: MOVE.L     sd_MenuDownSig(A3),D0
  869.            MOVE.L     D3,D1
  870.            OR.L     D0,D1
  871.            AND.L     D4,D1
  872.            CMP.L     D0,D1
  873.            BNE.B     CheckHotKey
  874.  
  875. * ------------ Lock = LockIBase(0)
  876.            MOVEQ.L     #0,D0
  877.            MOVEA.L     _IntuitionBase(A4),A6
  878.            JSR     _LVOLockIBase(A6)
  879.            MOVEA.L     D0,A2
  880.  
  881. * ------------ ActiveWindow = IntuitionBase->ActiveWindow
  882.            MOVEA.L     ib_ActiveWindow(A6),A0
  883.            MOVE.L     A0,_ActiveWindow(A4)
  884.  
  885. * ------------ ActiveWindow == NULL ?  [ No Window is active ]
  886.            MOVE.L     A0,D0
  887.            BEQ.B     NoMenues1     * Yes
  888.  
  889. * ------------ ActiveWindow->Flags & RMBTRAP  ?  [ Window doesn't want menues ]
  890.            BTST     #0,wd_Flags(A0)          **************************
  891.            BNE.B     NoMenues1     * Yes
  892.  
  893. * ------------ ActiveWindow->MenuStrip == NULL ?  [ Window has no menues ]
  894.            TST.L     wd_MenuStrip(A0)
  895.            BEQ.B     NoMenues1    * Yes
  896.  
  897. * ------------ Screen = ActiveWindow->WScreen
  898.            MOVE.L     wd_WScreen(A0),_Screen(A4)
  899.  
  900. * ------------ NrOfMessages = SendMessage()
  901.            JSR     @SendMessage(PC)
  902.            MOVE.W     D0,D6
  903.  
  904. * ------------ UnlockIBase(Lock)
  905.            MOVEA.L     A2,A0
  906.            JSR     _LVOUnlockIBase(A6)
  907.  
  908. * ------------ NrOfMessages != 0 ?  [ Wait for MENUVERIFY messages ]
  909.            TST.W     D6
  910.            BNE.B     1$           * Yes
  911.  
  912. * ------------ PopUpMenu(InputSignals)    (A3)
  913.            JSR     @PopUpMenu
  914.            BRA.B     LoopEnd
  915.  
  916. * ------------ VerifyOk = TRUE
  917. 1$           MOVEQ.L     #TRUE,D5
  918.            BRA.B     LoopEnd
  919.  
  920. * ------------ UnlockIBase(Lock)
  921. NoMenues1:     MOVEA.L      A2,A0
  922.            JSR     _LVOUnlockIBase(A6)
  923.  
  924. * ------------ FixDown(InputSignals)    (A3)
  925.            JSR     @FixDown(PC)
  926.  
  927.            BRA.B     LoopEnd
  928.  
  929. * ------------ SignalBits & HotKeySig ?
  930. CheckHotKey:   MOVE.L     sd_HotKeySig(A3),D0
  931.            AND.L     D4,D0
  932.            BEQ.B     LoopEnd
  933.  
  934. * ------------ HendleNewOptions(Options | OPENWINDOW)
  935.            MOVE.W     _Options(A4),D0
  936.            BSET     #OPENWINDOW+8,D0
  937.            JSR     HandleNewOpt(PC)
  938.  
  939. * ------------ Options & EXIT ?
  940.            BTST     #EXIT,_Options(A4)
  941.            BEQ.B     LoopEnd       * No
  942.  
  943. * ------------ Quit = TRUE
  944.            MOVEQ.L     #TRUE,D2
  945.  
  946. * ------------ NrOfMessages == 0 ?
  947.            TST.W     D6
  948.            BEQ.B     QuitLoop
  949.  
  950. LoopEnd:       BRA.W     LoopAgain
  951.  
  952. QuitLoop:      MOVEM.L     (SP)+,D2-D7/A2-A3/A6
  953.            RTS
  954.  
  955. ***************************************
  956. * HandleNewOpt(NewOptions)            *
  957. *  Input                  *
  958. *    NewOptions   Options to check    *
  959. *                      *
  960. * Warning! InputSignals must be in A3 *
  961. *       and ExecBase in A6          *
  962. ***************************************
  963. HandleNewOpt:  MOVE.W     D2,-(SP)
  964.  
  965. * ------------ NewOptions & OPENWINDOW ?
  966.            BTST     #OPENWINDOW+8,D0
  967.            BEQ.B     1$           * No
  968.  
  969.            MOVE.W     D0,D2
  970.  
  971. * ------------ Disable PopUpMenu by Clearing all options
  972. * ------------ Get semaphore
  973.            LEA     sd_Semaphore(A3),A0
  974.            JSR     _LVOObtainSemaphore(A6)
  975.  
  976.            CLR.W     sd_Options(A3)
  977.  
  978. * ------------ release semaphore
  979.            LEA     sd_Semaphore(A3),A0
  980.            JSR     _LVOReleaseSemaphore(A6)
  981.  
  982.            JSR     @SelectOptions
  983.  
  984. * ------------ Save new options
  985. 1$           MOVE.W     D0,_Options(A4)
  986.  
  987. * ------------ Get semaphore
  988.            LEA     sd_Semaphore(A3),A0
  989.            JSR     _LVOObtainSemaphore(A6)
  990.  
  991.            MOVE.W     D0,sd_Options(A3)
  992.  
  993. * ------------ release semaphore
  994.            LEA     sd_Semaphore(A3),A0
  995.            JSR     _LVOReleaseSemaphore(A6)
  996.  
  997.            MOVE.W     (SP)+,D2
  998.            RTS
  999.  
  1000. **********************************************************
  1001. * FixDown(InputSignals)                                  *
  1002. *  Stop inputhandler waiting for MENUBUTTON (LICKMENUES) *
  1003. **********************************************************
  1004. @FixDown:      MOVE.L     A6,-(SP)
  1005.            MOVE.L     A2,-(SP)
  1006.  
  1007.            MOVEA.L     A0,A2
  1008.            MOVEA.L     (A4),A6       * SysBase
  1009.  
  1010. * ------------ Get semaphore
  1011.            LEA     sd_Semaphore(A2),A0
  1012.            JSR     _LVOObtainSemaphore(A6)
  1013.  
  1014. * ------------ InputSignals.Down &= 1
  1015.            AND.W     #1,sd_Down(A2)
  1016.  
  1017. * ------------ release semaphore
  1018.            LEA     sd_Semaphore(A2),A0
  1019.            JSR     _LVOReleaseSemaphore(A6)
  1020.  
  1021.            MOVEA.L     (SP)+,A2
  1022.            MOVEA.L     (SP)+,A6
  1023.            RTS
  1024.  
  1025. *******************************************************
  1026. * SendMessage() - Send MENUVERIFY message             *
  1027. *  to all windows on screen with MENUVERIFY flag set. *
  1028. *  IBase must be locked!!                  *
  1029. * Input:                          *
  1030. *   none                          *
  1031. * Output:                          *
  1032. *   return    - Messages sent. (WORD)                 *
  1033. *******************************************************
  1034. @SendMessage:  MOVEM.L     D7/A2-A3/A6,-(SP)
  1035.  
  1036. * ------------ NrOfMessages = 0
  1037.            MOVEQ.L     #0,D7
  1038.  
  1039. * ------------ Window = Screen->FirstWindow
  1040.            MOVEA.L     _Screen(A4),A0
  1041.            MOVEA.L     sc_FirstWindow(A0),A3
  1042.  
  1043. * ------------ Window->IDCMPFlags & MENUVERIFY    ?
  1044. CheckWindow:   BTST     #5,wd_IDCMPFlags+2(A3)
  1045.            BEQ.B     NoMessage     * No
  1046.  
  1047. * ------------ Code = (Window == ActiveWindow) ? MENUHOT : MENUWAITING
  1048.            MOVEQ.L     #MENUHOT,D1
  1049.            CMPA.L     _ActiveWindow(A4),A3
  1050.            BEQ.B     1$
  1051.            MOVEQ.L     #MENUWAITING,D1
  1052.  
  1053. * ------------ Message = BuildIntuiMsg(ReplyPort, MENUVERIFY, Code)
  1054. 1$           MOVE.L     #$2000,D0
  1055.            MOVEA.L     _ReplyPort(A4),A0
  1056.            JSR     @BuildIntuiMsg(PC)
  1057.            MOVEA.L     D0,A2
  1058.  
  1059. * ------------ Message == NULL ?
  1060.            MOVE.L     A2,D0
  1061.            BEQ.B     NoMessage     * Yes
  1062.  
  1063. * ------------ CurrentTime(&Message->Seconds,&Message->Micros)
  1064.            LEA     im_Seconds(A2),A0
  1065.            LEA     im_Micros(A2),A1
  1066.            MOVEA.L     _IntuitionBase(A4),A6
  1067.            JSR     _LVOCurrentTime(A6)
  1068.  
  1069. * ------------ Message->IDCMPWindow = Window
  1070.            MOVE.L     A3,im_IDCMPWindow(A2)
  1071.  
  1072. * ------------ PutMsg(Window->UserPort,(struct Message *)Message);
  1073.            MOVEA.L     wd_UserPort(A3),A0
  1074.            MOVEA.L     A2,A1
  1075.            MOVEA.L     (A4),A6     * SysBase
  1076.            JSR     _LVOPutMsg(A6)
  1077.  
  1078. * ------------ NrOfMessages++
  1079.            ADDQ.W     #1,D7
  1080.  
  1081. * ------------ Window = Window->NextWindow
  1082. NoMessage:     MOVEA.L     (A3),A3       * wd_NextWindow
  1083.  
  1084. * ------------ Window == NULL ?  [ No more windows to check]
  1085.            MOVE.L     A3,D0
  1086.            BNE.B     CheckWindow   * No
  1087.  
  1088. * ------------ return (NrOfMessages)
  1089.            MOVE.W     D7,D0
  1090.  
  1091.            MOVEM.L     (SP)+,D7/A2-A3/A6
  1092.            RTS
  1093.  
  1094. ***************************************
  1095. * BuildIntuiMsg(ReplyPort,Class,Code) *
  1096. *                      *
  1097. * Input:                  *
  1098. *   ReplyPort                  *
  1099. *   Class                  *
  1100. *   Code                  *
  1101. * Output:                  *
  1102. *   return    -  IntuiMessage          *
  1103. ***************************************
  1104. @BuildIntuiMsg:
  1105.            MOVEM.L     D6-D7/A2/A6,-(SP)
  1106.            MOVEA.L     A0,A2
  1107.            MOVE.L     D0,D7
  1108.            MOVE.L     D1,D6
  1109.  
  1110.            MOVEA.L     (A4),A6       * SysBase
  1111.  
  1112. * ------------ Message = AllocMem(sizeof(struct IntuiMessage),MEMF_PUBLIC | MEMF_CLEAR)
  1113.            MOVEQ.L     #im_SIZEOF,D0
  1114.            MOVE.L     #MEMF_PUBLIC!MEMF_CLEAR,D1
  1115.            JSR     _LVOAllocMem(A6)
  1116.            MOVEA.L     D0,A0
  1117.  
  1118. * ------------ Message == NULL    ?
  1119.            MOVE.L     A0,D0
  1120.            BEQ.B     1$           * Yes
  1121.  
  1122. * ------------ Message->ExecMessage.mn_Node.ln_Type = NT_MESSAGE
  1123.            MOVE.B     #NT_MESSAGE,im_ExecMessage+mn_Node+ln_Type(A0)
  1124.  
  1125. * ------------ Message->ExecMessage.mn_ReplyPort = ReplyPort
  1126.            MOVE.L     A2,im_ExecMessage+mn_ReplyPort(A0)
  1127.  
  1128. * ------------ Message->ExecMessage.mn_Length = sizeof(struct IntuiMessage) - sizeof(struct Message);
  1129.            MOVE.W     #$20,im_ExecMessage+mn_Length(A0)
  1130.  
  1131. * ------------ Message->Class = Class
  1132.            MOVE.L     D7,im_Class(A0)
  1133.  
  1134. * ------------ Message->Code  = Code
  1135.            MOVE.W     D6,im_Code(A0)
  1136.  
  1137. * ------------ return (Message)
  1138. 1$           MOVEM.L     (SP)+,D6-D7/A2/A6
  1139.            RTS
  1140.  
  1141. ******************************************************
  1142. * QueTimer() - Queue the timer to go of after 0.2s   *
  1143. *                             *
  1144. * Input:                         *
  1145. *   none                         *
  1146. * Output:                         *
  1147. *   none:                         *
  1148. ******************************************************/
  1149. @QueTimer:     MOVE.L     A6,-(SP)
  1150.  
  1151. * ------------ TimerReqBlock->tr_node.io_Command = TR_ADDREQUEST
  1152.            MOVEA.L     _TimerReqBlock(A4),A1
  1153.            MOVE.W     #TR_ADDREQUEST,IO_COMMAND(A1)
  1154.  
  1155. * ------------ TimerReqBlock->tr_time.tv_secs = 0
  1156.            CLR.L     IOTV_TIME+TV_SECS(A1)
  1157.  
  1158. * ------------ TimerReqBlock->tr_time.tv_micro = 200000
  1159.            MOVE.L     #200000,IOTV_TIME+TV_MICRO(A1)
  1160.  
  1161. * ------------ SendIO(TimerReqBlock)
  1162.            MOVEA.L     (A4),A6       * SysBase
  1163.            JSR     _LVOSendIO(A6)
  1164.  
  1165.            MOVEA.L     (SP)+,A6
  1166.            RTS
  1167.  
  1168. **************************************************************
  1169. * VOID RestoreFunction(Library, Offset,   OldFunc, NewFunc)  *
  1170. *            A0     D0.W        A1          A2     *
  1171. * Try to restore a function in Library.              *
  1172. *  (If function can't be retored wait 5s and try again       *
  1173. * Input:                             *
  1174. *   Library   - Library to change.                 *
  1175. *   Offset    - Library function offset  (negative).         *
  1176. *   OldFunc   - Function to restore to.              *
  1177. *   NewFunc   - Function that should be in library.         *
  1178. * Output:                             *
  1179. *   none                             *
  1180. * Globals used:                          *
  1181. *   _DOSBase(A4)                                             *
  1182. **************************************************************
  1183. @RestoreFunction:
  1184.            MOVEM.L      D2-D4/A2/A6,-(SP)
  1185.            MOVE.W      D0,D2       * Offset
  1186.            MOVE.L      A1,D3       * OldFunc
  1187.            MOVE.L      A2,D4       * NewFunc
  1188.            MOVE.L      A0,A2       * Library
  1189.  
  1190.            MOVEA.L      _DOSBase(A4),A6
  1191.  
  1192. *************************************
  1193. * D2 = Offset          A2 = Library  *
  1194. * D3 = OldFunc          A6 = DOSBase  *
  1195. * D4 = NewFunc                *
  1196. *************************************
  1197. * ------------ *(Library + Offset + 2) == NewFunc ?
  1198. 1$           MOVE.L      2(A2,D2.W),D0
  1199.            CMP.L      D4,D0
  1200.            BEQ.B      2$           * Yes
  1201.  
  1202. * ------------ Wait(256)   ~5s
  1203.            MOVEQ.L      #1,D1
  1204.            SWAP.W      D1
  1205.            JSR      _LVODelay(A6)
  1206.            BRA.B      1$
  1207.  
  1208. * ------------ SetFunction(Library, Offset, OldFunc)
  1209. 2$           MOVEA.L      (A4),A6      * SysBase
  1210.            MOVEA.L      A2,A1
  1211.            MOVE.W      D2,A0
  1212.            MOVE.L      D3,D0
  1213.            JSR      _LVOSetFunction(A6)
  1214.  
  1215.            MOVEM.L      (SP)+,D2-D4/A2/A6
  1216.            RTS
  1217.  
  1218. ********************************************
  1219. * MySetMenuStrip, MyClearMenuStrip,       *
  1220. * MyOnMenu, MyOffMenu               *
  1221. *                       *
  1222. * My replacements for intuition functions. *
  1223. ********************************************
  1224. @MySetMenuStrip:
  1225.            MOVE.L      A2,-(SP)
  1226.            MOVEA.L      _OldSetMenuStrip,A2
  1227.            BRA.B      CallOldFunction
  1228.  
  1229. @MyClearMenuStrip:
  1230.            MOVE.L      A2,-(SP)
  1231.            MOVEA.L      _OldClearMenuStrip,A2
  1232.            BRA.B      CallOldFunction
  1233.  
  1234. @MyOnMenu:     MOVE.L      A2,-(SP)
  1235.            MOVEA.L      _OldOnMenu,A2
  1236.            BRA.B      CallOldFunction
  1237.  
  1238. @MyOffMenu:    MOVE.L       A2,-(SP)
  1239.            MOVEA.L      _OldOffMenu,A2
  1240.  
  1241. * ------------ Obtain semaphore and then call the intuition function.
  1242. CallOldFunction:
  1243.            MOVE.L      A6,-(SP)
  1244.            MOVEM.L      D0/A0-A1/A6,-(SP)
  1245.            LEA      _PopUpSemaphore,A0
  1246.            MOVE.L      (AbsExecBase).W,A6
  1247.            JSR      _LVOObtainSemaphore(A6)
  1248.            MOVEM.L      (SP)+,D0/A0-A1/A6
  1249.            JSR      (A2)
  1250.            LEA      _PopUpSemaphore,A0
  1251.            MOVE.L      (AbsExecBase).W,A6
  1252.            JSR      _LVOReleaseSemaphore(A6)
  1253.            MOVE.L      (SP)+,A6
  1254.            MOVE.L      (SP)+,A2
  1255.            RTS
  1256.  
  1257. *******************************
  1258. *  MyCreatePort(Name)         *
  1259. *  MyDeletePort(Port)         *
  1260. *                  *
  1261. *  Replacements for amiga.lib *
  1262. *******************************/
  1263. @MyCreatePort: MOVE.L     A6,-(SP)
  1264.            MOVE.L     A2,-(SP)
  1265.            MOVEA.L     (A4),A6       * SysBase
  1266.            MOVE.L     A0,A2
  1267.  
  1268. * ------------ Port = AllocMem(sizeof(struct MsgPort),MEMF_CLEAR | MEMF_PUBLIC)
  1269.            MOVEQ.L     #mp_SIZEOF,D0
  1270.            MOVE.L     #MEMF_PUBLIC!MEMF_CLEAR,D1
  1271.            JSR     _LVOAllocMem(A6)
  1272.            MOVE.L     D0,A0
  1273.  
  1274. * ------------ Port == NULL  ?
  1275.            MOVE.L     A0,D0
  1276.            BEQ.B     NoPort        * Yes
  1277.  
  1278. * ------------ Init port  (Flags = PA_SIGNAL & Pri = 0 not needed -> MEMF_CLEAR)
  1279. * ------------ Port->mp_Node.ln_Name = Name
  1280.            MOVE.L     A2,mp_Node+ln_Name(A0)
  1281.  
  1282. * ------------ Port->mp_Node.ln_Type = NT_MSGPORT
  1283.            MOVE.B     #NT_MSGPORT,mp_Node+ln_Type(A0)
  1284.  
  1285. * ------------ Port->mp_SigTask = (struct Task *)FindTask(0)
  1286.            MOVE.L     eb_ThisTask(A6),mp_SigTask(A0)
  1287.  
  1288. * ------------ SigBit = AllocSignal(-1)
  1289.            MOVE.L     A0,A2
  1290.            MOVEQ.L     #-1,D0
  1291.            JSR     _LVOAllocSignal(A6)
  1292.  
  1293. * ------------ Port->mp_SigBit = SigBit
  1294.            MOVE.B     D0,mp_SigBit(A2)
  1295.  
  1296. * ------------ SigBit < 0  ?
  1297.            BMI.B     NoSignal      * Yes
  1298.  
  1299. * ------------ AddPort(Port)
  1300.            MOVEA.L     A2,A1
  1301.            JSR     _LVOAddPort(A6)
  1302.  
  1303. * ------------ return(Port)
  1304.            MOVE.L     A2,D0
  1305.            BRA.B     CreateEnd
  1306.  
  1307. * ------------ FreeMem(Port,sizeof(struct MsgPort))
  1308. NoSignal:      MOVE.L     A2,A1
  1309.            MOVEQ.L     #mp_SIZEOF,D0
  1310.            JSR     _LVOFreeMem(A6)
  1311.  
  1312. * ------------ return(NULL)
  1313.            MOVEQ.L     #0,D0
  1314. NoPort:
  1315. CreateEnd:     MOVE.L     (SP)+,A2
  1316.            MOVE.L     (SP)+,A6
  1317.            RTS
  1318.  
  1319.  
  1320. @MyDeletePort: MOVE.L     A3,-(SP)
  1321.            MOVE.L     A6,-(SP)
  1322.            MOVEA.L     A0,A3
  1323.            MOVEA.L     (A4),A6       * SysBase
  1324.  
  1325. * ------------ RemPort(Port)
  1326.            MOVEA.L     A3,A1
  1327.            JSR     _LVORemPort(A6)
  1328.  
  1329. * ------------ FreeSignal(Port->mp_SigBit)
  1330.            MOVEQ.L     #0,D0
  1331.            MOVE.B     mp_SigBit(A3),D0
  1332.            JSR     _LVOFreeSignal(A6)
  1333.  
  1334. * ------------ FreeMem(Port,sizeof(struct MsgPort))
  1335.            MOVEA.L     A3,A1
  1336.            MOVEQ.L     #mp_SIZEOF,D0
  1337.            JSR     _LVOFreeMem(A6)
  1338.            MOVE.L    (SP)+,A6
  1339.            MOVE.L    (SP)+,A3
  1340.            RTS
  1341.  
  1342. *****************************************************
  1343. * ULONG Mystrlen(String) - A short strlen.          *
  1344. *                            *
  1345. * Input:                        *
  1346. *   String   - pointer to a null-terminated string. *
  1347. * Output:                        *
  1348. *   return   - length of string.            *
  1349. *****************************************************
  1350. @Mystrlen:     MOVEQ.L      #-1,D0
  1351. 1$:           ADDQ.L      #1,D0
  1352.            TST.B      (A0)+
  1353.            BNE.B      1$
  1354.            RTS
  1355.  
  1356.            section      __MERGED,bss
  1357. DT:           EQU    *
  1358. _PopUpSemaphore:
  1359.            ds.b    ss_SIZEOF
  1360. _OldSetMenuStrip:
  1361.            ds.l    1
  1362. _OldClearMenuStrip:
  1363.            ds.l    1
  1364. _OldOnMenu:    ds.l    1
  1365. _OldOffMenu:   ds.l    1
  1366. _IBase:        ds.l    1
  1367.            END
  1368.  
  1369.  
  1370.  
  1371.  
  1372.  
  1373.  
  1374.