Важная информация

User Tag List

Страница 1 из 4 1234 ПоследняяПоследняя
Показано с 1 по 10 из 37

Тема: Arduino Floppy Dump utility

  1. #1
    Veteran
    Регистрация
    04.08.2005
    Адрес
    Nizhnevartovsk
    Сообщений
    1,007
    Спасибо Благодарностей отдано 
    75
    Спасибо Благодарностей получено 
    114
    Поблагодарили
    77 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Arduino Floppy Dump utility

    В соседнем треде была презентация моей мини-разработки.
    Тут - отдельная тема, с продолжением самостоятельной жизни.

    Arduino Floppy DUMP utility - консольное приложение, написанное на python, предназначено для дампования флопиков (главным образом 5.25", но и 3.5" даже PC-шные HD диски по идее должен без проблем захватываться), и для сохранения образов в разных форматах. Работает в связке с микроконтроллером ATMega328(16MHz).

    Ссылка на предка - http://amiga.robsmithdev.co.uk/instructions

    Вводные данные:
    При MFM кодировании один байт информации конвертируется в 4-8 импульсов. Импульс генерируется при развороте направления намагниченности.
    В MFM всего возможно 3 разных длительности (4, 6, 8мкс для DD и 2, 3, 4мкс для HD дисков).
    Скорость вращения диска - 300об/мин, или 5об/с (бывает 360об/мин, но это не наш случай). Таким образом длительность трека - 200мс, или 200000мкс. То есть для DD диска один трек вмещает 25000-50000 импульсов, а HD диска - 50000-100000 импульсов.
    При загрузке данных из Arduino одна длительность кодируется 2 битами (используются комбинации b01 b10 и b11, а b00 - служебный, завершение потока - 0x00). Таким образом мы имеем в одном переданном байте 4 MFM длительности (импульса). То есть каждый байт исходной информации - это 1-2 байта, переданных из устройства.
    То есть, длина дорожки при загрузке данных из устройства - это от 6250 до 12500 байт для DD диска. Для HD диска, соответственно, от 12500 до 25000 байт.
    DD диски (основная масса 5.25" включая ZX, а также старые 3.5") имеют длину дорожки в исходных данных 6250 байт, HD диски - 12500 байт.
    За одну секунду трек загружается 5 раз (поскольку совершается 5 оборотов). Таким образом, плотность информации, загружаемой с устройства в MFM формате - это до 62500 байт в секунду (cps) для DD диска, и до 125000 cps для HD диска.

    То есть минимально возможная скорость, при которой HD дорожка будет успевать передаваться через USB-Serial - это 125000*(8+2) = 1250000Кбит/с. Для DD дисков, соответственно, 625000 Кбит/с.

    Таким образом для работы с HD дисками скорость работы UART должна быть 2Мбита/с, а для DD дисков достаточно 1Мбита/с. Это необходимо учитывать.

    Что нужно:
    1. Arduino (варианты)
    - а) Устройство на ATMega328 (16mhz), типа того как на рисунке (Arduino Pro Mini) + USB-Uart контроллер - FTDI-совместимый (т.к. без труда 2Мбита прокачивает). CP2102 не подходит (макс 1Мбит).
    - б) Вероятно будут работать и Arduino Uno (на AtMega328-16), и другие платы с интегрированными USB-Uart адаптерами на FTDI/FT232RL, обеспечивающие скорость 2Мбит/с. Это надо проверять.
    - в) Дешевый Arduino Nano, со встроенным CH340 (без кристаллов) - фирмварь прошивается в режиме Old bootloader. На скорости 2МБита работает с ошибками (~0.02% ошибок), на 1Мбита - ошибок нет, т.е. пойдёт только для DD дисков.
    2. Обвязка ардуины
    - бредборд (монтажная доска).
    - соединительные провода (возможно и без бредборды, если цеплять к самим ножкам ардуины).
    - 1кОм сопротивление (для подтягивания линии данных до 5в).
    - блок питания и шлейф для FDD.
    3. На хостовом ПК
    - Windows>=7, вроде и Linux и MacOS (но это не проверялось).
    - python>=v3.6. Библиотека pySerial
    - Arduino SDK.

    Запись дисков не предусмотрена (и, вероятно, не будет), поэтому ардуиновые ножки A0/A1/A2, и 3 не задействованы. Кроме того, поменяны местами ножки 4 и 8 (это все в сравнении с проектом Роба Смита).

    Если используется Arduino с UART, не дающим безглючные 2Мбита, то HD диски читать не получится. Однако, с DD дисками возможно будет работать. Для этого необходимо сообразно поправить скетч (.ino файл строка вначале "#define BAUDRATE 2000000"), и сам .py файл (строка "ser.baudrate=2000000"), на, соответственно 1000000.

    Схема:


    Мой сетап:


    Питание для дисковода отдельное. Шлейф - родной спектрумовский. Ножки 10-12-14-16 разъема соединены между собой на монтажной платке (чтобы было пофигу - перевернут кабель или нет). Шлейф насажен на обычные недорогие контактные штырьки (причём впаяно не всей гребенкой, а по-отдельности штырьки, а для земли всего 1 линия) - покупкой 34-пинового разъема не заморачивался. Шлейф воткнут с обратной стороны (на фото не видно).

    --------
    Зачем вообще? Материнки перестали делать с FDD контроллерами, raw driver никак не подцепишь. Да даже если подцепишь — этот raw driver весьма ограничен в своих возможностях «подкрутить» параметры чтения, что мешает нормально читать некоторые не очень качественные диски.
    Ардуино — дёшево, и сердито (это попытка выжать максимум из 8мибитного 16мгц микроконтроллера с 2кб ОЗУ), прекрасно работает с 5в устройствами, и есть почти в каждой российской семье. Люди относятся к Ардуине, как платформы для захвата, весьма скептически. Вот и посмотрим.


    Альтернативы:
    - greaseweazle - неплохой проект, работает на недорогой STM32 "blue pill", захватывает поток по таймингам не хуже kryoflux, но плохо дружит с 5.25" дисководами (вроде этот аспект недавно поправили - дребезг оптического датчика индекса теперь _вроде_ фильтруется). Но хостовая часть пока мало что позволяет. Плюс он появился позднее, чем я начал свой проект, так что пусть.
    - Arduino floppy disk reader/writer - проект-предок сабжа. Умеет даже писать, но не всеядный - ориентирован на Амиги, и вообще, достаточно плохо оптимизирован с точки зрения firmware, не умеет HD диски, тайминги захардкодены. То есть очень узкозаточенный.
    - FluxEngine - неплохой вариант. Построен на достаточно экзотичной плате CY8CKIT-059, которая дороже Arduino раз в 10 (но с учетом необходимого FTDI - всего раз в 5), умеет писать некоторые форматы, но спектрумских вообще не знает.
    - всякие дорогие устройства (сами знаете).

    --------
    Текущая версия скрипт + фирмварь:
    0.01b http://volutar.eu5.org/afd001b.7z


    --------
    История изменений:
    2020-08-07 v0.01b - подстройка под тайминги для каждой дороги, дорожки за 80й обрезаются (если пустые), вывод красивой статистики
    2020-08-05 v0.01a - первый релиз, сохраняет UDI, настроена на стандартные тайминги DD дисков 32/48/64 (4/6/8мкс)
    Последний раз редактировалось Dexus; 20.09.2020 в 10:28.

  2. Эти 4 пользователя(ей) поблагодарили Dexus за это полезное сообщение:

    Black Cat / Era CG (05.08.2020), Eltaron (07.08.2020), newart (11.08.2020), ^m00h^ (05.08.2020)

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

  4. #2
    Сибирский антропоморфн Аватар для Black Cat / Era CG
    Регистрация
    06.05.2010
    Адрес
    Бердск, НСО
    Сообщений
    4,560
    Спасибо Благодарностей отдано 
    922
    Спасибо Благодарностей получено 
    871
    Поблагодарили
    635 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Dexus Посмотреть сообщение
    Каким образом можно ответить в теме, не приклеивая к предыдущему сообщению, без вот этой шняги с "Добавлено"?
    Мне нужно новое сообщение, не трогая нуль-поста.
    Ждать...

    - - - Добавлено - - -

    Или писать новое сейчас вот
    Личка заполнена! И чистить я ее не буду! Пользуйтесь адекватными средствами связи! Спасибо.

    Seamos realistas y hagamos lo imposible!

    Ernesto Che Guevara
    Переехал сюда: SteinBlume (ex ATM CP/M Explorer)
    http://era-cg.su

    Скрытый текст

    Speccy2010 r2 (Спасибо m.d. & xlat),
    Sinclair ZX Spectrum + (Спасибо stepmotor),
    ZX Evolution rev.C + 5'25 FDD Epson SD-700AA + NedoPC PAL-Coder (Спасибо m.d. & xlat)
    [свернуть]

  5. Этот пользователь поблагодарил Black Cat / Era CG за это полезное сообщение:

    Dexus (05.08.2020)

  6. #3
    Veteran
    Регистрация
    04.08.2005
    Адрес
    Nizhnevartovsk
    Сообщений
    1,007
    Спасибо Благодарностей отдано 
    75
    Спасибо Благодарностей получено 
    114
    Поблагодарили
    77 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Смотрю тут, насколько удобно будет выводить "содержимое" дорожки для юстировки пороговых значений...
    Если брать просто усредненное, то там не факт что поможет. Вот например:
    Код:
    Arduino floppy dump utility v0.01b (UDI)    (c) 2019-2020 by Denis Dratov
    
      Port:  COM6 - AFD device, firmware version 1.0
    
    Rotation speed: 300.2883 rpm
    Probing track stats, to figure thresholds..
    us-----2|------3|------4|------5|------6|------7|------8|------9|
                    ,Xx.       .xX#-                                
                    #Xx.       .xX+.        .,...                   
                    X%+.       ,xx.        ....                     
                    %+                                              
                   .%-                                              
                   +%                                               
                   XX-       xx#+                                   
                 x#Xx-   . ,+xx+.   .  .,...                        
     .     ,..-xX#-,,,,,...,,.,,.,,,.,,,,.,..,... .  .. ....  . ... 
          .  . ,---++--+++++--+-----------,----,,-,... ..... ...... 
             ,----+++++x++++----+-----+----,-.,.,...  . .. ...,.   .
        . .,,-.-,-+-----+--,+-+++---+---,,,----,,,,,......... . ....
          ...,-,+++++++---------,,-,-.,,-,--,,,,--.,.-,,,,,..., . ..
          ...,.x#+++xxxx++,.,. ,....                 .,,,-,.        
               +%                                                   
                %,                                                  
                %+                                                  
                %%..     ,.,.                                       
                 ##x,.  .+x##,     .....                            
                 %+-..   .-++..    .....                            
                 %X                                                 
                 x%                                                 
                 .%,                                                
                  X#x.     .xx#x.                                   
                  +%x-.     -+x+.      ..,.,                        
                  -%,                                               
                   %X                                               
                   X%                                               
                   +%+,        -x+.                                 
                    #X+        .##+.        .,,.                    
                    X%.         ,..         .,                      
                    x%-                                             
                    ,%#                                             
                     %%                                             
                     x%,         ,#+#-          ...                 
                     +%#         .++x,         .,..                 
                      %%                                            
                      #%,                                           
                      ,%X                                           
                       %X           +xx+                            
                      .#%.          ,x#x.          .,,.             
                       x%+                                          
                       +%X                                          
                        %%                                          
                        %%,              .                          
                        #X+          .x#x#-           , .           
                       .x%#           -+,+,           ...           
                         %X                                         
                        +%X                                         
                        +%X                                         
                       .#Xx          ,xxxx,                         
                       ,X.           +###-                          
                       #x          .x##x,                           
                     .x#.         +###x                             
                     ##.       .x#Xx-                               
                  .x#x     -+x##x+,                                 
                 ,Xx     xx##+                                      
                  +xx+   .++xxxxx-                                  
                    .#x        +#X#.                                
                    ,X+        x#X#.                                
                     ##.       -x##x.                               
                     ##.       .x##+                                
                     x#.        +#X#.                               
                     x#         -###-                               
                     ,X.         ####.                              
                     .X+         -###-                              
                      #x          -XX-                              
                      x#          .#X#.                             
                      +X.          ,XX-                             
                      .X-           ##X.                            
                       Xx           +XX,                            
                       #x           .XXx                            
                       ##            #X#                            
                       ##            ###.                           
                       ##            #X#                            
                       ##            #Xx                            
                       ##            XXx                            
                       #x           -XXx                            
                       Xx           +XX+                            
                      .X+           x#X,                            
                      .X-           X#X.                            
                      .X,           X#x.                            
                      -X.          -XXx                             
                      +X           x#X-                             
                      xX.          ##X,                             
                      ##          .X##,                             
                      ##          ,X##.                             
                      #x          +XXx                              
                      X+          xXX-                              
                     .X-          x#X-                              
                     ,X.          ##X,                              
                     .X-          ##X                               
                     ,X-         .X##,                              
                     -X+         -X#x                               
                     +X-         +XX+                               
               .     x#.        +###                .
    Я уже показывал этот диск в соседней теме, но в графическом виде:


    Очень сильно плавающие значения. Это максимальное разрешение по времени (сверху вниз, каждая строка - информация о таймингах на 128 512 поворотов доменов). Если для каждого куска использовать свои пороги - в принципе даже что-то можно вытащить (конечно, не того участка который почти в самом начале - там дохлый номер). Но если первым этапом сканировать нулевую дорожку, и использовать усредненные тайминги для прочитки всего диска...

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

    Но если такую логику применить к этому диску - на первой же дорожке фейл. Т.е. усредненное будет мусорным, прочитать ничего не сможет с константным значением, взятым из этой кривой нулевой дороги.
    И тут ведь как повезёт - первая дорога может быть отличной, а следующие все с другими, кривыми таймингами. В таком случае он будет впустую шлёпать до конца с относительно быстрой скоростью... просто потом ещё разок будет читать, но в 2 раза медленнее, по фактически всем дорожкам.
    Как быть? Не хотелось бы городить лишние параметры. Учитывая, что заранее ведь человеку неизвестно насколько там всё плохо...
    Даже брать пару дорожек, и усреднять их может не помочь...

    Вот так будет выглядеть утрамбованная в 4 раза "картинка":
    Код:
                    %%#,       ,X%X-       .,-,..                   
                 x#%%+   . ,+###+   .  .,...                        
     .  . .--++#XXxxxxx##xxxxxxxxxxxxxxxx+++x++-++--,,,,,-,,..-,,,,.
          .,.--#%xxx#x#xxx-------,---.,,-,--,,,,--.,.------,.., . ..
                %%#x,,  .+###,.    ,...,                            
                 %%#x.     .xx#x.                                   
                  +%%-.     -+x+.      ..,.,                        
                   +%%x        -X#+.        .-,.                    
                    ,%%#         -#x#+         .,..                 
                      %%%           +xx+                            
                      .X%%          ,x#x.          .,,.             
                       .%%%          .x#x#+           -..           
                       ,%%%          +XXXx,                         
                  .x##X%x  -+x####X#X%Xx,                           
                 ,X##%#  x#XX#x#%%X,                                
                     %%.       -X%%%-                               
                     ,%%         #%%%#.                             
                      +%#          ,%%%x                            
                       %%            %%%.                           
                      .%X           #%%#                            
                      x%+          #%%%.                            
                      %%.         x%%%-                             
                     -%x          %%%+                              
               .     #%x        +#%%X,              .
    Выводить на второй стадии для каждой дорожки, на которой были ошибки CRC, такое вот ASCII'шное "художество"?
    ~20 строки на дорожку DD диска, соответственно ~40 для HD (которые PCшные, 1.2/1.44). В принципе, для HDшных можно ужимать в 8 раз, чтобы не засирать экран ими.
    Символы для отображения плотности сделал пока .,-+x#X% - можете предложить свои варианты.


    Есть вариант объединить 1й и 2й проход. Т.е.:
    0. Сканировать 0ю дорогу, взять из нее усредненные тайминги.

    1. Читать дорогу с усредненными таймингами (с предыдущего шага).
    2. Если были ошибки - сканировать тайминги, и повторно перечитывать дорогу с подробными таймингами. Взять из них же усреднённые, "на будущее".
    3. Следующая дорога, шаг №1

    Таким образом усреднённые тайминги будут перестраиваться по ходу чтения в случае сбоев, и использоваться для следующих дорожек.
    Последний раз редактировалось Dexus; 12.08.2020 в 12:18.

  7. #4
    Veteran
    Регистрация
    04.08.2005
    Адрес
    Nizhnevartovsk
    Сообщений
    1,007
    Спасибо Благодарностей отдано 
    75
    Спасибо Благодарностей получено 
    114
    Поблагодарили
    77 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    0.01b http://volutar.eu5.org/afd001b.7z
    - Капчурятся 83 дорожки, но если последние пустые - в образ они не сохраняются.
    - Собирается статистика, выбираются значения для MFM порогов (из-за этого дорожка читается дважды)
    - Статистика выводится для КАЖДОЙ дорожки (и поэтому скорость медленнее для всего диска)
    - Сохраняет журнал в dump.log
    - Если имя не указано в параметре - спрашивает его после захвата, перед непосредственным сохранением
    - Обновлена фирмварь, пороговые значения повышены до 192 (вдруг это SD диск)

    Загрузка со статистикой выглядит подобрым образом:
    Код:
    Rotation speed: 300.2883 rpm
    
                           .:        V            V                 
                           ::               ..                      
                          :::.             :::                      
                          :::::           ::::.            .        
                          :::::.         ::::::          .:::       
                          ::::::         ::::::         ::::::      
                 :     :.:::::::        .:::::::        ::::::      
             . .:::.::::::::::::: :.: ::::::::::  ... .:::::::. :.  
    us------2-------3-------4-------5-------6-------7-------8-------9
    Track type: MFM/DD   Period=4.00us    Quality: 90.61%
    000: T000:0 len256  01 09 02 0A 03 0B 04 0C 05 0D 06 0E 07 0F 08 10 
    
                           .:.    V                  V              
                           :::.           .::.                      
                          :::::          :::::            .:        
                          ::::::         :::::.          ::::       
                          ::::::         ::::::         :::::.      
                         .::::::        :::::::         ::::::      
                    .   .:::::::.       :::::::         ::::::   .  
                ::  :...:::::::::. :::..:::::::: ...    ::::::.  :  
    us------2-------3-------4-------5-------6-------7-------8-------9
    Track type: MFM/DD   Period=4.00us    Quality: 91.26%
    001: T000:0 len256  01 09 02 0A 03 0B 04 0C 05 0D 06 0E 07 0F 08 10
    Буковками V обозначается место, которое автоматом выбирается для порога (всего два порога)
    Последний раз редактировалось Dexus; 07.08.2020 в 01:54.

  8. #5
    Veteran
    Регистрация
    04.08.2005
    Адрес
    Nizhnevartovsk
    Сообщений
    1,007
    Спасибо Благодарностей отдано 
    75
    Спасибо Благодарностей получено 
    114
    Поблагодарили
    77 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Словом, HD диски, которые 1.44, капчурятся без особых проблем (что с прошивкой Роба Смита было невозможно).
    Статистика выглядит вот так:
    Код:
           .:                                                       
           ::       :                                               
           ::      ::       .                                       
           ::      ::      .:                                       
           ::.     ::      ::                                       
           :::     :::     :::                                      
        : ::::.. .::::    ::::                                      
       :::::::::::::::..  ::::: :   ... ..      : ...  .  :::     :.
    us------2-------3-------4-------5-------6-------7-------8-------9
    А неформатированные вот так:
    Код:
                .::::::......                                       
              :::::::::::::::::::::::::....................         
            .:::::::::::::::::::::::::::::::::::::::::::::::::::::::
          .:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    .... .::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    us------2-------3-------4-------5-------6-------7-------8-------9
    Почему там от 2.5микросекунд идет спад - хз. Это 5.25" дисковод, и возможно, что просто быстродействия компонентов не хватает чтобы в этой шустрой части спектра было достаточно насыщено. На 3.5" дисководе неформатированные пока не смотрел. Но там 2мкс тайминги спокойно захватываются, влоть до ~1.4мкс (цикл захвата соптимизировал как смог). В общем-то мне 3.5" постольку поскольку - весь архив в 5.25".

    - - - Добавлено - - -

    Сейчас размышляю о том, каким образом лучше создавать "кривую скорости". Т.е. чтобы справиться с ситуацией из поста №3. Какой-то чуть более хитрый, двухмерный стат.анализ надо привлекать..

    А помимо этого еще есть вот такие ситуации:
    Код:
    us------2-------3-------4-------5-------6-------7-------8-------9
                           X%x.           .x+-           .          
                     .  . .xX#-.         .x##x-          .....      
                         xXx-xX-..     -+.. ..,--,     .... ...     
                         X#. .##-.    .++.   ..-+,     ..    . ..   
                         #X  +%+                                    
                         .X#+Xx                                     
                          .xXx.          .+##+.            ,. .     
                   .      -XX#.          .,xx             ...       
                          xX+Xx,        .-++++-.          ,,...     
                          +%#X.                                     
                          ,%#X                                      
                .         x#,#x-        .xx, xx.         .  .       
                        . x###x,        .-x+++-.        ...,....    
                           +%+.           ,xx+             -,.      
                           #%                                       
                       .   -##x        .  x##+            -+-.      
                         .+#x#x,         +x++x+,.       .,.....     
                          x#,+xx+.     .+x+ -++-.      .+-, ,+-.    
                          -#xxx+,       ,xx-xx+.        ,--,--.     
                          .+#xx-         ,xxxx.         .-x+++      
                           xX#,          .x##x.           ....      
                         -x#xxxx-.     ,+++--x+-,      .,., .-,..   
                         +#-  +xx+     +x,   ,+x-     .-+.   ---,.  
                         +#-  +xx+.    xx.   -+x+.    ,+-,   -+-,   
                         -xx+xx--.     -+xx-+xx-..     .-.  ..,,.   
                           #%x,          .+#x-         .  --,       
                          -x##x-         ++xx-,         .-+x+..     
                          -x#xx+         +xx+x,          --+--.     
                      .   +xxxx+. .      +x++x+.        .-+-+,.     
                          xx.-#+.       -#+. +#+        . .  ..     
                  ..     .,###x.         -xxx+.           -++,      
                           +##+           +#x+           .+x+.      
                           +##+           +xx,           .+x+,      
    
                           :..           ..  .                      
                          .:::.          :: ::           .  .       
                          :::::          :::::.          :..::      
                          :::::         .::::::         ::::::      
                          :::::.        :::::::         :::::::     
                          ::::::        :::::::         :::::::     
                     :.:  ::::::       .:::::::       . :::::::     
              ..  ..:::::.::::::. :: .::::::::::.: ::::::::::::.   .
    us------2-------3-------4-------5-------6-------7-------8-------9
    Что тут? Очевидно, перемагниченные области, в которых сдвигается магнитная поляризация целых фрагментов дисков. Таким образом все четные домены оказываются чуть короче, а нечётные - длиннее (общая длительность остается той же, просто сдвигаются границы в + или в -).
    Линии "раздваиваются". Если "плюс" одной полоски пересекается с "минусом" другой (т.е. эти раздвоенности залазят на соседние) - уже стандартным способом не прочитаешь. Тут либо надо читать полный RAW, в котором и четные и нечетные тайминги будут очевидны. И тогда можно компенсировать, "выровнять" эти расплывы (но на это Ардуино скорее всего не способен, ибо памяти мало чтобы все читать без обработки), либо изобретать какой-то способ раздельного чтения четных и нечетных полосок, с последующей рекомбинацией... Нормализацию четных-нечётных доменов, кстати, и greaseweasle не умеет (хотя это ему ничего бы не стоило).

    Вообще, я даже не знаю насколько это нужно, насколько востребовано, есть ли вообще такие "ушатанные" магнитными полями диски. Все мои в принципе читаются и так, полоски друг на друга не налезают... Но, допускаю, что у людей могут быть такие нечитаемые никакими ухищрениями диски... Но, возможно, от них уже давно избавились, не дождавшись "волшебных утилит"...

    Чтобы выводить "подробный" график дорожки, в текущей версии (0.01b) достаточно раскомментировать строку №182 (# print_ba(stats[a-64:a])). Если у кого-то есть подобные кейсы - прошу делиться.
    Последний раз редактировалось Dexus; 07.08.2020 в 23:33.

  9. #6
    Veteran
    Регистрация
    04.08.2005
    Адрес
    Nizhnevartovsk
    Сообщений
    1,007
    Спасибо Благодарностей отдано 
    75
    Спасибо Благодарностей получено 
    114
    Поблагодарили
    77 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Есть некоторые затруднения с анализом статистики
    Такой пример:
    Код:
    us------2-------3-------4-------5-------6-------7-------8-------9
                         x#,  xx+..   -#x.   .,+x+.   .,,    .....  
                         +#x .+x++,   ,+x,   +x+-.    ,++.  .--,,   
                         #x, .x+x,.   .x#,   .-xx,     .,     ...   
                        .x#, .xxx..   ,#x    .,xx-    ,,.   ...,.   
                         x#- .#x--.   .+x.   ,-++.     ,-   ..,,,   
                 .       ##. .#++    .,x+. .  +-+,      .           
                   .     +#+.,x+x+.   .xx, ..-+++.    .--.  .---,.  
                         xx,  x+x-    -#x-   .+xx+.    ...   ....   
                         x#, .xx-.    ,#x,   .-+#-     .,.    ..,   
                         +xx.,++x+,   ,+x-. .+++-.    ,++,  ,-+--   
                         +#, .xx-.  . +#x,   .-x+x,    ..    ....   
                         +#+ ,xx-,    .x#-.  ,-xx.      .   ..,,..  
                     .   +#+ +x+x,   . xx-, .-x+x-      .,   . .
    Тут - обычный MFM. Должно быть 3 полоски. но их тут 6. Это и есть то самое перемагничивание. Четные импульсы удлиняются, нечётные укорачиваются
    Происходит вот такое:
    Код:
    -------\               /------\
            \             /        \
    +++++++++\-----------/++++++++++\------
              \         /            \
               \_______/              \____
    
    -----\                   /--\
          \                 /    \
    +++++++\---------------/++++++\--------
            \             /        \
             \           /          \      
              \         /            \
               \_______/              \____
    Соответственно, выделять первые три (две) полоски для разметки таймингов для таких вот дисков - нельзя. Тут надо делить на четные и нечетные. Проблема в том что есть плавающая скорость, а есть плавающая перемагниченность, и их нужно обрабатывать соответствующе. Поскольку изменение скорости влияет на 1.5х и 2х длительности как множитель, а перемагничивание влияет как суммирование. Если это просто скорость - тут проблем нет. Можно за счет динамического изменения пороговых значений, которые перед чтением впихнуть в ардуину перед чтением MFM потока.

    Но для каждой такой "перемагниченной" дорожки нужно несколько раз считывать статистику четных и нечетных (несколько - потому что нет никакой гарантии, что чтение начнется с четной или не четной - импульсы одинаково кодируются). Потом находить траекторию по каждому потоку - четному и нечетному, если они совпадают - значит перемагничивания нет, и можно читать без четного/нечетного, если расходятся - значит есть перемагниченность, и тогда нужна ОТДЕЛЬНАЯ процедура чтения, в которую нужно впихивать два массива для компенсации внутридорожной динамики - помимо пороговых значений, еще и отклонения для четных-нечетных импульсов. А потом читать дорогу, возможно несколько раз, поскольку также нет никакой гарантии, что четные попадут на четные.

    Сразу понять что в дороге есть эта перемагниченность в принципе можно - статистика для них будет не из трёх бугров состоять а как минимум четырёх. Но это не обязательно - если там плавает скорость (как в примере из поста №3), то количество бугров вообще ничего не значит - там они все дико размыты:
    Код:
                .  ...  ..  :::      .                              
                ::::::::::.:::::..::::                              
                :::::::::::::::::::::::.                            
               ::::::::::::::::::::::::::                           
               ::::::::::::::::::::::::::.                          
               ::::::::::::::::::::::::::::.:.::    ..  . .::..     
              ::::::::::::::::::::::::::::::::::.::.:::.:.::::::.:::
      : :: :  ::::::::::::::::::::::::::::::::::::::::::::::::::::::
    us------2-------3-------4-------5-------6-------7-------8-------9
    В случае плавающих скоростей - нечетких бугров, необходим такой вот многократный сбор статистики, чтобы при чтении компенсировать все эти плавающие штуки (если они там имеются). Достоверно и быстро задетектить треки с перемагниченностью не так-то просто, если они маскируются плавающей скоростью. Поэтому придется раз по 10 читать дорожку чтобы все тайминги вытащить с вероятностю в 95%. Ведь возможно что так не повезет, и перемагниченный трек будет 10 раз подряд прочитан по четным импульсам вне зависимости от пропуска одного импульса, и тогда утилита не увидит разницы между четными и нечетными, подумает что это просто скорость плавает. И трек все равно не прочитается.
    Последний раз редактировалось Dexus; 11.08.2020 в 00:50.

  10. #7
    Veteran
    Регистрация
    04.08.2005
    Адрес
    Nizhnevartovsk
    Сообщений
    1,007
    Спасибо Благодарностей отдано 
    75
    Спасибо Благодарностей получено 
    114
    Поблагодарили
    77 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Один и тот же фрагмент статистики, взятой разными способами (это диск isdos, приличная часть секторов которого не читается):
    Код:
    Общий                   -X#,        .xxxx,         .xx          
                            -%x          x+.#-          -x+         
                            -Xx         .x+-#.          -#.         
                            +Xx         ,#--x-          -x,         
                           xx-#xx.      .xxxx,        -x+.          
                          +x, ,xxx+,  ,+++  +++    .+x+-            
                         -#.   ..xxx++x-..    x+  -#,        .      
                          #-    xx   x#-      xx-#,                 
             .      .    .X+,#-.++...+x,.  ..,x..+-.,.      .  ..   
                          xx .  +x+x-,xx.   -xx   .xx,              
                           x+  +##+    ,xx +x-      ,x+             
                           +#  xx#.     ,#-#+        -x-            
                           .#,+#x+       +#x.         +x,           
                            +##x        ,xxxx,         -x+          
                            ,X#.        xx .xx          -#.         
                            .X#,        xx..xx          xx.         
                            +##x        .xxxx          -x-          
                            #-x#x        .#x           #+           
    us------2-------3-------4-------5-------6-------7-------8-------9
    Четный                  ,##-         xx                         
                            -#x          #+                         
                            .#x          x+                         
                            +#x         ,#-                         
                             -#xx.        -+x.                      
                              ,xxx+-        +x+                     
                               ..xxx+.  .    .#+             .      
                                xx            xx-#,                 
             .              .#-,+-.,      ...,x,.+-.        .  ..   
                             .  +x+x-       ,xx                     
                               +xx+.       +x-                      
                               xx#.       .#+                       
                              +#x+       .xx.                       
                             x#x.       ,x+.                        
                            .##.        xx.                         
                            ,##.        +x.                         
                             +#x.       .xx.                        
                             .x#x        ,x+                        
    us------2-------3-------4-------5-------6-------7-------8-------9
    Нечетный                -#.           .+x,         ,xx.         
                            .#,            ,#-          ,x+         
                            -#             -#.          -#          
                            -#,            -x+          ,#,         
                           xx.          .x++          -x+,          
                          +x,         ,+++          +x+,            
                         ,#.        .+x-.         -#-               
                          #-         x#-                            
                    .   .,X+.        +x,.           ,.              
                          xx         -x+,         .xx,              
                           xx          ,x+          ,xx             
                           +#           -#-          -#,            
                           .#.           +x-          xx,           
                            +x.           .xx.         -x+          
                             #,             xx          -#          
                             #.            .x+          xx.         
                            +x            .xx.         -x-          
                            #-            xx          .x+           
    us------2-------3-------4-------5-------6-------7-------8-------9
    Чётный/нечётный берутся на "как повезет", т.е. нет 100% гарантии что загрузится именно чётный а не нечётный, и в ~20% случаев чётный равен нечётному. По факту-то, конечно, это не так (не равны), но в силу неидеальных таймингов электроники дисковода, пропуск одного магнитного импульса после появления индекса не помогает.

    В общем, сейчас дошел до такого алгоритма (в случае ошибки чтения дорожки в быстром режиме):

    1. Загрузить ОБЩУЮ статистику
    2. Загрузить статистику через один импульс (как повезет - 80% нечётную и 20% чётную)
    3. Вычислить разницу между общей и половиной и проанализировать:
    А) Половины почти совпадают (отклонения несущественные) - значит перемагниченности нет (эту характеристику, кстати, неплохо было бы выводить в инфо о треке).
    Б) Половины заметно не совпадают - значит дорожки имеют перемагниченность. В таком случае необходимо вычислить кривую для компенсации перемагниченности (№1), с учётом того, что в разности будет выпирть чётный.
    4. Усреднить общие-нечётные, и составить кривую пороговых значений, компенсирующую плавающую скорость (№2). Также вывести величину неравномерности скорости.
    5. Читать дорожку в режиме "особый", с кривыми скорости и перемагниченности. В 80% случаев она будет прочитана как надо, и в 20% случаев компенсация перемагниченности усугубит картину. За несколько попыток всё должно будет прочитаться (1-80% 2-96% 3-99.2% 4-99.84% 5-99.97%).

    Но если и в этом случае будут проблемы, необходимо дампить "сырые" данные таймингов, и делать что-то с ними. Хотя скорее всего это будет означать что там плавающие биты, либо дорога местами физически провреждена, либо размагнитилась (когда граница между + и - размывается до исчезновения). Ну, в этой ситуации... мы... просто наша, эта самая... мы уже здесь наши полномочия всё, окончены.

    ЗЫ: Процедуру особого чтения уже сделал, перед чтением дорожки нужно загрузить массив порогов и четно-нечетных отклонений. По 3 байта на каждый "чанк" (который равен 128 байтам, т.е. 512 MFM импульсам). По сути остается всю эту алгоритмику, анализ статистики и вычисления графиков в питоне запрограммировать.
    Последний раз редактировалось Dexus; 12.08.2020 в 13:37. Причина: более веселый пример

  11. Этот пользователь поблагодарил Dexus за это полезное сообщение:

    SoftLight (12.08.2020)

  12. #8
    Guru
    Регистрация
    15.09.2009
    Адрес
    SPb
    Сообщений
    7,163
    Спасибо Благодарностей отдано 
    230
    Спасибо Благодарностей получено 
    262
    Поблагодарили
    190 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Dexus Посмотреть сообщение
    Альтернативы:
    - greaseweazle - неплохой проект, работает на недорогой STM32 "blue pill", но плохо дружит с 5.25" дисководами. Плюс появился позднее, чем я начал свой проект.
    - Arduino floppy disk reader/writer - тоже неплох. Умеет даже писать, но не всеядный - ориентирован на Амиги, и вообще, достаточно плохо оптимизирован с точки зрения firmware, не умеет HD диски, тайминги захардкодены.
    - всякие дорогие устройства (сами знаете).
    Так а чем плох FluxEngine ?
    Я тоже часто предпочитаю делать свои устройства, потому что мне нужно не всегда то, что удобно всем. Но обычно у меня есть четкие 2-3 пункта, по которым я могу отличить возможности моего поделия от имеющихся. В данном случае такие пункты есть? Или просто еще один велосипед?

  13. #9
    Veteran
    Регистрация
    04.08.2005
    Адрес
    Nizhnevartovsk
    Сообщений
    1,007
    Спасибо Благодарностей отдано 
    75
    Спасибо Благодарностей получено 
    114
    Поблагодарили
    77 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от dk_spb Посмотреть сообщение
    Так а чем плох FluxEngine ?
    ХЗ.
    Я понятия не имею, работает ли он с важными для нас TRD/FDI/UDI/HFE (что в моем планируется).
    И также я понятия не имею, умеет ли он подстраиваться под плавающую скорость и перемагниченные поверхности (что в моем также достаточно приоритетно).
    Цитата Сообщение от dk_spb Посмотреть сообщение
    Или просто еще один велосипед?
    Да, максимально дешёвый велосипед из говна и палок, который сможет читать даже убитые диски, не читающиеся обычными контроллерами.

  14. #10
    Guru
    Регистрация
    15.09.2009
    Адрес
    SPb
    Сообщений
    7,163
    Спасибо Благодарностей отдано 
    230
    Спасибо Благодарностей получено 
    262
    Поблагодарили
    190 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    FE тоже умеет подстраиваться. Цена готовой платки - 10$ (надо только разъем IDC34 припаять).
    Можно и BluePill использовать.

    >Я понятия не имею, работает ли он с важными для нас TRD/FDI/UDI/HFE (что в моем планируется).
    >И также я понятия не имею, умеет ли он подстраиваться под плавающую скорость и перемагниченные поверхности (что в моем также достаточно приоритетно).
    Странно, Вы же о нем сами писали.
    https://zx-pk.ru/threads/31038-greas...ght=fluxengine

    > Да, максимально дешёвый велосипед из говна и палок, который сможет читать даже убитые диски, не читающиеся обычными контроллерами.
    Ну то есть еще один. Никаких принципиальных отличий нет.

Страница 1 из 4 1234 ПоследняяПоследняя

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

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

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

Похожие темы

  1. Arduino Floppy Disk Reader
    от SoftLight в разделе Внешние накопители
    Ответов: 44
    Последнее: 05.08.2020, 01:06
  2. HCDisk 2.0 - PC disk utility.
    от Djoni в разделе Утилиты
    Ответов: 3
    Последнее: 17.09.2016, 00:37
  3. TZX/TAP utility for iPhone: Speccy Tape
    от Poopi в разделе Утилиты
    Ответов: 13
    Последнее: 02.07.2015, 08:13
  4. Data Glue Utility
    от dM_GBG в разделе Софт
    Ответов: 8
    Последнее: 22.11.2011, 12:40

Ваши права

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