/*
VIRUS SCANNER - V1.3 - 12 Maggio 1988 - by Luigi R. Callegari per C.C.C. 

Visualizza caratteri ASCII in Bootblock, permettendo visione di virus

File Viruscan.c - Compilato con Lattice AmigaDOS C V4.00 - Blink V7.2

Pubblicato sul disco Amigazzetta n° 2 - Prodotto da Editoriale Systems

E` vietata la vendita e la diffusione non autorizzata di questo programma.

Compilazione Lattice V4.00 & Linker V7.2:  LC -v -b -r Viruscan (RETURN)
BLINK FROM LIB:c.o+viruscan.o TO Viruscan LIB LIB:lc.lib+LIB:amiga.lib
               SMALLCODE SMALLDATA NODEBUG MAP NIL: CHIP (RETURN)
*/

#include <exec/types.h>
#include <exec/io.h>
#include <devices/trackdisk.h>
#include <stdlib.h>
#include <stdio.h>

#define TD_READ   CMD_READ
#define BLOCKSIZE TD_SECTOR
#define NUMHEADS  2

struct Port      *diskport, *CreatePort();
struct IOStdReq  *diskreq,  *CreateStdIO();

BYTE  *diskdata, diskbuffer[BLOCKSIZE]; /* Buffer per il disco */
SHORT error, testval;

void cleanup(s,c)	/* Gestione di errori ed uscita */
char *s; short c;
{
	fprintf(stderr,"\n%s\n",s);
	exit(c);
}

void ReadCylSec(cyl, sec, hd)	/* Lettura random del disco */
SHORT cyl, sec, hd;
{
LONG offset;
diskreq->io_Length   = BLOCKSIZE;
diskreq->io_Data     = (APTR)diskbuffer;
diskreq->io_Command  = TD_READ;
offset = TD_SECTOR * (sec + NUMSECS * hd + NUMSECS * NUMHEADS * cyl);
diskreq->io_Offset    = offset;
DoIO(diskreq);
if ( diskreq->io_Error !=0 )
	cleanup("Errore dalla periferica!",2);
return;
}

void MotorOn()		/* Accende il motore del drive */
{
diskreq->io_Length  = 1;         
diskreq->io_Command = TD_MOTOR;  
DoIO(diskreq);	
return;
}

void MotorOff()		/* Spegne il motore del drive */
{
diskreq->io_Length = 0;          
diskreq->io_Command = TD_MOTOR;  
DoIO(diskreq);	
return;
}

void  main(argc,argv)	/* Funzione principale di gestione */
int argc;  char **argv;
{
register int i, j, c, ndisk, error;

if (argc != 2)	cleanup("Uso: Viruscan n (n= 0,1,2,3)",3);

ndisk = atoi(argv[1]);

if ( ndisk < 0 || ndisk > 3 )
	cleanup("VIRUSCAN: Numero drive non compreso tra 0 e 3!",4);

diskdata  =  diskbuffer;
diskport  =  CreatePort(0,0);
diskreq   =  CreateStdIO(diskport);

if ( (error = OpenDevice(TD_NAME,ndisk,diskreq,0) ) != 0 ) {
	cleanup("VIRUSCAN: Non riesco ad aprire la periferica!",error);
}

printf("\n\033[1m VIRUSCAN\033[0m: Scansione del drive DF%d:\n\n", ndisk);

MotorOn();

for ( i = 0; i < 2 ; i++) {
	ReadCylSec(0, i, 0);
	for ( j = 0 ; j < BLOCKSIZE ; j++) {
		if ( ( c = (int)diskbuffer[j] ) > 31 && c < 128 )
			putchar(c);
		else	putchar('.');
		}
	}

MotorOff();		CloseDevice(diskreq);
DeleteStdIO(diskreq);	DeletePort(diskport);
printf("\n\n%s\n\n\n","\033[1m VIRUSCAN\033[0m: Lavoro eseguito!");
}

/*        ---------------------- End Of Program ---------------------- */
