╔══──══──══──══──══──══──══──══──══──══──══──══──══──══──══──══╗
│ HARD AND SOFT │
╚══──══──══──══──══──══──══──══──══──══──══──══──══──══──══──══╝
(C) ИВАН РОЩИН
Ошибка в STS 6.2 и ее исправление.
При обращении к диску STS 6.2 (как и более старые версии)
считает, что в регистре дорожки ВГ93 записан действительный
номер дорожки, на которой находится магнитная головка дисковода.
Но по ряду причин в регистре дорожки может содержаться неверное
значение,и в этом случае любая операция с диском будет завершена
с ошибкой.
Пусть мы загрузили STS с дисковода 'A', и после окончания
загрузки магнитная головка находится, например, на 10-й дорожке
(а содержимое регистра дорожки, соответственно, равно 10).
Установим Drive = 'B'. Что при этом произойдет? STS не будет
выполнять инициализацию дисковода для установки магнитной
головки в исходное состояние (на нулевую дорожку). STS не будет
выполнять и команду чтения первого попавшегося заголовка
сектора, чтобы узнать, на какой дорожке находится магнитная
головка (как это делает TR-DOS). STS посчитает, что и у
дисковода 'B' магнитная головка находится на 10-й дорожке, и
переместит ее на 10 шагов назад для позиционирования на 0-ю
дорожку (для чтения каталога). Если магнитная головка
действительно находилась на 10-й дорожке или на дорожке с
меньшим номером, все закончится успешно. Ну а в противном
случае, сами понимаете - после продолжительного ожидания цвет
бордюра изменится на красный, сигнализируя о дисковой ошибке.
Более того, мы не сможем обратно перейти на дисковод 'A' - STS
считает, что он уже установил магнитную головку на 0-ю дорожку,
а она осталась на 10-й...
Такие неприятности возникают не только при работе с двумя
дисководами, но и, например, при отладке собственных программ
для работы с диском, которые изменяют содержимое регистра
дорожки. Ассемблируем такую программу, запускаем - а после этого
STS отказывается работать с диском. А старые версии STS вообще
зависают при дисковых ошибках...
К счастью, есть простой способ преодоления этой проблемы:
достаточно выйти в TR-DOS, посмотреть каталог диска и вернуться
в STS. При этом содержимое регистра дорожки приходит в
соответствие с реальным положением магнитной головки дисковода.
А если выходить в TR-DOS не хочется (или невозможно)? В этом
случае придется внести определенные изменения в STS. Как же это
сделать?
Можно определить, где в STS вызывается подпрограмма чтения
каталога (она вызывается и при смене дисковода), и перед каждым
ее вызовом выполнять фрагмент программы, инициализирующий
дисковод - и проблема решена! Но, немного подумав, я нашел более
простой способ: вместо инициализации дисковода нужно записать в
регистр дорожки какое-нибудь достаточно большое число (по
крайней мере, большее 160), например, 255. В этом случае STS при
позиционировании на 0-ю дорожку переместит магнитную головку на
255 шагов назад, и, где бы она ни была, она обязательно окажется
на 0-й дорожке (что и требуется).
Итак, вносимые в STS изменения: подпрограмма чтения каталога
находится по адресу #E7F8, а вызывается она следующей командой:
#E495: JP #E7F8. По адресу #E495 поставим команду перехода на
фрагмент программы, записывающий 255 в регистр дорожки. Вот этот
фрагмент:
LDA,255 ;это число заносим в регистр дорожки
LDDE,#1E3A ;в ПЗУ TR-DOS: #1E3A - OUT (#3F),A: RET
CALL#E4D3 ;обращение к ПЗУ TR-DOS
JR#E7F8 ;переходим к чтению каталога
Где же найти для него свободное место? По адресу #E7CF
обнаруживаем участок программы, обнуляющий атрибуты экрана. STS
иногда использует для своих нужд нижнюю треть экрана
(#D000-#D7FF), а чтобы это было незаметно, устанавливает для нее
нулевые атрибуты.
#E7CF: EXX
LDHL,#D800
LDDE,#D801
LDBC,#02FF
LD(HL),L
LDIR
EXX
Здесь и разместим наш фрагмент:
#E7CF: JR#E7DD;для обхода фрагмента
#E7D1: LDA,255
LDDE,#1E3A
CALL#E4D3
JR#E7F8
По адресу #E495, соответственно, ставим команду JP #E7D1. Ну
что же, осталось только записать измененный STS на диск - и
можно работать.
° ° ° ° °