xref: /csrg-svn/sys/tahoe/stand/vdformat/smd.c (revision 34667)
129536Ssam #ifndef lint
2*34667Skarels static char sccsid[] = "@(#)smd.c	1.3 (Berkeley/CCI) 06/07/88";
329536Ssam #endif
429536Ssam 
529536Ssam #include	"vdfmt.h"
629536Ssam 
729536Ssam 
829536Ssam 
929536Ssam /*
10*34667Skarels **	The sector format of the SMD (VDDC) 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 
smd_decode_position(bad_entry,error)23*34667Skarels smd_decode_position(bad_entry, error)
24*34667Skarels register bs_entry *bad_entry;
25*34667Skarels register fmt_err *error;
2629536Ssam {
2732662Skarels 	int	sector_length = lab->d_traksize / lab->d_nsectors;
28*34667Skarels 	int	offset = (bad_entry->bs_offset-2) % sector_length;
29*34667Skarels 	int	bytes = ((bad_entry->bs_length / 8)) + 4;
3029536Ssam 
31*34667Skarels 	error->err_adr.cylinder = bad_entry->bs_cyl;
32*34667Skarels 	error->err_adr.track = bad_entry->bs_trk;
33*34667Skarels 	error->err_adr.sector = (bad_entry->bs_offset-2) / sector_length;
34*34667Skarels 	if(error->err_adr.sector >= lab->d_nsectors) {
35*34667Skarels 		error->err_adr.sector = lab->d_nsectors - 1;
36*34667Skarels 		error->err_stat = DATA_ERROR;
3729536Ssam 	}
3829536Ssam 	else if((offset < 35) || ((offset+bytes) > sector_length))
39*34667Skarels 		error->err_stat = HEADER_ERROR;
4029536Ssam 	else
41*34667Skarels 		error->err_stat = DATA_ERROR;
4229536Ssam }
4329536Ssam 
4429536Ssam 
4529536Ssam /*
4629536Ssam **
4729536Ssam */
4829536Ssam 
smd_code_position(error,badent)49*34667Skarels smd_code_position(error, badent)
50*34667Skarels register fmt_err *error;
51*34667Skarels register bs_entry *badent;
5229536Ssam {
5332662Skarels 	int		sector_length = lab->d_traksize / lab->d_nsectors;
5429536Ssam 
55*34667Skarels 	badent->bs_length = 1;
56*34667Skarels 	badent->bs_cyl = error->err_adr.cylinder;
57*34667Skarels 	badent->bs_trk = error->err_adr.track;
58*34667Skarels 	badent->bs_offset = error->err_adr.sector * sector_length;
59*34667Skarels 	if(error->err_stat & HEADER_ERROR) {
60*34667Skarels 		badent->bs_offset += 1;
6129536Ssam 	}
6229536Ssam 	else {
63*34667Skarels 		badent->bs_offset += 50;
6429536Ssam 	}
65*34667Skarels 	badent->bs_alt.cylinder = 0;
66*34667Skarels 	badent->bs_alt.track = 0;
67*34667Skarels 	badent->bs_alt.sector = 0;
68*34667Skarels 	badent->bs_how = scanning;
6929536Ssam }
70