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