1*29536Ssam #ifndef lint 2*29536Ssam static char sccsid[] = "@(#)smd_e.c 1.1 (Berkeley/CCI) 07/05/86"; 3*29536Ssam #endif 4*29536Ssam 5*29536Ssam #include "vdfmt.h" 6*29536Ssam 7*29536Ssam 8*29536Ssam /* 9*29536Ssam ** The sector format of the SMD controller looks like this: 10*29536Ssam ** 32 bytes sector gap (header error) 11*29536Ssam ** 1 byte sync (0x19) (header error) 12*29536Ssam ** 2 bytes cylinder address (header error) 13*29536Ssam ** 1 byte track address (header error) 14*29536Ssam ** 1 byte sector address (header error) 15*29536Ssam ** 2 bytes alt cylinder address (header error) 16*29536Ssam ** 1 byte alt track address (header error) 17*29536Ssam ** 1 byte alt sector address (header error) 18*29536Ssam ** 4 bytes header crc (header error) 19*29536Ssam ** 34 bytes header gap (data error) 20*29536Ssam ** 512 bytes data (data error) 21*29536Ssam ** 4 byte ecc (data error) 22*29536Ssam ** ?? trailing pad (data error) 23*29536Ssam */ 24*29536Ssam 25*29536Ssam fmt_err smd_e_decode_position(bad_entry) 26*29536Ssam bs_entry bad_entry; 27*29536Ssam { 28*29536Ssam fmt_err error; 29*29536Ssam int sector_length = CURRENT->vc_traksize / CURRENT->vc_nsec; 30*29536Ssam int offset = (bad_entry.bs_offset-2) % sector_length; 31*29536Ssam int bytes = (bad_entry.bs_length / 8) + 4; 32*29536Ssam 33*29536Ssam error.err_adr.cylinder = bad_entry.bs_cyl; 34*29536Ssam error.err_adr.track = bad_entry.bs_trk; 35*29536Ssam error.err_adr.sector = (bad_entry.bs_offset-2) / sector_length; 36*29536Ssam if(error.err_adr.sector >= CURRENT->vc_nsec) { 37*29536Ssam error.err_adr.sector = CURRENT->vc_nsec - 1; 38*29536Ssam error.err_stat = DATA_ERROR; 39*29536Ssam } 40*29536Ssam else if((offset < 45) || ((offset+bytes) > sector_length)) 41*29536Ssam error.err_stat = HEADER_ERROR; 42*29536Ssam else 43*29536Ssam error.err_stat = DATA_ERROR; 44*29536Ssam return error; 45*29536Ssam } 46*29536Ssam 47*29536Ssam 48*29536Ssam /* 49*29536Ssam ** 50*29536Ssam */ 51*29536Ssam 52*29536Ssam bs_entry smd_e_code_position(error) 53*29536Ssam fmt_err error; 54*29536Ssam { 55*29536Ssam int sector_length = CURRENT->vc_traksize / CURRENT->vc_nsec; 56*29536Ssam bs_entry temp; 57*29536Ssam 58*29536Ssam temp.bs_length = 1; 59*29536Ssam temp.bs_cyl = error.err_adr.cylinder; 60*29536Ssam temp.bs_trk = error.err_adr.track; 61*29536Ssam temp.bs_offset = error.err_adr.sector * sector_length; 62*29536Ssam if(error.err_stat & HEADER_ERROR) { 63*29536Ssam temp.bs_offset += 1; 64*29536Ssam } 65*29536Ssam else { 66*29536Ssam temp.bs_offset += 60; 67*29536Ssam } 68*29536Ssam temp.bs_alt.cylinder = 0; 69*29536Ssam temp.bs_alt.track = 0; 70*29536Ssam temp.bs_alt.sector = 0; 71*29536Ssam temp.bs_how = scanning; 72*29536Ssam return temp; 73*29536Ssam } 74*29536Ssam 75*29536Ssam 76*29536Ssam /* 77*29536Ssam ** 78*29536Ssam */ 79*29536Ssam 80*29536Ssam int smd_e_cyl_skew() 81*29536Ssam { 82*29536Ssam return 0; 83*29536Ssam } 84*29536Ssam 85*29536Ssam 86*29536Ssam /* 87*29536Ssam ** 88*29536Ssam */ 89*29536Ssam 90*29536Ssam int smd_e_trk_skew() 91*29536Ssam { 92*29536Ssam return 0; 93*29536Ssam } 94*29536Ssam 95