Вопрос про ТРДОС и FDC

ZXNet echo conference «zx.spectrum»

From Sergey Erokhin To All 29 November 1997


Hello All!

Кто нибудь знает зачем трдос на этапе старта комманду
#FC (Write Track ?) пихает в контроллер ?

это 9 OUT в порт 1F со старта,
после этого он ждет INTRQ (т.е. не пихает ни одного байта в
контролер -> получает Data Lost)

следующая комманда в порт 1F -> #C0 (Read addres)

Вопрос, результат анализа лога комманд ВГ в эмуляторе
Шалаева.


P.S. может сделаю FDI модуль .......

Good luck
Sergey.


From Vladimir Yudin To All 30 November 1997


Привет Sergey!

29 Nov 97 02:52, Sergey Erokhin wrote to All:

SE> Кто нибудь знает зачем трдос на этапе старта комманду
SE> #FC (Write Track ?) пихает в контроллер ?

SE> это 9 OUT в порт 1F со старта,
SE> после этого он ждет INTRQ (т.е. не пихает ни одного байта в
SE> контролер -> получает Data Lost)

SE> следующая комманда в порт 1F -> #C0 (Read addres)

Это стандартный косяк в TR-DOS с переходом на нужную
дорожку, при этом код команды поиска дорожки теряется
а контроллеру посылается номер требуемой дорожки смешанный с чем-то.
Так что при переходе на заданную дорожку контроллеру
посылаются самые разные коды, но все они не завершаются
нормально.

PS: я это высек когда эмулировал VG93


С уважением
┬ ┬┌┐┬┐ ┐┬┬
╨╜╨╙╜╨╙ ╨ ╨


From Pavel Fedin To All 3 December 1997

Это ошибка в программе TR-DOS. Должны была пихаться команда
позиционирования. Вот вырезка из моего дизассемблера:

---cut---

Адрес 16050. Проверка индексной области дорожки. Установите 23761 и поместите в
B время перемещения головки дисковода. Выби- рается верхняя сторона и при ошибке
в 23831 помещается 255. В регистр H помещается номер текущей дорожки.
Используется также с адреса
16103 (обработка ошибки NO DISC).

16050 CALL 8171 ;выбор верхней стороны диска
IN A,(31) ;берем состояние контроллера
AND 128 ;сохранение флага готовности
LD (23757),A
IN A,(63) ;берем номер текущей дорожки
LD H,A ;на случай возврата
CALL 15940 ;преобразование и выполнение команды из рег. B

Внимание!!! Перед CALL 15940 в регистр B надо поместить время
перемещения головки дисковода, иначе команда, которая выполнится
перед проверкой зависит от содержимого регистра B на входе в
подпрограмму и последствия могут быть весьма плачевными.

LD C,127 ;адрес регистра данных
LD D,1 ;число,определяющее количество попыток
DI ;запрет прерываний
LD A,192 ;чтение индексной области
OUT (31),A
PUSH BC ;сохранение адреса регистра данных
LD B,3 ;определяем количество попыток 16078 IN A,(255) ;берем
состояние сигналов DRQ и INTRQ
AND 192
JR NZ,16144 ;если какой-нибудь сигнал поступил, то начало чтения
INC DE ;следующая попытка
LD A,E
OR D
JR NZ,16078
DJNZ 16078 ;повтор до конца попыток
POP BC ;восстановление адреса регистра данных
EI ;разрешение прерываний
LD A,208 ;остановка контроллера
OUT (31),A
LD A,(23761);ошибку игнорировать ?

Ошибка!!! адо LD A,(23831).

CP 255
RET Z ;если да, то возврат
16103 CALL 10027 ;установка TAPE LOADING ERROR
LD A,255 ;в следующий раз ошибку игнорировать
LD (23831),A
JP 10011 ;обработка ошибки NO DISC 16114 POP BC ;восстановление
адреса регистра данных
IN H,(C) ;чтение первого байта
16117 IN A,(255) ;ожидание какого-нибудь сигнала
AND 192
JR Z,16117
EI ;на случай возврата

Ошибка!!! Так можно потерять байт при чтении.

RET M ;если поступил INTRQ, то возврат
DI ;запрет прерываний
IN A,(127) ;чтение байта
JR 16117 ;повтор

---cut---

А команда #FC получается чисто случайно, поскольку то, что получится, зависит
от содержимого регистра B при входе в эту подпрограмму.

Пока, с пачкой вишезов, Pavel Fedin.