; EXAMPLE.ASM written 09/15/86 by Martin Murray ******************************************************************************** * THIS CODE IS IN NO WAY COPYRIGHT 1986 BY INOVATRONICS, INC. IN FACT, * * YOU CAN DO ANYTHING WITH IT THAT YOU WANT TO DO. JUST REMEMBER, * * INOVATRONICS, INC. WILL BEAR ABSOLUTELY NO RESPONSIBILITY FOR THE USE, * * MISUSE, INABILITY TO USE OR INABLITY TO UNDERSTAND ANY OR ALL PARTS OF * * THIS CODE. ENJOY IT IN GOOD HEALTH. * ******************************************************************************** ******************************************************************************** * THE PURPOSE OF THE CODE IS TO LET YOU SEE WHAT YOUR PowerWindows * * GENERATED SOURCE CODE WILL LOOK LIKE IN A PROGRAM. IN MOST CASES, ALL * * YOU SHOULD HAVE TO DO IS ASSEMBLE THIS FILE. IT WILL AUTOMATICALLY * * INCLUDE YOUR SOURCE FILE, PROVIDED IT IS IN THE DEFAULT DIRECTORY, AND * * IS NAMED "example.i". JUST ASSEMBLE IT, LINK IT AND RUN IT. IT * * DEFAULTS TO TERMINATING WHEN THE CLOSE GADGET IS HIT, BUT IF YOU LOOK * * BELOW YOU'LL SEE HOW TO MAKE IT TERMINATE ON ANY EVENT AT ALL. * ******************************************************************************** include "exec/types.i" include "exec/io.i" include "exec/strings.i" include "libraries/dosextens.i" include "intuition/intuition.i" xref _AbsExecBase ************ EQUATES NULL equ 0 ************ MACROS xlib macro xref _LVO\1 endm callsys macro (routine name to call, A6 must have base pointer of library) xlib \1 CALLLIB _LVO\1 endm call macro (address to call) bsr \1 endm push macro (long ea to push) move.l \1,-(sp) endm pull macro (long ea to fetch without popping) move.l (sp),\1 endm pop macro (long ea to pop into) move.l (sp)+,\1 endm ********* DATA AREA DATA Intuitionname: string <'intuition.library'> InitialSP: dc.l 0 MeMyselfandI: dc.l 0 ReturnMsg: dc.l 0 _IntuitionBase: dc.l 0 CurrentWindow: dc.l 0 include "example.i" ;include the PowerWindows code ************ PROGRAM START CODE ;Intitialize by saving the stack pointer and finding our own task. move.l sp,InitialSP ;save the stack pointer move.l _AbsExecBase,a6 ;get the system library address sub.l a1,a1 callsys FindTask ;please, I must find myself move.l d0,MeMyselfandI ;save the address of the TCB list node move.l d0,a0 ; in case we need it for some reason tst.l PR_CLI(a0) ;were we run by Workbench? bne 1$ ;no-jump lea PR_MSGPORT(a0),a0 ;wait for the startup message push a0 callsys WaitPort pop a0 ;get it callsys GetMsg move.l d0,ReturnMsg ;save the message 1$: moveq #0,d0 ;open intuition.library lea Intuitionname,a1 callsys OpenLibrary move.l d0,_IntuitionBase ;save her address beq FatalExit ;quit NOW if no Intuition move.l d0,a6 ;A6 gets the pointer until we call Exec main: ;do the opening of the window, et all. lea NewWindowStructure,a0 ;point to the NewWindow structure and callsys OpenWindow ; open the window (gadgets will come up move.l d0,CurrentWindow ; too.) beq Exit ;leave if couldn't open window ;attach the menu if present ifd MenuList move.l d0,a0 ;window address to A0 lea MenuList,a1 ;menustrip pointed to by A1 callsys SetMenuStrip endc ;draw the IntuiText only if there is some ifd IntuiTextList move.l CurrentWindow,a0 ;get the RastPort address move.l WD_RPORT(a0),a0 lea IntuiTextList,a1 ;print this list of IText structures moveq #0,d0 ;let the text position itself move.l d0,d1 callsys PrintIText endc ;draw the Borders only if there are some of them ifd BorderList move.l CurrentWindow,a0 ;get the RastPort address move.l WD_RPORT(a0),a0 lea BorderList,a1 ;draw this list of Border structures moveq #0,d0 ;let the borders position themselves move.l d0,d1 callsys DrawBorder endc ;now wait for the event we should terminate at. move.l _AbsExecBase,a6 ;point to the system again loop: move.l CurrentWindow,a0 ;get the IDCMP port address and Wait on move.l WD_USERPORT(a0),a0 ; it push a0 ;save the port address callsys WaitPort pop a0 ;get the message callsys GetMsg move.l d0,a1 ;message address to A1 move.l IM_CLASS(a1),d4 ;save the event class in D4 callsys ReplyMsg ;reply the message ;termination test -- change it to any other IDCMP event, just be sure that your ; IDCMP flags are set properly cmp.l #CLOSEWINDOW,d4 ;should we terminate now? bne loop ;loop if not move.l _IntuitionBase,a6 ;be sure to do next through Intuition ;detach the menu if present ifd MenuList move.l CurrentWindow,a0 ;window address to A0 callsys ClearMenuStrip endc move.l CurrentWindow,a0 ;close the window callsys CloseWindow ************ PROGRAM EXIT Exit: move.l _AbsExecBase,a6 move.l _IntuitionBase,a1 ;close Intuition callsys CloseLibrary FatalExit: move.l ReturnMsg,d0 ;reply to any WorkBench message beq 1$ ;jump if none move.l a1,d0 ;point with this here register callsys ReplyMsg ;Reply the message 1$: moveq #0,d0 ;no error code returned move.l InitialSP,sp ;return to the caller rts end