home *** CD-ROM | disk | FTP | other *** search
- OPT c+,l-
-
- ****************************************
- * DevPatch II *
- * © J.Tyberghein N.François P.Marivoet *
- * Dec 1989 *
- ****************************************
-
- incdir ":include/"
- include "exec/types.i"
- include "exec/memory.i"
- include "exec/ports.i"
- include "exec/exec_lib.i"
-
- ;IntuitionBase routines
- _LVOOpenWindow equ -204
- ;DosBase
- _LVOOutput equ -60
- _LVOWrite equ -48
-
- nw_Title equ $1a
- nw_Height equ 6
- PRI equ 0
-
- ;*** Start code ***
-
- ;IntuitionLibrary
- lea IntLib(PC),a1
- CALLEXEC OldOpenLibrary
- move.l d0,_IntBase
- ;DosLibrary
- lea DosLib(PC),a1
- CALLEXEC OldOpenLibrary
- move.l d0,_DosBase
- ;Say we exist
- lea StartupMsg(PC),a2
- moveq #StartupMsgLen,d2
- bsr myPuts
- ;Test if the MsgPort exists
- lea StartBlock(PC),a1
- lea PortName(a1),a1
- CALLEXEC FindPort
- tst.l d0
- bne.s PortAlreadyExists
-
- ;Create MsgPort
- move.l #BlockLen,d0
- move.l #MEMF_CLEAR+MEMF_PUBLIC,d1
- CALLEXEC AllocMem
- tst.l d0
- beq CloseLib
- move.l d0,Port
- lea StartBlock(PC),a0
- move.l d0,a1
- move.l #BlockLen,d0
- CALLEXEC CopyMem
- move.l Port(PC),a1
- lea PortName(a1),a0
- move.l a0,LN_NAME(a1)
- CALLEXEC AddPort
- ;Install patch
- move.l Port(PC),a1
- lea OpenPatch(a1),a0
- move.l a0,d0
- move.l _IntBase(PC),a1
- move.l #_LVOOpenWindow,a0
- CALLEXEC SetFunction
- move.l Port(PC),a1
- move.l d0,JmpLab1(a1)
- lea PatchedMsg(PC),a2
- moveq #PatchedMsgLen,d2
- bsr.s myPuts
- bra.s CloseLib
-
- PortAlreadyExists:
- move.l d0,a2
- ;Remove patch
- move.l JmpLab1(a2),d0
- move.l _IntBase(PC),a1
- move.l #_LVOOpenWindow,a0
- CALLEXEC SetFunction
- ;Remove Port
- move.l a2,a1
- CALLEXEC RemPort
- ;Free Patch memory
- move.l a2,a1
- move.l #BlockLen,d0
- CALLEXEC FreeMem
- ;Say it's done
- lea RemovedMsg(PC),a2
- moveq #RemovedMsgLen,d2
- bsr.s myPuts
- CloseLib:
- ;Close libraries
- move.l _DosBase(PC),a1
- CALLEXEC CloseLibrary
- move.l _IntBase(PC),a1
- CALLEXEC CloseLibrary
- rts
-
- myPuts:
- move.l _DosBase(PC),a6
- jsr _LVOOutput(a6)
- move.l d0,d1
- move.l d2,d3
- move.l a2,d2
- jsr _LVOWrite(a6)
- rts
-
- *****************************************************************************
-
- ;This is our MsgPort followed by our patch function
- ;this data and code will be copied in one block
- StartBlock:
- dc.l 0,0
- dc.b NT_MSGPORT,PRI
- dc.l 0 ;Pointer to our MsgPort name
- dc.b 0,0
- dc.l 0,0,0,0
- dc.b 0,0
-
- OpenPatch equ *-StartBlock
- movem.l d7/a2-a3,-(a7)
- move.l nw_Title(a0),a2
- lea Assembling(PC),a3
- moveq #13,d7
- CmpLoop:
- cmp.b (a2)+,(a3)+
- dbne d7,CmpLoop
- addq.w #1,d7
- beq.s PatchIt
- move.l nw_Title(a0),a2
- lea DefaultOutput(PC),a3
- moveq #21,d7
- CmpLoop2:
- cmp.b (a2)+,(a3)+
- dbne d7,CmpLoop2
- addq.w #1,d7
- bne.s NotDevpac
- PatchIt:
- move.w #45,nw_Height(a0)
- NotDevpac:
- movem.l (a7)+,d7/a2-a3
- JmpLab1 equ *+2-StartBlock
- jmp $0.l
-
- PortName equ *-StartBlock
- dc.b "DevPatch.port",0
- Assembling: dc.b "Assembling...",0
- DefaultOutput: dc.b "Default Output Window",0
-
- BlockLen equ *-StartBlock
-
- *****************************************************************************
-
- _IntBase: dc.l 0
- _DosBase: dc.l 0
- Port: dc.l 0
- IntLib: dc.b "intuition.library",0
- DosLib: dc.b "dos.library",0
- StartupMsg: dc.b 27,"[33mDevPatch II",27,"[0m by PowerPeak",10,0
- StartupMsgLen equ *-StartupMsg
- PatchedMsg: dc.b "Patch installed.",10,0
- PatchedMsgLen equ *-PatchedMsg
- RemovedMsg: dc.b "Patch removed.",10,0
- RemovedMsgLen equ *-RemovedMsg
-
- END
-
-