© Иван Рощин, Москва
| ZXNet | : 500:95/462.53 |
| : bestview@mtu-net.ru | |
| WWW | : http://www.ivr.da.ru |
Voyager #2,
«Радиолюбитель. Ваш
компьютер» 5/2000)
Дата последнего редактирования: 25.11.2002.
При обращении к диску STS 6.2 (как и более старые версии) считает, что в регистре дорожки ВГ93 записан действительный номер дорожки, на которой находится магнитная головка дисковода. Но по ряду причин в регистре дорожки может содержаться неверное значение, и в этом случае любая операция с диском будет завершена с ошибкой.
Пусть мы загрузили STS с дисковода A, и после окончания загрузки магнитная
головка находится, например, на десятой дорожке (а содержимое регистра
дорожки, соответственно, равно 10). Установим Drive=B. Что при этом
произойдёт? STS не будет выполнять инициализацию дисковода для установки
магнитной головки в исходное состояние (на нулевую дорожку). STS не будет
выполнять и команду чтения первого попавшегося заголовка сектора, чтобы
узнать, на какой дорожке находится магнитная головка (как это делает
Такие неприятности возникают не только при работе с двумя дисководами, но и, например, при отладке собственных программ для работы с диском, которые изменяют содержимое регистра дорожки. Ассемблируем такую программу, запускаем а после этого STS отказывается работать с диском. А старые версии STS вообще зависают при дисковых ошибках
К счастью, есть простой способ преодоления этой проблемы: достаточно выйти
в
А если выходить в
Можно определить, где в STS вызывается подпрограмма чтения каталога (она
вызывается и при смене дисковода), и перед каждым её вызовом выполнять
фрагмент программы, инициализирующий дисковод, и проблема решена!
Но, немного подумав, я нашёл более простой способ: вместо инициализации
дисковода нужно записать в регистр дорожки
Итак, вносимые в 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 или
|
Другие мои статьи об отладчике STS:
|