Subversion Repositories pentevo

Rev

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 сектора.