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