home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
files
/
diskutil
/
tapebios
/
tapetest.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-06
|
6KB
|
233 lines
/* Test to exercise the TAPEBIOS.TOS program */
/* This program is part of the TapeBIOS distribution */
/* Adapted by Alan Hourihane, from code by P. Moreau */
/* Needs TapeBIOS driver loaded */
#include<stdio.h>
#include<osbind.h>
#include"tapebind.h"
extern long get_cookie();
extern void exit();
extern int Mode_Sense();
extern int RSense();
extern void bclear();
#define BBLKS 254L
#define BBLKW 254
#define HBLKS 127L
#define HBLKW 127
#define BSIZE BBLKS*512L
#define HSIZE HBLKS*512L
/* 3.5 megs for disc/tape io test */
#define IOTS BBLKW * 30
int
main()
{
int i, blk, stat;
long x; /* Long index and GP */
char *buffer;
char *ptr;
printf("Tape Test Program for TapeBIOS. Copyright 1992, A. Hourihane.\r\n");
if (!get_cookie("TAPE")) {
printf("TapeBIOS is not installed.\r\n");
exit(1);
}
buffer = (char*)Malloc(BSIZE);
if(!buffer)
{
printf("Malloc error allocating %ld byte buffer\r\n", BSIZE);
exit(1);
}
printf("Test Unit Ready\r\n");
stat = Tready();
if(stat)
{
printf("\tTape drive is Not ready\r\n");
goto bye;
}
printf("Load Tape\r\n");
stat = Tload(0L); /* Load tape NO RETENSION */
if (stat) goto bye;
printf("Mode Sense\r\n");
stat = Mode_Sense(); /* Mode Sense */
printf("Creating data buffer patterns\r\n");
for(ptr = buffer, x = 0L; x < BSIZE; x++) *ptr++ = (char)(x);
printf("Write Tape\r\n");
stat = Twrite(buffer, BBLKS); /* Write 64 512 byte blocks */
if(stat) goto bye;
printf("Write Filemark\r\n");
stat = Tfmark(2L); /* Write 2 filemarks */
if(stat) goto bye;
printf("Rewind Tape\r\n");
stat = Trewind(); /* Rewind tape */
if(stat) goto bye;
printf("Clearing data buffer\r\n");
bclear(buffer, BSIZE);
printf("Read Tape\r\n");
stat = Tread(buffer, BBLKS); /* Read 64 512 byte blocks */
if(stat) goto bye;
printf("Rewind Tape\r\n");
stat = Trewind(); /* Rewind Tape */
if(stat) goto bye;
printf("Checking data buffer\r\n");
for(ptr = buffer, x = 0L; x < BSIZE; x++, ptr++)
{
if(*ptr != (char)(x))
printf("\r\nData error offset %lx, was %02x, sb %02x",
x, (unsigned int)(*ptr), (int)(x));
}
printf("Disk - Tape I/O test\r\n");
for(blk = 0; blk < IOTS; blk += BBLKW)
{
i = Rwabs(0, buffer, BBLKW, blk, 2); /* Read Hard Disk */
if(i)
{
printf("\r\n\tDisk IO error 0x%02x reading block %d\r\n", i, blk);
goto bye;
}
stat = Twrite(buffer, BBLKS); /* Write 1 Tape block */
if(stat)
{
printf("\r\n\tTape IO error 0x%02x writing block %d\r\n", stat, blk);
if(stat == 2) /* Check Condition ? */
{
printf("\tCheck Condition\r\n");
stat = RSense(); /* Request Sense if Check */
}
}
printf("Blocks transfered %d\r\n\033A", blk);
}
printf("\r\nWrite Filemark\r\n");
stat = Tfmark(2L); /* Write 2 file marks */
if(stat) goto bye;
printf("Rewind Tape\r\n");
stat = Trewind(); /* Rewind Tape */
if(stat) goto bye;
/* Read data from disc and tape and compare data */
for(blk = 0; blk < IOTS; blk += HBLKW)
{
i = Rwabs(0, buffer, HBLKW, blk, 2); /* Read Hard Disk */
if(i)
{
printf("\r\n\tDisk IO error 0x%02x reading block %d\r\n", i, blk);
goto bye;
}
stat = Tread(&buffer[HSIZE], HBLKS); /* Write Tape drive */
if(stat)
{
printf("\r\n\tTape IO error 0x%02x reading block %d\r\n", stat, blk);
if(stat == 2) /* Check Condition ? */
{
printf("\tCheck Condition\r\n");
stat = RSense(); /* Request Sense if Check */
}
}
for(x = 0L; x < HSIZE; x++)
{
if(buffer[x] != buffer[x+HSIZE])
{
printf("\r\n\033pData Error!\033q\7\r\n");
x = HSIZE+1L;
}
}
printf("Blocks verified %d\r\n\033A", blk);
}
printf("\r\nTest Completed.\r\n");
bye:
if (stat == 0x02) /* Check Condition */
{
printf("\tCheck Condition\n");
stat = RSense();
}
else if(stat)
{
printf("\tExit with Error - Tape status = %02x\r\n");
printf("\tCheck Programmers manual.\r\n");
}
printf("Unload Tape\r\n");
stat = Tunload(0L); /* Unload tape NO RETENSION */
printf("Hit [RETURN] when ready ... ");
i = getc(stdin);
return 0;
}
int RSense()
{
int stat, i;
char sense[512];
bclear(&sense[0], 32L);
stat = Trsense(&sense[0], 64L);
printf("\tSense Data: ");
for(i = 0; i < 11; i++) printf(" %02x", (int)(sense[i]) & 0xFF);
printf("\r\n");
return(stat);
}
int Mode_Sense()
{
int stat;
long x;
char buffer[512];
bclear(&buffer[0], 13L);
stat = Tmsense(&buffer[0], 255L); /* Display Mode Sense */
if(stat) return(stat);
printf(" Media Type : %02x\r\n", (int)(buffer[1]) & 0xFF);
printf(" Write Protect : %s\r\n", (buffer[2] & 0x80) ? "On" : "Off");
printf(" Buffered Mode : %s\r\n", (buffer[2] & 0x10) ? "On" : "Off");
printf(" Speed : %d\r\n", (int)(buffer[2] & 3));
printf(" Density Code : %02x\r\n", (int)(buffer[4]));
x = ((long)(buffer[5]) & 0xff) << 16;
x |= ((long)(buffer[6]) & 0xff) << 8;
x |= ((long)(buffer[7]) & 0xff);
printf(" Number of Blocks : %ld\r\n", x);
x = ((buffer[9] & 0xff) << 16);
x |= ((buffer[10] & 0xff) << 8);
x |= ((buffer[11]) & 0xff);
printf(" Block Size : %ld\r\n", x);
printf(" Disable Erase Ahead : %s\r\n", (buffer[12] & 4) ? "On" : "Off");
printf(" Auto Inhibit : %s\r\n", (buffer[12] & 2) ? "On" : "Off");
printf(" Soft Error Count : %s\r\n", (buffer[12] & 1) ? "Supressed" : "Enabled");
return(stat);
}
void
bclear(p, cnt)
char *p;
long cnt;
{
long x;
for(x = 0L; x < cnt; x++)
*p++ = 0;
}