ZX-Spectrum PS/2 Keyboard

How to connect USB or PS/2 keyboard to ZX-Spectum

This method using Atmega8 AVR for connecting PS/2 or USB(ps/2 compatible) keyboard to ZX-Spectum.

You should use 24MHz crystal oscillator with it.

 

Firmware

This firmware (version 2) is for Atmega8 with 24MHz crystal oscillator Download

Version 3 (24.01.2016) Download

Version 4 (26.01.2016) Download

 

NEW! Version 5.5 with sources (03.02.2016)

kbd_firmware_v5_5_m8_with_src (для ATMega8)

kbd_firmware_v5_5_m48_with_src (для ATMega48)

kbd_firmware_v5_5_m168p_with_src (для ATMega168p)

kbd_firmware_v5_5_m328p_with_src (для ATMega328p)

 

Starting from version 5.3 firmware has new NumLock functions (cursor keys and space acts as Sinclair Joystik), auto switching to E mode for keys [,{,},],~

 

 

Upload it using avrdude

avrdude -p atmega8 -c USBasp -U flash:w:KBD13_M8_nw_MODIFIEDv4.hex -U lfuse:w:0xCF:m -U hfuse:w:0xC7:m

 

Connection

It is direct connection to ZX-Spectrum keyboard slot

 

kbd_atmega8

Circuit exampe

 

 

Some usefull info on connectors

Pinout PS2 - USB usb_ps2

61 thoughts to “ZX-Spectrum PS/2 Keyboard”

  1. Данная схема работает на обычном спектруме. Но на турбированном работают только кнопки F11, F12, SysRq.
    Я правильно понимаю, что атмега просто не успевает поймать биты опроса клавиатуры со стороны спектрума?
    Можно ли это как-то исправить программно?

  2. Да, именно так, скорее всего программно исправить можно, поправив тайминги опроса. F11, F12 работают т.к. они не участвуют в опросе, а замыкают контакты напрямую.

      1. К порту клавиатуры, если он разведен, если нет, то сделать самостоятельно, по схеме из практически любого клона ZX

        1. У меня схема пентагон 128 от.2014 года, брал плату у Tetroid. Там на общей гребёнке есть контакт KEY SELECT, прокурив схему, пришел к выводу, что это оно. Подключил. Не работает. Делал на arduino nano с 328 мегой на борту, кварц 16 Мгц. Не работает. Клавиатура моргает всеми светодиодами и тишина.

  3. А не будет слишком наглым попросить Вас поправить прошивку или подсказать в каком месте что поправить?

  4. К сожалению, я не являюсь автором данной прошивки, но беглый просмотр кода говорит, что обработка шины ведется в INT0_Handler, т.е. с порта D читаются биты адреса + 1 бит адреса берется с порта C, получив адрес, из таблицы берется значение и шлется в шину данных (порт B).
    Так как у вас клавиши не работают совсем (даже нет мусора), то здесь возможны 2 проблемы
    1) атмега не успевает считать/записать данные на шину и требуется задействовать WAIT (можно повесить на B.5 и поместить дерганье этого сигнала в INT0_Handler)
    2) сама атмега тормозит с кристаллом 24МГц, попробуйте заменить на другую, возможно проблема именно в чипе.

  5. Подумав еще немножко, могу сказать следующее

    1. Раз кнопки F11, F12… работают, значит опрос самой клавиатуры ps/2 происходит нормально и аппаратные прерывания от ZX не забивают таймер.
    2. Раз другие кнопки не работают совсем, значит аппаратные прерывания, хоть и работают, но не успевают выставить нужный бит на порту вывода или вообще переключиться в режим вывода, а, возможно, и не срабатывает считывание по /RDFE.

    INT0_Handler:
    in YL,PinD ; PinD -> YL получаем данные с шины адреса
    sbic PinC,0x03 ; if (PinC.3=0) skip next line (IF KA10=0)
    ori YL,0x04 ; YL or 4 (1->YL.2) добавляем недостающий бит с порта C

    ; [Y] -> r20 // берем данные из таблицы и шлем в порт B
    ldd r20,Y+0x00
    out PortB,r20 ; r20 -> PortB

    LOOP0: // держим шину данных пока /RDFE=0
    sbis PinD,0x02 ;if PinD.2=1 skip rjmp
    rjmp LOOP0

    // выставляем единицы на порту B (на шине данных все единицы)
    out PortB,CONSTFF ; 0xFF -> PortB
    reti

    Если по коду, то в YL мы получили состояние шины адреса для опроса клавиатуры, затем, из таблицы, подготовленной в таймере, получили значение для отправки в шину данных в регистр r20, который отправляем в порт B и ждем пока /RDFE не станет 0.
    Вот, где-то в этом промежутке отправки данных и выставления единиц на шине данных может быть проблема, но, чтобы понять более конкретно, нужно проверить на конкретном примере.
    К сожалению, у меня турбированного варианта нет, поэтому я оставляю это для тех у кого есть такая возможность.

  6. Еще, можно попробовать
    // set INT0
    ldi r18,0x0A ;falling edge
    поменять на rising edge, но, не знаю, поможет это или нет
    поменять нужно на
    ldi r18,0x0F ;int0/1 rising edge

    PS: если будут успехи, сообщите, пожалуйста.

  7. Увы, не помогло. Видно Атмега8 не успевает обрабатывать сигнал на такой скорости. Сейчас жду Атмегу48, попробую по этой же упрощённой схеме залить для неё прошивку и проверить, успеет ли она.

  8. Поделитесь потом успехами, 48-ая возможно и заработает, т.к. там больше портов, т.е. нет необходимости объединять биты с шины адреса.

    1. Василий, я давно слежу за вашим проектом, если хотите могу для вас отдельный раздел сделать

  9. В версии 3 ускорена обработка прерываний /RDFE, поэтому возможно клавиатура заработает и в турбо режиме, если у кого-то заработала, сообщите, пожалуйста.

    1. Yes, it is for ZX-Spectrum, address pins on PD0,PD1,PD3-PD7,PC3, data (column) pins on PB0-PB4, PD2 is for keyboard port switching /RDFE (reading from port #FE signal). If you mean ZX-Spectrum with ULA chip, you need to add additional IC for decoding port #FE, bacause decoder is in ULA and we don’t have access inside 🙁

  10. Не могу запустить на желтом скорпионе( F11, F12, PrintScreen – работают, а вот все остальное – нет. Использую Atmega8 и 24МГц кварц, прошивка Версии 5.5. Сигнал /RDFE подключаю к КП11 на 15 ногу, он на схеме обозначен /CSK (там стоит две КП11 для сигналов KL0-KL4) Прошу хоть какой-то помощи в подключении.

  11. я тоже сделал устройство для подключения PS/2 клавиатуры на ATmega168, работающей на частоте 20MHz. Порт D подключен к KA8..KA15, порт B – KD0..KD4. По прерываниям происходит чтение скан кода от клавиатуры, а вот читать линии адреса KAn и управлять линиями KDn по прерываниям микроконтроллер уже не успевает, поэтом пришлось сделать поллинг в очень коротком основном цикле. Все работает, но полагаю, что реализация подключения на микроконтроллере принципиально не верна )) – для иммитации оригинальной кнопочной клавиатуры правильнее использовать CPLD в сочетании с микроконтроллером. Такой проект уже есть http://microsin.net/adminstuff/hardware/yet-another-sinclair-spectrum-at-keyboard-interface.html , и я в рамках освоения технологии применения CPLD планирую создать нечто подобное, но с расширением: например, включить в CPLD логику управления выбора ПЗУ Спектрума…

    1. Схема с CPLD однозначно будет на 100% иммитировать оригинальную клавиатуру и подключаться 13-тью проводками к Спектруму. Чипы MAX3064A уже заказал и жду ))

      1. С CPLD конечно вариант лучше, но дороже и сложнее, тут же решение требующее минимум усилий для повторения 🙂 хотя не на всех моделях будет работать.

        1. Да, EPM3064ATC44 в Чип и Дипе стоит 240р. за штуку, а на Aliexpress – 70р., (20шт. за 1400р)… Сложность схемы возрастает незначительно, но можно сэкономить на микроконтроллере – взять попроще. Так что с CPLD возрастает сложность – но плюсом будет корректность работы. Сделаю для себя – обязательно поделюсь с заинтересованными лицами ))

  12. Собрал, все работает. Но иногда нажатие любой кнопки вызывает RESET. Не знаете что можно сделать, что бы этого не происходило,?

    1. Может МК на данной частоте работает нестабильно (зашунтируйте кварц атмеги сопротивлением на 2-3МОм), или шина данных не стабильна, тут тогда нужно ставить диоды как в оригинальной схеме.

  13. Доброго времени суток всем!
    Получилось на EPM3064ATC44 сделать? Если да поделитесь пожалуйста со схемой и прошивкой.

    1. Собрал устройство на макетной плате. Освоил Verilog, написал прошивку для CPLD, отлажу – и все буде готово. Останется только нарисовать схему в PCAD и развести там же плату. Плата ATmega+CPLD предполагается быть универсальной, так что мне она нужна не только для спектрумовской клавиатуры.

  14. Здесь ссылка на проект https://github.com/leonid-z/zxkeyboard
    Вчера закончил работу с макетом, прошивкой для CPLD и программой для микроконтроллера. Все работает как задумывалось.
    Буду рисовать схему, разводить и заказывать платы.
    Хотя появилась следующая задумка: PS/2 клавиатура – хорошо, а USB – лучше! В результате заказал на Aliexpress платку с SL811 – USB хост контроллером.
    P.S. Интересно – кому-нибудь такие адаптеры нужны?

    1. Очень интересный проект! Хотелось бы иметь такую разведенную платку для CPLD, можно даже пока только под PS/2. Буду следить за гитхабом.

  15. Hello from Canada!

    Would you tell me what to connect to /BTN1 and /BTN2? Are there any buttons? If yes, what are their functions?

    Thank you very much!

    Laurentiu

  16. Доброго дня! Я прикупил контроллер, о котором идет речь на форуме zx-pk, но там вместо atmega48 стоит atmega8, ребята подсказали, что в этом случае лучше всего использовать вашу схему. Нет ли где-то печатной платы вашего контроллера? Я сам не смогу сделать чертеж монтажки по схеме.

  17. Privet Vsem!
    V nachale goda sdelal ya ZX97 (klon ZX81). Prilogil k nemy TZXDuino. Neskol’ko foto zdes’ – https://imgur.com/a/kYP2Q
    Potom reshil dobavit klavyaturu PS2. Nashol v internete ssylki k proektu ZX Spectrum PS2 keyboard. U menya ne bylo otdel’nogo kontrollera ATMega328P no imel Arduino Pro Mini 16MHZ s nim. Zaprogrammiroval, podklyuchil – no i PS2 ne rabotaet :/.Oshibok v montage net.
    Ya smotryu shemu ZX81 i ZX Spectrum i tak dumayu, chto klavyatury u nih odinakovye i opros toge.
    U menya est vopros: ya horosho dumayu ili net? Nado mne iskat’ samyy kontroller ATMega na vysshuyu chastotu ili ya oshibayus i nado mne brosit’ eto delo?
    Pozdrvlyayu vseh – Tadeusz.

    1. Судя по схеме ZX97 работа с клавиатурой ведется аналогично ZX-Spectrum, поэтому данный проект должен работать.
      16MHz это мало для нормальной работы контроллера, нужно минимум 24MHz

      1. Spasibo bol’shoe za otvet. V takom sluchae ne sdayus’ – poishchu ATMega8. Obyazatelno napishu o rezultate – no eto moget byt’ ne ochen’ bystro.

  18. Добрый день! Пожалуйста подскажите, есть ли где-то чертеж печатной платы? Хочу собрать ваш контроллер, но не могу развести плату сам.

  19. Добрый день, помогите пожалуйста. Хочу сделать обычную 40 клавишную клавиатуру как на оригинальном zx spectrum 48k, с помощью ps/2 клавиатуры. Как в прошивке переназначить кнопки? Я в асемблере не волоку вобще, код на си пишу. ADMIN подскажи, если можно с примером пожалуйста

    1. KEYTABLE: ; KeyCode PC ZX KeyCode PC ZX

      .db 0x00, SS+KEY_D ; 0x00 – N/A – ——- ; 0x01 – [ F9] – STEP
      .db 0x00, SS+KEY_U ; 0x02 – N/A – ——- ; 0x03 – [ F5] – OR
      .db SS+KEY_E, SS+KEY_Q ; 0x04 – [ F3] – >= ; 0x05 – [ F1] – ASN

      Тут в табличке по два сканкода PS/2 клавиатуры (без расширенных кодов, с расширенными в других таблицах ниже),
      нумерация начинается с нуля, т.е. в первой строке в таблице им ставится соответствие, 0 – 0 (данный код ничего не делает), 1 (кнопка F9) ей ставится в соответствие SymbolShift + D, что соответствует слову STEP на ZX,
      в следующей строке идут коды 2 и 3, 2 – 0 (данный код ничего не делает ему ставится в соответствие 0, что означает нет нажатия на клавишу ZX), коду 3 (кнопка F5 на клавиатуре) ставится в соответствие комбинация SymbolShift + U, что соответствует слову OR на ZX клавиатуре, и т.д.

      Аналогично для кодов с префиксом E0 на PS/2 клавиатуре, отдельная таблица, принцип кодирования аналогичный

      И еще 2 таблицы для нажатий при включенном CapsLock и NumLock, чтобы можно было эмулировать PC клавиатуру на ZX, особенно полезно при редактировании текста, чтобы было удобно работать как на PC.

  20. Понял спасибо, будем разбираться, в версии 5,5 немного непонятно работа светодиодов, в самом начале загараются и гаснут, потом зажигаются если нажать на кнопку, и не меняются если нажимать на HumLock CapsLock. Подскажите Реально ли в прошивке оставить только опрос клавиатуры ps/2, прерывания и табличку одну, а такое как светодиоды и разные режимы убрать, чтоб было просто нажал на кнопку и контроллер с эмулировал нажатую кнопку? Если да то подскажите куда в прошивке копать?

  21. Собрал схему выше на atmega 8 завелась на кварце 24мгц,но вот светодиод NUM LOCK на клаве горит постоянно и на нажатие кнопки не реагирует т.е нельзя использовать джойстик как описано выше прошивка v5.5.Остальное вроде работает нормально.В чем может быть проблема?Комп PENTAGON 128K модификация 2014г.

    1. А Caps Lock и Scroll Lock нормально реагируют? Может с самой клавиатурой что-то? Китайцы иногда и не такое могут учудить…

  22. Клава гениус KWD-820 стара как г… мамонта.На обычном компе нормально работает.Другой клавы правда с PS/2 нет в наличии.

  23. Да Админ ваша правда,попробовал на обычном компе не работает кнопка NUM LOCk видимо шлейф отвалился.Бум искать другую клаву.

  24. Доброй ночи. Собрал схему – работает но както прерывисто. Т.Е. если удерживать клавишу – то повтор символа получается с разным периодом. Atmega8A (по датащиту максимум 16мгц) а стоит кварц на 18 мгц. Проблема в малой частоте?

    1. Да, скорее всего слабоват, удивительно, что он на данной частоте вообще работает 🙂 я всегда ставлю 24, но 8А они такие…

  25. Собрал данную схему с МК ATmega168PA. Кварц 20 МГц. Прошивка 5.5 Fuse биты взял из файла readme.txt (Low 0xCE High 0xDD).
    После включения кратковременно вспыхивают три светодиода на клавиатуре. На Caps Lock, Num Lock, PrScr клавиатура не реагирует и соответствующий светодиод не зажигается. Сам спектрум ни на одно нажатие клавиатуры не реагирует. Подключено все по схеме, единственное вызывает затруднение сигнал /RDFE. У меня плата HARLEQUIN_128_Issue_2D. Это участок схемы https://zx-pk.ru/attachment.php?attachmentid=66061&d=1535183302. (здесь полная схема http://trastero.speccy.org/cosas/JL/Superfo-Harlequin-128K/128K-i.html). Я пробовал подключать его как к выводу 3, так и к выводу 6 микросхемы U5. Сигнал RESET ZX должен же формироваться вне зависимости от подключения линий КА8-КА15, KD0-KD4 и /RDFE? Те же светодиоды на клавиатуре тоже должны светится без подключения к спектруму? Просто как еще проверить работоспособность кнтроллера?

  26. Подскажите собрал данную схему на atmega8a кварц 24мгц клавиатуру подключаю по usb dexp k-902bu согнал /RDFE беру с лл1 как по схеме https://www.alpsoid.ru/?p=746. Клавиатура при подключении никак не реагирует, светодиоды не загораются, Атмегу прошивал прошивкий 5.5 24 мгц кварц через TL866II+, фьюзы как в readme.txt, лок галки сняты. Ленинграл 48к никак не реагрирует на нажатия клавиш, если замыкаешь контакты на самой плате ленинграда, символы на экране появляются.

  27. Продублирую с zx-pk.ru свое сообщение. Я провел эксперимент. Закатал назад ATMega168PA на плату и поставил кварц 25 МГц. Биты конфигурации выставил на внешнее тактирование и разрешил выход тактового сигнала на порт CLKO (РВ0). После подачи питания частотомер показал на этом выводе частоту в 25 МГц. Причем стабильную частоту, без скачков и провалов. Это стало доказательством, что МК дружит с кварцем на этой частоте. Прошил прошивку KBD13_M168P_nw_MODIFIEDv5_5_25MHz.hex.
    Результат отрицательный. Клавиатура не дружит с МК, Снизил тактовую до 8 МГц на внутреннем генераторе, клавиатура и МК заработали на этой частоте. Воспользовался случаем и проверил с какой частотой идет тактирование порта CLK клавиатуры. Всего 137 Гц. Что-то маловато. По вики там частота 10-16 кГц должна быть.
    В общем делаю выводы из своего эксперимента. Прошивка не работает, где-то в ней ошибка. Изначально надо сделать так, чтобы без проблем дружили МК и клавиатура, а уж затем проверять работу на ZX.

  28. Проверил на клоне ZX Spectrum КВАНТ и atmega8a, ставил кварцы от 20 до 30 МГц, проверил все прошивки по частотам. ПРОШИВКИ НЕ РАБОТАЮТ!!!. Или компьютер вешаеться – при этом повышается потребление электроэнерги примерно 200-500 мА, испортил 4 – atmegi, вероятно они вылетели из-за разностей уровней-атмега не в такт (в прерывание) выставляла свои данные на шину, один раз повредилась прошивка ПЗУ спеки. Самый лучший вариант- это реакция на prt sc – reser компа, и включение и выключение светодиодов num lk и …ПРОШИВКИ НЕ РАБОТАЮТ!!!.

    1. Добрый день.
      Прошивки неоднократно проверялсь и работали. Atmega8 по определению не может вылететь, если не нее не подавать повышенное напряжение более 5,5 вольт. Повредить ПЗУ тоже очень сложно, если нет повышенных напряжений или статики, скорее всего у вас проблемы с питанием или некачественные микроконтроллеры.

  29. Продолжая эксперементировать с кварцами и прошивками… Добился отказа части клавиатуры по линиям А15 и А14- 2 ряда перестали работать. Что интересно диоды по линиям на прозвон ЖИВЫЕ. При подключении данного контролера-повышаться потребление электроэнергии до 500мА и комп вешаеться или выполняет что-то непонятное из пзу. Схему по триста раз перепроверял….данный контроллер мне подпалил мой КВАНТ.

  30. Спасибо за проект, очень полезная штука. Я собирал для 4-х Спектрумов, все на 8-х Мегах. У меня заработало только на 20 Мгц, все прочие варианты не работали.
    Но есть “но” – маленькими клавиатурами (82-,83-кнопочными) пользоваться практически не возможно. При запуске включается NumLock – курсор работает, но вместо букв на ноутбучнах клавах – цифровая клавиатура. При выключении NumLосk – буквы работают, но вместо кусорных кнопок включается Sinclair_Joystick (6-9 и 0 на пробеле).
    В результате я модифицировал прошивку. При инициализации клавы команда, включающая ScrollLock и NumLock заменена на команду, выключающую все Lock-и. Убрано переключение курсора на Sinclair_Joystick путём редактирования таблицы замены кодов курсорных кнопок и пробела.
    Прошивка здесь – https://disk.yandex.ru/d/mgTT7LXgXUaMVw

    Было Стало
    0000006C: 83 80
    0000006D: E0 E0

    Было:
    .def KBD_IND=r24
    KBD_MAIN_R:
    // init indicators
    ldi KBD_IND,3 ; 3 = Scroll lock + num lock
    rcall KBD_SEND_INDICATORS
    Стало:
    .def KBD_IND=r24
    KBD_MAIN_R:
    // init indicators
    ldi KBD_IND,0 ; 0 = All Lock’s OFF
    rcall KBD_SEND_INDICATORS

    Было Стало
    00000506: 22 A4
    00000507: A4 A4
    00000508: 23 A5
    00000509: A5 A5
    0000050A: 25 9D
    0000050B: 9D 9D
    0000050C: 24 A3
    0000050D: A3 A3
    0000050E: 21 39
    0000050F: 39 39

    Было:
    KEYTABLE_ALT2: ; Keycode KEYS Value in table
    .db KEY_9, CS+KEY_7 ; 0x75 [Sinclair Up] / [Up] {ALT2-0}
    .db KEY_8, CS+KEY_6 ; 0x72 [Sinclair Down] / [Down] {ALT2-1}
    .db KEY_6, CS+KEY_5 ; 0x6B [Sinclair Left] / [Left] {ALT2-2}
    .db KEY_7, CS+KEY_8 ; 0x74 [Sinclair Right] / [Right] {ALT2-3}
    .db KEY_0, KEY_SP ; 0x75 [Sinclair Fire] / [Space] {ALT2-4}
    Стало:
    KEYTABLE_ALT2: ; Keycode KEYS Value in table
    .db CS+KEY_7, CS+KEY_7 ; 0x75 [Sinclair Up] / [Up] {ALT2-0}
    .db CS+KEY_6, CS+KEY_6 ; 0x72 [Sinclair Down] / [Down] {ALT2-1}
    .db CS+KEY_5, CS+KEY_5 ; 0x6B [Sinclair Left] / [Left] {ALT2-2}
    .db CS+KEY_8, CS+KEY_8 ; 0x74 [Sinclair Right] / [Right] {ALT2-3}
    .db KEY_SP, KEY_SP ; 0x75 [Sinclair Fire] / [Space] {ALT2-4}

Leave a Reply to GERMAN Cancel reply

Your email address will not be published.