Сообщение от
EARL
После операции чтения/записи сектора возникает необходимость чтения порта #1F, на предмет проверки возникновения ошибки на предыдущей операции. В TR-DOS мне попался следующий кусок (по адресу #3EF3):
Код:
IN H,(C)
.wait:
IN A,(#FF)
AND #C0
JR Z,.wait
EI
RET M
DI
IN A,(#7F)
JR .wait
Понятно, что напрямую эту часть для чтения произвольного порта не получится, т.к. после завершения команда чтения/записи сектора это приведет к зацикливанию. Но этого можно избежать. После завершения какой-либо операции мы посылаем в регистр #1F код #E0 (команда "сырого" чтения дорожки). Эта команда не изменяет содержимое регистра состояния до своего завершения, а значит считываемое значение состояние контроллера остается от предыдущей операции. Посылка же команды "сырого" чтения дорожки контроллеру позволяла всего лишь избежать зацикливания.
Ну вот, всю идею я вроде описал, а теперь мне интересно, чтобы кто-нибудь проверил это на реальных машинах, потому что в эмуляторах это, кажется, не учитывается. Можно ли использовать данный трюк при программировании контроллера ВГ93? Будет ли он работать на всех машинах?
Насколько я помню, ни к какому зацикливанию это не приведет, а произойдет выход по RET M
Код:
#3ef3 in h,(c)
#3ef5 in a,(#ff) ; ожидание intrq или drq
and %11000000 ; bit7 - intrq/bit6 - drq
jr z,#3ef5
ei
ret m ; выход по intrq
ибо команда чтения/записи сектора также была завершена тем же самым intrq-сигналом окончания команды:
Код:
#3fe5 in a,(#ff) ; ожидание intrq или drq
and %11000000 ; bit7 - intrq/bit6 - drq
jr z,#3fe5
ret m ; выход по intrq
#3fec ini ; чтение байта
jr #3fe5
просто мы получим значение регистра состояния контроллера #1f и с разрешенными прерываниями выйдем из процедуры. Ниче недокументированного я здесь не вижу, просто весь трабл данного метода состоит именно в команде EI...
p.s. см. источник: Абзац №15, Рубрика: В помощь разработчику, "Укрощение TR-DOS".