xref: /original-bsd/sys/tahoe/stand/vdformat/smd_e.c (revision 92c664ec)
1 #ifndef lint
2 static char sccsid[] = "@(#)smd_e.c	1.2 (Berkeley/CCI) 11/23/87";
3 #endif
4 
5 #include	"vdfmt.h"
6 
7 
8 /*
9 **	The sector format of the SMD controller looks like this:
10 **  32 bytes sector gap			(header error)
11 **   1 byte sync (0x19)			(header error)
12 **   2 bytes cylinder address		(header error)
13 **   1 byte track address		(header error)
14 **   1 byte sector address		(header error)
15 **   2 bytes alt cylinder address	(header error)
16 **   1 byte alt track address		(header error)
17 **   1 byte alt sector address		(header error)
18 **   4 bytes header crc			(header error)
19 **  34 bytes header gap			(data error)
20 ** 512 bytes data			(data error)
21 **   4 byte ecc				(data error)
22 **  ?? trailing pad			(data error)
23 */
24 
25 fmt_err smd_e_decode_position(bad_entry)
26 bs_entry bad_entry;
27 {
28 	fmt_err	error;
29 	int	sector_length = lab->d_traksize / lab->d_nsectors;
30 	int	offset = (bad_entry.bs_offset-2) % sector_length;
31 	int	bytes = (bad_entry.bs_length / 8) + 4;
32 
33 	error.err_adr.cylinder = bad_entry.bs_cyl;
34 	error.err_adr.track = bad_entry.bs_trk;
35 	error.err_adr.sector = (bad_entry.bs_offset-2) / sector_length;
36 	if(error.err_adr.sector >= lab->d_nsectors) {
37 		error.err_adr.sector = lab->d_nsectors - 1;
38 		error.err_stat = DATA_ERROR;
39 	}
40 	else if((offset < 45) || ((offset+bytes) > sector_length))
41 		error.err_stat = HEADER_ERROR;
42 	else
43 		error.err_stat = DATA_ERROR;
44 	return	error;
45 }
46 
47 
48 /*
49 **
50 */
51 
52 bs_entry smd_e_code_position(error)
53 fmt_err	error;
54 {
55 	int		sector_length = lab->d_traksize / lab->d_nsectors;
56 	bs_entry	temp;
57 
58 	temp.bs_length = 1;
59 	temp.bs_cyl = error.err_adr.cylinder;
60 	temp.bs_trk = error.err_adr.track;
61 	temp.bs_offset = error.err_adr.sector * sector_length;
62 	if(error.err_stat & HEADER_ERROR) {
63 		temp.bs_offset += 1;
64 	}
65 	else {
66 		temp.bs_offset += 60;
67 	}
68 	temp.bs_alt.cylinder = 0;
69 	temp.bs_alt.track = 0;
70 	temp.bs_alt.sector = 0;
71 	temp.bs_how = scanning;
72 	return	temp;
73 }
74