Menu

#2 [Feature Request] Support for FluxEngine and greaseweazle

open
nobody
None
2022-11-03
2022-10-30
Anonymous
No

Originally created by: nightgryphon

I've built an opensource GreaseWeazle floppy reader and trying to read/decode and encode/write BK floppies usinf FluxEngine software.
Unfortunately it seems FluxEngine decoder unable to decode some of my weared floppies and the FluxEngine encoder can not write correct data from existing image to new BK floppies :(

It will be cool to have an utility to debug and rescue old BK floppies using open source GreaseWeazle reader hardware or using flux data readed by open source FluxEngine. Also to write floppies from raw images...

Discussion

  • Anonymous

    Anonymous - 2022-10-31

    Originally posted by: weshatheleopard

    Ночной, ты что, своих не узнаёшь?

    "Лечение" треков у меня уже есть, см. MfmTrack#cleanup. Посмотри — может, вытянешь. Вот обратной конвертации из MfmTrack в KryoFluxReader пока нет, потому как не требовалось. Скажи — если будет надо, напишу.

     
  • Anonymous

    Anonymous - 2022-10-31

    Originally posted by: nightgryphon

    Узнаёшь, но все же типа международная площадка всё такое ;) После подыхания телефона контактов много посеялось.

    У KryoFluxReader свой формат, сходу тулзы для конвертации из FluxEngine в его формат не нашел, так что не получается твою библиотеку использовать пока к сожалению. С самой МФМ записью пока не разбирался как генерится сигнал.
    Во FluxEngine заявлена поддержка БК800 дискет, но что-то декодирование странный результат дает, а новое записал - БКшка не видит.
    Так что если будет настроение допилисть генерацию, а то и прям запись - будет очень круто =-.-= Запись можно через опенсорсный GreaseWeazle, он из bluepill (микро девборда STM32) за полчаса паяется подлапными средствами. Цепляется на УСБ как виртуальный ком порт через него работает.

    Так-то я сделал свой контроллер на СТМ32 который эмулирует и память СМК и флоп и хард, его пользую. А тут надыбал флоповодный контроллер для БК и встрял с дискетами начиная с того что на новых машинах дисковод тупо некуда воткнуть %)

     
  • Anonymous

    Anonymous - 2022-10-31

    Originally posted by: weshatheleopard

    У KryoFluxReader свой формат

    У меня обе платы есть. GreaseWeasle, кстати, поддерживает файлы формата KryoFlux. Но трахаться с исходными файлами было неудобно, поэтому сделал свой формат .trk, где всё в человекочитаемом (и редактируемом) виде. Обратное преобразование .trk -> .raw тоже вполне себе можно написать. Только тогда нужна помощь тестировать.

    С самой МФМ записью пока не разбирался как генерится сигнал.

    На википедии есть, с примерами, посмотри. Всё очень просто.

     
  • Anonymous

    Anonymous - 2022-10-31

    Originally posted by: nightgryphon

    гм. напрямую утилитой от GreaseWeasle не пробовал ибо там не было заявлено поддержки БК, гляну.

    С тестированием помогу конечно чем смогу. Если что есть и осцил и лог анализатор.

     
  • Anonymous

    Anonymous - 2022-10-31

    Originally posted by: weshatheleopard

    Утилита от GreaseWeasle делает прямой снимок диска, то есть её не волнует, от чего диск. Она как ксерокс. Там есть другая утилита для анализа снимков, и вот там уже важен формат, но я ею не пользовался. Кстати, БКшный формат - это стандартный IBMовский на 720 (он же 800, когда на дороже 10 секторов, а не 9).

    Я сохранял свои диски вот таким батничком:

    mkdir %1
    gw read --device=COM4 --drive=B --track=c=0-82:h=0,1:step=1 --revs=10 --retries=2 --rpm=300 --rate=1000 %1/%1..raw
    
     
  • Anonymous

    Anonymous - 2022-11-02

    Originally posted by: nightgryphon

    что-то у меня ключи --rpm=300 --rate=1000 не приняло, сграбил без них. Поставил Руби под виндой и что-то туплю как конвертировать.
    Имя папки с .raw файлами - _new_rec
    На Руби раньше никогда не писал, первый раз его вижу, сорри...

    C:\bktools\lib>irb -I
    irb(main):001:0> $: << '.'
    =>
    ["C:/Ruby31-x64/lib/ruby/site_ruby/3.1.0",
     "C:/Ruby31-x64/lib/ruby/site_ruby/3.1.0/x64-ucrt",
     "C:/Ruby31-x64/lib/ruby/site_ruby",
     "C:/Ruby31-x64/lib/ruby/vendor_ruby/3.1.0",
     "C:/Ruby31-x64/lib/ruby/vendor_ruby/3.1.0/x64-ucrt",
     "C:/Ruby31-x64/lib/ruby/vendor_ruby",
     "C:/Ruby31-x64/lib/ruby/3.1.0",
     "C:/Ruby31-x64/lib/ruby/3.1.0/x64-mingw-ucrt",
     "."]
    
    irb(main):003:0> require 'kryo_flux_reader'; KryoFluxReader::convert_disk '_new_rec';
    C:/bktools/lib/kryo_flux_reader.rb:165:in `convert_disk': uninitialized constant KryoFluxReader::Pathname (NameError)
    
        full_path = Pathname.new(dir).realpath
                    ^^^^^^^^
            from (irb):3:in `<main>'
            from C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/irb-1.4.1/exe/irb:11:in `<top (required)>'
            from C:/Ruby31-x64/bin/irb:33:in `load'
            from C:/Ruby31-x64/bin/irb:33:in `<main>'
    
     
  • Anonymous

    Anonymous - 2022-11-03

    Originally posted by: nightgryphon

    Тэк. С конвертированием формата КриоФлюкс трэков вроде разобрался. Добавил require

    ruby -e "$:<<'.';require 'pathname'; require 'Tools'; require 'kryo_flux_reader'; KryoFluxReader::convert_disk './andos';"
    
     
  • Anonymous

    Anonymous - 2022-11-03

    Originally posted by: weshatheleopard

    1) Можно запустить консоль - из командной строки rake console, тогда ты будешь в интерпретаторе и команды можно вводить по одной.
    2) имена файлов в require задаются строчными буквами (хотя винде пофиг)
    3) convert_disk переведёт набор треков из формата KryoFlux (raw) в соответствующие trk, с которым уже работает моя читалка, см. документацию.

     
  • Anonymous

    Anonymous - 2022-11-03

    Originally posted by: nightgryphon

    попробовал декодировать

    ruby -e "$:<<'.';require 'pathname'; require 'tools'; require 'disk'; require 'mfm_track'; require 'mfm_track'; require 'disk_sector'; require 'colorize'; disk = Disk.load('./andos'); disk.export('./andos.img');"
    

    печаль на первых дорогах :(

    Track 0, side 0, sectors read: 6
    Track 0, side 1, sectors read: 6
    Track 1, side 0, sectors read: 8
    Track 1, side 1, sectors read: 3
    Track 2, side 0, sectors read: 9
    Track 2, side 1, sectors read: 10
    Track 3, side 0, sectors read: 10
    Track 3, side 1, sectors read: 10
    Track 4, side 0, sectors read: 10
    Track 4, side 1, sectors read: 10
    

    плюс при конвертации формата треков последние дорожки странно записывает и декодер не находит файлы, вываливается не записав вообще ничего

    .....
    andos79.1.raw.79.D.trk
    andos80.0.raw
    andos80.0.raw.80.U.trk
    andos80.1.raw
    andos80.1.raw.80.D.trk
    andos81.0.raw
    andos81.0.raw._._.trk
    andos81.1.raw
    andos81.1.raw._._.trk
    andos82.0.raw
    andos82.0.raw._._.trk
    andos82.1.raw
    andos82.1.raw._._.trk
    
     
  • Anonymous

    Anonymous - 2022-11-03

    Originally posted by: nightgryphon

    Переименовал последние файлы, но не помогло :(

    Track 79, side 0, sectors read: 10
    Track 79, side 1, sectors read: 10
    Track 80, side 0, sectors read: 10
    Track 80, side 1, sectors read: 10
    Track , side , sectors read: 0
    Track , side , sectors read: 0
    Track , side , sectors read: 0
    Track , side , sectors read: 0
    Tracks/sides read: 166
    D:/_floppy/bktools/lib/disk.rb:35:in `block in export': undefined method `*' for nil:NilClass (NoMethodError)
    
        tracks.sort_by{ |track| track.track_no * 2 + track.side }.each { |track|\r
                                               ^
            from D:/_floppy/bktools/lib/disk.rb:35:in `each'
            from D:/_floppy/bktools/lib/disk.rb:35:in `sort_by'
            from D:/_floppy/bktools/lib/disk.rb:35:in `export'
            from -e:1:in `<main>'
    
     
  • Anonymous

    Anonymous - 2022-11-03

    Originally posted by: weshatheleopard

    1. Полный диск имеет 80 дорожек, но многие дисководы позволяли иметь 81, а то и 82 дорожки, и некоторые юзеры их тоже форматировали и использовали, поэтому я считываю с запасом. Если видно, что последние дорожки не форматированы (а это видно по тому, что на них не детектируется маркер сектора), то эти файлы просто вручную выкидываю.
    2. Вот то, что у тебя в первых дорожках не все сектора прочитались — это уже проблема пореальнее. Попробуй их обработать отдельно, вручную. Я добавил новый метод для автоматического поиска, попробуй так:

      track = MfmTrack.load("file_name.trk")
      track.find_sync_pulse_length
      Если оно определило и вернуло подходящую длину синхроимпульса, с которой дорожка прочиталась, то можно после этого сделать track.save("file_name.trk") — оно это значение запомнит в самом файле, и с тех пор файл будет читататься нормально.

    Если не прочиталось, то можно попробовать сделать так:

    • определить примерную длительность синхроимпульса: track.scan
    • с этой длительностью сделать чистку дорожки: track.cleanup(значение)
    • после этого попробовать её прочитать: track.read
      Если прочиталось — то отлично, можно сохранять. Если нет — то можно этим значением поиграться, каждый раз уменьшая/увеличивая его на пару десятых (каждый раз придётся загружать файл дорожки по новой). Если и после этого не читается — то делать нечего, надо смотреть вручную.
     

Log in to post a comment.

MongoDB Logo MongoDB