Просмотр полной версии : Подскажите алгоритм определения типа дискеты
Интересует алгоритм определения типа дискеты, т.е. кол-во дорожек (40 или 80) и сторон дискеты (1 или 2). Перечитал кучу книжек по tr-dos и нигде не нашел описание как это делается. Нашел в исходниках TR-DOS 5.04T как определяется кол-во дорожек, но там тоже не все понятно, в частности как выбирать паузу между позиционированием головок. Кол-во сторон в этой версии тр-дос вообще судя по комментариям кода не определяется.
На вопрос "для чего это нужно?" отвечу просто - в целях повышения собственных знаний. Так что если кто в курсе как определяется тип дискеты, то поделитесь опытом.:)
Интересует алгоритм определения типа дискеты, т.е. кол-во дорожек (40 или 80) и сторон дискеты (1 или 2). Перечитал кучу книжек по tr-dos и нигде не нашел описание как это делается. Нашел в исходниках TR-DOS 5.04T как определяется кол-во дорожек, но там тоже не все понятно, в частности как выбирать паузу между позиционированием головок. Кол-во сторон в этой версии тр-дос вообще судя по комментариям кода не определяется.
На вопрос "для чего это нужно?" отвечу просто - в целях повышения собственных знаний. Так что если кто в курсе как определяется тип дискеты, то поделитесь опытом.:)
Я правильно понял, что взять эту информацию с 0 трека не вариант? ;) Чтобы определить сколько дорожек на дискетке, то надо спозиционировать головку на 40 трек и пробовать потреково шагать дальше (например до 45 трека), если не получается, то делать соответствующие выводы. Чтобы определить количество сторон, то надо выбрать нижнюю сторону и попробовать что-то прочитать, если не читается, то значит односторонний диск.
Я правильно понял, что взять эту информацию с 0 трека не вариант? ;)
Да. Допустим у нас в дисководе отформатированная дискета и все сектора содержат нули.
Насколько я понял, то в TR-DOS количество дорожек определяется несколько иначе. Сперва выполняется команда поиска дорожки 50, после этого посылается команда поиска дорожки 2, делается пауза и читается регистр состояния. Если к этому времени команда выполнилась и головка уже на дорожке 2, то принимается решение, что дискета 40 дорожечная.
Тут главный вопрос - какую именно паузу нужно выдержать.
Так что если кто в курсе как определяется тип дискеты, то поделитесь опытом.
Щаз, отпишу свои варианты тестов. А теста получается 2, на скорость МГ и на ти дисковода.
Да. Допустим у нас в дисководе отформатированная дискета и все сектора содержат нули.
Насколько я понял, то в TR-DOS количество дорожек определяется несколько иначе. Сперва выполняется команда поиска дорожки 50, после этого посылается команда поиска дорожки 2, делается пауза и читается регистр состояния. Если к этому времени команда выполнилась и головка уже на дорожке 2, то принимается решение, что дискета 40 дорожечная.
Тоже вариант.
Тут главный вопрос - какую именно паузу нужно выдержать.
я бы ограничился только вот этим:
x3FE5 IN A,(#FF) ;поступил какой-нибудь сигнал?
AND #C0
JR Z,x3FE5 ;если нет, то ждем его
RET M ;если это INTRQ, то возврат
Для чего в ПЗУ делается задержка в 725779 тактов мне не понятно, по идее и без нее должно работать.
Для определения кол-ва дорожек у дисковода можно использовать следующий алгоритм:
Для начала выводим головки на нулевой цилиндр. Потом есть 2 варианта проверки количества дорожек.
Вариант 1
Делаем циклом (командой шаг) перемещение МГ на цилиндр 46-48. (считаем, что максимально возможный цилиндр у 40 дорожек дисковода ~ 45)
По завершению цикла, меняем направление перемещения МГ от центра к краю.
И запускаем второй цикл, на такое же число. После каждого выполнения команды проверяем бит "0-я дорожка" регистра состояния ВГ93. Если головки вышли на 0-й цилиндр, а цикл не закончен, то мы имеем дисковод 40 дорожек.
Вариант 2
Вместо команды "шаг" можно использовать команду "позиционирование МГ (со сброшенным битом проверки положения МГ)" Сначала делаем позиционирование на ц.60, а назад на 2. Если дисковод 40 дорожек, то мы окажемся на 0.
---------- Post added at 12:42 ---------- Previous post was at 12:37 ----------
Для определения скорости перемещения делается тест похожий. Цикл идёт на скорости (4). Выставляем скорость, делаем перемещение с ц.0 на ц.15 (к примеру), потом делаем выход назад командой шаг на минимальной скорости (для 100% гарантии правильного выполнения) и смотрим. с 15-го ли цилиндра мы пришли (т.е. не ранее ли достигнута дорожка 0). Вот и всё. Как-то так.
Для определения скорости перемещения делается тест похожий. Цикл идёт на скорости (4). Выставляем скорость, делаем перемещение с ц.0 на ц.15 (к примеру), потом делаем выход назад командой шаг на минимальной скорости (для 100% гарантии правильного выполнения) и смотрим. с 15-го ли цилиндра мы пришли (т.е. не ранее ли достигнута дорожка 0). Вот и всё. Как-то так.
Скорость перемещения МГ задается 2-мя младшими битами в командах Восстановления, Поиска и Шага. Разве это не всего лишь указание контроллеру какую паузу нужно сделать для перехода с одного цилиндра на другой. Можно чу-чуть подробнее про скорость перемещения МГ, т.е. почему и зачем ее надо указывать в этих командах?
т.е. почему и зачем ее надо указывать в этих командах?
Предположим, что у нас есть медленный дисковод (я таких держал в руках 2, один ИЗОТ (40x2), толстый такой, снятый со станка, второй от спектрума +3). Время перемещения головок у них 12мс (если и больше не суть важно, пусть будет 12). Если мы в командах связанных с позиционированием выставим 6 мс, то получится вот что:
Сначала контроллер выдаст первый импульс "шаг", на дисковод. Дисковод начнет выполнять команду. Всё прекрасно. (про длительность самого импульса я прямо сейчас сказать не могу, надо смотреть доки на дисководы и на ВГ). Но если дисковод делает шаг за 12мс, то воспринять следующую команду шаг и адекватно выполнить, он сможет только через указанное время, а мы выдаем команду ранее. Как я помню, ИЗОТовский дисковод вообще не мог двигать головами, если скорость установлена быстрее поддерживаемой им. А так, по логике, если мы будем позиционировать на ц.30, то можем не на той скорости добраться лишь до 15, 6 или до 1. Я точно сказать не могу.
Итак, с определением количества дорожек и скорости МГ разобрались. Осталось определить кол-во сторон диска. Выше предлагалось попробовать что-то считать с одной стороны диска и с другой, по итогам уже решить сколько же сторон диска. Да выше я также писал, что мы предполагаем работу с отформатированной дискетой, а что если она не форматирована. В этом случае первые два теста (кол-во дорожек и скорость МГ) все равно дадут верный результат, а вот количество сторон диска я полагаю можно попробовать определить с помощью команды Чтение дорожки. В случае ошибки при выполнении данной команды для одной из сторон диска можно сделать вывод, что диск имеет лишь одну сторону. Есть еще у кого-нибудь мысли по этому поводу?
Тырдос форматирует и читает вторую сторону. На основании полученных данных продолжает формат DS или SS.
Тырдос форматирует и читает вторую сторону.
Человек спрашивал как определить. При чем тут TRDOS вообще? Мы сами хотим сделать тест. В этом вопрос.
Мы сами хотим сделать тест
Человек спрашивал как определить. При чем тут TRDOS вообще?
Я ответил как определить на примере тырдос. Не хотите, придумайте лучше.
а вот количество сторон диска я полагаю можно попробовать определить с помощью команды Чтение дорожки. В случае ошибки при выполнении данной команды для одной из сторон диска можно сделать вывод, что диск имеет лишь одну сторону. Есть еще у кого-нибудь мысли по этому поводу?
Вот с определением сторонности дисковода есть сложности.
1)Неизвестно, истинно односторонние дисководы имели ли сигнал выбора стороны? Реагировали ли они на него? Т.е. вполне может быть, что дисковод 1-сторонний, но он ждет, что мы выбираем сторону 0. Если же мы выбрали сторонку 1 (которой у него нет), то он не делает чтения\записи. Подозреваю, что были и дисководы, которые всё же воспринимали сигнал выбора стороны и (самые первые) не воспринимали его вообще, т.е. выбираем мы 0 или 1 он всегда будет работать со стороной 0
2)Без установленной и отформатированной дискеты установить, сколько стуорон у дисковода невозможно.
3)Если мы подозреваем, что дисковод 2-х сторонний, то должна быть установлена дискета отформатированная на 2 стороны (если мы будем определять кол-во сторон чтением), если же мы установили 1 стороннюю дискету (до этого не форматированную вообще и потом отформатированную как 1 стороннюю), то тест чтением покажет нам, что дисковод имеет 1 сторону.
4)Если же мы будем делать проверку командой форматирования (запись дорожки), то проще. ставим сторону 1, форматируем, ставим сторону 0, форматируем, ставим сторону 1, читаем адресный маркер.
1 Не актуально
2 Верно
4 Это если свой драйвер форматирования. Зачастую маркер стороны всегда в 0.
---------- Post added at 18:04 ---------- Previous post was at 18:01 ----------
3 А если дисковод односторонний а вставили двустороннюю отформаченную дискету -
то тест чтением покажет нам, что дисковод имеет 1 сторону.
А если дисковод односторонний а вставили двустороннюю отформаченную дискету
Вопрос про выбор стороны. Если дисковод понимает сигнал, то при выборе стороны 1 чтения не будет, вот и всё.
1-й вопрос - актуально. Все вопросы надо решать тщательно или вообще не решать. Полу-решения неприемлемы. А когда мы сами решаем, что актуально а что нет - в итоге получаем глюкодром. Это нехорошо.
---------- Post added at 21:29 ---------- Previous post was at 21:27 ----------
Зачастую маркер стороны всегда в 0.
Опять TRDOS? Мы не знаем, что это такое. Мы делаем сами. Никакого tr-dos или другого -дос нету.
P.S. код стороны для 2-х сторонних дискет всегда равен 0 только в trdos. Дискеты 3" для +3 не в счет, т.к. они "односторонние" с переворачиванием. Более систем, с 2-х сторонним форматом, и кодом стороны 0 везде я не знаю. Все известные мне форматы используют код стороны.
Опять TRDOS? Мы не знаем, что это такое. Мы делаем сами. Никакого tr-dos или другого -дос нету.
Сам себе противоречишь.
Все вопросы надо решать тщательно или вообще не решать. Полу-решения неприемлемы.
А что будит если вставить DS дискету формаченную и записанную в том же тырдосе в DS дисковод и отфотматить вторую сторону по своему, так, ради проверки? А там была важная инфа...
Сам себе противоречишь
Я? С чего вдруг? Я отвечаю на поставленный вопрос, а не отсылаю к трдосу, как там он мог сделать или не мог, как трдос форматировал. Я не знаю что это такое, в данном случае.
---------- Post added at 22:25 ---------- Previous post was at 22:23 ----------
А там была важная инфа...
Похоже ты не понимаешь о чем речь. Мы о важной инфе сейчас говорим? Или о задаче определения параметров дисковода? Ты о абстрагировании когда-нибудь слышал? Читал текст выше, когда я стал писать о тесте проверки сторон? Прочитай ещё раз, каждое слово.
Я не хочу спорить, делай что хочешь...
Ведь, применительно к реальной ситуации, тест на количество сторон у системы "дисковод+дискета" можно проводить всего 1 раз - при форматировании дискеты. Если же мы создаем программу тестирующее железо, то программа попросит нас вставить (специально для lisica) дискету не содержащую важную инфу. И предупредит пользователя, что будет произведен разрушающий тест. Неужели это так трудно понять? И упорствовать там, где не надо? М? Или всё же приложить умственные способности к решению проблемы? А проблема-то есть, вообще-то.
Vadim, А нельзя считать трек с 0 стороны потом с 1 и сравнить?
А нельзя считать трек с 0 стороны потом с 1 и сравнить?
Посекторно? Они могут совпасть, дискета ж может быть отформатирована с заполнением нулями (реально любым не запрещённым байтом). Конечно, в реальности это маловероятно, но всё же возможно. Если читать дорожку целиком, то как тут сравнивать я вообще не представляю. Ещё надо выяснить момент. Односторонний дисковод, что он читает при выборе стороны 1? Если под односторонним понимать не совсем исправный двух-сторонний, с нерабочей (отключенной) верхней головой, то он читать не будет.
Человек назвал цель
"для чего это нужно?" отвечу просто - в целях повышения собственных знаний. А ты сделал из мухи слона и к тому же косвенно меня тупым обозвал
Ведь, применительно к реальной ситуации, тест на количество сторон у системы "дисковод+дискета" можно проводить всего 1 раз - при форматировании дискеты. Если же мы создаем программу тестирующее железо, то программа попросит нас вставить (специально для lisica) дискету не содержащую важную инфу.
Или всё же приложить умственные способности к решению проблемы? А проблема-то есть, вообще-то.Где проблема то?
Ведь, применительно к реальной ситуации, тест на количество сторон у системы "дисковод+дискета" можно проводить всего 1 раз - при форматировании дискеты.А вот это единственное правильное решение с занесением в 9 сектор нулевой дороги. Потом только по этому сектору ориентироваться. И не нужно меня носом тыкать в тестовые спецпроги так как не оних речь.
Я считаю, что односторонние дисководы и впрямь на данный момент не актуальны, так что нужно лишь определить тип дискеты. Глянул сейчас доку по ВГ93 и понял что при выполнении команды Чтение дорожки в регистре состояния устанавливаются лишь биты указывающие на готовность НГМД (бит 7), потерю данных (бит 2), запрос данных (бит 1) и занятость (бит 0). Все остальные биты обнуляются, таким образом, как я понял, определить кол-во сторон тоже не получится. Остается судя по всему последний вариант - форматировать дорожку и потом читать. А чтобы не загубить данные можно использовать максимально возможную дорожку, хотя это тоже не на 100% убережет от порчи ценных данных. У меня больше идей нет.
Где проблема то?
Проблема в определении кол-ва сторон у дисковода. А ты всё о трдос вспоминаешь, какой-то 9-й сектор. Забудь. Задача в том, что бы определить, что там делает трдос, давным давно известно и совершенно неинтересно то, что ты предлагаешь в каждом посте. Абсолютно. Поверь, я знаю что такое трдос и как он там чего где пишет. Вопрос не в этом. Вопрос, что бы нам, самим определить количество сторон. Ты так этого и не понимаешь, а ещё обижаешься.
---------- Post added at 23:11 ---------- Previous post was at 23:10 ----------
форматировать дорожку и потом читать.
Всё верно, я к этому и подводил. Единственно 100% точный способ.
Вопрос, что бы нам, самим определить количество сторон.
Я не обижаюсь. Просто по другому не получится, никак.
Все остальные биты обнуляются, т.е. таким образом как я понял определить кол-во сторон тоже не получится.
Дело даже не в битах Рег.сост. Дело в том, что как бы ВГ93 вообще не управляет сторонами дискеты, хотя она о них знает. Бит кода стороны можно использовать и проверять. Проблема вся в том, что сторону перед началом работы задаем мы для системы ВГ93+дисковод. Записью в системный регистр бетадиска (ТМ9). ВГ93 же, может только считывать из заголовков секторов код стороны диска. А мы можем задавать бит в команде чтения или позиционирования "проверять код стороны диска". Вот, это всё (или почти всё), на что способна ВГ93. В TRDOS же, даже эти скудные возможности не были использованы.
Всё верно, я к этому и подводил. Единственно 100% точный способ.
Ты подводил?.........
Тырдос форматирует и читает вторую сторону. На основании полученных данных продолжает формат DS или SS.
Посекторно? Они могут совпасть, дискета ж может быть отформатирована с заполнением нулями (реально любым не запрещённым байтом). Конечно, в реальности это маловероятно, но всё же возможно. Если читать дорожку целиком, то как тут сравнивать я вообще не представляю. Ещё надо выяснить момент. Односторонний дисковод, что он читает при выборе стороны 1? Если под односторонним понимать не совсем исправный двух-сторонний, с нерабочей (отключенной) верхней головой, то он читать не будет.
Если дискета отформатирована под ОС (любую) на ней должен быть хоть 1 информационный сектор. хоть где нибудь. Если нет тогда да, форматить, писать, читать.
начните читать сектор и в середине чтения переключите сторону. дочитался нормально - одна сторона у дисковода.
Ты подводил?
До штирлица не дошло письмо из Москвы... Читаем сообщение #13 ещё раз. Внимательно. Всё сообщение.
---------- Post added at 23:27 ---------- Previous post was at 23:23 ----------
Если дискета отформатирована под ОС (любую) на ней должен быть хоть 1 информационный сектор. хоть где нибудь.
Я хоть сейчас могу сделать дискету, которая будет отформатирована под любой формат (физический), но в полях данных секторов будут 0. Во всех секторах. Дискета исправная? Да. Секторы будут прекрасно читаться, если мы их читаем процедурами чтения секторов. Но диск не содержит ФС, или служебной инфы. Так что простое чтение тут мало поможет. Переключение на ходу - сложный трюк, и, если дисковод реагирует на сигнал выбора стороны, но при этом односторонний - нам такой вариант не подойдет. Т.к. тест выдаст ложный результат.
---------- Post added at 23:36 ---------- Previous post was at 23:27 ----------
Сейчас нашёл я нужную инфу. Односторонний дисковод Teac FD-55E. Сигнала выбора стороны не имеет. значит трюк с переключением стороны сработает.
Alex Rider
31.03.2013, 16:57
А такой алгоритм не пойдет? (Не помню точно, у одностороннего дисковода только верхняя или только нижняя сторона, пишу в предположении, что только верхняя)
1. Идем на 0-й цилиндр.
2. Читаем 0-й сектор нижней стороны. Если дискета не форматирована, поступаем как TR-DOS: убеждаемся, что верхняя сторона не форматирована, форматируем нижнюю, смотрим, с какой стороны смогли прочитать 0-й сектор.
3. Если дискета форматирована, но сектора 0 нет, ищем на нижней стороне первый существующий сектор.
4. Читаем найденный сектор, читаем его же с верхней стороны. Если на верхней такого сектора нет, значит, дисковод двусторонний.
5. Если сектора не совпадают по длине или по информации, значит, дисковод двусторонний.
6. Если сектора сверху и снизу совпадают, пишем инверсию информации в найденный сектор нижней чтороны и перечитываем. По равенству данных принимаем решение.
Barmaley_m
31.03.2013, 19:00
Выскажу следующие соображения.
1. Как уже говорили выше, для определения количества сторон требуется дискета.
2. Пытаемся найти различия путем считывания верхней и нижней сторон. Если найдены различия - дисковод двусторонний. Если различий не найдено на дорожке 0 - то можно попробовать другие дорожки, это повышает вероятность получения результата (т.е. нахождения различий), но не гарантирует его. В пределе можно прочитать все дорожки и, не найдя различий на сторонах, все еще не иметь однозначного ответа на вопрос, сколько у дисковода сторон.
3. Если различий не найдено - то дисковод, возможно, односторонний, но для определения этого необходимо производить запись на дискету.
4. Если дискета отформатирована (то есть хотя бы на одной дорожке был найден хотя бы один сектор) - то тест можно производить путем записи в этот сектор. Важную информацию, находящуюся в нем, можно на время теста сохранить в памяти, а потом перезаписать обратно на диск.
5. Если на дискете секторов не обнаружено - то необходимо производить запись (форматирование) дорожки. Восстановление дорожки после ее форматирования, в общем случае, невозможно.
Важную информацию, находящуюся в нем, можно на время теста сохранить в памяти, а потом перезаписать обратно на диск.
иногда это фатально (были такие схемы турбирования ВГ, при которых запись в сектор на неродном компе убивала этот сектор).
iceoflame
15.05.2013, 17:42
1. Как уже говорили выше, для определения количества сторон требуется дискета. А если прочитать информацию в 9том секторе дискеты, там же вроде есть вся необходимая инфа.
А если прочитать информацию в 9том секторе дискеты, там же вроде есть вся необходимая инфа.
С подключением
иногда это фатально (были такие схемы турбирования ВГ, при которых запись в сектор на неродном компе убивала этот сектор).
и не только турбированные, 70-80% контроллеров этим страдало, особенно на дорожках дальше 40-й.
---------- Post added at 23:25 ---------- Previous post was at 23:24 ----------
А если прочитать информацию в 9том секторе дискеты, там же вроде есть вся необходимая инфа.
не факт что в 9-м секторе правильная информация.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot