129536Ssam #ifndef lint 2*34667Skarels static char sccsid[] = "@(#)smd_e.c 1.3 (Berkeley/CCI) 06/07/88"; 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 smd_e_decode_position(bad_entry,error)25*34667Skarelssmd_e_decode_position(bad_entry, error) 26*34667Skarels register bs_entry *bad_entry; 27*34667Skarels register fmt_err *error; 2829536Ssam { 2932662Skarels int sector_length = lab->d_traksize / lab->d_nsectors; 30*34667Skarels int offset = (bad_entry->bs_offset-2) % sector_length; 31*34667Skarels int bytes = (bad_entry->bs_length / 8) + 4; 3229536Ssam 33*34667Skarels error->err_adr.cylinder = bad_entry->bs_cyl; 34*34667Skarels error->err_adr.track = bad_entry->bs_trk; 35*34667Skarels error->err_adr.sector = (bad_entry->bs_offset-2) / sector_length; 36*34667Skarels if(error->err_adr.sector >= lab->d_nsectors) { 37*34667Skarels error->err_adr.sector = lab->d_nsectors - 1; 38*34667Skarels error->err_stat = DATA_ERROR; 3929536Ssam } 4029536Ssam else if((offset < 45) || ((offset+bytes) > sector_length)) 41*34667Skarels error->err_stat = HEADER_ERROR; 4229536Ssam else 43*34667Skarels error->err_stat = DATA_ERROR; 4429536Ssam } 4529536Ssam 4629536Ssam 4729536Ssam /* 4829536Ssam ** 4929536Ssam */ 5029536Ssam smd_e_code_position(error,badent)51*34667Skarelssmd_e_code_position(error, badent) 52*34667Skarels register fmt_err *error; 53*34667Skarels register bs_entry *badent; 5429536Ssam { 5532662Skarels int sector_length = lab->d_traksize / lab->d_nsectors; 5629536Ssam 57*34667Skarels badent->bs_length = 1; 58*34667Skarels badent->bs_cyl = error->err_adr.cylinder; 59*34667Skarels badent->bs_trk = error->err_adr.track; 60*34667Skarels badent->bs_offset = error->err_adr.sector * sector_length; 61*34667Skarels if(error->err_stat & HEADER_ERROR) { 62*34667Skarels badent->bs_offset += 1; 6329536Ssam } 6429536Ssam else { 65*34667Skarels badent->bs_offset += 60; 6629536Ssam } 67*34667Skarels badent->bs_alt.cylinder = 0; 68*34667Skarels badent->bs_alt.track = 0; 69*34667Skarels badent->bs_alt.sector = 0; 70*34667Skarels badent->bs_how = scanning; 7129536Ssam } 72