Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1088 | alone | 1 | Описание формата FDI-файла |
2 | Версия 1.0 (Углеков К.) |
||
3 | Версия 2 (deathsoft) |
||
4 | |||
5 | Пример реализации чтения/записи fdi версий 1 и 2 можно посмотреть в |
||
6 | wldr_fdi.cpp эмулятора UnrealSpeccy v0.38.3 |
||
7 | |||
8 | Общую структуру fdi файла можно представить в следующем виде: |
||
9 | |||
10 | TFdiHdr - присутствует всегда |
||
11 | TFdiAddInfo - присутствует в формате 2 и выше (в формате 1 отсутствует) |
||
12 | TTrkHdr[c*h] - массив заголовков дорожек |
||
13 | ... |
||
14 | FdiTrkData[] - массив переменной длины с данными дорожек |
||
15 | ... |
||
16 | (формат 2 тип 1 (информация о сбойных байтах)) |
||
17 | TFdiTrkAddInfo[] - массив переменной длины с дополнительной информацией о дорожках |
||
18 | ... |
||
19 | FdiTrkAddData[] - массив переменной длины с данными сбойных байтов для тех дорожек где они есть |
||
20 | |||
21 | |||
22 | Формат заголовка файла |
||
23 | Структура TFdiHdr: |
||
24 | ------------------------------------------------------------------------------ |
||
25 | Смещение Длина поля Описание |
||
26 | ------------------------------------------------------------------------------ |
||
27 | |||
28 | |||
29 | 3 1 Флаг защиты записи (0 - write enabled, 1 - write disabled) |
||
30 | 4 2 Число цилиндров |
||
31 | 6 2 Число поверхностей |
||
32 | 8 2 Смещение текста (короткий комментарий к диску) |
||
33 | A 2 Смещение данных |
||
34 | С 2 Длина дополнительной информации в заголовке. |
||
35 | В версии 1.0 - 0x0000 |
||
36 | В версии 2 - размер структуры TFdiAddInfo (см. "Формат дополнительной информации") |
||
37 | |||
38 | E "Длина дополнительной информации" (если 0, то дополнительной информации нет) |
||
39 | см. "Формат дополнительной информации" |
||
40 | |||
41 | E+"длина дополнительной информации" |
||
42 | ??? |
||
43 | Область заголовков треков. Здесь собрана вся информация о |
||
44 | формате дискеты. Эта область должна содержать не меньше |
||
45 | "Число цилиндров"*"Число поверхностей" заголовков. Заголовки |
||
46 | идут в порядке Cyl 0 Head 0, Cyl 0 Head 1, Cyl 1 Head 0 и т.д. |
||
47 | Формат заголовка описан ниже. |
||
48 | |||
49 | "Смещение текста" |
||
50 | ??? |
||
51 | Комментарий к диску.Конец комментария - нулевой символ. |
||
52 | MAKEFDI при создании нового файла позволяет вводить комментарий |
||
53 | не более 64 символов с завершающим нулем,но при работе с файлом |
||
54 | длина этого поля будет определяться по положению завершающего |
||
55 | нулевого символа |
||
56 | |||
57 | "Смещение данных" |
||
58 | ??? |
||
59 | Здесь лежат собственно данные из секторов. Сколько здесь будет |
||
60 | секторов, их длина и порядок следования - зависит от формата. |
||
61 | |||
62 | ------------------------------------------------------------------------------- |
||
63 | |||
64 | Формат FDI-файла допускает пропуски между областями заголовков треков,текстовым |
||
65 | комментарием и областью данных. |
||
66 | |||
67 | |||
68 | Формат заголовка трека |
||
69 | Структура TTrkHdr: |
||
70 | ------------------------------------------------------------------------------ |
||
71 | Смещение Длина поля Описание |
||
72 | ------------------------------------------------------------------------------ |
||
73 | |||
74 | |||
75 | относительно "Смещения данных" |
||
76 | 4 2 Всегда содержит 0 (резерв для модернизации) |
||
77 | 6 1 Число секторов на треке |
||
78 | |||
79 | 7 (Число секторов)*7 |
||
80 | Информация о секторах на треке. Каждый сектор описывается 7 |
||
81 | байтами. Первые 4 байта - стандарные параметры C,H,R,N из |
||
82 | адресного маркера. Следующий байт - флаги: |
||
83 | |||
84 | bit 7=0 - маркер нормальных данных, 1 - удаленных данных; |
||
85 | bit 0-5: флаги CRC. Единица в одном из разрядов означает, что |
||
86 | при считывании этого сектора на длину 128,256,1024,2048 или |
||
87 | 4096 байт получается правильная контрольная сумма. Если во всех |
||
88 | разрядах 0 - сектор записан с ошибкой контрольной суммы. |
||
89 | bit 6: В данной версии всегда 0. Возможно, 1 в данном разряде |
||
90 | будет обозначать адресный маркер без области данных. |
||
91 | |||
92 | Последние 2 байта - смещение данных этого сектора относительно |
||
93 | начала области данных трека. Чтобы получить абсолютный адрес |
||
94 | в файле, к этому числу надо добавить "Смещение данных" и |
||
95 | "Смещение трека" |
||
96 | ------------------------------------------------------------------------------ |
||
97 | 7*(Число секторов+1) длина заголовка трека |
||
98 | |||
99 | Заметим, что байт флагов в описании сектора пока никак не используется |
||
100 | эмулятором. |
||
101 | |||
102 | Формат дополнительной информации (FDI 2 и выше) |
||
103 | |||
104 | Типы данных: |
||
105 | u8 - беззнаковый 8бит (1 байт) |
||
106 | u16 - беззнаковый 16бит (2 байта) |
||
107 | u32 - беззнаковый 32бит (4 байта) |
||
108 | |||
109 | Описание структуры TFdiAddInfo: |
||
110 | struct TFdiAddInfo |
||
111 | { |
||
112 | // Заголовок, одинаковый для всех форматов |
||
113 | u16 Ver; // 2 - FDI 2 |
||
114 | u16 AddInfoType; // Тип дополнительной информации: |
||
115 | // 1 - bad bytes info (информация о сбойных блоках) |
||
116 | |||
117 | // Для AddInfoType == 1 (для других форматов информация ниже будет другой) |
||
118 | u32 TrkAddInfoOffset; // Смещение массива структур TFdiTrkAddInfo в байтах от начала файла |
||
119 | // число структур равно "Число цилиндров" * "Число поверхностей" из FDI |
||
120 | // заголовка (Внимание! структуры имеют переенный размер) |
||
121 | u32 DataOffset; // Смещение данных с дополнительной информацией (от начала файла) |
||
122 | }; |
||
123 | |||
124 | Описание структуры TFdiTrkAddInfo: |
||
125 | struct TFdiTrkAddInfo(int n) // n - Число секторов на дорожке, дорожки имеют сквозную нумерацию |
||
126 | // от 0 до "Число цилиндров" * "Число поверхностей"-1 |
||
127 | { |
||
128 | u32 TrkOffset; // Смещение в байтах дополнительной информации для данной дорожки |
||
129 | // относительно FdiAddInfo.DataOffset |
||
130 | // 0xFFFFFFFF - дополнительная информация для данной дорожки отсутствует |
||
131 | if(n && (TrkOffset != 0xFFFFFFFF)) |
||
132 | { |
||
133 | TFdiSecAddInfo Sec[n]; // Описатели дополнительной информации о секторах (если n==0, то отсутствует) |
||
134 | } |
||
135 | }; |
||
136 | |||
137 | Описание структуры TFdiSecAddInfo: |
||
138 | struct TFdiSecAddInfo |
||
139 | { |
||
140 | u8 Flags; // 1 - Массив сбойных байтов присутствует |
||
141 | |||
142 | // Смещение битового массива сбойных байтов внутри дорожки относительно TFdiTrkAddInfo[i].TrkOffset; |
||
143 | // Число битов определяется размером сектора |
||
144 | // Один бит соответствует одному сбойному байту |
||
145 | // Для вычисления смещения конкретного бита нужно сложить |
||
146 | // u32 offs = FdiAddInfo.DataOffset + FdiAddInfo[i].TrkOffset + (FdiAddInfo[i].Sec[s].Flags & 1) ? (128 << FdiHdr.Trk[i].Sec[s].n) : 0; |
||
147 | // (где i - текущая дорожка, s - текущий сектор, Sec[s].n - код размера сектора 0-128байт, 1-256байт,2-512байт,3-1024байт и т.д.) |
||
148 | // номер байта определяется как offs>>3, а номер бита в байте как offs&7 |
||
149 | u16 DataOffset; |
||
150 | }; |
||
151 | |||
152 | При записи в байты помеченные как сбойные эмулятор должен искажать записываемые данные |
||
153 | (наприер делать xor с псевдослучайно последовательностью). |
||
154 | При чтении из байты помеченных как сбойные эмулятор должен искажать данные |
||
155 | (наприер делать xor с псевдослучайно последовательностью) и выдавать ошибку CRC сектора. |