
Сообщение от
AlecV
Слушай, может я торможу, но непонятно - а зачем затирать индексный маркер ? Если флопы отформатировать на контроллере PC в формате IBM то они нормально читаются на MY и прочих ВП1-128, индексный маркер болтается в начале дорожки и никому не мешает. Проблема возникает, если флопы форматировать на MY в формате ISO, т.е. без маркера. Тогда контроллер флопа PC не может найти первый сектор на каждой дорожке.
Начну с последнего. Все дискеты отформатированные на УКНЦ, а также 4 дискеты от знакомого, отформатированные на MY:, у меня на PC прочитались без проблем. Так что наличие/отсутствие индексного маркера здесь роли не играет. Читалось на IT8712F-A и IT8718F-S. Судя по даташитам контроллер флопов там совместим с i82077.
А теперь по поводу чтения дискет, отформатированных на PC. По поводу MY: ничего не могу сказать, не имею возможности попробовать, а на УКНЦ в данном случае виноват драйвер дисковода в системном ПЗУ. Так он оказался написан. Для поиска заголовка сектора драйвер сначала ищет синхрозону, состоящую из нулей. Когда контроллер не синхронизирован, то в данном случае из регистра данных накопителя читается либо ноль, либо минус один. Ловит драйвер это в цикле 132656-132730. Далее в цикле 132730-132742 удостоверяется, что это синхрозона (очередное прочитанное слово равно 0 или -1). А вот уже со 132742 начинается собственно поиск маркера, контроллеру дается команда на поиск, а в цикле со 132762 производится ожидание маркера. Ждет максимум он 150 итераций, это примерно 11830 тактов процессора или 1893 мкс, что соответствует по времени 59 байтам на дискете. Естественно если это была реальная синхрозона перед заголовком, то где-то через 8-10 байт будет прочитан адресный маркер и все пойдет путем. Однако же в случае с синхрозоной перед индексной меткой в результате ожидания пролетается оставшаяся часть синхрозоны, сама метка IAM, промежуток GAP1 и головка выходит на синхрозону первого сектора. А вот здесь самое интересное: так как в цикле ожидания маркера сам маркер не был найден, то производится переход на метку 132630, где цикл просто пропускает при чтении все нули и минус единицы. В итоге синхрозона перед первым сектором пропущена и его уже невозможно будет считать.
Код:
132630$:MOV @R5,R0 ; Прочесть слово с дискеты
BEQ 132640$ ; Это нуль
INC R0
BNE 132656$ ; Это не минус один
132640$:TSTB @#177710 ; Таймер окончил счет ?
BPL 132630$ ; Нет
CALL 134242$ ; Сбросить готовность таймера
SOB R2,132630$
BR 132772$ ; Ошибка (не форматирована дискета или ее нет)
132656$:MOV #4,R1
CMPB #5,23301 ; Формат 1024 байта в секторе ?
BNE 132702$ ; Нет
TST @R4 ; Присутствует линия индекс ?
BPL 132702$ ; Нет
MOV #36,R1
132702$:MOV @R5,R0 ; Прочесть слово с дискеты
BEQ 132730$ ; Это нуль
INC R0
BEQ 132730$ ; Это минус один
TSTB @#177710 ; Таймер окончил счет
BPL 132656$ ; Нет
CALL 134242$ ; Сбросить готовность таймера
SOB R2,132656$
BR 133002$ ; Ошибка (не найден межсекторный промежуток)
132730$:MOV @R5,R0 ; Прочесть слово с дискеты
BEQ 132740$ ; Это нуль
INC R0
BNE 132640$ ; Это не минус один
132740$:SOB R1,132730$
BIS #400,R3 ; Установить в УС бит поиска заголовка
MOV R3,@R4 ; Начать поиск
BIC #400,R3 ; Сбросить в УС бит поиска заголовка
MOV #226,R0 ; Время ожидания поиска
MOV R3,@R4
132762$:TSTB @R4 ; Маркер заголовка обнаружен ?
BMI 133034$ ; Да
SOB R0,132762$
BR 132630$ ; Заголовок сектора необнаружен