UDI — различия между версиями
Deathsoft (обсуждение | вклад) (→Описание) |
Deathsoft (обсуждение | вклад) (Описан алгоритм CRC применяемый в формате UDI (это не CRC32)) |
||
(не показано 5 промежуточных версии этого же участника) | |||
Строка 50: | Строка 50: | ||
... | ... | ||
− | 0xXXXXXXXX 0x0004 CRC файла (CRC32 | + | 0xXXXXXXXX 0x0004 CRC файла (CRC32 реализованный автором с ошибкой) |
Строка 86: | Строка 86: | ||
Для типичной длины дорожки 6250 байт: | Для типичной длины дорожки 6250 байт: | ||
− | ctlen = | + | ctlen = ((tlen + 7) >> 3) = 782 байт. |
Лишние биты - незначащие, их рекомендуется заполнять нулями. | Лишние биты - незначащие, их рекомендуется заполнять нулями. | ||
− | Программы, создающие/записывающие UDI файлы обязаны обеспечивать присутствие реальных CRC кодов для массивов данных и адресных массивов по алгоритму CRC с полиномом <math>F = | + | Программы, создающие/записывающие UDI файлы обязаны обеспечивать присутствие реальных CRC кодов для массивов данных и адресных массивов по алгоритму CRC с полиномом <math>F = x^{16} + x^{12} + x^5 + 1</math> |
− | Симуляцию ошибочного CRC синтетическим способом, при конвертировании из файлов FDI, рекомендуется производить с помощью выражения C = RC | + | Симуляцию ошибочного CRC синтетическим способом, при конвертировании из файлов FDI, рекомендуется производить с помощью выражения <math>C = RC\oplus{}\tt{0xFFFF}</math>, где C - crc которую нужно записать, RC - crc синтетическая, корректно вычисленная по алгоритму CRC... это чтоб накладок не выходило, запишешь bad CRC равный нулю или еще чему-нибудь, глядишь, а он и впрямь окажется равным нулю - получается реально bad'овый CRC будет определятся как безошибочный. |
|- | |- | ||
|colspan="3"|Для других форматов дорожки (не 0): | |colspan="3"|Для других форматов дорожки (не 0): | ||
|- | |- | ||
− | |1 | + | |1 |
|4 | |4 | ||
|MTIL - Длина блока, описывающего дорожку | |MTIL - Длина блока, описывающего дорожку | ||
|- | |- | ||
− | |5 | + | |5 |
|MTIL | |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 без согласования с автором не вносить. | Вниманию разработчикам эмуляторов: большая просьба - своих корректив в формат 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).
Один бит соответствует одному байту образа дорожки: Например имеем последовательность байт: { 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 без согласования с автором не вносить.