Исправление ошибки TR-DOS
(C) MAD MAX
________________________________
Наверное многие (а точнее,
практически все) сталкивались с
таким неприятным явлением, - при
чтении некоторых программ голов-
ка дисковода яростно забивается
в конец дисковода, издавая при
этом душераздирающие звуки. По-
чему это происходит? Что это?
Ошибка контроллера или ошибка в
программе? Многие думали о раз-
ном. Но вот Константин Углеков
из Москвы (огромное ему спаси-
бо!) решил уделить внимание дан-
ной проблеме более серьезно. Мы
приводим его выкладку по поводу
устранения данного дефекта, взя-
тую из описания эмулятора Спек-
трума.
На входе в подпрограмму #3Е44
(TR-DOS) в регистре B должна со-
держаться константа позициониро-
вания (от #08 до #0B); с ней де-
лают OR #18 и кладут результат в
регистр команд контроллера (зна-
чения #18-#1B соответствуют ко-
манде ПОИСК без проверки адрес-
ных маркеров на дорожке). При
вызове #3Е44 из #3ЕB5 регистр B
никак не определен, и он может
содержать, например, число сек-
торов при вызове #3D13 с C=5 или
C=6. Если же число секторов
больше #20 , то в регистр команд
будет направлен не код команды
ПОИСК, а что-то иное.
Простая проверка показывает,
что все происходит именно таким
образом. Вызывая #3D13 с BC=
#4005 несколько раз подряд (DE
считаем неизмененным), можно
наблюдать перемещение головок
дисковода на один шаг к центру
диска перед позиционированием на
начало читаемого блока, а при
вызовах с BC=#6005 наблюдается
один шаг в обратном направлении.
Если учесть, что #40 OR #18 =
#58 - код команды шаг вперед, а
#60 OR #18 - код команды шаг на-
зад, то никаких сомнений быть не
может - это ошибка TR-DOS!
Сразу следует вопрос - а
можно ли испортить диск, если
задать число секторов #A0-#BF
(чтобы получить команду записи
сектора), или #F0-#FF (чтобы по-
лучить команду записи дорожки)?
Ответ - нет. Даже если контрол-
лер воспринимает числа #B8 и #F8
как законные команды, то для то-
го, чтобы запись на диск нача-
лась, контроллер должен сначала
получить первый байт данных; для
команды записи сектора этот байт
должен поступить не позже про-
хождения 8-го байта GAP перед
записываемым сектором, а для за-
писи дорожки - в течении прохож-
дения 3 байт с момента подачи
команды. Если первый байт данных
не получен в эти сроки, то опе-
рация сразу же завершается ошиб-
кой LOST DATA (Потеря данных;
бит 2 регистра состояний), и
выставляется сигнал IRQ (как и
положено для завершения любой
операции). Раз эта ошибка не мо-
жет привести к порче диска, то
закономерен вопрос: а стоит ли
на нее вообще обращать внимание?
Если Вас интересует повышение
скорости обмена с диском, то
непременно! Все модификации TR-
DOS на базе версии 5.03 с прис-
тавочками типа "FAST", "TURBO"
и т.п. совершенно бесмысслены,
если при каждом обращени к
функциям 5,6 подпрограммы #3D13
будет теряться время либо на по-
зиционирование (хорошо, если на
один шаг), либо на поиск секто-
ра.
Что можно предложить взамен?
Вместо вызова #3Е44 из #3EB2 вы-
зываем что-нибудь вроде #880
(если там пусто), а по адресу
#880 помещаем небольшую прог-
раммку:
PUSH HL ;в H номер дорожки
;который еще нужен
PUSH AF ;то же Замечание
CALL #3E08 ;регистры HL и DE
;будут испорчены, а
;DE можно не сохран.
LD B,A ;наконец-то в B
;попадет значение
;константы позицио-
;нирования
POP AF
POP HL
JP #3E44 ;и никакой ошибки!
Чтобы выполнить данную дора-
ботку, Вам придется стереть со-
держимое ПЗУ, и прошить его за-
ново. Для тех ПЗУ, в которых нет
пустого места (Scorpion), возмо-
жен вариант записи данного ку-
сочка на какое-нибудь ненужное
текстовое сообщение типа "INTER-
FACE ONE FITTED". Интересно, как
много Скорпионов с этим интер-
фейсом?
К вышесказанному следует до-
бавить, что данная доработка бы-
ла произведена на реальном Спек-
труме и показала себя наилучшим
образом, не дав никаких побочных
эффектов. И посему рекомендуется
для употребления.