Клавиатура ПК Специалист с точки зрения программиста
Специалист был моим первым компьютером, благодаря которому я постиг азы программирования, самостоятельно разобрался с двоичной и шестнадцатеричной системами исчисления и много чем ещё. Неудивительно, что до сих пор Специалист вызывает у меня самые тёплые чувства. По стечению обстоятельств я взялся за эмуляцию Специалиста, написанную на языке программирования Python. Вначале я написал эмуляцию процессора КР580ВМ80А (а на самом деле это первые 256 команд процессора Z80), далее я организовал вывод экрана, и уже после этого смог запустить на выполнение, загруженные в память, программы. Я вплотную подобрался к эмуляции клавиатуры и столкнулся с тем, что нигде не смог найти описания работы клавиатуры Специалиста с точки зрения программиста. Возможно, схемотехнику будет достаточно лишь взглянуть на схему компьютера, чтобы понять как и что работает, но я, увы, не схемотехник, а программист. Поэтому мне пришлось по обрывочным данным и анализу работы системного загрузчика вникать в суть работы клавиатуры Специалиста. В итоге мне удалось со всем разобраться и благополучно добавить клавиатуру в свой эмуляторе. Через какое-то время я скорее всего забуду детали, поэтому я решил написать эту заметку. К тому же есть какая-то вероятность, что это может пригодится кому-то ещё.
Итак, клавиатура Специалиста подключена к компьютеру через микросхему программируемого параллельного интерфейса К580ВВ55А. Программисту доступны 4 регистра этого интерфейса: порт А, порт B, порт С и регистр управления. В Специалисте эта микросхема подключена таким образом, что регистры проецируются в общее адресное пространство процессора и доступны по адресам #F800-#FFFF. То есть 2 кБ адресов (что составляет 5% от всех адресов!) отведено под то, чтобы читать-писать только четыре 8-битные ячейки микросхемы К580ВВ55А. Мне, честно говоря, не понятна такая расточительность. Я предполагаю, что это связано с упрощением схемотехники, а следовательно с удешевлением Специалиста. Так как регистров всего 4, а адресов аж 2048, то эти 4 регистра повторяются друг за другом на протяжении всех 2 кБ. Выглядит это следующим образом:
Таким образом, чтобы обратится к регистрам необходимо выставить биты в адресах следующим образом:Код:Порт A : #F800, F804, ..., #FFFC Порт B : #F801, F805, ..., #FFFD Порт C : #F802, F806, ..., #FFFE Управл.: #F803, F807, ..., #FFFF
Обращение к регистрам ничем не отличается от обычного чтения-записи любой другой ячейки памяти: LDA FF00, или LD A,(#FF00) в мнемонике Z80.Код:Порт A : 1111 1xxx xxxx xx00 Порт B : 1111 1xxx xxxx xx00 Порт C : 1111 1xxx xxxx xx10 Управл.: 1111 1xxx xxxx xx11 Где x - любое значение бита.
Несмотря на то, что диапазон адресов регистров достаточно широк, системное программное обеспечение "Загрузчик" использует для обращения следующие четыре адреса:
Микросхема К580ВВ55А является программируемым адаптером ввод-вывода, поэтому прежде чем начать обмен данными, необходимо её запрограммировать необходимым образом, отправив в управляющий регистр соответствующий управляющий байт. В "Загрузчике" Специалиста для считывания данных клавиатуры используются две команды, передаваемые в управляющий регистр:Код:Порт A : #FF00 Порт B : #FF01 Порт C : #FF02 Управл.: #FF03
#82 (1000 0010) - переключение микросхемы в режим чтения порта В
#91 (1001 0001) - переключение микросхемы в режим чтения порта А и младшей половины порта С
bit7 - режим программирования
bit4 - переключение порта A в режим чтения
bit1 - переключение порта B в режим чтения
bit0 - переключение младшей половины порта C в режим чтения
Вот такие данные считываются из четырёх ячеек в разных условиях, когда ни одна клавиша не нажата:
Клавиатура Специалиста представляет из себя матрицу состоящую из 12 колонок и 6 рядов. Плюс есть ещё одна отдельная кнопка "НР". Каждая колонка матрицы соответствует одному биту порта А и младшей половины порта С:Код:#FF00: #FF #FF #0F #FF - сразу после включения компьютера #FF00: #00 #FF #00 #FF - после подачи команды #82 #FF00: #FF #00 #0F #00 - после подачи команды #91
Рядам клавиатуры соответствуют биты порта B:Код:1 2 3 4 5 6 7 8 9 10 11 12 C3 C2 C1 C0 A7 A6 A5 A4 A3 A2 A1 A0
Клавише "НР" соответствует 1-й бит порта B.Код:1 B7 2 B6 3 B5 4 B4 5 B3 6 B2 HP B1
Когда нажимается какая-либо клавиша, то сбрасывается соответствующий бит в соответствующем порту. Так, например, при нажатии на левую верхнюю клавишу "F", соответствующую первой колонке и первому ряду из портов будут считываться следующие данные:
Ко всему вышеописанному остаётся только добавить, что системный "Загрузчик" при опросе клавиатуры считывает отдельно вначале строки, записав байт #82 в управляющий регистр К580ВВ55А, а затем, после подачи команды #91, колонки.Код:#FF00 (порт А) - #FF (1111 1111) #FF01 (порт B) - #07 (0000 0111) #FF02 (порт C) - #7F (0111 1111)
Для наглядности я сделал вот такую таблицу:
Если у вас есть что дополнить по теме, или если вы нашли какие-то неточности в моём описании, то убедительная просьба сообщить мне, чтобы я внёс соответствующие корректировки в данную заметку.
Комментарии
Трекбэков
Всего трекбэков 0
Ссылка трекбэка: