xref: /csrg-svn/sys/tahoe/stand/vdformat/smd_e.c (revision 34667)
129536Ssam #ifndef lint
2*34667Skarels static char sccsid[] = "@(#)smd_e.c	1.3 (Berkeley/CCI) 06/07/88";
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 
smd_e_decode_position(bad_entry,error)25*34667Skarels smd_e_decode_position(bad_entry, error)
26*34667Skarels register bs_entry *bad_entry;
27*34667Skarels register fmt_err *error;
2829536Ssam {
2932662Skarels 	int	sector_length = lab->d_traksize / lab->d_nsectors;
30*34667Skarels 	int	offset = (bad_entry->bs_offset-2) % sector_length;
31*34667Skarels 	int	bytes = (bad_entry->bs_length / 8) + 4;
3229536Ssam 
33*34667Skarels 	error->err_adr.cylinder = bad_entry->bs_cyl;
34*34667Skarels 	error->err_adr.track = bad_entry->bs_trk;
35*34667Skarels 	error->err_adr.sector = (bad_entry->bs_offset-2) / sector_length;
36*34667Skarels 	if(error->err_adr.sector >= lab->d_nsectors) {
37*34667Skarels 		error->err_adr.sector = lab->d_nsectors - 1;
38*34667Skarels 		error->err_stat = DATA_ERROR;
3929536Ssam 	}
4029536Ssam 	else if((offset < 45) || ((offset+bytes) > sector_length))
41*34667Skarels 		error->err_stat = HEADER_ERROR;
4229536Ssam 	else
43*34667Skarels 		error->err_stat = DATA_ERROR;
4429536Ssam }
4529536Ssam 
4629536Ssam 
4729536Ssam /*
4829536Ssam **
4929536Ssam */
5029536Ssam 
smd_e_code_position(error,badent)51*34667Skarels smd_e_code_position(error, badent)
52*34667Skarels register fmt_err *error;
53*34667Skarels register bs_entry *badent;
5429536Ssam {
5532662Skarels 	int		sector_length = lab->d_traksize / lab->d_nsectors;
5629536Ssam 
57*34667Skarels 	badent->bs_length = 1;
58*34667Skarels 	badent->bs_cyl = error->err_adr.cylinder;
59*34667Skarels 	badent->bs_trk = error->err_adr.track;
60*34667Skarels 	badent->bs_offset = error->err_adr.sector * sector_length;
61*34667Skarels 	if(error->err_stat & HEADER_ERROR) {
62*34667Skarels 		badent->bs_offset += 1;
6329536Ssam 	}
6429536Ssam 	else {
65*34667Skarels 		badent->bs_offset += 60;
6629536Ssam 	}
67*34667Skarels 	badent->bs_alt.cylinder = 0;
68*34667Skarels 	badent->bs_alt.track = 0;
69*34667Skarels 	badent->bs_alt.sector = 0;
70*34667Skarels 	badent->bs_how = scanning;
7129536Ssam }
72