129536Ssam #ifndef lint 2*32662Skarels static char sccsid[] = "@(#)smd.c 1.2 (Berkeley/CCI) 11/23/87"; 329536Ssam #endif 429536Ssam 529536Ssam #include "vdfmt.h" 629536Ssam 729536Ssam 829536Ssam 929536Ssam /* 1029536Ssam ** The sector format of the SMD 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 2329536Ssam fmt_err smd_decode_position(bad_entry) 2429536Ssam bs_entry bad_entry; 2529536Ssam { 2629536Ssam fmt_err error; 27*32662Skarels int sector_length = lab->d_traksize / lab->d_nsectors; 2829536Ssam int offset = (bad_entry.bs_offset-2) % sector_length; 2929536Ssam int bytes = ((bad_entry.bs_length / 8)) + 4; 3029536Ssam 3129536Ssam error.err_adr.cylinder = bad_entry.bs_cyl; 3229536Ssam error.err_adr.track = bad_entry.bs_trk; 3329536Ssam error.err_adr.sector = (bad_entry.bs_offset-2) / sector_length; 34*32662Skarels if(error.err_adr.sector >= lab->d_nsectors) { 35*32662Skarels error.err_adr.sector = lab->d_nsectors - 1; 3629536Ssam error.err_stat = DATA_ERROR; 3729536Ssam } 3829536Ssam else if((offset < 35) || ((offset+bytes) > sector_length)) 3929536Ssam error.err_stat = HEADER_ERROR; 4029536Ssam else 4129536Ssam error.err_stat = DATA_ERROR; 4229536Ssam return error; 4329536Ssam } 4429536Ssam 4529536Ssam 4629536Ssam /* 4729536Ssam ** 4829536Ssam */ 4929536Ssam 5029536Ssam bs_entry smd_code_position(error) 5129536Ssam fmt_err error; 5229536Ssam { 53*32662Skarels int sector_length = lab->d_traksize / lab->d_nsectors; 5429536Ssam bs_entry temp; 5529536Ssam 5629536Ssam temp.bs_length = 1; 5729536Ssam temp.bs_cyl = error.err_adr.cylinder; 5829536Ssam temp.bs_trk = error.err_adr.track; 5929536Ssam temp.bs_offset = error.err_adr.sector * sector_length; 6029536Ssam if(error.err_stat & HEADER_ERROR) { 6129536Ssam temp.bs_offset += 1; 6229536Ssam } 6329536Ssam else { 6429536Ssam temp.bs_offset += 50; 6529536Ssam } 6629536Ssam temp.bs_alt.cylinder = 0; 6729536Ssam temp.bs_alt.track = 0; 6829536Ssam temp.bs_alt.sector = 0; 6929536Ssam temp.bs_how = scanning; 7029536Ssam return temp; 7129536Ssam } 72