home *** CD-ROM | disk | FTP | other *** search
- opt c+,l-
-
- incdir include/
- include intuition/intuitionbase.i
- include intuition/intuition.i
-
- ;******************************
- ;* Trace Open and LoadSeg *
- ;* © J.Tyberghein 29 sep 89 *
- ;******************************
-
- SysBase equ 4
- ;ExecBase routines
- _LVOOldOpenLibrary equ -408
- _LVOCloseLibrary equ -414
- _LVOForbid equ -132
- _LVOPermit equ -138
- _LVOWaitPort equ -384
- _LVOGetMsg equ -372
- _LVOReplyMsg equ -378
- ;DosBase routines
- _LVOOpen equ -30
- _LVOOutput equ -60
- _LVOWrite equ -48
- _LVOLoadSeg equ -150
- ;IntuitionBase routines
- _LVOOpenWindow equ -204
- _LVOCloseWindow equ -72
- _LVOSetWindowTitles equ -276
- ;Graphics routines
- _LVOText equ -60
- _LVOMove equ -240
- _LVOScrollRaster equ -396
- _LVOSetAPen equ -342
-
- CALLEXEC macro
- move.l (SysBase).w,a6
- jsr _LVO\1(a6)
- endm
-
- CALLGRAF macro
- move.l GfxBase,a6
- jsr _LVO\1(a6)
- endm
-
- CALLINT macro
- move.l IntBase,a6
- jsr _LVO\1(a6)
- endm
-
- CALLDOS macro
- move.l DosBase,a6
- jsr _LVO\1(a6)
- endm
-
- ;*** Start code ***
-
- move.l a0,ComLin
- move.l d0,ComLinLen
- ;DosLibrary
- lea DosLib,a1
- CALLEXEC OldOpenLibrary
- move.l d0,DosBase
- ;IntuitionLibrary
- lea IntLib,a1
- CALLEXEC OldOpenLibrary
- move.l d0,IntBase
- ;GfxLibrary
- lea GfxLib,a1
- CALLEXEC OldOpenLibrary
- move.l d0,GfxBase
-
- ;Get current OutputHandle
- CALLDOS Output
- move.l d0,OutputHandle
-
- ;Check arguments
- move.b #0,SmallWin
- lea NWin,a0
- move.w #300,nw_Width(a0)
- cmp.l #3,ComLinLen
- blt.s NoSmallWin
- move.w #350,nw_Width(a0)
- move.l ComLin,a0
- cmp.b #'s',2(a0)
- bne.s ErrorArg
- move.b #1,SmallWin
- lea NWin,a0
- move.w #10,nw_Height(a0)
- move.l #0,nw_FirstGadget(a0)
- NoSmallWin:
- move.l ComLin,a0
- cmp.b #'o',(a0)
- beq.s OpenTrace
- cmp.b #'l',(a0)
- beq.s LoadSegTrace
- ErrorArg:
- move.l OutputHandle,d1
- move.l #UsageString,d2
- move.l #UsageStringLen,d3
- CALLDOS Write
- bra ErrorOW
- OpenTrace:
- move.l #_LVOOpen,Offset
- move.l #WoTitle,WinTitle
- move.l #-1,DosNum
- bra.s Continue
- LoadSegTrace:
- move.l #_LVOLoadSeg,Offset
- move.l #WlTitle,WinTitle
- move.l #-19,DosNum
-
- Continue:
- tst.b SmallWin
- beq.s NoSmW
- move.l #0,WinTitle
- NoSmW:
- bsr OpenWin
- tst.l d0
- beq ErrorOW
-
- ;Install Patch
- CALLEXEC Forbid
- move.l DosBase,a0
- move.l Offset,d0
- move.w (a0,d0),SaveSetF
- move.l 2(a0,d0),SaveSetF+2
- move.w #$4ef9,(a0,d0)
- move.l #Patch,2(a0,d0)
- move.l DosBase,d0
- add.l #$4e,d0
- move.l d0,LabelJmp+2
- CALLEXEC Permit
-
- ;Wait for windowclose or gadget
- WaitUser:
- move.l UserPort,a0
- CALLEXEC WaitPort
- move.l UserPort,a0
- CALLEXEC GetMsg
- move.l d0,a0
- move.l im_Class(a0),d2
- move.w im_Code(a0),d3
- move.l a0,a1
- CALLEXEC ReplyMsg
- and.l #MOUSEBUTTONS,d2
- beq.s TheEnd
- cmp.w #MENUUP,d3
- bne.s WaitUser
- ;The user pressed the right mouse button, so move the window to the first screen
- move.l Win,a0
- CALLINT CloseWindow
- bsr OpenWin
- tst.l d0
- bne.s WaitUser
- bsr EndPatch
- bra.s ErrorOW
-
- TheEnd:
- bsr EndPatch
- move.l Win,a0
- CALLINT CloseWindow
-
- ErrorOW:
- move.l GfxBase,a1
- CALLEXEC CloseLibrary
- move.l DosBase,a1
- CALLEXEC CloseLibrary
- move.l IntBase,a1
- CALLEXEC CloseLibrary
- rts
-
- ;*** Restore patch ***
- EndPatch:
- CALLEXEC Forbid
- move.l DosBase,a0
- move.l Offset,d0
- move.w SaveSetF,(a0,d0)
- move.l SaveSetF+2,2(a0,d0)
- CALLEXEC Permit
- rts
-
- ;*** Open window on first screen ***
- ;-> d0 = 0 if error
- ;***
- OpenWin:
- move.l IntBase,a1
- lea NWin,a0
- move.l ib_FirstScreen(a1),nw_Screen(a0)
- move.l WinTitle,nw_Title(a0)
- CALLINT OpenWindow
- tst.l d0
- beq.s ErrorOWi
- move.l d0,Win
- move.l d0,a0
- move.l wd_RPort(a0),rp
- move.l wd_UserPort(a0),UserPort
- moveq #1,d0
- ErrorOWi:
- rts
-
- ;*** New patch function ***
- ;Print file name
- ;***
- Patch:
- movem.l a6/d1-d5,-(a7)
- tst.b SmallWin
- bne.s SkipDraw
- move.l d1,-(a7) ;We have a large window
- move.l rp,a1
- moveq #0,d0
- moveq #10,d1
- moveq #2,d2
- moveq #12,d3
- move.l #286,d4
- move.l #51,d5
- CALLGRAF ScrollRaster ;Scroll window one line up
- move.l rp,a1
- moveq #1,d0 ;White
- CALLGRAF SetAPen
- move.l rp,a1
- moveq #10,d0
- moveq #0,d1
- move.w #50,d1
- CALLGRAF Move
- move.l (a7)+,d1 ;Restore string ptr (argument in d1)
- move.l rp,a1
- move.l d1,a0
- bsr StrLen
- cmp.l #34,d0
- ble.s AllRight
- moveq #34,d0
- AllRight:
- move.l d1,a0
- CALLGRAF Text
- bra.s ContPatch
- SkipDraw:
- move.l Win,a0
- moveq #32,d0
- move.l d1,a1
- lea String,a2
- LoopSWT:
- move.b (a1),(a2)+
- tst.b (a1)+
- beq.s TheEndSWT
- subq.l #1,d0
- bne.s LoopSWT
- move.b #0,(a2)+
- TheEndSWT:
- lea String,a1
- move.l #0,a2
- CALLINT SetWindowTitles
- ContPatch:
- movem.l (a7)+,a6/d1-d5
- move.l DosNum,d0
- LabelJmp:
- jmp $00000000
-
- ;*** String length ***
- ;a0 = string address
- ;-> d0 = length
- ;***
- StrLen:
- moveq #-1,d0
- LoopSL:
- addq.l #1,d0
- tst.b (a0)+
- bne.s LoopSL
- rts
-
- EVEN
- DosBase: dc.l 0
- IntBase: dc.l 0
- GfxBase: dc.l 0
- ;Old SetFunction address
- SaveSetF: dc.w 0
- dc.l 0
- rp: dc.l 0 ;RastPort
- Win: dc.l 0 ;Window
- UserPort: dc.l 0 ;Window user port
- OutputHandle: dc.l 0
- Offset: dc.l 0 ;Offset of function
- WinTitle: dc.l 0 ;Current window title
- DosNum: dc.l 0 ;Number for dos.library (intern)
- ComLin: dc.l 0 ;Address of arguments to this command
- ComLinLen: dc.l 0 ;Length of argumentstring
- SmallWin: dc.b 0 ;1 if a small window is required
-
- String: ds.b 35 ;Space for windowtitle
-
-
- ;Library names
- DosLib: dc.b "dos.library",0
- IntLib: dc.b "intuition.library",0
- GfxLib: dc.b "graphics.library",0
-
- WoTitle: dc.b "Open trace",0
- WlTitle: dc.b "LoadSeg trace",0
-
- UsageString: dc.b "Usage: Trace o | l [s]",10,0
- UsageStringLen equ *-UsageString
-
- EVEN
- ;Window
- NWin:
- dc.w 0,0,300,58
- dc.b 2,1
- dc.l CLOSEWINDOW+MOUSEBUTTONS
- dc.l WINDOWDEPTH+WINDOWDRAG+WINDOWCLOSE+RMBTRAP+REPORTMOUSE
- dc.l 0
- dc.l 0
- dc.l 0
- dc.l 0,0
- dc.w 0,0,0,0
- dc.w CUSTOMSCREEN
-
- END
-
-
-