* Virustest  schrieben von Roger Fischlin 4/1988 mit der  Devpac Assembler
*
* Das Programm wird von Cli aufgerufen, nach der Aufforderung die zu
* testende Diskette ins Laufwerk df0: zu legen, RETURN drücken.


execbase  equ     4
findtask  equ  -294
addport   equ  -354
remport   equ  -360
openlib   equ  -408
closelib  equ  -414
opendev   equ  -444
closedev  equ  -450
doio      equ  -456
output    equ   -60
write     equ   -48
read      equ   -42


	move.l execbase,a6 ; Dos-Library öffnen
	move.l #dosname,a1
	moveq #0,d0
	move.l execbase,a6
	jsr openlib(a6)
	tst.l d0
	beq ende
	move.l d0,dosbase ; Handle des Cli-Fensters holen
	move.l d0,a6
	jsr output(a6)
	move.l d0,cli_handle

	move.l dosbase,a6 ; Text ausgeben
	move.l cli_handle,d1
	move.l #textwait,d2
	move.l #53,d3
	jsr write(a6)
	move.l cli_handle,d1 ; warten, bis RETURN-Taste gedrückt
	move.l #readbuffer,d2
	moveq #1,d3
	jsr read(a6)

	move.l execbase,a6 ; Die ersten beiden Blöcke (Boot-Blöcke) in
	sub.l a1,a1        ; Diskbuffer (ende des Programmes) laden.
	jsr findtask(a6)	
	move.l d0,readreply+$10

	lea readreply,a1
	jsr addport(a6)

	lea diskio,a1 ; Track-Device öffnen
	move.l #0,d0 ; Laufwerk df0:
	clr.l d1
	lea.l trackdevice,a0
	jsr opendev(a6)
	tst.l d0
	bne fehler

	lea.l diskio,a1 ; Tabelle zum Lesen von Disk anlegen
	move.l #readreply,14(a1)
	move.w #2,28(a1)
	move.l #diskbuffer,40(a1)
	move.l #2*512,36(a1)
	move.l #0*512,44(a1)
	move.l execbase,a6
	jsr doio(a6) ; von Diskette lesen

	move.l diskio+32,d6 ; Floppy-Motor ausschalten
	lea.l diskio,a1
	move #9,28(a1)
	move.l #0,36(a1)
	jsr doio(a6)
	
	lea.l readreply,a1
	jsr remport(a6)

	lea.l diskio,a1 ; Trackdisk.Device schließen
	jsr closedev(a6)


	clr.l d4 ; Prüfen, ob auf den Boot-Blöcken der Text
	clr.l d2 ; "trac"(kdisk.device)zu finden ist, den jeder
schleife	lea.l diskbuffer,a0 ; Bootblock-Virus zum weiterkopieren  
	add.l d2,a0 ; benötigt .
	cmp.l #"trac",(a0)
	bne notfound
	moveq #1,d4
	bra textausgabe
notfound	addi.l #2,d2
	cmp.l #$3fe,d2
	bne schleife

textausgabe	move.l cli_handle,d1 ;Je nach Wert von D4 Ergebnis aus-
	tst.l d4 ; geben ( D4 = 0 : kein Virus ).
	beq novirus
	move.l #textvirus,d2
	bra goon
novirus	move.l #textnovirus,d2
goon	move.l dosbase,a6
	move.l #18,d3
	jsr write(a6)

fehler	move.l dosbase,a1 ; Dos.Library schließen
	move.l execbase,a6
	jsr closelib(a6)
	clr.l d0
ende	rts


dosbase	dc.l 0
cli_handle	dc.l 0
dosname	dc.b "dos.library",0
textvirus	dc.b "Virus on disk  !",10,10
textnovirus	dc.b "No virus found !",10,10
textwait	dc.b "Insert disk to be checked in df0: and press return ! "
trackdevice	dc.b "trackdisk.device",0
diskio	ds.l 20
readreply	ds.l 8
diskbuffer	ds.b 512*2
readbuffer	ds.l 1
