Из журнала ZX Format #3, Санкт-Петербург, 03.1996 Исправление ошибки 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. Интересно, как много Скорпионов с этим интер- фейсом? К вышесказанному следует до- бавить, что данная доработка бы- ла произведена на реальном Спек- труме и показала себя наилучшим образом, не дав никаких побочных эффектов. И посему рекомендуется для употребления. ________________________________