Важная информация
RSS лента

CityAceE

Клавиатура ПК Специалист с точки зрения программиста

Оценить эту запись
Специалист был моим первым компьютером, благодаря которому я постиг азы программирования, самостоятельно разобрался с двоичной и шестнадцатеричной системами исчисления и много чем ещё. Неудивительно, что до сих пор Специалист вызывает у меня самые тёплые чувства. По стечению обстоятельств я взялся за эмуляцию Специалиста, написанную на языке программирования 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
Таким образом, чтобы обратится к регистрам необходимо выставить биты в адресах следующим образом:

Код:
Порт A : 1111 1xxx xxxx xx00
Порт B : 1111 1xxx xxxx xx00
Порт C : 1111 1xxx xxxx xx10
Управл.: 1111 1xxx xxxx xx11

Где x - любое значение бита.
Обращение к регистрам ничем не отличается от обычного чтения-записи любой другой ячейки памяти: LDA FF00, или LD A,(#FF00) в мнемонике Z80.

Несмотря на то, что диапазон адресов регистров достаточно широк, системное программное обеспечение "Загрузчик" использует для обращения следующие четыре адреса:

Код:
Порт A : #FF00
Порт B : #FF01
Порт C : #FF02
Управл.: #FF03
Микросхема К580ВВ55А является программируемым адаптером ввод-вывода, поэтому прежде чем начать обмен данными, необходимо её запрограммировать необходимым образом, отправив в управляющий регистр соответствующий управляющий байт. В "Загрузчике" Специалиста для считывания данных клавиатуры используются две команды, передаваемые в управляющий регистр:

#82 (1000 0010) - переключение микросхемы в режим чтения порта В
#91 (1001 0001) - переключение микросхемы в режим чтения порта А и младшей половины порта С

bit7 - режим программирования
bit4 - переключение порта A в режим чтения
bit1 - переключение порта B в режим чтения
bit0 - переключение младшей половины порта C в режим чтения

Вот такие данные считываются из четырёх ячеек в разных условиях, когда ни одна клавиша не нажата:

Код:
#FF00: #FF #FF #0F #FF - сразу после включения компьютера
#FF00: #00 #FF #00 #FF - после подачи команды #82
#FF00: #FF #00 #0F #00 - после подачи команды #91
Клавиатура Специалиста представляет из себя матрицу состоящую из 12 колонок и 6 рядов. Плюс есть ещё одна отдельная кнопка "НР". Каждая колонка матрицы соответствует одному биту порта А и младшей половины порта С:
Код:
1  2  3  4  5  6  7  8  9  10 11 12
C3 C2 C1 C0 A7 A6 A5 A4 A3 A2 A1 A0
Рядам клавиатуры соответствуют биты порта B:

Код:
1  B7
2  B6
3  B5
4  B4
5  B3
6  B2
HP B1
Клавише "НР" соответствует 1-й бит порта B.

Когда нажимается какая-либо клавиша, то сбрасывается соответствующий бит в соответствующем порту. Так, например, при нажатии на левую верхнюю клавишу "F", соответствующую первой колонке и первому ряду из портов будут считываться следующие данные:
Код:
#FF00 (порт А) - #FF (1111 1111)
#FF01 (порт B) - #07 (0000 0111)
#FF02 (порт C) - #7F (0111 1111)
Ко всему вышеописанному остаётся только добавить, что системный "Загрузчик" при опросе клавиатуры считывает отдельно вначале строки, записав байт #82 в управляющий регистр К580ВВ55А, а затем, после подачи команды #91, колонки.

Для наглядности я сделал вот такую таблицу:



Если у вас есть что дополнить по теме, или если вы нашли какие-то неточности в моём описании, то убедительная просьба сообщить мне, чтобы я внёс соответствующие корректировки в данную заметку.

Обновлено 02.06.2020 в 16:09 CityAceE

Метки: Нет Добавить / редактировать метки
Категории
Без категории

Комментарии

  1. Аватар для alm604
    Возможно предполагалось использование и других устройств ввода-вывода в этом адресном пространстве. Поэтому обращение загрузчика только по указанным адресам. Добавить дешифратор - и можно расширить функционал.

Трекбэков