PDA

Просмотр полной версии : Недокументированные особенности КР1818ВГ93



EARL
12.12.2006, 13:35
После операции чтения/записи сектора возникает необходимость чтения порта #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? Будет ли он работать на всех машинах?

Evgeny Muchkin
12.12.2006, 21:58
Если не ошибаюсь, то как раз этот момент в ПЗУ все и используют для вышеописанной надобности чтения любого порта TR-DOS (например если посмотреть 35 номер ZXNews - статья про CMOS часы). :)

jtn
12.12.2006, 23:05
Если не ошибаюсь, то как раз этот момент в ПЗУ все и используют для вышеописанной надобности чтения любого порта TR-DOS (например если посмотреть 35 номер ZXNews - статья про CMOS часы).
нет, в прошивках трдос профпзу (всех версий) по одним и тем же адресам адресам #3ffx прошиты
out (c),a
ret
и
in a,(c)
ret
но ориентироваться на это само собой нельзя

EARL
13.12.2006, 19:19
Если не ошибаюсь, то как раз этот момент в ПЗУ все и используют для вышеописанной надобности чтения любого порта TR-DOS (например если посмотреть 35 номер ZXNews - статья про CMOS часы). :)
Во как оказывается! А я и не знал. Похоже я слишком отстал от жизни и прогресса в мире спектрума :v2_blink:

Evgeny Muchkin
21.12.2006, 15:21
The Exploited, я про профпзу (вернее, про пзу скорпиона) ничего и не говорил. :)

Jack Ketch
04.11.2007, 10:56
Такое было сделано на Черном Вороне медноногова !!!!! Есть такаяя поганая цифра помойму 247 при записи в порт ВГ-шка все стоит !!!!
ДЛЯ защиты от копирования т.к. там был такой НОМЕР сектора или чето такое непомню

Faster
19.10.2009, 23:17
После операции чтения/записи сектора возникает необходимость чтения порта #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".