1 Отредактировано avivanov76 (10-07-2019 14:44)

Тема: Почему девятка из неиспользуемых портов читает старший байт адреса?

Многие знают, что если на девятке прочитать какой-нибудь неиспользуемый порт ввода-вывода, то вместо ожидаемого значения $FF будет получен старший байт адреса. Например, вводим в мониторе C200 и получаем $C2.

Меня это поначалу очень удивило, я даже думал, что это какая-то софтовая заморочка в мониторе. Но программы тоже видят при чтении старший байт. И что самое странное - никакого регистра, который связывал бы шину адреса с шиной данных, в девятке нет.

Так бы и остался этот вопрос неразрешенным, но случай помог. Столкнулся я с глюком КНГМД http://forum.agatcomp.ru//viewtopic.php?id=219
Проблема была в том, что оторвался один из подтягивающих резисторов на выходе ПЗУ. В результате, происходила странная вещь: при последовательном чтении из ПЗУ, если в первом байте в определенном разряде был 0, а во втором байте в том же разряде 1, то уровень не успевал подняться до 1, а на шине данных был промежуточный уровень.

http://forum.agatcomp.ru//misc.php?action=pun_attachment&item=589&download=0

Теперь понятно, куда я клоню? Когда процессор выполняет инструкцию LDA C200, по шине данных последовательно передаются байты: AD 00 C2. В следующем такте процессор обращается по адресу C200, но активных устройств к шине не подключено, и он видит последний переданный байт.

Почему это происходит?

Да просто емкость шины и входное сопротивление ТТЛШ входа образуют RC цепочку, которая "запоминает" уровень напряжения. Входное сопротивление ТТЛШ входа порядка 50 кОм, емкость шины возьмем пикофарад 50. Получаем постоянную времени tau=RC 2,5 мкс. Чтобы удерживать уровень в течение 1 такта ЦП этого хватает с большим запасом.

Если следом идет обращение к существующему устройству или памяти, то активный ТТЛШ выход (выходное сопротивление которого примерно 100-150 Ом) мгновенно емкость шины разряжает и "запомненное" значение уже ни на что не влияет.

Убедиться, что проблема именно в этом - легко: берете резистор 1 кОм, втыкаете одним концом в +5 В, вторым в контакты А3-А10 в слотах расширения. Соответствующий разряд сразу начинает читаться как 1.

Почему так получилось?

Я думаю - это просто небрежность при проектировании схемы девятки. В семерке шина данных терминируется на плате процессора резисторами R9-R24. В девятке при переносе ЦП на основную плату эти резисторы "потеряли".

Post's attachments

UnterminatedOutput.png, 4.16 kb, 300 x 128
UnterminatedOutput.png 4.16 kb, 243 downloads since 2019-07-10 

2

Re: Почему девятка из неиспользуемых портов читает старший байт адреса?

Сколько лет прошло, а в "Агате" всё время что-то новое обнаруживается :)
Меня тоже удивили такие данные из "бесхозных" адресов, но я большого значения не придал, будучи уверен, что это не баг, а фича. Ан нет, баг. Болтающийся вход - зло!

3

Re: Почему девятка из неиспользуемых портов читает старший байт адреса?

Я тоже как-то обращал внимание, что не всегда читается именно Cx, как бы от каких-то шевелений разъёмов зависит, ещё от не пойми чего.
Но как-то не очень привычно в ТТЛ-логике думать о ёмкостях :)
В КМОП- там понятно, там на этом много эффектов есть. Но в ТТЛ... Я думал, что даже без всяких терминаторов единички будут.
Ёмкости же там мизерные, а токи приличные, даже у свободно висящего входа.