; ญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญ ; ญญ                                                                   ญญ ; ญญ                      LibraryKiller V1.0                     ญญ ; ญญ                                                                   ญญ ; ญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญ ; ญญ                                                                   ญญ ; ญญ    Author : Roger Fischlin                       ญญ ; ญญ                 Steigerwaldweg 6                       ญญ ; ญญ                          6450 Hanau 7                           ญญ ; ญญ                          West Germany                            ญญ ; ญญ                                                                   ญญ ; ญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญ ; ญญ                                                                   ญญ ; ญญ This program may be freely distributed .    ญญ ; ญญ                                                                   ญญ ; ญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญ ; ญญ                                                                   ญญ ; ญญ     Assembler : DevPac V2                          ญญ ; ญญ                                                                   ญญ ; ญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญ incdir "ram:include/" include exec/memory.i include exec/exec_lib.i include exec/execbase.i include exec/libraries.i include exec/lists.i include exec/nodes.i include libraries/dos_lib.i include libraries/dos.i CALL_DOS macro move.l -SP_DosBase(a5),a6 jsr _LVO\1(a6) endm CALL_INT macro move.l -SP_IntBase(a5),a6 jsr _LVO\1(a6) endm CALL_GFX macro move.l -SP_GfxBase(a5),a6 jsr _LVO\1(a6) endm rsreset SP_A0 rs.l 1 SP_D0 rs.l 1 SP_DosBase rs.l 1 SP_Text rs.b 82 SP_SIZEOF rs.w 0 OpenThem link a5,#-SP_SIZEOF clr.b -1(a0,d0) ; terminate string with 0 move.l a0,-SP_A0(a5) ; save d0/a0 move.l d0,-SP_D0(a5) lea dosname(pc),a1 ; open library CALLEXEC OldOpenLibrary move.l d0,-SP_DosBase(a5) move.l -SP_A0(a5),a0 ; no command line tst.b (a0) beq LIST cmp.b #"?",(a0) ; command line "?" beq Info jsr REMOVE CloseLib move.l -SP_DosBase(a5),a1 ; close library CALLEXEC CloseLibrary moveq.l #0,d0 unlk a5 rts Info CALL_DOS Output ; write info text move.l d0,d1 lea.l .Text(pc),a0 move.l a0,d2 move.l #.TextEnd-.Text,d3 CALL_DOS Write bra CloseLib .Text dc.b $a,$9b,"1;33;40m" dc.b " LibraryKiller V1.0 (5-April-1990)" dc.b $9b,"0;32;40m",$a dc.b "Author : Roger Fischlin, Steigerwaldweg 6, 6450 Hanau 7, West Germany",$a dc.b $9b,"0;31;40m",$a dc.b "LibraryKiller removes libraries which are not used any more. This",$a dc.b "program may freely distributed.",$a,$a dc.b "Usage: LibraryKiller ป list all libraries",$a dc.b " LibraryKiller ป remove library ( '*' allowed )",$a dc.b " LibraryKiller * ป remove all libraries",$a,$a .TextEnd even dosname DOSNAME ****************************************************************** * search libraries and remove them * ****************************************************************** REMOVE move.l 4.w,a2 ; exec structure lea.l LibList(a2),a2 ; 1st library node CALLEXEC Forbid ; another task could add a new library or remove one .... .Label2 move.l (a2),d0 ; first node beq .NotFound ; empty list ? .Label4 move.l d0,a2 move.l (a2),d0 ; pointer to 0 beq .NotFound move.l LN_NAME(a2),a1 ; compare names move.l -SP_A0(a5),a0 .Label1 cmp.b #"*",(a0) ; "*" ? beq .Found cmpm.b (a0)+,(a1)+ bne.s .Label2 tst.b -1(a1) ; end of string (0) ? bne .Label1 .Found CALL_DOS Output move.l d0,d1 move.l LN_NAME(a2),a0 ; write libary name move.l a0,d2 moveq.l #-1,d3 .Label3 addq.l #1,d3 tst.b (a0)+ bne.s .Label3 CALL_DOS Write cmp.l d0,d3 ; error ? bne .NotFound move.l (a2),d5 ; save pointer lea.l .InUseText(pc),a0 move.l a0,d2 tst.w LIB_OPENCNT(a2) ; nobody uses this library bne .NoError ; library still in use ... move.l a2,a1 CALLEXEC RemLibrary ; remove library (that's all !!!) lea.l .RemoveText(pc),a0 move.l a0,d2 tst.l d0 bne.s .NoError lea.l .RemoveError(pc),a0 move.l a0,d2 .NoError CALL_DOS Output ; write result move.l d0,d1 move.l #20,d3 CALL_DOS Write cmp.l d0,d3 ; error ? bne.s .NotFound move.l d5,d0 ; next node beq.s .NotFound ; last ? bra .Label4 .NotFound CALLEXEC Permit rts .RemoveText dc.b " : removed. ",$a .InUseText dc.b " : still in use ! ",$a .RemoveError dc.b " : remove failed !",$a ****************************************************************** * list all libraries * ****************************************************************** LIST CALL_DOS Output ; write first line move.l d0,d1 lea .Header(pc),a0 move.l a0,d2 move.l #.HeaderEnd-.Header,d3 CALL_DOS Write move.l 4.w,a2 ; exec structure lea.l LibList(a2),a2 ; 1st library node .Label2 move.l (a2),d0 ; first node beq .NoMore ; empty list ? move.l d0,a2 move.l (a2),d0 ; pointer to 0 beq .NoMore lea -SP_Text-80(a5),a1 ; clear move.w #77,d0 .Label1 move.b #" ",(a1)+ dbra d0,.Label1 move.b #$a,(a1)+ move.l LN_NAME(a2),a1 ; copy name lea -SP_Text-80(a5),a0 move.w #19,d0 .Label3 move.b (a1)+,(a0)+ dbeq d0,.Label3 moveq.l #0,d0 move.b LN_TYPE(a2),d0 ; write Type lea -SP_Text-80+62-32+1(a5),a0 bsr .Write4 lea -SP_Text-80+70-32+1(a5),a0 moveq.l #0,d0 move.b LN_PRI(a2),d0 ; write Pri bpl.s .Positive ; positive ? neg.b d0 move.b #"-",(a0) ; write "-" .Positive bsr .Write4 move.w LIB_OPENCNT(a2),d0 ; write OpenCount lea -SP_Text-80+78-32+1(a5),a0 bsr .Write4 move.w LIB_VERSION(a2),d0 ; write version lea -SP_Text-80+86-32+1(a5),a0 bsr .Write4 move.w LIB_REVISION(a2),d0 ; write revision lea -SP_Text-80+93-32+1(a5),a0 bsr .Write4 move.w LIB_NEGSIZE(a2),d0 ; write size lea -SP_Text-80+99-32+1(a5),a0 bsr .Write4 move.w LIB_POSSIZE(a2),d0 lea -SP_Text-80+105-32+1(a5),a0 bsr .Write4 move.l a2,d0 ; write library base lea -SP_Text-80+52-32+1(a5),a0 move.b #"$",(a0)+ moveq.l #7,d2 ; 8 nibble moveq.l #0,d1 .Label6 rol.l #4,d0 ; get next nibble and move.b d0,d1 ; move to lowest nibble and.b #$f,d1 cmp.b #10,d1 blt.s .Label7 add.b #"A"-"0"-10,d1 ; offset for letters .Label7 add.b #"0",d1 ; convert to ASCII move.b d1,(a0)+ dbra d2,.Label6 CALL_DOS Output ; write line move.l d0,d1 lea -SP_Text-80(a5),a0 move.l a0,d2 move.l #78,d3 CALL_DOS Write cmp.l d3,d0 ; error ? bne.s .Error bra .Label2 ; next entry .NoMore CALL_DOS Output ; write LF move.l d0,d1 lea .Return(pc),a0 move.l a0,d2 moveq.l #2,d3 CALL_DOS Write .Error bra CloseLib .Write4 and.l #$ffff,d0 move.w #"0",d1 ; Word -> ASCII cmp.w #999,d0 bls.s .Label_W1 divu #1000,d0 add.b d1,d0 move.b d0,(a0) clr.w d0 swap d0 .Label_W1 cmp.w #99,d0 bls.s .Label_W2 divu #100,d0 add.b d1,d0 move.b d0,1(a0) clr.w d0 swap d0 .Label_W2 cmp.w #9,d0 bls.s .Label_W3 divu #10,d0 add.b d1,d0 move.b d0,2(a0) clr.w d0 swap d0 .Label_W3 add.b d1,d0 move.b d0,3(a0) rts .Header dc.b $a,$9b,"0;33;40m" dc.b " Libraries",$a,$a dc.b $9b,"4;32;40m" dc.b "Name Address Type Pri. OpenCnt Vers. Rev. Neg. Pos." dc.b $9b,"0;31;40m",$a .HeaderEnd even .Return dc.b $a,$a