home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
595.lha
/
Notify_v1.1
/
Source
/
DosWedge.asm
< prev
next >
Wrap
Assembly Source File
|
1991-09-07
|
4KB
|
148 lines
section code
*
* In both functions, we need a buffer area. Here's what will be in the
* buffer area:
*
* area - area+6 : backup of what was in the DosBase jump table
* area+6 - area+12 : a jump to the new code (serves also as linked list)
* area+12 - area+20: the "old code", made either of:
*
* moveq.l #xx, d0
* jmp #longadd
*
* or
*
* nop
* jmp #longadd
*
* depending if we were the first to modify the DosBase
* function.
*
* DosWedge
*
* On entry, on the stack we have:
*
* sp+16: new function address
* sp+12: backup area (10 words == 20 bytes)
* sp+8 : offset of function in DosBase
* sp+4 : DosBase
* sp : return address (what did ya think?)
*
* You can declare the DosWedge function like this in Lattice 5.10:
*
* __fptr __stdargs DosWedge (struct DosBase *, LONG Offset, WORD *BackUp, __fptrNewFunc);
*
JUMP equ $4EF9
XDEF _DosWedge
_DosWedge:
move.l a6,-(a7)
move.l 4,a6
jsr -$84(a6) ; Forbid
move.l 8(a7),a0 ; DosBase
add.l 12(a7),a0 ; add offset of function
move.l 16(a7),a1 ; backup for old jump
move.w (a0),(a1) ; contains a moveq+bra or jmp
move.l 2(a0),2(a1)
cmp.w #JUMP,(a1) ; if old stuff is a jmp someone passed b4 us
beq NotFirst
HereFirst:
move.w (a0),12(a1) ; get old moveq code
move.w #JUMP,14(a1) ; put a JMP #longaddr instruction
move.l a0,16(a1) ; get DosBase+offset
moveq.l #0,d1 ; clear register
move.w 4(a0),d1 ; get old BRA offset
addq.l #4,d1 ; add 4 : offset relative to PC at fetch time
add.l d1,16(a1) ; and add it
bra SetJump ; go set new jump address
NotFirst:
move.w #$4E71,12(a1) ; put a NOP
move.w #JUMP,14(a1) ; put a jmp instruction
move.l 2(a0),16(a1) ; get address of the one who passed here
SetJump:
move.w #JUMP,(a0) ; put a JMP #longaddr instruction
addq.l #6,a1 ; start of new code
move.l a1,2(a0) ; put new code jumper
move.w #JUMP,(a1) ; put a JMP #longaddr instruction
move.l 20(a7),2(a1) ; put address of new function
move.l a1,d0
addq.l #6,d0 ; this is the "old function ptr"
move.l 8(a7),a0 ; get DOSBase
move.l d0,-(a7)
jsr CheckSum ; calculate checksum
jsr -$8A(a6) ; Permit
move.l (a7)+,d0
move.l (a7)+,a6
rts
* UnWedge
*
* On entry, on the stack we have:
*
* sp+12: backup area (10 words == 20 bytes)
* sp+8 : offset of function in DosBase
* sp+4 : DosBase
* sp : return address (what did ya think?)
*
* You can declare the UnWedge function like this in Lattice 5.10:
*
* void __stdargs UnWedge (struct DosBase *, LONG Offset, WORD *Backup);
*
XDEF _UnWedge
_UnWedge:
move.l a6,-(a7)
move.l 4,a6
jsr -$84(a6) ; Forbid
move.l 8(a7),a0 ; DosBase
add.l 12(a7),a0 ; offset
move.l 16(a7),a1 ; backup area
move.l a1,d0 ; get our new function address
addq.l #6,d0
cmp.l 2(a0),d0 ; check if it's in DosBase
beq Alone
NotAlone:
move.l 2(a0),a0 ; get the address of the one who passed here
subq.l #6,a0 ; get start of his backup
cmp.l 2(a0),d0 ; check if its backup contains that
bne NotAlone ; if not, get next in "list"
move.w 12(a1),12(a0) ; copy noop or moveq
move.l 16(a1),16(a0) ; modify its "old function pointer"
Alone:
move.w (a1),(a0) ; no one passed after us
move.l 2(a1),2(a0) ; so we restore what was there
move.l 8(a7),a0 ; get DOSBase
jsr CheckSum ; do checksum
jsr -$8A(a6) ; Permit
move.l (a7)+,a6
rts
CheckSum:
move.l a0,a1
move.w 16(a1),d0
lsr.w #1,d0
moveq.l #0,d1
bra later
loop:
add.w -(a1),d1
later:
dbf d0,loop
move.w d1,28(a0)
rts
end