В описании к старенькому эмулятору UKV by Uglekov K , автор пишет:


Ошибка в TR-DOS, которую я нашел с помощью эмулятора

Сразу оговорюсь, что речь пойдет о версии TR-DOS 5.03; но найденная
ошибка присутствует и во всех ее модификациях, которые я видел, и в версии
5.01.

Как отмечалось выше, если моему эмулятору не указать положение точек
TEST и SEEK1, то при чтении/записи блока длиной больше 128 секторов зависание
гарантировано. Когда я стал разбираться, в чем же дело, то обнаружил следующее.
На входе в подпрограмму 3E44 (=SEEK1) в регистре B должна лежать константа
позиционирования (от 8 и до 0Bh); с ней делают OR 18h и кладут результат в
регистр команд контроллера (значения 18h-1Bh соответствуют команде SEEK без
проверки адресных маркеров на дорожке). При вызове 3E44 из 3EB5 (=TEST) регистр
B никак не определен, и может содержать, например, число секторов при вызове
3D13 с C=5 или 6. Если же число секторов больше 20h, то в регистр команд будет
направлен не код команды SEEK, а что-то иное.
Простая проверка на SPECTRUM'е показывает, что все происходит именно
таким образом. Вызывая 3D13 с BC=4005h несколько раз подряд (DE считаем
неизменным), можно наблюдать перемещение головок дисковода на один шаг к центру
диска перед позиционированием на начало читаемого блока, а при вызовах c
BC=6005h наблюдается один отдельный шаг в обратном направлении. Если учесть, что
40h OR 18h = 58h - код команды STEP IN, а 60h OR 18h = 78h - код команды STEP
OUT, то никаких сомнений сомнений уже быть не может: ЭТО ОШИБКА TR-DOS.
Сразу следует вопрос: а можно ли испортить диск, если задать число
секторов 0A0h-0BFh (чтобы получить команду записи сектора), или 0F0h-0FFh (чтобы
получить команду записи дорожки) ? Ответ - нет. Даже если контроллер
воспринимает числа 0B8h и 0F8h как законные команды (это я не проверял), то для
того, чтобы запись на диск началась, контроллер должен сначала получить первый
байт данных; для команды записи сектора этот байт должен поступить не позже
прохождения 8-го байта GAP перед записываемым сектором, для записи трека - в
течение прохождения 3 байт с момента подачи команды. Если первый байт данных не
получен в эти сроки, то операция сразу же завершается с ошибкой LOST DATA (бит
2 статусного регистра), и выставляется сигнал IRQ (как и положено при завершении
любой операции). В эмуляторе не предусмотрено выполнение задержек по данному
правилу, и сигнал IRQ не выставляется до тех пор, пока через регистр данных
контроллера не будет передан блок нужного размера.
Раз эта ошибка не может привести к порче диска, то закономерен вопрос:
а стоит ли на нее вообще обращать внимание? Если вас интересует повышение
скорости обмена с диском, то ответ - непременно! Все модификации TR-DOS на
базе версии 5.03 с приставочками "FAST","TURBO" и т.п. совершенно бессмысленны,
если при каждом обращении к функциям 5,6 подпрограммы 3D13 будет теряться время
либо на позиционирование (хорошо,если только на один шаг), либо на поиск
сектора.
Что можно предложить взамен? Вместо вызова 3E44 из 3EB2 вызываем
что-нибудь вроде 880h (если там свободно), а по адресу 880 помещаем

PUSH HL ; H сейчас содержит номер трека и еще понадобится
PUSH AF ; то же замечание
CALL 3E08h ; регистры HL и DE будут испорчены,но DE можно не сохранять
LD B,A ; наконец-то в B попадает значение константы позиционирования
POP AF
POP HL
JP 3E44h ; и никакой ошибки !


А ведь действительно, как сейчас помню, дергалась головка на дисководе туда-сюда не по делу...