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