home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 1: Amiga
/
FrozenFish-Apr94.iso
/
bbs
/
alib
/
d8xx
/
d886
/
patchlibrary.lha
/
PatchLibrary
/
CPUClr.asm
< prev
next >
Wrap
Assembly Source File
|
1993-07-16
|
4KB
|
170 lines
;
; CPUClr - (C) 1993 Stefan Fuchs
;replaces BltClear() with a CPU based function
;compatible to kick V36's "fill" feature
include exec/types.i
include ASMMacros.i
InstallPatch = -30 ;patch
WaitRemovePatch = -36
FindPatch = -48
;----------------------------------------
Main:
OPENLIB DosName,0,DosFailed ;Open Dos Library
move.l d0,DosBase
lea.l head(pc),a0 ;Print Title Text
bsr TextOutput
OPENLIB PatchName,0,PatchFailed ;Open Patch Library
move.l d0,PatchBase
lea.l IdString(pc),a0 ;Is Patch Installed
CALL FindPatch,PatchBase
tst.l d0
beq install ;No ->install
move.l d0,a0 ;Remove Patch
CALL WaitRemovePatch
lea.l RemoveText(pc),a0
tst.l d0
beq exit
lea.l RemoveFailText(pc),a0
bra exit
install:
lea.l NewPatch(pc),a0
CALL InstallPatch
lea.l InstalledText(pc),a0
tst.l d0
bne exit
lea.l InstallFailText(pc),a0
exit:
bsr TextOutput
CLOSELIB PatchBase ;Close patch Library
PatchFailed:
tst.l PatchBase
bne PatchFailedSkip
lea.l ReqPatchLib(pc),a0
bsr TextOutput
PatchFailedSkip:
CLOSELIB DosBase ;Close Dos Library
DosFailed:
rts
******************************************************************V1.3*
* Name: TextOutput
* Function: Writes a C-string to std output (CLI,PRT,...)
* Version: V1.2 (works)
* Assembler: MasterSeka V1.75 & OMA V1.81
* Copyright: 1991 Stefan Fuchs
*
* Inputs: a0 = Pointer to a C-string
* Assumptions: DosBase
* Results:
* Destroyed registers:
* Code: pc-relative
* Known bugs:
* See also:
* Notes: Exits without any output,
* if the Outputhandle or a0 is null
***********************************************************************
TextOutput:
movem.l d0-d3/a0/a1/a6,-(sp)
moveq.l #0,d3
move.l a0,d2
beq.s TextOutputExit
TextOutputLoop:
addq.l #1,d3
tst.b (a0)+
bne.S TextOutputLoop
lea DosBase(pc),a0
move.l (a0),a6
jsr -60(a6) ;OutPut
move.l d0,d1
beq.s TextOutputExit
jsr -48(a6) ;Write
TextOutputExit:
movem.l (sp)+,d0-d3/a0/a1/a6
rts
;-------------------------------------------------
dc.b "$VER: CpuClr 2.5 (16.02.1993)",0
GfxName: dc.b "graphics.library",0
DosName: dc.b "dos.library",0
PatchName: dc.b "patch.library",0
IdString: dc.b "CPUCLR0",0
head: dc.b $9b,"1mCPUCLR V2.5 ",$9b,"0m (C) 1993 by Stefan Fuchs",10,0
ReqPatchLib: dc.b "*** Requires patch.library in libs:",10,0
InstalledText: dc.b "Patch successfully installed",10,0
InstallFailText:dc.b "*** Failed to install patch",10,0
RemoveText: dc.b "Patch successfully removed",10,0
RemoveFailText: dc.b "*** Failed to remove patch",10,0
even
DosBase: dc.l 0
PatchBase: dc.l 0
NewPatch:
dc.l NewBltClr ;pointer to the patch code to be installed
dc.l NewBltClrEnd-NewBltClr ;optional length of NPAT_NewCode in bytes
dc.l GfxName ;pointer to the LibraryName
dc.w 0 ;version of Library to open
dc.w -300 ;LVO of function to patch
dc.w 0 ;Priority (-127...+126) of the patch
dc.w 0 ;currently none defined (keep zero)
dc.l IdString ;optional pointer to an IDString
dc.l 0 ;optional pointer to longword for Result2
;-----------------------------------------------
NewBltClr:
;this is the new bltclear() routine
;must be pc-relative
;A1= &memBlock
;D0= bytecount
;D1= flags
move.l d2,a0
btst #1,d1
beq NewBltClrSkip1 ;calc size
move.l d0,d2
swap d2
mulu d2,d0
NewBltClrSkip1: ;ByteSize now in d0
moveq #0,d2
btst #2,d1
beq NewBltClrSkip2
move.l d1,d2
swap d1 ;d1 is no longer correct
move.w d1,d2
tst.l d0
beq NewBltClrExit ;Copy size is zero ->better exit
NewBltClrSkip2: ;fillpatten now in d2
btst #1,d0 ;Is Bytesize a multible of 4
beq NewBltClrSkip3 ;Yes than skip this
move.w d2,(a1)+
subq.l #2,d0
beq NewBltClrExit
NewBltClrSkip3:
lsr.l #2,d0
subq.l #1,d0
ClearLoop:
move.l d2,(a1)+
dbra d0,ClearLoop
NewBltClrExit:
move.l a0,d2
rts
NewBltClrEnd:
END