AEK: equ 1 ; fehlt in Sammlung ASS: equ 2 BS1: equ 3 ; fehlt in Sammlung Bit16: equ 4 ; fehlt in Sammlung BGS9: equ 5 ; fehlt in Sammlung (Linkvirus) Butonic: equ 6 ; fehlt in Sammlung ByteBandit: equ 7 ByteBanditPlus: equ 8 ; fehlt in Sammlung ByteWarrior: equ 9 DiskDoktors: equ 10 Gadaffi: equ 11 Graffitti: equ 12 ; fehlt in Sammlung Gyros: equ 13 ; fehlt in Sammlung HCS: equ 14 ; fehlt in Sammlung IRQ: equ 15 ; fehlt in Sammlung (Linkvirus) Joshua: equ 16 ; fehlt in Sammlung Lamer: equ 17 ; nur Vers. 2 in Sammlung LSD: equ 18 NorthStar: equ 19 ; Versionen 1 und 2 Obelisk: equ 20 ; fehlt in Sammlung Paramount: equ 21 ; fehlt in Sammlung Pentagon: equ 22 Phantasmumble: equ 23 ; fehlt in Sammlung Revenge: equ 24 SCA_Clones: equ 25 ; AEK,BS1,LSD,SCA Suntronic: equ 26 System_Z: equ 27 ; Versionen 3.0, 4.0, 5.0 (5.3 fehlt) Timebomb: equ 28 UltraFox: equ 29 ; fehlt in Sammlung VKill_1_0: equ 30 WAFT: equ 31 ; fehlt in Sammlung Warhawk: equ 32 ; fehlt in Sammlung virus: macro moveq #?1,d0 bra vim endm moveq #0,d2 subq.w #1,d0 args: move.b (a0)+,d1 ; Argument-Auswertung cmp.b #$40,d1 bls.s narg and.w #$1f,d1 bset d1,d2 narg: dbf d0,args move.l d2,Options move.l 4.w,a6 ; ExecBase lea trddev(pc),a1 ; 'trackdisk.device' lea 350(a6),a0 ; Device-List jsr -276(a6) ; FindName move.l d0,TDBase beq error ; Fehler lea dosname(pc),a1 ; dos.library jsr -408(a6) ; OldOpenLibrary move.l d0,DosBase beq error ; Fehler move.l d0,a6 ; DosBase jsr -60(a6) ; Output() move.l d0,stdout lea version(pc),a0 ; Titel bsr output bsr CheckIRQ lea 550(a6),a5 move.l (a5),a3 ; KickTagPtr move.l 42(a6),d5 ; ColdCapture move.l 46(a6),d6 ; CoolCapture bne.s memtest tst.l d5 bne.s memtest tst.l (a5) beq ok ; kein resetfestes Programm im Speicher memtest: ; testet, welcher Virus im Speicher ist cmp.l #$7ec3e,d6 ; SCA-Virus bne.s nsca bsr ClrCool ; CoolCapture löschen tst.l $7efde ; ist DoIO verändert ? beq.s sca1 ; nein -> move.l $7efde,-454(a6) ; normale DoIO-Funktion einsetzen sca1: virus SCA_Clones nsca: move.w 148(a6),d0 ; VBlank-Interrupt.iv_code and.w #$00f0,d0 ; zeigt ins ROM ? cmp.w #$00f0,d0 beq.s nbb ; sonst ByteBandit-Virus move.l 148(a6),a0 suba.w #$2ca,a0 cmp.l #$444f5300,(a0) ; ist es wirklich ByteBandit ? bne.s nbb ; sonst verzweige move.l $3da(a0),148(a6) ; VBlank-Interrupt rücksetzen move.l TDBase,a1 move.l $3d6(a0),-28(a1) ; BeginIO-Funktion rücksetzen bsr KillRes virus ByteBandit nbb: cmp.l #$7f94c,a3 ; ByteWarrior bne.s nbw move.l #$fc06dc,-454(a6) ; DoIO-Funktion rücksetzen bsr KillRes virus ByteWarrior nbw: tst.l (a5) ; KickTagPtr beq.s nlm lea -$3b8(a3),a0 ; Lamer-Virus ? cmp.l #$444f5300,(a0) bne.s nlm move.l $3a8(a0),-610(a6) ; KickSumData-Funktion rücksetzen move.l TDBase,a1 move.l $3ac(a0),-28(a1) ; BeginIO-Funktion rücksetzen bsr KillRes virus Lamer nlm: cmp.l #$7ec0e,d6 ; NorthStar-Antivirus bne.s nns bsr ClrCool virus NorthStar nns: cmp.l #$7f4d8,a3 ; System_Z4.0 beq.s szfmem cmp.l #$7f4dc,a3 ; System_z5.0 bne.s nsz szfmem: bsr KillRes virus System_Z nsz: cmp.l #$7fb4c,d6 ; Pentagon Circle Virusslayer bne.s npc bsr ClrCool virus Pentagon npc: cmp.l #$7e060,d6 ; Revenge-Virus bne.s nrev bsr ClrCool move.l $7e068,-454(a6) ; DoIO rücksetzen move.l $7e06e,148(a6) ; VBlank-IRQ rücksetzen virus Revenge nrev: cmp.l #$7e86c,d6 ; Obelisk bne.s nob bsr ClrCool * Der folgende Programmteil ist von VirusX gestohlen. * Er sollte noch verbessert werden! jsr -132(a6) ; Forbid move.l #10,$7e88a jsr -138(a6) ; Permit * Ende des gestohlenen Teils virus Obelisk nob: cmp.l #$7fc24,a3 ; Gadaffi-Virus bne.s ngad bsr KillRes bsr ClrCool ; CoolCapture löschen move.l #$fc06dc,-454(a6) ; DoIO rücksetzen virus Gadaffi ngad: move.l d5,a0 ; Disk-Doktors-Virus cmp.l #$444f5300,-$25c(a0) bne.s ncrr lea clpdev(pc),a1 ; clipboard.device jsr -294(a6) ; FindTask tst.l d0 beq.s ncrr move.l d0,-(a7) jsr -120(a6) ; Disable move.l (a7),a1 ; Task jsr -288(a6) ; RemTask move.l #$fc06dc,-454(a6) ; DoIO rücksetzen move.l 148(a6),d0 ; VBlank-Interrupt cmp.l #$fc0000,d0 ; verändert ? bhi.s crrvb ; nein -> move.l #$fc12fc,148(a6) crrvb: move.l (a7)+,a1 suba.w #$40a,a1 move.l #$7d0,d0 jsr -210(a6) ; FreeMem jsr -126(a6) ; Enable moveq #0,d5 move.l d5,42(a6) ; ColdCapture löschen bsr ClrCool ; CoolCapture löschen virus DiskDoktors ncrr: cmp.l #$7f300,a3 ; ASS-Virus bne.s nass bsr KillRes virus ASS nass: cmp.l #$7ec74,d6 ; Phantasmumble bne.s nphn bsr ClrCool * Der folgende Programmteil ist von VirusX gestohlen. * Er sollte noch verbessert werden! ; ha, ha, here's nothing!! * Ende des gestohlenen Teils virus Phantasmumble nphn: cmp.l #$7ec64,d6 ; HCS bne.s nhcs bsr ClrCool * Der folgende Programmteil ist von VirusX gestohlen. * Er sollte noch verbessert werden! move.l $7ef9c,-454(a6) * Ende des gestohlenen Teils virus HCS nhcs: cmp.l #$7ed36,d6 ; UltraFox bne.s nuf bsr ClrCool * Der folgende Programmteil ist von VirusX gestohlen. * Er sollte noch verbessert werden! cmp.w #7,-454(a6) bne.s uf1 move.l $7eb38,-454(a6) uf1: * Ende des gestohlenen Teils virus UltraFox nuf: move.l d6,d0 ; VKill 1.0 sub.l 58(a6),d0 cmp.l #$82,d0 bne.s nvk1 bsr ClrCool move.l 58(a6),a0 move.l 286(a0),-364(a6) ; PutMsg rücksetzen virus VKill_1_0 nvk1: cmp.l #$7faa8,d6 ; Suntronic bne.s nst bsr ClrCool move.l #$fc06dc,-454(a6) ; DoIO rücksetzen (Kick 1.2) virus Suntronic nst: move.l (a3),a1 move.l 14(a1),a1 lea vers+3(pc),a0 ; ACT-Viruskiller bsr strcmp cmp.w #13,d0 bhi ACTf ; schon im Speicher -> lea raddev(pc),a0 ; ramdrive.device bsr strcmp bne.s unkm bsr NextRes lea rad(pc),a0 bsr output bra.s ok2 unkm: moveq #0,d5 move.l d5,42(a6) ; ColdCapture löschen bsr ClrCool bsr KillRes lea unkmem(pc),a0 ; unbekanntes resetfestes Programm bsr output bra.s ok2 ok: lea nomem(pc),a0 bsr output ok2: ; noch ein Virus ? tst.l d5 ; ColdCapture bne memtest tst.l d6 ; CoolCapture bne memtest cmp.l #0,a3 ; KickTagPtr bne memtest ok3: move.l #$10002,d1 ; Chip-Memory, Clear move.l #$c00,d0 ; 3KByte jsr -198(a6) ; AllocMem move.l d0,boot clr.l d1 move.l #end-resident,d0 jsr -198(a6) ; AllocMem move.l d0,a3 beq error move.l d0,MemList+16 ; Zeiger für resetfesten Speicher btst #7,Options+1 ; -> 23 = W (Write) beq.s noptw move.w #$4e71,opt_w ; nop noptw: move.l TDBase,a2 move.l -28(a2),io ; Adresse der echten BeginIO speichern move.l -610(a6),ksd ; KickSumData speichern move.l -196(a6),OL+2 ; OpenLibrary speichern move.l d0,a0 lea resident(pc),a1 move.l #end-resident-1,d0 cm1: move.b (a1)+,(a0)+ ; resetfester Programmteil kopieren dbf d0,cm1 btst #2,Options+1 ; -> 18 = R (not Resident) beq.s resi move.l #remove-resident,30(a3) ; remove anstatt init resi: move.l a3,d0 add.l d0,(a3) ; Resident-Tabelle add.l d0,10(a3) ; MatchWord add.l d0,14(a3) ; EndSkip add.l d0,22(a3) ; Name add.l d0,26(a3) ; IdString add.l d0,30(a3) ; Init move.l 550(a6),d0 ; KickTagPtr add.l d0,d0 ; *2 sne d1 ; d1 setzen, falls d0!=0 lsr.b #1,d1 ; d1 in X-Flag roxr.l #1,d0 ; /2 + X-Flag move.l d0,4(a3) ; als Fortsetzung der Resident-Tabelle move.l a3,550(a6) ; KickTagPtr lea MemList-resident(a3),a0 move.l a0,546(a6) ; KickMemPtr jsr -612(a6) ; KickSumData move.l d0,554(a6) ; Prüfsumme speichern lea setfunctions-resident(a3),a0 jsr (a0) error: btst #0,Options ; -> 24 = X (eXit) beq.s notX move.l 550(a6),d0 beq.s notX move.l d0,a3 jsr 34(a3) ; eject notX: move.l DosBase,a1 beq.s e1 ; DosLibrary nicht geöffnet jsr -414(a6) ; CloseLibrary e1: moveq #0,d0 rts KillRes:move.l (a3)+,d0 beq.s nomores btst #31,d0 beq.s KillRes nomores:bclr #31,d0 move.l d0,(a5) move.l d0,a3 rts NextRes:move.l (a3)+,d0 beq.s nmr2 btst #31,d0 beq.s NextRes nmr2: bclr #31,d0 lea -4(a3),a5 move.l d0,a3 rts ACTf: move.l 26(a3),a4 ; IdString tst.l (a4) beq ok3 lea actmem(pc),a0 bsr output move.l idstring(pc),d0 cmp.l (a4),d0 blt error ; neue Version im Speicher -> jsr 34(a3) ; eject bra ok3 output: move.l a0,d2 ; Zeiger auf Text moveq #0,d3 ; Textlänge o2: tst.b (a0)+ ; Zeichen zählen beq.s o1 addq.w #1,d3 bra.s o2 o1: move.l stdout,d1 ; FileHandle move.l DosBase,a6 jsr -48(a6) ; Write move.l 4.w,a6 ; ExecBase rts vim: clr.l -(sp) ; Virus in Memory bsr GetName tst.l (sp)+ bsr.s output lea memtext(pc),a0 bsr.s output bra ok2 ClrCool:moveq #0,d6 ; CoolCapture löschen move.l d6,46(a6) bra ChkSum strcmp: movem.l a0-a1,-(a7) moveq #0,d0 sc2: cmpm.b (a0)+,(a1)+ bne.s sc1 addq.w #1,d0 tst.b -1(a0) bne.s sc2 sc1: movem.l (a7)+,a0-a1 rts * lt. VirusX CheckIRQ: lea -$196(a6),a0 ; OpenLibVectorPtr move.l (a0),a1 ; EntryForOldOpenLib lea $12(a1),a2 ; OldOldOpenLibVector cmp.l #$2f3a0010,(a1) bne.s nirq move.l (a2),(a0) ; Vektor rücksetzen lea irqn(pc),a0 bsr output lea memtext(pc),a0 bsr output nirq: rts clpdev: dc.b 'clipboard.device',0 raddev: dc.b 'ramdrive.device',0 Version:dc.b 'ACT-Viruskiller Version 0.98',10 dc.b 'written in 1989 by Christian Kläger',10,10,0 actmem: dc.b 'ACT-Viruskiller schon im Speicher',10,0 memtext:dc.b '-Virus im Speicher gekillt',10,0 rad: dc.b 'RAD-Disk im Speicher',10,0 unkmem: dc.b 'Unbekanntes resetfestes Programm!',10,0 nomem: dc.b 'Kein Virus im Speicher',10,0 even TDBase: dc.l 0 stdout: dc.l 0 Options:dc.l 0 resident: dc.l 8,0 ; Resident-Tabelle dc.w $4afc ; MatchWord dc.l 8 ; MatchTag (+Anfang) dc.l init-resident ; EndSkip (+Anfang) dc.b 1 ; Flags dc.b 33 ; Version dc.b 0 ; Type dc.b -5 ; Priorität dc.l vers-resident+3 ; Name (+Anfang) dc.l idstring-resident ; IdString (+Anfang) dc.l init-resident ; Init (+Anfang) eject: move.l 4.w,a6 ; ExecBase lea trddev(pc),a1 ; 'trackdisk.device' lea 350(a6),a0 ; Device-List jsr -276(a6) ; FindName move.l d0,a0 move.l io(pc),-28(a0) ; BeginIO rücksetzen move.l ksd(pc),-610(a6) ; KickSumData rücksetzen move.l OL+2(pc),-196(a6) ; OpenLibrary rücksetzen move.l resident+4(pc),d0 bclr #31,d0 move.l d0,550(a6) ; KickTagPtr jsr -612(a6) ; KickSumData move.l d0,554(a6) lea MemList+14(pc),a3 move.w (a3)+,d4 move.l boot(pc),a1 move.l #$c00,d0 ej1: jsr -210(a6) ; FreeMem move.l (a3)+,a1 move.l (a3)+,d0 dbf d4,ej1 rts MemList: blk.b 14,0 ; Node dc.w 1 ; NumEntries dc.l 0 dc.l end-resident init: movem.l d0-d1/a0-a1/a6,-(a7) moveq #4,d1 rescol: move.w $dff006,$dff180 dbf d0,rescol dbf d1,rescol move.w #$fff,$dff180 move.l 4.w,a6 move.l #$10002,d1 ; Chip-Memory, Clear move.l #$c00,d0 ; 3KByte jsr -198(a6) ; AllocMem lea boot(pc),a6 move.l d0,(a6) bsr.s setfunctions movem.l (a7)+,d0-d1/a0-a1/a6 rts setfunctions: move.l 4.w,a6 ; ExecBase jsr -120(a6) ; Disable lea trddev(pc),a1 ; 'trackdisk.device' lea 350(a6),a0 ; Device-List jsr -276(a6) ; FindName move.l d0,a0 lea begin(pc),a1 move.l a1,-28(a0) ; BeginIO setzen lea kicksumdata(pc),a1 move.l a1,-610(a6) ; lea OpenLib(pc),a1 ; move.l a1,d0 ; lea -198.w,a0 ; move.l a6,a1 ; jsr -420(a6) ; SetFunction ; move.l a1,-196(a6) lea offsettab(pc),a0 move.l a6,(a0)+ move.w #314,d0 move.w d0,(a0)+ moveq #0,d1 move.l a6,a1 ol11: add.w -(a1),d1 dbf d0,ol11 move.w d1,(a0) jmp -126(a6) ; Enable * Diese Funktion wird anstelle der Init-Funktion eingesetzt, falls das Programm * nicht resetfest sein soll. remove: move.l 4.w,a6 move.l resident+4(pc),d0 bclr #31,d0 move.l d0,550(a6) jsr -612(a6) move.l d0,554(a6) lea vers+3(pc),a1 ; Namen löschen clr.b (a1) rts OpenLib: ; bsr OL ; movem.l d0-d1/a3/a5/a6,-(sp) ; lea offsettab(pc),a3 ; move.l (a3)+,a6 ; move.w (a3)+,d0 ; moveq #0,d1 ;ol1: add.w -(a6),d1 ; dbf d0,ol1 ; cmp.w (a3)+,d1 ; beq.s olok ; move.w d1,-2(a3) ; move.l boot(pc),a5 ; lea vers(pc),a3 ; Versionsnummer ; bsr copytx ; move.b #1,(a5)+ ; Text geht weiter ; lea libch(pc),a3 ; bsr copytx ; clr.b (a5)+ ; Textende ; moveq #50,d1 ; bsr DisplayAlert ;olok: movem.l (sp)+,d0-d1/a3/a5/a6 ; rts kicksumdata: move.l a0,-(a7) lea MemList(pc),a0 move.l a0,546(a6) lea resident(pc),a0 move.l a0,550(a6) move.l ksd(pc),a0 jsr (a0) move.l (a7)+,a0 bra ResetGuru install:bsr WaitIO bsr toMemo bra kill2 begin: movem.l d0-d2/a0/a2/a3/a5,-(a7) move.l a6,a5 move.l 4.w,a6 jsr -120(a6) ; Disable tst.l 42(a6) ; CoolCapture prüfen bne.s coolset tst.l 46(a6) ; ColdCapture prüfen beq.s nores coolset:bsr ResetGuru nores: move.l a5,a6 bsr BeginIO tst.l 44(a1) ; io_Offset = Bootblock bne endio cmp.w #3,28(a1) ; CMD_WRITE opt_w: beq.s install cmp.w #2,28(a1) ; CMD_READ bne endio bsr WaitIO bsr toMemo move.l 40(a1),a0 add.w #12,a0 lea Std2(pc),a3 moveq #18,d0 scm1: move.w (a0)+,d1 cmp.w (a3)+,d1 bne.s nstd dbf d0,scm1 beq endio ; keinen Text ausgeben nstd: move.l boot(pc),a5 move.l 40(a1),a0 lea vers(pc),a3 ; Versionsnummer bsr copytx ; ausgeben move.b #1,(a5)+ ; Text geht weiter lea viren(pc),a3 ; allg. Virentest-Schleife lea endviren(pc),a2 test: moveq #0,d0 move.b 1(a3),d0 add.w d0,d0 move.l (a0,d0.w),d0 cmp.l 2(a3),d0 beq virusfound addq.l #8,a3 cmp.l a3,a2 bne.s test bsr Read bsr BootCheckSum ; Prüfsumme prüfen bne endio ; nicht bootfähig move.l 40(a1),a0 move.l a0,a2 lea $400(a2),a3 u12: cmp.w #$337c,(a2)+ ; move.w #3,28(a1) beq.s u11 cmp.l a2,a3 bne.s u12 move.l a0,a2 u22: cmp.w #$137c,(a2)+ ; move.b #3,29(a1) beq.s u21 cmp.l a2,a3 bne.s u22 bra.s u30 u11: cmp.l #$0003001c,(a2) bne.s u12 bra.s u25 u21: cmp.l #$0003001d,(a2) bne.s u22 u25: lea endviren(pc),a3 beq virusfound u30: lea unk(pc),a3 ; Unknown Bootblock bsr copytx bsr drivenr moveq #12,d0 ; 13 Zeilen tx1: moveq #76,d1 ; zu 77 Zeichen move.b #1,(a5)+ ; Text noch nicht fertig clr.b (a5)+ move.b #$c,(a5)+ ; horiz. Koordinate move.w d0,d2 asl.w #3,d2 neg.w d2 add.w #148,d2 ; vert. Koordinate berechnen move.b d2,(a5)+ ; und einfügen tx2: bsr zeich ; Zeichen umwandeln dbf d1,tx2 ; nächstes Zeichen clr.b (a5)+ ; Ende der Zeile dbf d0,tx1 ; nächste Zeile move.b #1,(a5)+ ; Text noch nicht fertig clr.b (a5)+ move.b #$c,(a5)+ ; horiz. Koordinate move.b #156,(a5)+ ; vert. Koordinate moveq #22,d1 ; 23 Zeichen tx3: bsr zeich ; umwandeln dbf d1,tx3 ; und nächstes clr.b (a5)+ ; Ende der Zeile move.l #175,d1 ; Höhe des Gurus guru: movem.l a1/a6,-(a7) move.b #1,(a5)+ clr.b (a5)+ move.b #64,(a5)+ move.b d1,(a5)+ add.w #12,d1 move.l d1,-(a7) lea wprot(pc),a3 lea write(pc),a0 tst.w (a0) bne.s gu1 lea wena(pc),a3 gu1: bsr copytx clr.b (a5) move.l (a7)+,d1 ; Höhe des Gurus bsr DisplayAlert movem.l (a7)+,a1/a6 moveq #-1,d1 lea write(pc),a0 tst.w (a0) bne.s gu2 tst.w d0 bne.s gu2 kill2: bsr kill bsr ReadIt ; Verify !!! moveq #0,d1 lea Std(pc),a3 moveq #24,d0 v1: cmpm.w (a3)+,(a0)+ dbne d0,v1 beq.s gu2 move.l boot(pc),a5 lea vers(pc),a3 ; Versionsnummer bsr copytx move.b #1,(a5)+ ; Text geht weiter lea verr(pc),a3 bsr copytx clr.b (a5)+ ; Textende moveq #50,d1 bsr DisplayAlert moveq #-1,d1 gu2: moveq #11,d0 lea memo(pc),a0 move.l a1,a3 c2: move.l (a0)+,(a3)+ ; original Rückmeldung holen dbf d0,c2 cmp.l #$400,36(a1) ; io_Length = 1KByte bne endio cmp.l 40(a1),a4 ; booten wir ? bne endio ; nein -> tst.w d1 beq.s dont move.l boot(pc),a5 lea vers(pc),a3 ; Versionsnummer bsr copytx ; ausgeben move.b #1,(a5)+ ; Text geht weiter lea doit(pc),a3 bsr copytx ; Text ausgeben clr.b (a5)+ ; Textende moveq #70,d1 bsr DisplayAlert tst.w d0 bne endio dont: move.l 40(a1),a3 move.l a3,a0 move.w #255,d0 dont1: clr.l (a3)+ dbf d0,dont1 lea Std(pc),a3 moveq #24,d0 dont2: move.w (a3)+,(a0)+ dbf d0,dont2 endio: move.l a6,a5 move.l 4.w,a6 jsr -126(a6) ; Enable move.l a5,a6 movem.l (a7)+,d0-d2/a0/a2/a3/a5 rts copys: move.b #1,(a5)+ lea anz(pc),a3 bsr copytx clr.l d1 move.l 40(a1),a0 move.w (a0,d0.w),d1 bsr itoa clr.b (a5)+ moveq #70,d1 bra guru itoa: move.l #10000,d0 move.b #$20,-(a5) nziff: divu d0,d1 bne.s cout cmp.b #$20,-1(a5) beq.s ncout cout: add.b #$30,d1 move.b d1,(a5)+ ncout: swap d1 ext.l d1 divu #10,d0 cmp.w #1,d0 bne.s nziff add.b #$30,d1 move.b d1,(a5)+ rts zeich: move.b (a0)+,d2 cmp.b #$1f,d2 bhi.s z1 move.b #$2e,d2 z1: cmp.b #$7d,d2 bls.s z2 move.b #$2e,d2 z2: move.b d2,(a5)+ rts copytx: move.b (a3)+,(a5)+ ; Text kopieren bne.s copytx tst.b (a3) ; zwei Nullbytes nacheinander bne.s copytx ; dann Ende rts drivenr:movem.l d0/a0,-(a7) ; Drive-Nummer berichtigen move.l 24(a1),a0 ; -> io_Unit move.b 67(a0),d0 ; Drivenummer add.b d0,-3(a5) ; bei DF0: addieren move.b 64(a0),d0 lea write(pc),a0 and.w #$10,d0 move.w d0,(a0) movem.l (a7)+,d0/a0 rts gnunk: lea unkv(pc),a0 rts GetName: lea names(pc),a0 subq #1,d0 bmi.s gnunk bra.s gn1 gn2: tst.b (a0)+ bne.s gn2 gn1: dbf d0,gn2 tst.b (a0) ; SCA-Clone ? bpl.s gn3 ; nein -> move.l a5,-(a7) move.l a0,a5 move.l 8(a7),d0 beq.s gn4 bsr Read move.l a0,8(a7) bra.s gn5 gn4: lea $7ec00,a0 gn5: movem.l a2/a3,-(a7) lea SCAviren(pc),a3 lea endSCA(pc),a2 gn6: move.w 2(a3),d0 move.l (a0,d0.w),d0 cmp.l 4(a3),d0 beq gn7 addq.l #8,a3 cmp.l a3,a2 bne.s gn6 lea 1(a5),a0 bra.s gn8 gn7: move.w (a3),d0 bsr.s GetName gn8: movem.l (a7)+,a2/a3 move.l (a7)+,a5 gn3: rts virusfound: clr.b (a5)+ move.l a3,-(a7) moveq #0,d0 move.b (a3),d0 move.l a0,-(a7) bsr.s GetName move.l a0,a3 move.l (a7)+,a0 move.l a3,a2 moveq #0,d0 vad3: tst.b (a2)+ beq.s vad4 addq.w #1,d0 bra.s vad3 vad4: add.w d0,d0 add.w d0,d0 sub.w #240,d0 neg.w d0 move.b d0,(a5)+ move.b #36,(a5)+ vad5: move.b (a3)+,(a5)+ bne.s vad5 tst.b -(a5) lea indrive(pc),a3 bsr.L copytx bsr.L drivenr bsr.s Read move.l (a7)+,a3 move.w 6(a3),d0 bne.L copys moveq #50,d1 bra.L guru BeginIO: movem.l a1/a5-a6,-(a7) move.l io(pc),a5 jsr (a5) ; IO ausführen movem.l (a7)+,a1/a5-a6 rts DoIO: bsr.s BeginIO WaitIO: movem.l a1/a6,-(a7) move.l 4.w,a6 jsr -474(a6) ; waitio movem.l (a7)+,a1/a6 rts Read: cmp.l #$200,36(a1) ; nur 1 Block gelesen ? bne.s nread ReadIt: move.l #$400,36(a1) move.l boot(pc),a0 adda.w #$800,a0 move.l a0,40(a1) bsr.s DoIO nread: move.l 40(a1),a0 rts kill: move.l #$400,36(a1) move.l boot(pc),a0 adda.w #$800,a0 move.l a0,40(a1) move.w #3,28(a1) move.l a0,a3 move.w #255,d0 k1: clr.l (a3)+ dbf d0,k1 lea Std(pc),a3 moveq #24,d0 k2: move.w (a3)+,(a0)+ dbf d0,k2 bra DoIO BootCheckSum: move.w #$ff,d1 moveq #0,d0 move.l 40(a1),a0 bcsloop:add.l (a0)+,d0 bcc.s bcsnext addq.l #1,d0 bcsnext:dbf d1,bcsloop not.l d0 rts ResetGuru: movem.l d0-d3/a0-a5,-(sp) move.l a7,a0 move.l boot(pc),a7 lea $c00(a7),a7 move.l a0,-(a7) clr.l 42(a6) ; CoolCapture löschen clr.l 46(a6) ; ColdCapture löschen bsr ChkSum move.l boot(pc),a5 lea vers(pc),a3 ; Versionsnummer bsr copytx move.b #1,(a5)+ ; Text geht weiter lea res(pc),a3 bsr copytx clr.b (a5)+ ; Textende moveq #50,d1 bsr.s DisplayAlert move.l (a7),a7 movem.l (sp)+,d0-d3/a0-a5 rts DisplayAlert: movem.l d4-d5/a0-a1/a6,-(a7) move.l d1,d5 move.l 4.w,a6 ; ExecBase jsr -132(a6) ; Forbid lea 378(a6),a0 ; LibList lea intuition(pc),a1 ; intuition.library jsr -276(a6) ; FindName move.l d0,a6 move.w d0,-(a7) ; 2 Bytes auf Stack reservieren move.l a7,a0 moveq #2,d0 jsr -132(a6) ; GetPrefs move.w (a7),d4 move.b #8,(a7) ; topaz.80 move.l a7,a0 moveq #2,d0 moveq #0,d1 jsr -324(a6) ; SetPrefs move.l d5,d1 moveq #0,d0 move.l boot(pc),a0 jsr -90(a6) ; DisplayAlert move.w d0,-(a7) move.w d4,2(a7) lea 2(a7),a0 moveq #2,d0 moveq #0,d1 jsr -324(a6) ; SetPrefs move.l 4.w,a6 jsr -138(a6) ; Permit movem.w (a7)+,d0/d4 movem.l (a7)+,d4-d5/a0-a1/a6 rts ChkSum: lea 34(A6),A0 ; Prüfsumme berechnen clr.w D0 moveq #$17,D1 cs1: add.w (A0)+,D0 dbf D1,cs1 not.w D0 move.w D0,(A0) ; Prüfsumme speichern rts toMemo: moveq #11,d0 lea memo(pc),a0 move.l a1,a3 c1: move.l (a3)+,(a0)+ dbf d0,c1 rts io: dc.l 0 ksd: dc.l 0 OL: jmp 0 boot: dc.l 0 write: dc.w 0 memo: blk.l 12,0 offsettab:blk.l 2,0 Std: dc.w $444f,$5300,$c020,$0f19,$0000,$0370 Std2: dc.w $43fa,$0018,$4eae,$ffa0,$4a80,$670a,$2040,$2068 dc.w $0016,$7000,$4e75,$70ff,$60fa dosname:dc.b 'dos.library',0 ; muss hier sein, da zu Std gehört!! idstring: dc.l $30393800 ; 0.98 trddev: dc.b 'trackdisk.device',0 intuition: dc.b 'intuition.library' vers: dc.b 0,212,20,'ACT-Viruskiller Version 0.98',0,0 indrive:dc.b '-Virus in Drive DF0:',0 anz: dc.b 0,248,52,'Anzahl Kopien: ',0 unk: dc.b 0,196,36,'Unknown Bootblock in Drive DF0:',0,0 even ; Name ,Adr/2,Langwort ,CopyCnt viren: dc.b ASS ,$18,$20,$41,$4d,$49,$00,$00 dc.b Bit16 ,$a8,$3f,$ff,$2c,$78,$00,$00 dc.b Butonic ,$13,$ff,$fc,$61,$3c,$00,$00 dc.b ByteBandit ,$06,$60,$00,$00,$3e,$00,$4a dc.b ByteBanditPlus ,$0a,$0c,$39,$00,$02,$00,$00 dc.b ByteWarrior ,$23,$43,$fa,$ff,$b8,$00,$00 dc.b DiskDoktors ,$a9,$00,$fc,$06,$dc,$03,$aa dc.b Gadaffi ,$20,$47,$41,$44,$41,$00,$00 dc.b Graffitti ,$a8,$00,$01,$00,$bf,$00,$00 dc.b Gyros ,$42,$4e,$75,$2c,$79,$00,$00 dc.b HCS ,$20,$51,$c8,$ff,$fc,$00,$00 dc.b Joshua ,$15,$ff,$88,$30,$2e,$00,$00 dc.b Lamer ,$1e,$ff,$88,$41,$fa,$00,$00 ; 1.0 dc.b Lamer ,$23,$d3,$10,$b1,$18,$03,$a4 ; 2.0 dc.b Lamer ,$18,$10,$39,$00,$df,$00,$00 ; 3.0 dc.b NorthStar ,$08,$4e,$6f,$72,$74,$00,$1c ; 1 dc.b NorthStar ,$09,$4e,$6f,$72,$74,$00,$1e ; 2 dc.b Obelisk ,$0a,$fe,$3a,$65,$18,$00,$00 dc.b Paramount ,$60,$50,$53,$57,$43,$00,$00 dc.b Pentagon ,$09,$00,$07,$fd,$84,$00,$00 dc.b Phantasmumble ,$20,$42,$40,$32,$3c,$00,$00 dc.b Revenge ,$07,$49,$44,$39,$32,$03,$f6 dc.b SCA_Clones ,$06,$41,$fa,$ff,$f2,$02,$f8 ; AEK,BS1,LSD dc.b Suntronic ,$2f,$2d,$40,$02,$2a,$00,$00 dc.b System_Z ,$04,$50,$56,$4c,$2e,$00,$00 dc.b Timebomb ,$d8,$53,$55,$43,$4b,$00,$00 dc.b UltraFox ,$e8,$83,$35,$3e,$f0,$00,$00 dc.b VKill_1_0 ,$1f,$00,$3a,$26,$49,$02,$de dc.b WAFT ,$35,$ff,$3a,$28,$40,$00,$00 dc.b Warhawk ,$43,$e6,$3a,$4c,$df,$00,$00 dc.b 0 ,$7e,$00,$07,$f4,$00,$00,$00 dc.b 0 ,$7e,$b1,$18,$b5,$c8,$00,$00 dc.b 0 ,$52,$00,$bf,$e0,$01,$00,$00 endviren:dc.l 0,0 ; dummy-Eintrag für unbekannte Viren ; Name , Adr, Langwort SCAviren:dc.w AEK ,$3d0,$2041,$454b dc.w BS1 ,$3b8,$2043,$3634 dc.w LSD ,$3f0,$4c53,$4421 endSCA: unkv: dc.b "Unknown",0 names: dc.b "AEK",0 dc.b "ASS",0 dc.b "Bamiga Sector One",0 dc.b "16 Bit Crew",0 dc.b "BGS 9",0 dc.b "Butonic",0 dc.b "ByteBandit",0 dc.b "ByteBanditPlus",0 dc.b "ByteWarrior",0 dc.b "Disk-Doctors",0 dc.b "Gadaffi",0 dc.b "Graffitti",0 dc.b "Gyros",0 dc.b "HCS",0 irqn: dc.b "IRQ",0 dc.b "Joshua",0 dc.b "Lamer Exterminator",0 dc.b "LSD",0 dc.b "NorthStar",0 dc.b "Obelisk",0 dc.b "Paramount",0 dc.b "Pentagon Circle",0 dc.b "Phantasmumble",0 dc.b "Revenge",0 dc.b -1,"SCA",0 dc.b "Suntronic",0 dc.b "System Z",0 dc.b "Timebomb",0 dc.b "UltraFox",0 dc.b "VKill",0 dc.b "WAFT",0 dc.b "Warhawk",0 res: dc.b 0,104,36,'WARNUNG: Ein Programm wollte sich resetfest machen !!!',0 libch: dc.b 0,124,36,'WARNUNG: Eine Library-Funktion wurde verändert!!!',0 verr: dc.b 0,136,36,'Verify-Error!!! Bootblock nicht installiert!',0 doit: dc.b 0,172,36,'Soll der Bootblock ausgeführt werden?',0,1 dc.b 0,100,48,'Links: ja',0,1,1,188,48,'Rechts: nein',0 dc.b 0 wprot: dc.b 'Linker Mausknopf: weiter ' dc.b ' Disk ist schreibgeschützt',0,0 wena: dc.b 'Linker Mausknopf: weiter ' dc.b ' Rechter Mausknopf: install',0,0 even DosBase:dc.l 0 end: