Страница Ивана Рощина > Статьи >

© Иван Рощин, Москва

ZXNet: 500:95/462.53
E-mail: bestview@mtu-net.ru
WWW: http://www.ivr.da.ru

Ошибка в STS 6.2 и её исправление

(ZX-Pilot #29,
 Voyager #2,
 «Радиолюбитель. Ваш компьютер» 5/2000)
Дата последнего редактирования: 25.11.2002.

При обращении к диску STS 6.2 (как и более старые версии) считает, что в регистре дорожки ВГ93 записан действительный номер дорожки, на которой находится магнитная головка дисковода. Но по ряду причин в регистре дорожки может содержаться неверное значение, и в этом случае любая операция с диском будет завершена с ошибкой.

Пусть мы загрузили STS с дисковода A, и после окончания загрузки магнитная головка находится, например, на десятой дорожке (а содержимое регистра дорожки, соответственно, равно 10). Установим Drive=B. Что при этом произойдёт? STS не будет выполнять инициализацию дисковода для установки магнитной головки в исходное состояние (на нулевую дорожку). STS не будет выполнять и команду чтения первого попавшегося заголовка сектора, чтобы узнать, на какой дорожке находится магнитная головка (как это делает TR-DOS). STS посчитает, что и у дисковода B магнитная головка находится на десятой дорожке, и переместит её на 10 шагов назад для позиционирования на нулевую дорожку (для чтения каталога). Если магнитная головка действительно находилась на десятой дорожке или на дорожке с меньшим номером, всё закончится успешно. Ну а в противном случае, сами понимаете: после продолжительного ожидания цвет бордюра изменится на красный, сигнализируя о дисковой ошибке. Более того, мы не сможем обратно перейти на дисковод A: STS считает, что он уже установил магнитную головку на нулевую дорожку, а она осталась на десятой…

Такие неприятности возникают не только при работе с двумя дисководами, но и, например, при отладке собственных программ для работы с диском, которые изменяют содержимое регистра дорожки. Ассемблируем такую программу, запускаем — а после этого STS отказывается работать с диском. А старые версии STS вообще зависают при дисковых ошибках…

К счастью, есть простой способ преодоления этой проблемы: достаточно выйти в TR-DOS, посмотреть каталог диска и вернуться в STS. При этом содержимое регистра дорожки приходит в соответствие с реальным положением магнитной головки дисковода.

А если выходить в TR-DOS не хочется (или невозможно)? В этом случае придётся внести определённые изменения в STS. Как же это сделать?

Можно определить, где в STS вызывается подпрограмма чтения каталога (она вызывается и при смене дисковода), и перед каждым её вызовом выполнять фрагмент программы, инициализирующий дисковод, — и проблема решена! Но, немного подумав, я нашёл более простой способ: вместо инициализации дисковода нужно записать в регистр дорожки какое-нибудь достаточно большое число (по крайней мере, большее 160), например, 255. В этом случае STS при позиционировании на нулевую дорожку переместит магнитную головку на 255 шагов назад, и, где бы она ни была, она обязательно окажется на нулевой дорожке (что и требуется).

Итак, вносимые в STS изменения: подпрограмма чтения каталога находится по адресу #E7F8, а вызывается она следующей командой: #E495: JP #E7F8. По адресу #E495 поставим команду перехода на фрагмент программы, записывающий 255 в регистр дорожки. Вот этот фрагмент:

        LD    A,255    ;Это число заносим в регистр дорожки.
        LD    DE,#1E3A ;В ПЗУ TR-DOS: #1E3A - OUT (#3F),A: RET.
        CALL  #E4D3    ;Обращение к ПЗУ TR-DOS.
        JR    #E7F8    ;Переходим к чтению каталога.

Где же найти для него свободное место? По адресу #E7CF обнаруживаем участок программы, обнуляющий атрибуты экрана. STS иногда использует для своих нужд нижнюю треть экрана (#D000—#D7FF), а чтобы это было незаметно, устанавливает для неё нулевые атрибуты.

        #E7CF: EXX
               LD    HL,#D800
               LD    DE,#D801
               LD    BC,#02FF
               LD    (HL),L
               LDIR
               EXX

Здесь и разместим наш фрагмент:

        #E7CF: JR    #E7DD ;для обхода фрагмента
        #E7D1: LD    A,255
               LD    DE,#1E3A
               CALL  #E4D3
               JR    #E7F8

По адресу #E495, соответственно, ставим команду JP #E7D1. Ну что же, осталось только записать изменённый STS на диск — и можно работать.

P.S. Также рекомендую исправить и другую ошибку в STS 6.2, связанную с не всегда правильным определением состояния прерываний. Об её исправлении говорилось в моей статье «Недокументированная особенность процессора Z80». Уже исправленную версию STS вы можете получить по Fido или E-mail (см. адреса в начале статьи).

Другие мои статьи об отладчике STS:

1. 

«Особенности отладки программ с помощью монитора STS». «ZX-Ревю» 5—6/1997.

2. 

«Как „подружить“ ALASM 4.1 и STS 6.2». Voyager #2.

3. 

«Секреты текстового вывода». «Радиолюбитель. Ваш компьютер» 2—3/2001, под псевдонимом BV_Creator.

(В этой статье описан способ получения шрифта 6x8 на базе шрифта ПЗУ; этот способ можно применить в STS, а освободившееся место, где раньше хранился шрифт, можно использовать для реализации в STS новых функций.)

4. 

«Настройка цветов в STS 6.2». «Радиомир. Ваш компьютер» 9/2002, под псевдонимом BV_Creator.

Страница Ивана Рощина > Статьи >