Тема: Почему девятка из неиспользуемых портов читает старший байт адреса?
Многие знают, что если на девятке прочитать какой-нибудь неиспользуемый порт ввода-вывода, то вместо ожидаемого значения $FF будет получен старший байт адреса. Например, вводим в мониторе C200 и получаем $C2.
Меня это поначалу очень удивило, я даже думал, что это какая-то софтовая заморочка в мониторе. Но программы тоже видят при чтении старший байт. И что самое странное - никакого регистра, который связывал бы шину адреса с шиной данных, в девятке нет.
Так бы и остался этот вопрос неразрешенным, но случай помог. Столкнулся я с глюком КНГМД http://forum.agatcomp.ru//viewtopic.php?id=219
Проблема была в том, что оторвался один из подтягивающих резисторов на выходе ПЗУ. В результате, происходила странная вещь: при последовательном чтении из ПЗУ, если в первом байте в определенном разряде был 0, а во втором байте в том же разряде 1, то уровень не успевал подняться до 1, а на шине данных был промежуточный уровень.
Теперь понятно, куда я клоню? Когда процессор выполняет инструкцию LDA C200, по шине данных последовательно передаются байты: AD 00 C2. В следующем такте процессор обращается по адресу C200, но активных устройств к шине не подключено, и он видит последний переданный байт.
Почему это происходит?
Да просто емкость шины и входное сопротивление ТТЛШ входа образуют RC цепочку, которая "запоминает" уровень напряжения. Входное сопротивление ТТЛШ входа порядка 50 кОм, емкость шины возьмем пикофарад 50. Получаем постоянную времени tau=RC 2,5 мкс. Чтобы удерживать уровень в течение 1 такта ЦП этого хватает с большим запасом.
Если следом идет обращение к существующему устройству или памяти, то активный ТТЛШ выход (выходное сопротивление которого примерно 100-150 Ом) мгновенно емкость шины разряжает и "запомненное" значение уже ни на что не влияет.
Убедиться, что проблема именно в этом - легко: берете резистор 1 кОм, втыкаете одним концом в +5 В, вторым в контакты А3-А10 в слотах расширения. Соответствующий разряд сразу начинает читаться как 1.
Почему так получилось?
Я думаю - это просто небрежность при проектировании схемы девятки. В семерке шина данных терминируется на плате процессора резисторами R9-R24. В девятке при переносе ЦП на основную плату эти резисторы "потеряли".