129536Ssam #ifndef lint 2*32662Skarels static char sccsid[] = "@(#)smd_e.c 1.2 (Berkeley/CCI) 11/23/87"; 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 2529536Ssam fmt_err smd_e_decode_position(bad_entry) 2629536Ssam bs_entry bad_entry; 2729536Ssam { 2829536Ssam fmt_err error; 29*32662Skarels int sector_length = lab->d_traksize / lab->d_nsectors; 3029536Ssam int offset = (bad_entry.bs_offset-2) % sector_length; 3129536Ssam int bytes = (bad_entry.bs_length / 8) + 4; 3229536Ssam 3329536Ssam error.err_adr.cylinder = bad_entry.bs_cyl; 3429536Ssam error.err_adr.track = bad_entry.bs_trk; 3529536Ssam error.err_adr.sector = (bad_entry.bs_offset-2) / sector_length; 36*32662Skarels if(error.err_adr.sector >= lab->d_nsectors) { 37*32662Skarels error.err_adr.sector = lab->d_nsectors - 1; 3829536Ssam error.err_stat = DATA_ERROR; 3929536Ssam } 4029536Ssam else if((offset < 45) || ((offset+bytes) > sector_length)) 4129536Ssam error.err_stat = HEADER_ERROR; 4229536Ssam else 4329536Ssam error.err_stat = DATA_ERROR; 4429536Ssam return error; 4529536Ssam } 4629536Ssam 4729536Ssam 4829536Ssam /* 4929536Ssam ** 5029536Ssam */ 5129536Ssam 5229536Ssam bs_entry smd_e_code_position(error) 5329536Ssam fmt_err error; 5429536Ssam { 55*32662Skarels int sector_length = lab->d_traksize / lab->d_nsectors; 5629536Ssam bs_entry temp; 5729536Ssam 5829536Ssam temp.bs_length = 1; 5929536Ssam temp.bs_cyl = error.err_adr.cylinder; 6029536Ssam temp.bs_trk = error.err_adr.track; 6129536Ssam temp.bs_offset = error.err_adr.sector * sector_length; 6229536Ssam if(error.err_stat & HEADER_ERROR) { 6329536Ssam temp.bs_offset += 1; 6429536Ssam } 6529536Ssam else { 6629536Ssam temp.bs_offset += 60; 6729536Ssam } 6829536Ssam temp.bs_alt.cylinder = 0; 6929536Ssam temp.bs_alt.track = 0; 7029536Ssam temp.bs_alt.sector = 0; 7129536Ssam temp.bs_how = scanning; 7229536Ssam return temp; 7329536Ssam } 74