static char sccsid
[] = "@(#)smd_e.c 1.3 (Berkeley/CCI) 6/7/88";
** The sector format of the SMD controller looks like this:
** 32 bytes sector gap (header error)
** 1 byte sync (0x19) (header error)
** 2 bytes cylinder address (header error)
** 1 byte track address (header error)
** 1 byte sector address (header error)
** 2 bytes alt cylinder address (header error)
** 1 byte alt track address (header error)
** 1 byte alt sector address (header error)
** 4 bytes header crc (header error)
** 34 bytes header gap (data error)
** 512 bytes data (data error)
** 4 byte ecc (data error)
** ?? trailing pad (data error)
smd_e_decode_position(bad_entry
, error
)
register bs_entry
*bad_entry
;
int sector_length
= lab
->d_traksize
/ lab
->d_nsectors
;
int offset
= (bad_entry
->bs_offset
-2) % sector_length
;
int bytes
= (bad_entry
->bs_length
/ 8) + 4;
error
->err_adr
.cylinder
= bad_entry
->bs_cyl
;
error
->err_adr
.track
= bad_entry
->bs_trk
;
error
->err_adr
.sector
= (bad_entry
->bs_offset
-2) / sector_length
;
if(error
->err_adr
.sector
>= lab
->d_nsectors
) {
error
->err_adr
.sector
= lab
->d_nsectors
- 1;
error
->err_stat
= DATA_ERROR
;
else if((offset
< 45) || ((offset
+bytes
) > sector_length
))
error
->err_stat
= HEADER_ERROR
;
error
->err_stat
= DATA_ERROR
;
smd_e_code_position(error
, badent
)
register bs_entry
*badent
;
int sector_length
= lab
->d_traksize
/ lab
->d_nsectors
;
badent
->bs_cyl
= error
->err_adr
.cylinder
;
badent
->bs_trk
= error
->err_adr
.track
;
badent
->bs_offset
= error
->err_adr
.sector
* sector_length
;
if(error
->err_stat
& HEADER_ERROR
) {
badent
->bs_alt
.cylinder
= 0;
badent
->bs_alt
.track
= 0;
badent
->bs_alt
.sector
= 0;
badent
->bs_how
= scanning
;