Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature Request] Support for FluxEngine and greaseweazle #2

Open
nightgryphon opened this issue Oct 30, 2022 · 11 comments
Open

[Feature Request] Support for FluxEngine and greaseweazle #2

nightgryphon opened this issue Oct 30, 2022 · 11 comments

Comments

@nightgryphon
Copy link

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...

@weshatheleopard
Copy link
Owner

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

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

@nightgryphon
Copy link
Author

nightgryphon commented Oct 31, 2022

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

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

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

@weshatheleopard
Copy link
Owner

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

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

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

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

@nightgryphon
Copy link
Author

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

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

@weshatheleopard
Copy link
Owner

weshatheleopard commented Oct 31, 2022

Утилита от 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

@nightgryphon
Copy link
Author

что-то у меня ключи --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>'

@nightgryphon
Copy link
Author

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

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

@weshatheleopard
Copy link
Owner

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

@nightgryphon
Copy link
Author

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

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

@nightgryphon
Copy link
Author

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

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>'

@weshatheleopard
Copy link
Owner

weshatheleopard commented Nov 3, 2022

  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
    Если прочиталось — то отлично, можно сохранять. Если нет — то можно этим значением поиграться, каждый раз уменьшая/увеличивая его на пару десятых (каждый раз придётся загружать файл дорожки по новой). Если и после этого не читается — то делать нечего, надо смотреть вручную.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants