Цитата Сообщение от 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$         ; Заголовок сектора необнаружен