Commit | Line | Data |
---|---|---|
06ed8013 | 1 | #ifndef lint |
ca67e7b4 | 2 | static char sccsid[] = "@(#)smd_e.c 1.3 (Berkeley/CCI) 6/7/88"; |
06ed8013 SL |
3 | #endif |
4 | ||
5 | #include "vdfmt.h" | |
6 | ||
7 | ||
8 | /* | |
9 | ** The sector format of the SMD controller looks like this: | |
10 | ** 32 bytes sector gap (header error) | |
11 | ** 1 byte sync (0x19) (header error) | |
12 | ** 2 bytes cylinder address (header error) | |
13 | ** 1 byte track address (header error) | |
14 | ** 1 byte sector address (header error) | |
15 | ** 2 bytes alt cylinder address (header error) | |
16 | ** 1 byte alt track address (header error) | |
17 | ** 1 byte alt sector address (header error) | |
18 | ** 4 bytes header crc (header error) | |
19 | ** 34 bytes header gap (data error) | |
20 | ** 512 bytes data (data error) | |
21 | ** 4 byte ecc (data error) | |
22 | ** ?? trailing pad (data error) | |
23 | */ | |
24 | ||
511232dd MK |
25 | smd_e_decode_position(bad_entry, error) |
26 | register bs_entry *bad_entry; | |
27 | register fmt_err *error; | |
06ed8013 | 28 | { |
b816ea10 | 29 | int sector_length = lab->d_traksize / lab->d_nsectors; |
511232dd MK |
30 | int offset = (bad_entry->bs_offset-2) % sector_length; |
31 | int bytes = (bad_entry->bs_length / 8) + 4; | |
06ed8013 | 32 | |
511232dd MK |
33 | error->err_adr.cylinder = bad_entry->bs_cyl; |
34 | error->err_adr.track = bad_entry->bs_trk; | |
35 | error->err_adr.sector = (bad_entry->bs_offset-2) / sector_length; | |
36 | if(error->err_adr.sector >= lab->d_nsectors) { | |
37 | error->err_adr.sector = lab->d_nsectors - 1; | |
38 | error->err_stat = DATA_ERROR; | |
06ed8013 SL |
39 | } |
40 | else if((offset < 45) || ((offset+bytes) > sector_length)) | |
511232dd | 41 | error->err_stat = HEADER_ERROR; |
06ed8013 | 42 | else |
511232dd | 43 | error->err_stat = DATA_ERROR; |
06ed8013 SL |
44 | } |
45 | ||
46 | ||
47 | /* | |
48 | ** | |
49 | */ | |
50 | ||
511232dd MK |
51 | smd_e_code_position(error, badent) |
52 | register fmt_err *error; | |
53 | register bs_entry *badent; | |
06ed8013 | 54 | { |
b816ea10 | 55 | int sector_length = lab->d_traksize / lab->d_nsectors; |
06ed8013 | 56 | |
511232dd MK |
57 | badent->bs_length = 1; |
58 | badent->bs_cyl = error->err_adr.cylinder; | |
59 | badent->bs_trk = error->err_adr.track; | |
60 | badent->bs_offset = error->err_adr.sector * sector_length; | |
61 | if(error->err_stat & HEADER_ERROR) { | |
62 | badent->bs_offset += 1; | |
06ed8013 SL |
63 | } |
64 | else { | |
511232dd | 65 | badent->bs_offset += 60; |
06ed8013 | 66 | } |
511232dd MK |
67 | badent->bs_alt.cylinder = 0; |
68 | badent->bs_alt.track = 0; | |
69 | badent->bs_alt.sector = 0; | |
70 | badent->bs_how = scanning; | |
06ed8013 | 71 | } |