
Нынче хорошую механическую клавиатуру для спектрума сложно найти. В спектрумовские времена очень удобные клавиатуры были у Робика. Встретив в продаже я купил одного Робика, внутренности были в ужасном состоянии, но как клавиатура для моего "зоопарка" очень даже ничего. Как временная мера было нормально, но со временем мне захотелось чего-то более универсального, да и механика ведь не вечная. По этой причине я развел печатную плату контроллера, который был разработан для компьютера KAY-2010 Камилем Каримовым. Контроллер вышел достаточно универсальным: легко подключается практически к любому спектруму, при работе не тормозит Z80 (при работе ЦП на частоте 3.5МГц контроллер успевает отработать запрос в положеное время, в режиме турбо контроллер /WAIT-ом притормаживает процессор, но не значительно).
Подключается он к линиям клавиатуры (KA8-KA15, KD0-KD4), дополнительно подключаются сигналы /M1, /A0, /IORD, /RES, /MAGIC, ну и собственно питание.
Платка исполнена в таком виде, что легко может быть закреплена на задней стенке корпуса, на заглушке плат расширения. К компьютеру подключается с помощью двух шлейфов: 16 жильный к разъему клавиатуры, питанию и 10 жильный к внутренним сигналам ПК (/RES, /MAGIC, /M1, A0, /IORD...).
Так же среди "фишек" этого контроллера можно назвать:
- возможность работы с EEPROM (энергонезависимой памятью) объемом 256 байт, общение с которой происходит через порт #FE;
- программное управление сигналом Turbo через этот же порт;
- возможность использования макросов (определенной комбинации клавиш можно присвоить целую последовательность клавиш), но с ними я пока еще не разбирался.
Алгоритм работы с контроллером
Команды управления контроллером:
Задать адрес EEPROM - 0x55,"A",Adr_L,Adr_H
- Прочитать байт из EEPROM по ниблам - 0x55,"R",Data_H,Data_L
- Записать байт в EEPROM - 0x55,"W',Data
- Прочитать скан-код нажатой клавиши - 0x55,"C",Data_H,Data_L
Управление режимом TURBO:
- Выключить TURBO - 0x55,"T",0x00
- Включить TURBO - 0x55,"T",0xFF
- Прочитать состояние TURBO - 0x55,"T",0x01 (не 0x00 и не 0xFF)
Исходные тексты процедур работы с контроллером
Вот пример работы с EEPROM в этом контроллере на ассемблере:
; Чтение байта из ячейки EEPROM
; Вход: HL -> ADR_eeprom
; Выход: C = (ADR_eeprom)
; CY = 0 - OK
rd_eeprom:
call set_adr ; Задать адрес EEPROM
ret c ;Выход с ошибкой
; Задан адрес ячейки EEPROM в контроллере
ld a,055h ; код доступа
in a,(0FEh)
ld a,"R" ;Команда чтения EEPROM
in a,(0FEh)
; Контроллер ждет чтения двух половинок байта
in a,(0FEh)
rlca
rlca
rlca
rlca
and 0F0h ;ст. нибл данных
ld c,a ;сохранить
in a,(0FEh)
and 0Fh ;мл. нибл данных
or c
ld c,a ; байт данных из EEPROM
ret ; CY=0
;-------------------------------------------
; Запись байта в EEPROM
; Вход: HL -> ADR_eeprom
; C -> (ADR_eeprom)
; CY = 0 - OK
wr_eeprom:
call set_adr ; Задать адрес EEPROM
ret c ; Выход с ошибкой
; Задан адрес ячейки EEPROM в контроллере
ld a,055h ; код доступа
in a,(0FEh)
ld a,"W" ; Команда записи в EEPROM
in a,(0FEh)
ld a,c ; Байт данных
in a,(0FEh); Записать
ret ; CY=0
;-------------------------------------------
; Задать текущий адрес ячейки EEPROM.
; После операций чтения/записи
; происходит авто-инкремент текущего адреса.
set_adr:
ld a,055H ;Код доступа
in a,(0FEh) ; байт ответа
and 1Fh ; маска
cp 0Ah ; должен прочитаться 0Ah
scf ; CY=1
ret nz ; Иначе выход с ошибкой
; Контроллер откликнулся
ld a,"A" ;Команда задания адреса
in a,(0FEh)
ld a,L ;Мл.Байт адреса
in a,(0FEh)
ld a,H ;Ст.Байт адреса
in a,(0FEh)
xor a ; CY=0
ret ; Выход без ошибки
;==============================================
Материалы к статье
- Схема и шаблоны для изготовления плат (.pdf);
- Прошивка для контроллера (.hex).






