129536Ssam #ifndef lint 2*34667Skarels static char sccsid[] = "@(#)smd.c 1.3 (Berkeley/CCI) 06/07/88"; 329536Ssam #endif 429536Ssam 529536Ssam #include "vdfmt.h" 629536Ssam 729536Ssam 829536Ssam 929536Ssam /* 10*34667Skarels ** The sector format of the SMD (VDDC) 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 smd_decode_position(bad_entry,error)23*34667Skarelssmd_decode_position(bad_entry, error) 24*34667Skarels register bs_entry *bad_entry; 25*34667Skarels register fmt_err *error; 2629536Ssam { 2732662Skarels int sector_length = lab->d_traksize / lab->d_nsectors; 28*34667Skarels int offset = (bad_entry->bs_offset-2) % sector_length; 29*34667Skarels int bytes = ((bad_entry->bs_length / 8)) + 4; 3029536Ssam 31*34667Skarels error->err_adr.cylinder = bad_entry->bs_cyl; 32*34667Skarels error->err_adr.track = bad_entry->bs_trk; 33*34667Skarels error->err_adr.sector = (bad_entry->bs_offset-2) / sector_length; 34*34667Skarels if(error->err_adr.sector >= lab->d_nsectors) { 35*34667Skarels error->err_adr.sector = lab->d_nsectors - 1; 36*34667Skarels error->err_stat = DATA_ERROR; 3729536Ssam } 3829536Ssam else if((offset < 35) || ((offset+bytes) > sector_length)) 39*34667Skarels error->err_stat = HEADER_ERROR; 4029536Ssam else 41*34667Skarels error->err_stat = DATA_ERROR; 4229536Ssam } 4329536Ssam 4429536Ssam 4529536Ssam /* 4629536Ssam ** 4729536Ssam */ 4829536Ssam smd_code_position(error,badent)49*34667Skarelssmd_code_position(error, badent) 50*34667Skarels register fmt_err *error; 51*34667Skarels register bs_entry *badent; 5229536Ssam { 5332662Skarels int sector_length = lab->d_traksize / lab->d_nsectors; 5429536Ssam 55*34667Skarels badent->bs_length = 1; 56*34667Skarels badent->bs_cyl = error->err_adr.cylinder; 57*34667Skarels badent->bs_trk = error->err_adr.track; 58*34667Skarels badent->bs_offset = error->err_adr.sector * sector_length; 59*34667Skarels if(error->err_stat & HEADER_ERROR) { 60*34667Skarels badent->bs_offset += 1; 6129536Ssam } 6229536Ssam else { 63*34667Skarels badent->bs_offset += 50; 6429536Ssam } 65*34667Skarels badent->bs_alt.cylinder = 0; 66*34667Skarels badent->bs_alt.track = 0; 67*34667Skarels badent->bs_alt.sector = 0; 68*34667Skarels badent->bs_how = scanning; 6929536Ssam } 70