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. 1 + 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,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	vers+3(pc),a0		; Titel
	bsr	output
	lea	Autor(pc),a0
	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	-$3a6(a3),a0		; Lamer 1.0 ?
	cmp.l	#$444f5300,(a0)
	beq.s	lm1
	lea	-$3b8(a3),a0		; Lamer 2.x ?
	cmp.l	#$444f5300,(a0)
	bne.s	nlm
lm1	cmp.w	#$abcd,(a0)+
	bne.s	lm1
	move.l	(a0)+,-610(a6)		; KickSumData-Funktion	rücksetzen
	move.l	TDBase,a1
	move.l	(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
	moveq	#0,d1
	move.l	#ende-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	a3,a0
	lea	resident(pc),a1
	move.w	#ende-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	nmores
	btst	#31,d0
	beq.s	KillRes
nmores	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,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
Autor	dc.b	10,'written in 1989/90 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,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
	ds.b	14			; Node
	dc.w	1			; NumEntries
	dc.l	0
	dc.l	ende-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,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,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,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,a6
	jsr	-120(a6)		; Disable
	tst.l	42(a6)			; CoolCapture prüfen
	bne.s	coolst
	tst.l	46(a6)			; ColdCapture prüfen
	beq.s	nores
coolst	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	0(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,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	0(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					; Text kopieren
	move.b	(a3)+,(a5)+
	bne.s	copytx
	tst.b	(a3)			; zwei Nullbytes nacheinander
	bne.s	copytx			; dann Ende
	rts

drivenr					; Drive-Nummer korrigieren
	movem.l	d0/a0,-(a7)
	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	0(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,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
bcloop	add.l	(a0)+,d0
	bcc.s	bcnext
	addq.l	#1,d0
bcnext	dbf	d1,bcloop
	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,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,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).l
boot	dc.l	0
write	dc.w	0
memo	ds.l	12
offsettab ds.l	2
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	$30393841		; 0.98a
		dc.b	0
trddev		dc.b	'trackdisk.device',0
intuition	dc.b	'intuition.library'
vers		dc.b	0,212,20,'ACT-Viruskiller Version 0.98a',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
viren		; Name	      ,Adr/2,Langwort	   ,CopyCnt
	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

SCAviren     ; Name, Adr, Langwort
	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

ende	end






