xref: /csrg-svn/sys/tahoe/stand/vdformat/smd.c (revision 32662)
129536Ssam #ifndef lint
2*32662Skarels static char sccsid[] = "@(#)smd.c	1.2 (Berkeley/CCI) 11/23/87";
329536Ssam #endif
429536Ssam 
529536Ssam #include	"vdfmt.h"
629536Ssam 
729536Ssam 
829536Ssam 
929536Ssam /*
1029536Ssam **	The sector format of the SMD controller looks like this:
1129536Ssam **  28 bytes sector gap		(header error)
1229536Ssam **   1 byte sync (0x19)		(header error)
1329536Ssam **   2 bytes cylinder address	(header error)
1429536Ssam **   1 byte track address	(header error)
1529536Ssam **   1 byte sector address	(header error)
1629536Ssam **   2 bytes header crc		(header error)
1729536Ssam **  18 bytes header gap		(data error)
1829536Ssam ** 512 bytes data		(data error)
1929536Ssam **   4 byte ecc			(data error)
2029536Ssam **  ?? trailing pad		(data error)
2129536Ssam */
2229536Ssam 
2329536Ssam fmt_err smd_decode_position(bad_entry)
2429536Ssam bs_entry bad_entry;
2529536Ssam {
2629536Ssam 	fmt_err	error;
27*32662Skarels 	int	sector_length = lab->d_traksize / lab->d_nsectors;
2829536Ssam 	int	offset = (bad_entry.bs_offset-2) % sector_length;
2929536Ssam 	int	bytes = ((bad_entry.bs_length / 8)) + 4;
3029536Ssam 
3129536Ssam 	error.err_adr.cylinder = bad_entry.bs_cyl;
3229536Ssam 	error.err_adr.track = bad_entry.bs_trk;
3329536Ssam 	error.err_adr.sector = (bad_entry.bs_offset-2) / sector_length;
34*32662Skarels 	if(error.err_adr.sector >= lab->d_nsectors) {
35*32662Skarels 		error.err_adr.sector = lab->d_nsectors - 1;
3629536Ssam 		error.err_stat = DATA_ERROR;
3729536Ssam 	}
3829536Ssam 	else if((offset < 35) || ((offset+bytes) > sector_length))
3929536Ssam 		error.err_stat = HEADER_ERROR;
4029536Ssam 	else
4129536Ssam 		error.err_stat = DATA_ERROR;
4229536Ssam 	return	error;
4329536Ssam }
4429536Ssam 
4529536Ssam 
4629536Ssam /*
4729536Ssam **
4829536Ssam */
4929536Ssam 
5029536Ssam bs_entry smd_code_position(error)
5129536Ssam fmt_err	error;
5229536Ssam {
53*32662Skarels 	int		sector_length = lab->d_traksize / lab->d_nsectors;
5429536Ssam 	bs_entry	temp;
5529536Ssam 
5629536Ssam 	temp.bs_length = 1;
5729536Ssam 	temp.bs_cyl = error.err_adr.cylinder;
5829536Ssam 	temp.bs_trk = error.err_adr.track;
5929536Ssam 	temp.bs_offset = error.err_adr.sector * sector_length;
6029536Ssam 	if(error.err_stat & HEADER_ERROR) {
6129536Ssam 		temp.bs_offset += 1;
6229536Ssam 	}
6329536Ssam 	else {
6429536Ssam 		temp.bs_offset += 50;
6529536Ssam 	}
6629536Ssam 	temp.bs_alt.cylinder = 0;
6729536Ssam 	temp.bs_alt.track = 0;
6829536Ssam 	temp.bs_alt.sector = 0;
6929536Ssam 	temp.bs_how = scanning;
7029536Ssam 	return	temp;
7129536Ssam }
72