BSD 4_3_Tahoe release
[unix-history] / usr / src / sys / tahoestand / vdformat / smd_e.c
#ifndef lint
static char sccsid[] = "@(#)smd_e.c 1.3 (Berkeley/CCI) 6/7/88";
#endif
#include "vdfmt.h"
/*
** The sector format of the SMD controller looks like this:
** 32 bytes sector gap (header error)
** 1 byte sync (0x19) (header error)
** 2 bytes cylinder address (header error)
** 1 byte track address (header error)
** 1 byte sector address (header error)
** 2 bytes alt cylinder address (header error)
** 1 byte alt track address (header error)
** 1 byte alt sector address (header error)
** 4 bytes header crc (header error)
** 34 bytes header gap (data error)
** 512 bytes data (data error)
** 4 byte ecc (data error)
** ?? trailing pad (data error)
*/
smd_e_decode_position(bad_entry, error)
register bs_entry *bad_entry;
register fmt_err *error;
{
int sector_length = lab->d_traksize / lab->d_nsectors;
int offset = (bad_entry->bs_offset-2) % sector_length;
int bytes = (bad_entry->bs_length / 8) + 4;
error->err_adr.cylinder = bad_entry->bs_cyl;
error->err_adr.track = bad_entry->bs_trk;
error->err_adr.sector = (bad_entry->bs_offset-2) / sector_length;
if(error->err_adr.sector >= lab->d_nsectors) {
error->err_adr.sector = lab->d_nsectors - 1;
error->err_stat = DATA_ERROR;
}
else if((offset < 45) || ((offset+bytes) > sector_length))
error->err_stat = HEADER_ERROR;
else
error->err_stat = DATA_ERROR;
}
/*
**
*/
smd_e_code_position(error, badent)
register fmt_err *error;
register bs_entry *badent;
{
int sector_length = lab->d_traksize / lab->d_nsectors;
badent->bs_length = 1;
badent->bs_cyl = error->err_adr.cylinder;
badent->bs_trk = error->err_adr.track;
badent->bs_offset = error->err_adr.sector * sector_length;
if(error->err_stat & HEADER_ERROR) {
badent->bs_offset += 1;
}
else {
badent->bs_offset += 60;
}
badent->bs_alt.cylinder = 0;
badent->bs_alt.track = 0;
badent->bs_alt.sector = 0;
badent->bs_how = scanning;
}