home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dream 49
/
Amiga_Dream_49.iso
/
amiga
/
workbench
/
commodoties
/
patchwb.lha
/
PatchWB
/
PatchWB.asm
< prev
next >
Wrap
Assembly Source File
|
1998-01-31
|
5KB
|
204 lines
opt o+,ow-
;*************************************************
;** PatchWB ⌐ 1997,98 THOR **
;** **
;** Fixes bugs in the workbench library **
;** AddAppItem crashes if the WB is closed **
;** IPrefs/OpenWorkBench() hang **
;*************************************************
opt o+,ow-
include inc:macros.asm
include inc:exec_lib.asm
include inc:intuition_lib.asm
include inc:workbench_lib.asm
include inc:graphics_lib.asm
section main_code,code
;*************************************************
;** Program starts here **
;*************************************************
Start:
move.l ExecBase,a6
lea WBName(pc),a1
move.l a6,SysBase ;SaveBack SysBase
moveq #39,d0 ;Only V39,V40
jsr OpenLibrary(a6)
move.l d0,a4
tst.l d0
beq .nowblib
cmp.w #40,20(a4) ;newer version -> forget it!
bhi .nowblib
lea IntName,a1
moveq #37,d0
jsr OpenLibrary(a6)
move.l d0,a3
tst.l d0
beq.s .nointuilib
jsr Forbid(a6)
move.l #_NewLockIBase,d0
lea LockIBase,a0
move.l a3,a1
jsr SetFunction(a6)
move.l d0,_OldLockIBase+2
move.l #_NewUnlockIBase,d0
lea UnlockIBase,a0
move.l a3,a1
jsr SetFunction(a6)
move.l d0,_OldUnLockIBase+2
move.l #_NewAppMenu,d0
lea AddAppMenuItemA,a0
move.l a4,a1
jsr SetFunction(a6)
move.l d0,_OldAppMenu+2
move.l #_NewRemMenu,d0
lea RemoveAppMenuItem,a0
move.l a4,a1
jsr SetFunction(a6)
move.l d0,_OldRemMenu+2
jsr CacheClearU(a6) ;Execbase still in a6: Flush Cache
lea Start(pc),a0
move.l a3,IntuitionBase ;save back intuition for later use
clr.l -4(a0) ;Unlink segments...
jsr Permit(a6)
;intuition isn't closed
;it won't get away and
;can't be flushed from memory
.nointuilib:
move.l a4,a1 ;close workbench
jsr CloseLibrary(a6)
.nowblib:
moveq #0,d0 ;fail quietly
rts
WBName: dc.b "workbench.library",0
IntName: dc.b "intuition.library",0
dc.b "$VER: PatchWB 1.01 (30.01.98)",0
section resident_code,code
;*************************************************
;** The resident code starts here **
;** this segment is unlinked and stays **
;** resident **
;** Remember that this is still a patch **
;** don't try this at home! **
;*************************************************
_NewAppMenu:
saveregs d0-d1/a0-a1/a6
move.l IntuitionBase(pc),a6
lea WBSName(pc),a0
jsr LockPubScreen(a6) ;WB MUST be open ! This call will do that
loadregs
_OldAppMenu:
jsr $aaaaaaaa ;old address gets patched in here! Don't try this at home!
saveregs d0/a6
move.l IntuitionBase(pc),a6
lea WBSName(pc),a0
sub.l a1,a1
jsr UnlockPubScreen(a6)
loadregs
rts
_NewRemMenu:
saveregs a0/a6
move.l IntuitionBase(pc),a6
lea WBSName(pc),a0
jsr LockPubScreen(a6) ;WB MUST be open ! This call will do that
loadregs
_OldRemMenu:
jsr $aaaaaaaa ;old address gets patched in here! Don't try this at home!
saveregs d0/a6
move.l IntuitionBase(pc),a6
lea WBSName(pc),a0
sub.l a1,a1
jsr UnlockPubScreen(a6)
loadregs
rts
_NewLockIBase:
bsr.s _IsIPrefs
bne.s _OldLockIBase
saveregs d0/a4
move.l a6,a4 ;keep intuitionbase
move.l SysBase(pc),a6
jsr Forbid(a6)
do
tst.w $b3a(a4) ;Obtain magic intuition lock
break.s eq
move.l $568(a4),a6 ;get graphics lib from IBase
;!!! This works ONLY for V39,V40
jsr WaitTOF(a6)
loop.s
addq.w #1,$b3a(a4)
move.l SysBase(pc),a6
jsr Permit(a6)
move.l a4,a6
loadregs
_OldLockIBase:
jmp $aaaaaaaa ;patch in old address here... Don't try this at home...
_NewUnlockIBase:
move.l a0,d0
bsr.s _IsIPrefs
movea.l d0,a0
bne.s _OldUnlockIBase
bsr.s _OldUnlockIBase
subq.w #1,$b3a(a6) ;free magic intuition base
rts
_OldUnlockIBase:
jmp $aaaaaaaa
_IsIPrefs:
move.l SysBase(pc),a0
move.l $114(a0),a0 ;get task
move.l $a(a0),d1 ;get name
beq.s .exit
lea IPrefsName(pc),a1
move.l d1,a0
for.l #11,d1
cmp.b (a0)+,(a1)+
next ne,d1
rts
.exit:
clz
rts
IntuitionBase: dc.l 0
SysBase: dc.l 0
WBSName: dc.b "Workbench",0
IPrefsName: dc.b "½ IPrefs ╗",0