home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 2
/
FFMCD02.bin
/
new
/
os20
/
util
/
mfrhelp
/
mfrhelp.s
< prev
next >
Wrap
Text File
|
1993-12-21
|
6KB
|
230 lines
;-------------------------------------------------------------------------------
* *
* MFRHelp *
* *
* *
* Filename mfrhelp.s *
* Author Daniel Weber *
* Version 0.20 *
* Start 18.10.93 *
* *
* Last Revision 18.10.93 *
* *
* *
* Written using the ProAsm assembler *
* *
;-------------------------------------------------------------------------------
output 'ram:mfrhelp'
opt o+,q+,ow-,qw- ;optimize
verbose
super
MC68040
;-------------------------------------------------------------------------------
incdir 'include:'
incdir 'dh1:routines'
include 'libraries/asl.i'
include 'exec/execbase.i'
include 'exec/memory.i'
;-------------------------------------------------------------------------------
AbsExecBase EQU 4
* exec library offsets
_LVOSupervisor EQU -30
_LVOForbid EQU -132
_LVOPermit EQU -138
_LVOAllocMem EQU -198
_LVOCloseLibrary EQU -414
_LVOSetFunction EQU -420
_LVOOpenLibrary EQU -552
_LVOCacheClearU EQU -636
* utility library offset
_LVOFindTagItem EQU -30
* asl library offset
_LVOAslRequest EQU -60
;-------------------------------------------------------------------------------
progbase:
movem.l d0-a6,-(a7)
moveq #36,d0 ;open asl.library
lea AslName(pc),a1
move.l (AbsExecBase).w,a6
jsr _LVOOpenLibrary(a6)
move.l d0,AslBase ;no asl.library => exit
beq .out
move.l #patchend-patch,d0 ;allocate memory for patch
move.l #MEMF_PUBLIC,d1
jsr _LVOAllocMem(a6)
move.l d0,location ;no memory for patch => exit
beq .quit
lea patch(pc),a0 ;copy patch...
move.l d0,a1
move.w #patchend-patch-1,d7
.copy: move.b (a0)+,(a1)+
dbra d7,.copy
;
; clear all caches if needed
;
.clearcaches:
btst #1,AttnFlags+1(a6) ;68000/10 installed?
beq.s .set
cmp.w #36,LIB_VERSION(a6) ;2.0 or higher?
bcc.s .exec
lea .clear(pc),a5
jsr _LVOSupervisor(a6)
bra.s .set
.clear: movec cacr,d1 ;save cache control register
move.w #$8000,d2 ;small 68040 processor test
movec d2,cacr
movec cacr,d2
tst.w d2 ;d2.w=$8xxx => 68040 installed
bmi.s .68040
or.w #$808,d1 ;data and instruction cache clear
bra.s .cc
.68040: cpusha bc ;68040: clear both caches
.cc: movec d1,cacr ;restore cache control register
rte
.exec: jsr _LVOCacheClearU(a6) ;exec used for 2.0 of higher
;
; install patch
;
.set: move.l (AbsExecBase).w,a6
jsr _LVOForbid(a6)
move.l AslBase(pc),a1 ;install patch
lea _LVOAslRequest,a0
move.l location(pc),a5
move.l a5,d0
jsr _LVOSetFunction(a6)
move.l d0,oldFunction-patch(a5)
jsr _LVOPermit(a6)
;
; done...
;
.quit: move.l AslBase(pc),a1
jsr _LVOCloseLibrary(a6)
.out: movem.l (a7)+,d0-a6
moveq #0,d0
rts
;-------------------------------------------------------------------------------
*
* the patch
*
;-------------------------------------------------------------------------------
patch: movem.l a0/a1,-(a7) ;save structure pointer & taglist
pea patch2(pc) ;return address for old function
move.l oldFunction(pc),-(a7) ;old Function (returned by SetFunction)
rts
;
; correct result of MFR's ASLRequest patch
;
patch2: movem.l (a7),a0/a1
tst.l d0 ;no file selected
beq .out
movem.l d0-a6,-(a7) ;check for DOMULTISELECT
moveq #0,d5
move.l (AbsExecBase).w,a6 ;check for CygnusEd3.5
move.l ThisTask(a6),a0
move.l LN_NAME(a0),d0 ;pointer to name
beq.s 2$
move.l d0,a0
lea cedname(pc),a2
.loop: tst.b (a2) ;compare task name
beq.s .ok
cmp.b (a0)+,(a2)+
beq.s .loop
bra.s 2$ ;not CygnusEd3.5
.ok: moveq #36,d0 ;open utility.library
lea UtilityName(pc),a1
jsr _LVOOpenLibrary(a6)
move.l d0,a6
move.l a6,d0
beq.s 2$
move.l #ASLFR_Flags1,d0 ;search for ASLFR_Flags1 tag
move.l _movembytes+4(a7),a0 ;= 64(a7) (ced3.5's taglist)
jsr _LVOFindTagItem(a6)
tst.l d0
beq.s 1$ ;not found
move.l d0,a0
move.l ti_Data(a0),d0
btst #FRB_DOMULTISELECT,d0 ;DOMULTISELECT bit set?
sne d5
1$: move.l #ASLFR_DoMultiSelect,d0 ;search for ASLFR_DoMultiSelect
move.l _movembytes+4(a7),a0 ;= 64(a7)
jsr _LVOFindTagItem(a6)
tst.l d0
beq.s 11$ ;not found
move.l d0,a0
tst.l ti_Data(a0)
sne d5
11$: move.l a6,a1 ;close utility.library
move.l (AbsExecBase).w,a6
jsr _LVOCloseLibrary(a6)
2$: tst.l d5 ;d5: (0: no... -: DOMULTISELECT)
movem.l (a7)+,d0-a6
beq.s .out
tst.l fr_NumArgs(a0) ;correct the ASL filerequester
bne.s .out ;structure...
addq.l #1,fr_NumArgs(a0) ;set fr_NumArgs to 1
tst.l fr_ArgList(a0)
bne.s .out
mea (a0),fr_ArgList(a0) ;HACK!!! (for CED) to simulate
.out: movem.l (a7)+,a0/a1 ;a valid filelist with one entry
rts
oldFunction: dc.l 0
cedname: dc.b "CygnusEd ver. 3.5",0
UtilityName: dc.b "utility.library",0
even
patchend:
;-------------------------------------------------------------------------------
*
* data
*
;-------------------------------------------------------------------------------
AslName: dc.b "asl.library",0
even
AslBase: dc.l 0
location: dc.l 0
END