UDI — различия между версиями

Материал из SpeccyWiki
Перейти к: навигация, поиск
(Описан алгоритм CRC применяемый в формате UDI (это не CRC32))
 
(не показано 17 промежуточных версии этого же участника)
Строка 1: Строка 1:
 
Формат UDI (Ultra Disk Image) был разработан Александром Макеевым для эмулятора [[zxmak]]. Последней версией является 1.0 от 24.03.2002.
 
Формат UDI (Ultra Disk Image) был разработан Александром Макеевым для эмулятора [[zxmak]]. Последней версией является 1.0 от 24.03.2002.
 +
 +
== Описание ==
 +
{| class="standard"
 +
!смещение
 +
!размер
 +
!назначение
 +
|-
 +
|0
 +
|4
 +
|Идентификатор "UDI!", если идентификатор записан маленькими буквами ("udi!"), то применено сжатие данных, алгоритм сжатия пока не определен, но вероятно будет аналогичен TELEDISK'у. Упаковываются данные, начиная с образа первой дорожки, т.е. сразу после основного (и дополнительных) заголовка                 
 +
|-
 +
|4
 +
|4
 +
|Размер файла после распаковки без учета CRC (если файл не упакован, то просто размер файла - 4)
 +
|-
 +
|8
 +
|1
 +
|Версия формата, для UDI 1.0 содержит #00
 +
|-
 +
|9
 +
|1
 +
|Максимально доступный цилиндр (0x00...0xFF), итого макс. число цилиндров = 256
 +
|-
 +
|A
 +
|1
 +
|Максимальный номер поверхности диска: 0x01 - DoubleSided, 0x00 - SingleSided (0x02..0xFF -reserved!)
 +
|-
 +
|B
 +
|1
 +
|В этой версии не используется поэтому всегда 0x00
 +
|-
 +
|C
 +
|4
 +
|EXTHDL - Длина дополнительного заголовка (всегда 0, в противном случае структура данных может быть другая...)
 +
|-
 +
|}
 +
 +
Далее следуют образы каждой из дорожек, в порядке размещения на диске
 +
(Trk00, Side00; Trk00, Side01; Trk01, Side00; Trk01, Side01; ...):
 +
 +
0x00000010      0xXXXX  Образ дорожки см. ниже...
 +
 +
0xXXXXXXXX      0xXXXX  Образ следующей дорожки
 +
 +
0xXXXXXXXX      0xXXXX  Образ следующей дорожки
 +
 +
...
 +
 +
...
 +
 +
0xXXXXXXXX      0x0004  CRC файла (CRC32 реализованный автором с ошибкой)
 +
 +
 +
...
 +
 +
Образ дорожки:
 +
{| class="standard"
 +
!смещение
 +
!размер
 +
!назначение
 +
|-
 +
|0
 +
|1
 +
|Определяет формат дорожки: 0 - MFM only  (например TR-DOS-ный формат) другие значения форматов пока запрещены! (т.к. еще не известно сколько доп. инфы нужно хранить)
 +
|-
 +
|colspan="3"|Для формата дорожки 0 (MFM only):
 +
|-
 +
|1
 +
|2
 +
|tlen - Длина дорожки в байтах (типичная длина дорожки 6250 байт)
 +
ВНИМАНИЕ! Для MFM DoubleDensity (ВГ93) крайне не рекомендуется задавать длину дорожки, сильно отличающуюся от 6250 байт!!!
 +
|-
 +
|3
 +
|tlen
 +
|Побайтовый образ дорожки - включая пробелы, синхропробелы, синхроимпульсы (маркеры MFM), адресные маркеры, заголовки, массивы данных, etc. Другими словами здесь записаны те байты, которые будут выданы ВГ93 по команде "чтение дорожки"
 +
|-
 +
|3+tlen
 +
|ctlen
 +
|Битовый массив, описывающий тип CLK для каждого байта образа дорожки (см. приложение 1).
 +
Один бит соответствует одному байту образа дорожки:<br>
 +
0 - записано с обычным CLK (обычные данные)<br>
 +
1 - записано с маркерным CLK (метки #A1 и #C2)
 +
 +
Например имеем последовательность байт: { 0xA1,0xA1,0x00,0xA1,0xFE,0x00,0x00,0x01 } где 0xA1 - MFM маркеры тогда байт битового массива будет равен 0x0B.
 +
 +
Для типичной длины дорожки 6250 байт:
 +
ctlen = ((tlen + 7) >> 3) = 782 байт.
 +
Лишние биты - незначащие, их рекомендуется заполнять нулями.
 +
 +
Программы, создающие/записывающие UDI файлы обязаны обеспечивать присутствие реальных CRC кодов для массивов данных и адресных массивов по алгоритму CRC с полиномом <math>F = x^{16} + x^{12} + x^5 + 1</math>
 +
 +
Симуляцию ошибочного CRC синтетическим способом, при конвертировании из файлов FDI, рекомендуется производить с помощью выражения <math>C = RC\oplus{}\tt{0xFFFF}</math>, где C - crc которую нужно записать, RC - crc синтетическая, корректно вычисленная по алгоритму CRC...  это чтоб накладок не выходило, запишешь bad CRC равный нулю или еще чему-нибудь, глядишь, а он и впрямь окажется равным нулю - получается реально bad'овый CRC будет определятся как безошибочный.
 +
|-
 +
|colspan="3"|Для других форматов дорожки (не 0):
 +
|-
 +
|1
 +
|4
 +
|MTIL - Длина блока, описывающего дорожку
 +
|-
 +
|5
 +
|MTIL
 +
|Блок описывающий формат дорожки
 +
|}
 +
 +
                Алгоритм вычисления CRC32 для файла UDI
 +
<span style="color:#FF0000">(это не настоящий алгоритм crc32, алгоритм содержит ошибку, строчка "CRC ^= -1l ^ Symbol;" должна в настоящем crc32 быть "CRC ^= Symbol;")<span style="color:#FF0000">
 +
 +
Начальное значение CRC = 0xFFFFFFFF  (-1l).
 +
 +
Функция обновления CRC32 для одного байта Symbol:
 +
 +
<pre>
 +
long CalcCRC32(long CRC, unsigned char Symbol)
 +
{
 +
  long temp;
 +
  CRC ^= -1l ^ Symbol;
 +
  for(int k = 8; k--;)
 +
      { temp = -(CRC & 1), CRC >>= 1, CRC ^= 0xEDB88320ul & temp; }
 +
  CRC ^= -1l;
 +
  return CRC;
 +
}
 +
</pre>
 +
 +
  Вниманию разработчикам эмуляторов: большая просьба - своих корректив в формат UDI без согласования с автором не вносить.
 +
 +
 +
 
[[Категория:Форматы файлов]]
 
[[Категория:Форматы файлов]]

Текущая версия на 00:20, 14 ноября 2014

Формат UDI (Ultra Disk Image) был разработан Александром Макеевым для эмулятора zxmak. Последней версией является 1.0 от 24.03.2002.

Описание

смещение размер назначение
0 4 Идентификатор "UDI!", если идентификатор записан маленькими буквами ("udi!"), то применено сжатие данных, алгоритм сжатия пока не определен, но вероятно будет аналогичен TELEDISK'у. Упаковываются данные, начиная с образа первой дорожки, т.е. сразу после основного (и дополнительных) заголовка
4 4 Размер файла после распаковки без учета CRC (если файл не упакован, то просто размер файла - 4)
8 1 Версия формата, для UDI 1.0 содержит #00
9 1 Максимально доступный цилиндр (0x00...0xFF), итого макс. число цилиндров = 256
A 1 Максимальный номер поверхности диска: 0x01 - DoubleSided, 0x00 - SingleSided (0x02..0xFF -reserved!)
B 1 В этой версии не используется поэтому всегда 0x00
C 4 EXTHDL - Длина дополнительного заголовка (всегда 0, в противном случае структура данных может быть другая...)

Далее следуют образы каждой из дорожек, в порядке размещения на диске (Trk00, Side00; Trk00, Side01; Trk01, Side00; Trk01, Side01; ...):

0x00000010 0xXXXX Образ дорожки см. ниже...

0xXXXXXXXX 0xXXXX Образ следующей дорожки

0xXXXXXXXX 0xXXXX Образ следующей дорожки

...

...

0xXXXXXXXX 0x0004 CRC файла (CRC32 реализованный автором с ошибкой)


...

Образ дорожки:

смещение размер назначение
0 1 Определяет формат дорожки: 0 - MFM only (например TR-DOS-ный формат) другие значения форматов пока запрещены! (т.к. еще не известно сколько доп. инфы нужно хранить)
Для формата дорожки 0 (MFM only):
1 2 tlen - Длина дорожки в байтах (типичная длина дорожки 6250 байт)

ВНИМАНИЕ! Для MFM DoubleDensity (ВГ93) крайне не рекомендуется задавать длину дорожки, сильно отличающуюся от 6250 байт!!!

3 tlen Побайтовый образ дорожки - включая пробелы, синхропробелы, синхроимпульсы (маркеры MFM), адресные маркеры, заголовки, массивы данных, etc. Другими словами здесь записаны те байты, которые будут выданы ВГ93 по команде "чтение дорожки"
3+tlen ctlen Битовый массив, описывающий тип CLK для каждого байта образа дорожки (см. приложение 1).

Один бит соответствует одному байту образа дорожки:
0 - записано с обычным CLK (обычные данные)
1 - записано с маркерным CLK (метки #A1 и #C2)

Например имеем последовательность байт: { 0xA1,0xA1,0x00,0xA1,0xFE,0x00,0x00,0x01 } где 0xA1 - MFM маркеры тогда байт битового массива будет равен 0x0B.

Для типичной длины дорожки 6250 байт: ctlen = ((tlen + 7) >> 3) = 782 байт. Лишние биты - незначащие, их рекомендуется заполнять нулями.

Программы, создающие/записывающие UDI файлы обязаны обеспечивать присутствие реальных CRC кодов для массивов данных и адресных массивов по алгоритму CRC с полиномом <math>F = x^{16} + x^{12} + x^5 + 1</math>

Симуляцию ошибочного CRC синтетическим способом, при конвертировании из файлов FDI, рекомендуется производить с помощью выражения <math>C = RC\oplus{}\tt{0xFFFF}</math>, где C - crc которую нужно записать, RC - crc синтетическая, корректно вычисленная по алгоритму CRC... это чтоб накладок не выходило, запишешь bad CRC равный нулю или еще чему-нибудь, глядишь, а он и впрямь окажется равным нулю - получается реально bad'овый CRC будет определятся как безошибочный.

Для других форматов дорожки (не 0):
1 4 MTIL - Длина блока, описывающего дорожку
5 MTIL Блок описывающий формат дорожки
               Алгоритм вычисления CRC32 для файла UDI

(это не настоящий алгоритм crc32, алгоритм содержит ошибку, строчка "CRC ^= -1l ^ Symbol;" должна в настоящем crc32 быть "CRC ^= Symbol;")

Начальное значение CRC = 0xFFFFFFFF (-1l).

Функция обновления CRC32 для одного байта Symbol:

long CalcCRC32(long CRC, unsigned char Symbol)
{
   long temp;
   CRC ^= -1l ^ Symbol;
   for(int k = 8; k--;) 
      { temp = -(CRC & 1), CRC >>= 1, CRC ^= 0xEDB88320ul & temp; }
   CRC ^= -1l;
   return CRC;
}
  Вниманию разработчикам эмуляторов: большая просьба - своих корректив в формат UDI без согласования с автором не вносить.