User Tag List

Страница 7 из 13 ПерваяПервая ... 34567891011 ... ПоследняяПоследняя
Показано с 61 по 70 из 232

Тема: Эмуляция 1801ВП1-128 в ПЛИС

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,805
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    147
    Поблагодарили
    78 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vslav Посмотреть сообщение
    Предлагаю немного освежить тему
    Очень кстати - я как раз почти созрел написать эмулятор ВП1-128, который будет работать с байтовыми образами дорожек ( в текстовом формате *.TRK ).

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,805
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    147
    Поблагодарили
    78 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В описании ВП1-128 написано, что CRC вычисляется по формуле: 1 + x^5 + x^12 + x^16.
    Но по такой формуле работают несколько разных алгоритмов CRC-16, дающих разные результаты, например:

    Код:
    KERMIT ( CCITT )
    width=16 poly=0x1021 init=0x0000 refin=true refout=true
    xorout=0x0000 check=0x2189
    
    XMODEM
    width=16 poly=0x1021 init=0x0000 refin=false refout=false
    xorout=0x0000 check=0x31C3
    
    CRC-16
    width=16 poly=0x1021 init=0xFFFF refin=false refout=false
    xorout=0x0000 check=0x29B1
    
    X-25
    width=16 poly=0x1021 init=0xFFFF refin=true refout=true
    xorout=0xFFFF check=0x906E
    Есть ли возможность уточнить, какой именно алгоритм у генератора CRC ВП1-128 ?

    По идее - он должен перебирать биты каждого записываемого слова от старшего к младшему ( в порядке их расположения на диске ).

  4. #3

    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    14,389
    Спасибо Благодарностей отдано 
    1,701
    Спасибо Благодарностей получено 
    2,217
    Поблагодарили
    871 сообщений
    Mentioned
    69 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от Patron Посмотреть сообщение
    Есть ли возможность уточнить, какой именно алгоритм у генератора CRC ВП1-128 ?

    По идее - он должен перебирать биты каждого записываемого слова от старшего к младшему ( в порядке их расположения на диске ).
    По идее, стандартный CRC-16, иначе он не был бы совместим со стандартным форматом MFM.

  5. #4

    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,805
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    147
    Поблагодарили
    78 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vslav Посмотреть сообщение
    Инициализация регистра перед началом вычисления суммы производится нулем. Запись вычисленной суммы на диск выполняется в инвертированном виде (значит при чтении она будет считана также проинвертированной). Корректность прочитанного блока + инвертированная сумма определяется по равенству регистра значению 0xFFFF.
    Контроллеры DEC и IBM ( если верить документации ) вычисляют CRC так:

    1. Начальное значение CRC = 0xFFFF ;
    2. Старший бит идёт первым ;
    3. Запись вычисленной суммы без инверсии.

    Т.е. по сути - это одно и то же, только инверсия результата выполняется до начала вычисления CRC, а не после.

    ...

    Вычисление CRC начинается в момент записи маркера, поэтому возникают два вопроса:

    1. Что именно запускает генератор CRC при записи:

    1.1. Установка бита WM (9) ;
    1.2. То же + байт 0xA1 в сдвиговом регистре.

    2. Если генератор CRC в ходе записи не был запущен - будет ли выполнена запись CRC ( 0xFFFF ) в момент пропуска требования ?

    ---------- Post added at 13:08 ---------- Previous post was at 12:16 ----------

    Цитата Сообщение от Vslav Посмотреть сообщение
    алгоритм уже завтра на свежую голову восстановлю
    Похоже, что алгоритм такой. Байтовый вариант выглядит так:
    Код:
    unsigned short crc16( unsigned char byte, int step )
    {
    	static unsigned short crc = 0;
    	if( step == 0 ) { crc = 0; }
    	crc ^= unsigned short ( byte ) << 8;
    	for( int i = 0 ; i < 8 ; i++ ) {
    		if( crc & 0x8000 )
    			crc = (crc << 1) ^ 0x1021;
    		else
    			crc = crc << 1;
    	}
    	return crc;
    }


    ---------- Post added at 13:27 ---------- Previous post was at 13:08 ----------

    Также ( если я правильно понял ) при чтении CRC проверяется так - если требование выполнено, то содержимое регистра данных интерпретируется как данные и включается в расчёт CRC, если же требование не выполнено - содержимое регистра данных интерпретируется как инверсное значение CRC, прибавляется к рассчитанному значению CRC и результат проверяется на равенство 0xFFFF.

    Но тогда получается, что если продолжать забирать данные из регистра данных - инверсное значение CRC будет прочитано как обычные данные и чтение пойдёт дальше.

    А что в таком случае произойдёт при считывании маркера:

    1. Чтение продолжится, но произойдёт сброс генератора CRC и расчёт CRC начнётся заново со считанного байта 0xA1 ;
    2. Произойдёт что-то ещё..
    Последний раз редактировалось Patron; 14.12.2013 в 12:14.

  6. #5

    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    759
    Поблагодарили
    353 сообщений
    Mentioned
    88 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Patron Посмотреть сообщение
    В описании ВП1-128 написано, что CRC вычисляется по формуле: 1 + x^5 + x^12 + x^16.
    Но по такой формуле работают несколько разных алгоритмов CRC-16, дающих разные результаты, например:
    Есть ли возможность уточнить, какой именно алгоритм у генератора CRC ВП1-128 ?
    Update:
    Я тут начал моделировать запись сектора, выявил еще один косяк ВП1-128, она оказывается бит готовности данных ставит сильно заранее (до момента перенесения старшего байта из регистра данных в сдвиговый регистр), и если быстрая шина МПИ (как в используемой сейчас модели процессора - он пишет-читает максимально быстро), то она успевает переписать регистр данных быстрее чем из него успевает переписаться старший байт в сдвиговый регистр (потому что увидела раннюю готовность). Сейчас ввел в транзакции МПИ задержки, будут результаты - отпишу.
    Последний раз редактировалось Vslav; 13.12.2013 в 13:50.

  7. #6

    Регистрация
    07.10.2007
    Адрес
    п.Пудость Гатчинского р-на Лен.обл.
    Сообщений
    3,248
    Спасибо Благодарностей отдано 
    360
    Спасибо Благодарностей получено 
    638
    Поблагодарили
    414 сообщений
    Mentioned
    46 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Уж для того, чтобы разобраться какой алгоритм используется для подсчета CRC, в архиве "сырые данные" с нулевой дорожки нижней стороны отформатированной на УКНЦ дискеты. Там все - и межсекторные промежутки, и маркеры, и заголовки, и данные, ну и соответственно CRC.
    Вложения Вложения
    • Тип файла: rar TRACK.rar (243 байт, Просмотров: 202)

  8. #7

    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,805
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    147
    Поблагодарили
    78 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Alex_K Посмотреть сообщение
    Там все - и межсекторные промежутки, и маркеры, и заголовки, и данные, ну и соответственно CRC.
    Чтобы далеко не ходить - возьмём заголовок первого сектора:
    Код:
    A1 A1 A1 FE 00 00 01 02 CA 6F
    Запустим эти байты в стандартный алгоритм CRC-16:
    Код:
    	printf("Write:");
    	crc = 0xFFFF;
    	crc = crc16(crc, 0xA1);
    	crc = crc16(crc, 0xA1);
    	crc = crc16(crc, 0xA1);
    	crc = crc16(crc, 0xFE);
    	crc = crc16(crc, 0x00);
    	crc = crc16(crc, 0x00);
    	crc = crc16(crc, 0x01);
    	crc = crc16(crc, 0x02);
    	tmp = crc;
    	printf("\nCRC: %04X", tmp);
    
    	printf("\n\nRead:");
    	crc = 0xFFFF;
    	crc = crc16(crc, 0xA1);
    	crc = crc16(crc, 0xA1);
    	crc = crc16(crc, 0xA1);
    	crc = crc16(crc, 0xFE);
    	crc = crc16(crc, 0x00);
    	crc = crc16(crc, 0x00);
    	crc = crc16(crc, 0x01);
    	crc = crc16(crc, 0x02);
    	crc = crc16(crc, 0xCA);
    	crc = crc16(crc, 0x6F);
    	printf("\nTMP: %04X", crc);
    	if ( crc == 0x0000 ) printf(" CRC OK");
    Результат запуска:
    Код:
    Write:
     A1 ( FFFF, 443B )
     A1 ( 443B, 968B )
     A1 ( 968B, CDB4 )
     FE ( CDB4, B230 )
     00 ( B230, B799 )
     00 ( B799, 4E3C )
     01 ( 4E3C, 852B )
     02 ( 852B, CA6F )
    CRC: CA6F
    
    Read:
     A1 ( FFFF, 443B )
     A1 ( 443B, 968B )
     A1 ( 968B, CDB4 )
     FE ( CDB4, B230 )
     00 ( B230, B799 )
     00 ( B799, 4E3C )
     01 ( 4E3C, 852B )
     02 ( 852B, CA6F )
     CA ( CA6F, 6F00 )
     6F ( 6F00, 0000 )
    TMP: 0000 CRC OK
    ВП1-128 "внутри себя" использует инверсный вариант CRC-16, но перед записью на диск инвертирует CRC, поэтому на диск пишется в точности то же, что генерит стандартный алгоритм CRC-16:
    Код:
    CRC-16
    width=16 poly=0x1021 init=0xFFFF refin=false refout=false
    xorout=0x0000 check=0x29B1
    Последний раз редактировалось Patron; 14.12.2013 в 00:57.

  9. #8

    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    759
    Поблагодарили
    353 сообщений
    Mentioned
    88 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Все, привел я к обычному делению на полином. Нужно просто было понять что же реально делится и подавать фактическую последовательность делимого:
    Код:
    crc = 0;
    crc = crc16_m2(crc, 0xA1 ^ 0xFF);
    crc = crc16_m2(crc, 0xA1 ^ 0xFF);
    crc = crc16_m2(crc, 0x30);
    crc = crc16_m2(crc, 0x31);
    crc = crc16_m2(crc, 0x32);
    crc = crc16_m2(crc, 0x33);
    crc = crc16_m2(crc, 0x00);
    crc = crc16_m2(crc, 0x00);
    где - crc16_m2() - обычное деление на полином, с вдвиганием бита данных в младший разряд. Контрольные суммы совпадают, все выкладки полностью подтвердились.

  10. #9

    Регистрация
    11.09.2009
    Адрес
    Москва
    Сообщений
    4,805
    Спасибо Благодарностей отдано 
    9
    Спасибо Благодарностей получено 
    147
    Поблагодарили
    78 сообщений
    Mentioned
    16 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vslav Посмотреть сообщение
    где - crc16_m2() - обычное деление на полином, с вдвиганием бита данных в младший разряд
    А как выглядит на C исходный код функции crc16_m2() ?
    Последний раз редактировалось Patron; 15.12.2013 в 11:42.

  11. #10

    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    759
    Поблагодарили
    353 сообщений
    Mentioned
    88 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Patron Посмотреть сообщение
    А как выглядит на C исходный код функции crc16_m2() ?
    Код:
    unsigned short int crc16_m2(unsigned short crc, unsigned char data)
    {
    	int i;
    
    	printf("\n %02X ( %04X,", data, crc);
    	for(i=0; i<8; i++)
    	{
    		if (crc & 0x8000)
    		{
    			crc <<= 1;
    			crc |= (data >> 7) & 1;
    			crc ^= 0x1021;
    		}
    		else
    		{
    			crc <<= 1;
    			crc |= (data >> 7) & 1;
    		}
    		data <<= 1;
    	}
    	printf(" %04X )", crc );
    	return crc;
    }

Страница 7 из 13 ПерваяПервая ... 34567891011 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. ЮТ-88: Реализация на ПЛИС (DE1)
    от Santechnik в разделе ЮТ-88
    Ответов: 61
    Последнее: 13.05.2022, 08:22
  2. Вопрос по ПЛИС
    от Zloy в разделе Несортированное железо
    Ответов: 23
    Последнее: 17.10.2015, 17:12
  3. Аксель на ПЛИС
    от iceoflame в разделе Amiga
    Ответов: 163
    Последнее: 25.03.2012, 14:51
  4. Список версий 1801ВП1 и 1801РЕ2
    от CodeMaster в разделе ДВК, УКНЦ
    Ответов: 2
    Последнее: 28.02.2012, 22:39
  5. 1801вп1-128
    от dk_spb в разделе ДВК, УКНЦ
    Ответов: 0
    Последнее: 29.05.2010, 11:24

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •