Version_1.0
- Сигнал IORQGE/ имеет уровень 3.3V (LVTTL). Плата не работает корректно в ZX-BUS XTRaiser.
- Для включения поддержки колеса мыши нужна CPLD EPM3064.
- При включении регистры контроллера MX, MY, MKEY инициализируются некорректно в 0xFF, 0x80, 0x60: должно быть 0x80, 0x60, 0xFF (в регистре MKEY кнопки должны быть отжаты).
Текущая версия:
- Сигнал IORQGE/ буферизирован через 3-state buffer 74LVC1G125 до уровня TTL (5V) для исправления конфликта с ZX-BUS XTRaiser (не проверено) и предупреждения обратного тока с других карт через IO выход CPLD. Решение подсмотрено в схемах в ZX-Multisound и ZXM-GeneralSound.
- Добавлен разъем для подключения внешнего брекета PS/2 (распространенная распиновка PC AT 486/Pentium материнских плат)
- Добавлен разъем UART для отладки
- Ширина краевого разъема ZX-BUS увеличена с 80 до 81 мм
- Описание схемы в CPLD переписано на Verilog и оптимизировано для поддержки колеса мыши на EPM3032 при отказе от третьей кнопки мыши (32 macrocells). Возможна сборка без поддержки колеса мыши (31 macrocells) и с полной поддержкой (34 macrocells).
- Разработать максимально компактный простой в повторении интерфейс PS/2 Kempston Mouse для шины ZX BUS.
- Исходники прошивок микроконтролллеров / CPLD, схема и разводка платы должны быть полностью открыты.
- Сигнал WAIT микропроцессора не должен использоваться.
Не входит в требования:
- Поддержка USB мыши. Объем аппаратной и программной поддержки USB стека в микроконтроллере не соответствует сложности задачи.
Контроллер доступен как 3 8-разрядных регистра кнопок и осей X/Y MKEY, MX, MY по следующим адресам портов:
#FADF 1111 1010 1101 1111 BUTTONS #FBDF 1111 1011 1101 1111 MX #FFDF 1111 1111 1101 1111 MY
- Биты 0-2 регистра MKEY соответствуют инвертированным значениям левой, правой, средней кнопок мыши.
- Бит 3 регистра MKEY зарезервирован под четвертую кнопку мыши и всегда равен 1.
- Биты 4-7 регистра MKEY хранят значение оси mouse wheel, если она поддержана (начальное значение %0000). Если ось mouse wheel не поддержана, всегда содержат %1111.
При переполнении 8-bit значений координат осей происходит перенос значения.
Спецификация оси mouse wheel была публично зафиксирована в сообщении в Fido эхоконференции REAL SPECCY
Дополнительная информация: https://speccy.info/Kempston_Mouse
Original Kempston Mouse Interface (1986)
ZX-Ревю 1995 #1
[схема]
KEMPSTON-MOUSE
(С) М.Свечков (схема), К.Мехедов (программа) 1995
Фирма Scorpion & Д.К. (Санкт-Петербург 1995-97)
Контроллер IBM PC-клавиатуры и мыши
Схема Прошивка V2.5
Инструкция по работе и подключению: V2.1: 1 2
V2.5: 1 2
Публикации:
ZX Format #01 (31 октября 1995)
On-Line #15 (17 декабря 1995)
On-Line #16 (24 декабря 1995)
Схема от Михаила Кондратьева (17 апреля 1995)
Интерфейс Kempston Mouse от Create Soft (Максим Романов, Mad Max & RML) (Санкт-Петербург)
ZX-Format #5 (12 декабря 1996)
[screenshot]
Схемa KEMPSTON MOUSE
(С) Mad Max
Spectrofon #20 (12 октября 1996)
[text]
[screenshot]
[схема]
ZX-SPECTRUM и МЫШЬ
(C) Владимиp Лаpьков, 1996, Санкт-Петербург
AY Mouse
ZX Power #1 (12.10.1996)
В ЗАЩИТУ БЕДНОЙ МЫШКИ
(C) V.M.G., Харьков
Optron #13 (12 июня 1998)
[screenshot]
Kempston mouse
(C) Рашпиль, Сергей Филимонов
ZX Club #09 (31 октября 1998)
[screenshot]
Kempston mouse
(С) SERGIUS PUZZLER / PROXIMA
Adventurer #11 (31 июля 2000)
[screenshot]
Описание на подключение Kempston MOUSE (простая и маленькая схема)
(C) Паршуков XN0ByS Юрий/CPU
Deja Vu #0A (30 сентября 2000)
[text]
[screenshot]
Схема Kempston Mouse Interface (v2.1) на БИС KP580BB55A
(C) Felix Knajzev
Поддержка оси mouse wheel
DonNews #19 (26 февраля 2003)
[screenshot]
KEMPSTON MOUSE INTERFACE
(C) Bit/XXL
Схема контроллера мыши на AT89C2051 (MSC-51)
Опубликовано в ZX-Net эхоконференции HARDWARE.ZX (21 Aug 2000)
(C) Eugene Stahov 1999-2000
Микроконтроллер AT89C1051/AT89C2051, исходный код прошивки закрыт.
Использует сигнал WAIT при опросе регистров интерфейса.
PS/2 -> Kempston Mouse Adapter v2.0
Опубликовано в Fido эхоконференции ZX.SPECTRUM (2003-01-10)
(C) 1999-2000 Studio STALL (Eugene Stahov)
(C) 2003 Kamil Karimov
Микроконтроллер AT90S2313 (или AT90S1200), исходный код прошивки закрыт.
Использует сигнал WAIT при опросе регистров интерфейса.
PS/2 -> Kempston Mouse Adapter v4.0
[схема]
(C)2010 Kamil Karimov
Не использует сигнал WAIT.
Для обеспечения работы контроллера без торможения Z80 микроконтроллер ATTiny2313 работает на частоте 20 Мгц.
Исходный код прошивки микроконтроллера закрыт.
The Kempston Mouse Turbo Interface 2006/2008/2011 by Velesoft and Ben Versteeg
PC Mouse and Kempston joystick Interface for the Sinclair ZX Spectrum
Поддержка master/slave mouse, mouse wheel.
Микроконтроллер PIC16F84A + CPLD XC9572X
Исходный код прошивки микроконтроллера закрыт.
Z-Controller
(C) Алексей Жабин KingOfEvil 2007
Позволяет подключать к ZX Spectrum стандартную клавиатуру и мышь с интерфейсом PS/2, IDE-устройства, карты флеш-памяти стандарта SD. Устройство предназначено для установки в слот ZX Bus.
Документация
Микроконтроллер КР1878ВЕ1 + CPLD EPM7128SLC84
Исходный код прошивок CPLD и микроконтроллера открыт в 2024 году
ZX Evolution
(C) NedoPC 2010
Периферийный контроллер ATMEGA128
PS/2 интерфейс клавиатуры и мыши
Open source
ZX_Multi_Card ZXMC1/ZXMC2
(C) caro Kamil Karimov 2005
Поддерживает:
- IBM AT клавиатуру - эмулирует стандартную клавиатуру Спектрума;
- PS/2 мышка - эмулирует Кемпстон мышку (с колесом);
- RS232 - поддержка внешнего модема с адресацией по Кондратьеву.
- Часы реального времени (RTC)
Closed source
Схема контроллера Kempston Mouse для Nemo-BUS (модификация схемы из Spectrofon #20)
(C) Prusak 2016
Контроллер для USB клавиатуры и мыши
[github]
(С) Игорь Матвеев @azx987sa 2023
Микроконтроллер CH9350
Closed source
Для реализации была выбрана связка ATmega8 + EPM3032.
Общая идея контроллера Kempston Mouse на ATmega+EPM3032, схема включения и выбор битов адреса для дешифрации портов были взяты из Deltagon 1.5 (C) Евгений Королёв @djking26, Игорь Матвеев @azx987sa.
Прошивка ATmega для обработки протокола написана на языке C. В отдельной ветке есть упрощенная прошивка на библиотеках Arduino.
Аппаратные прерывания ATmega по фронтам сигналов PS/2 MDATA/MCLK и таймеры не использовались для большей понятности кода. Тем не менее, сигналы MDATA/MCLK подключены к входам INT1/INT0 микроконтроллера, есть альтернативная прошивка, использующая аппаратное прерывание от сигнала PS/2 clock. Альтернативная прошивка предназначена в первую очередь для разработчиков.
Реализация регистров интерфейса, схемы дешифрации адресов и формирования сигнала IORQGE для CPLD EPM3032 выполнена на языке Verilog. Также есть признанная менее понятной реализация на VHDL.
Текущая реализация использует 31 из 32 macrocells в CPLD EPM3032 c отключенными битами оси mouse wheel в регистре кнопок мыши, 33 macrocells при включении битов оси mouse wheel.
Теретически возможно использование менее доступной и более дорогой CPLD EPM3064 или оптимизация модели в Verilog и распределения ресурсов в CPLD.
По умолчанию включена поддержка двух кнопок и mouse wheel, используется 32 macrocells.
При подаче питания на контроллер до прихода первого пакета событий от PS/2 мыши в регистры MKEY, MX, MY всегда записываются значения 0xFF, 0x80, 0x60.
При отключенной поддержке оси mouse wheel в старших 4 битах регистра MKEY %1111, при включенной поддержке начальное значение оси %0000.
Формирование сигнала IORQGE/ происходит исходя из общих битов адресов портов A0,A1,A7,A5/ и сигнала M1/.
Отладка устройства проводилась на Pentagon 2024 и сверялась с эмулятором Unreal Speccy 0.39.0, выбранным как референс реализации. Работа на других клонах ZX Spectrum не проверялась.
Условная эквивалентная схема контролллера в CPLD:
На Scorpion ZS 256 в меню сервисного монитора мышь работает некорректно, при этом тест, загруженный в RAM, работает корректно. Симптоматически исправлялось включением сигнала A15 в схему дешифрации, аргументированного объяснения этому пока нет. Вариант с использованием сигнала /DOS не проверялся.
Была замечена некорректная работа регистров осей в CPLD: выглядело как перепутанная пара битов. Решилось перекомпиляцией описания схемы и прошивкой CPLD.
На некоторых платах с неправильной реализацией IORQGE теоретически возможен конфликт с портом Kempston Joystick.
PS/2 мышь может требовать задержку перед инициализацией после подачи питания. Решено перезагрузкой контроллера после 2 секунд ожидания инициализации устройства PS/2.
Gluk Reset Service проверяет наличие мыши сразу после включения.
Проверки:
- В цикле неясной длительности проверяется, что значение оси X не меняется
- Проверяется, что регистр KEY не равен регистру X
- Проверяется, что младшие 3 бита регистра KEY равны 1
Проблема:
Мышь при включении автоматически не определяется, но определяется после сброса. Можно принудительно включить мышь через клавишу [8].
Суть проблемы в том, что микроконтроллер ATmega не успевает проинициализировать PS/2 мышь (1-2 s) и выставить значения регистров контроллера по умолчанию (~6 us).
Варианты решения:
- Для определения наличия подсоединенной к контроллеру мыши требуется до 1-2 секунд, в течении которых сигнал /RESET Z80 удерживается контроллером, как это например сделано в контроллере ZXMC.
- Инициализировать регистры контроллера сразу после включения, не дожидаясь проверки наличия PS/2 мыши. Все еще требует внешней задержки сигнала /RESET Z80 более 6 us. Для ПО подобного Gluk тест наличия мыши будет проходить, даже если PS/2 мышь не присоединена.
В коде реализован второй вариант.
Ref | Qnty | Value | Cmp name | Footprint | Description |
---|---|---|---|---|---|
C1, C2, C3, C4, C5, C6, C7, C8 | 8 | 0.1u | C | Capacitor_SMD:C_1206_3216Metric | Unpolarized capacitor |
C9 | 1 | 10u | C_Polarized | Capacitor_Tantalum_SMD:CP_EIA-6032-28_Kemet-C_Pad2.25x2.35mm | Polarized capacitor |
C10 | 1 | 22u | C_Polarized | Capacitor_Tantalum_SMD:CP_EIA-6032-28_Kemet-C_Pad2.25x2.35mm | Polarized capacitor |
J4 | 1 | Mini-DIN-6 | Mini-DIN-6 | Connector_Mini-DIN_Female_6Pin_2rows | 6-pin Mini-DIN connector |
J5 | 1 | Conn_02x03_Odd_Even ISP | Conn_02x03_Odd_Even | Connector_PinHeader_2x03_P2.54mm_Vertical | |
J7 | 1 | Conn_02x05_Odd_Even JTAG | Conn_02x05_Odd_Even | Connector_IDC-Header_2x05_P2.54mm_Vertical | |
R1 | 1 | 2.2K | R | Resistor_SMD:R_1206_3216Metric | Resistor |
R2, R3 | 2 | 4.7K | R | Resistor_SMD:R_1206_3216Metric | Resistor |
R4, R5, R6, R7 | 4 | 10K | R | Resistor_SMD:R_1206_3216Metric | Resistor |
U1 | 1 | ATmega8A-U | ATmega8A-U | Package_QFP:TQFP-32_7x7mm_P0.8mm | 16MHz, 8kB Flash, 1kB SRAM, 512B EEPROM, TQFP-32 |
U2 | 1 | EPM3032ALC44 | EPM3032ALC44 | Package_LCC:PLCC-44_THT-Socket | CPLD MAX3000A MCs:32 IOs:34 [PLCC-44] |
U3 | 1 | AMS1117-3.3 | AMS1117-3.3 | Package_TO_SOT_SMD:SOT-223-3_TabPin2 | 1A Low Dropout regulator, positive, 3.3V fixed output, SOT-223 |
U4 | 1 | 74LVC1G125DB | 74LVC1G125 | Package_TO_SOT_SMD:SOT-23-5 | Single Buffer Gate Tri-State, Low-Voltage CMOS |
IC Socket PLCC-44 THT DIP
Разъем J4 PS/2 зеленый с прямыми ушками.
Разъемы программаторов J5, J7 - любой pin header 2x03, 2x05 2.54mm. Запаивать их не обязательно.
Конденсаторы C9, C10 линейного преобразователя напряжения танталовые согласно datasheet.
Отладочные компоненты:
Ref | Qnty | Value | Cmp name | Footprint | Description |
---|---|---|---|---|---|
R8, R9 | 2 | 2.2K | R | Resistor_SMD:R_1206_3216Metric | Resistor |
J6 | 1 | Conn_01x04 Debug | Conn_01x04 | Connector_PinHeader_1x04_P2.54mm_Vertical |
Нужно установить AVR SDK: WinAVR-20100110
Сompile:
make clean make all
Собранная прошивка с включенной поддержкой mouse wheel и отключенным отладочным выводом на OLED дисплей.
Для сборки и заливки прошивки CPLD необходима бесплатная версия ПО Quartus II Web Edition версии 9.1 SP2 / 13.0 SP1
Последовательность компиляции и прошивки:
- File/Open Project
- Processing/Start Compilation
- Tools/Programmer
- При необходимости выбрать программатор USB Blaster через Hardware Setup
- Для файла скомпилированной прошивки mouse_controller.pof выбрать Program/Configure и Verify.
- Start.
Для прошивки ATmega можно использовать программатор CH341A и ПО NeoProgrammer V2.2.
Последовательность прошивки:
- Убедиться, что микроконтроллер доступен и определяется через SPI: Нажать Detect.
- Если контроллер не определяется, то возможна ошибка соединения проводов с программатором, отсутствие контакта в разъеме ISP, ошибки сборки, в микроконтроллере могут быть прошиты fuses для использования внешнего кварцевого резонатора.
- Выставить Fuses через соответствующий диалог, нажать Write.
Low High 0xC4 0xD9
- Открыть файл .hex прошивки через Open File.
- Через Write IC сделать Erase/Write/Verify.
При некоторой сноровке гребенки разъемов ISP и JTAG можно не припаивать, а прижать под углом на время прошивки.
Для прошивки по JTAG может быть использован дешевый аналог Altera USB Blaster.
Несколько более дорогие аналоги USB Blaster на FT245+CPLD возможно более совместимы в установке и работе (не проверялось).
Доступные дешевые аналоги Altera USB Blaster Rev.c на CH552G условно работоспособны, нужно обновление прошивки программатора.
Требуется WCHISPTool и прошивка CH552_Blaster_v22.2.27.hex
Подробнее: Прошивка китайского USB-Blaster на основе CH552G
Драйвер программатора устанавливается из папки установки quartus/drivers/usb-blaster
После запайки в плату всех компонентов помимо CPLD и обвязки JTAG, в первую очередь преобразователя питания 5V=>3.3V, при подаче питания 3.3V на разъем JTAG с программатора напряжение питания падает до ~2V.
CPLD определяется в Quartus, но не прошивается.
Нужно подать на плату внешнее питание 5V через разъем ISP или слот ZX-BUS.
На практике при отладке плата успешно перешивалась на лету на включенном Pentagon 2024.
Требуется особая осторожность при подключении программаторов через USB, необходимо выполнять на выключенном устройстве.
Бывшие в употреблении чипы EPM3032 могут быть залочены и не видны через JTAG интерфейс. Можно попытать удачи в процедуре unlock, или заказать у другого поставщика.
Поддержка mouse wheel в регистре кнопок контроллера включена по умолчанию с отключенной третьей кнопкой мыши. Эта реализация использует 32 macrocells и помещается в EPM3032 (source/Altera-VHDL/mouse_controller.v):
// Example 2 buttons mouse support with mouse wheel (32 macrocells)
// Exclude 3rd mouse button and reserved bit from output in order to fit to EPM3032.
assign D = MKEY_SEL ? {register_key[7:4], 2'b11, register_key[1:0]} : 8'hZ;
Для поддержки третьей кнопки мыши без колеса прокрутки заменить на:
// Example 3 buttons mouse support with mouse wheel turned off (31 macrocells)
assign D = MKEY_SEL ? {4'b1111, register_key[3:0]} : 8'hZ;
Для полной поддержки заменить на:
// Example 3 buttons mouse support with mouse wheel (34 macrocells)
assign D = MKEY_SEL ? register_key : 8'hZ;
Целевым устройством указать EPM3064.
Работа с EPM3064 не тестировалась.
ПО для тестирования интерфейса: MousTest (C) 2012 Patrik Rak - Raxoft
Для отладки интерфейса PS/2 можно использовать OLED I2C Display 128x32. Должны быть запаяны резисторы подтяжки I2C SDA/SCL R8, R9.
Припаивать дисплей не нужно, достаточно контакта в разъеме I2C под собственным весом дисплея.
В Makefile нужно включить отладочный код и пересобрать с библиотекой OLED for AVR mikrocontrollers:
CFLAGS += -DDEBUG=1
Можно отследить шаги инициализации устройства PS/2, тип устройства, обработку осей, кнопок и колеса мыши.
Проверка инициализации и работы PS/2 мыши микроконтроллером ATmega8:
Вариант 1:
- Вставить OLED дисплей 128x132 в разъем I2C.
- Прошить отладочную прошивку ZX_BUS_Mouse_ATmega8_Fuses_C4_D9_Debug_OLED_128x32.hex
При включении выводится надписи Init... Done и далее при движении мыши ее координаты и состояние оси wheel / кнопок.
Вариант 2:
- Присоединить светодиод к контактам разъема I2C GND и SDA. Короткий пин светодиода к GND.
- Прошить отладочную прошивку ZX_BUS_Mouse_ATmega8_Fuses_C4_D9_Debug_LED_SDA_GND.hex
При включении после успешной инициализации PS/2 мыши светодиод загорается. При нажатии кнопок гаснет.
- Общая идея контроллера Kempston Mouse на связке ATmega+EPM3032, схема включения и выбор битов адреса для дешифрации портов: Deltagon 1.5 (C) Евгений Королёв @djking26, Игорь Матвеев @azx987sa
- @Alex_Eburg - ZX BUS PCB Prototype Board
- Black_Cat - BC Info Guide #7. Стандартизация ZXBus интерфейсов и шин. (c) Black_Cat 2011-2020
- Adam Chapweske - PS/2 Mouse/Keyboard Protocol (C) 1999, The PS/2 Mouse Interface (C) 2003
- Kris Chambers - Arduino/Wiring Library for interfacing with a PS2 mouse
- Patrik Rak raxoft - MousTest
- Sylaina - OLED for AVR mikrocontrollers library
- Velesoft - RUSKA VERZE KEMPSTON MOUSE - скриншоты статей из электронных журналов
- Zxdn - Электроника/схемы устройств - Клавиатуры, мыши
- Калинин Вячеслав/newart - zxpress.ru
- @AMM - поддержка в начальном запуске
- @Michael_Kaa - помощь в тестировании на Scorpion ZS 256
- @djking26 - локализация проблемы с Gluk Reset Service