ZX_BUS_Mouse — это максимально компактный, простой в повторении открытый интерфейс
PS/2 Kempston Mouse для шины
ZX-BUS (совместим также с Nemo-BUS). Проект включает прошивки микроконтроллера и CPLD, схему и разводку платы в KiCad.
Файлы для загрузки
История версий
| Версия | Изменения |
|---|
| V.1.0 | Сигнал IORQGE/ имеет уровень 3.3V (LVTTL). Плата не работает корректно в ZX-BUS XTRaiser. Для поддержки колеса мыши нужна CPLD EPM3064. При включении регистры MX, MY, MKEY инициализируются некорректно (0xFF, 0x80, 0x60 вместо 0x80, 0x60, 0xFF). |
| V.1.1 | Сигнал IORQGE/ буферизирован через 3-state buffer 74LVC1G125 до уровня TTL (5V) — исправлен конфликт с ZX-BUS XTRaiser, повышена стабильность. Добавлен разъём для внешнего брекета PS/2 (распиновка PC AT 486/Pentium). Добавлен разъём UART для отладки. Ширина краевого разъёма ZX-BUS увеличена с 80 до 81 мм. Описание схемы в CPLD переписано на Verilog и оптимизировано для поддержки колеса мыши на EPM3032 при отказе от третьей кнопки (32 macrocells). Возможна сборка без поддержки колеса (31 macrocells) и с полной поддержкой (34 macrocells на EPM3064). Не корректно работает с теневым монитором Scorpion (меню, не грузятся программы из ROM диска при активированной мыши). Нужен сигнал A15 в дешифрацию портов. |
| V.1.2 | Исправление загрузки с ROM диска в ПрофПЗУ Scorpion ZS 256. В дешифрацию портов и формирование сигнала IORQGE добавлен сигнал A15. |
Входные требования
- Разработать максимально компактный простой в повторении интерфейс PS/2 Kempston Mouse для шины ZX-BUS
- Исходники прошивок микроконтроллера/CPLD, схема и разводка платы — полностью открыты
- Сигнал WAIT микропроцессора не должен использоваться
Не входит в требования:
- Поддержка USB мыши (объём аппаратной и программной поддержки USB стека не соответствует сложности задачи)
Описание интерфейса Kempston Mouse
Контроллер доступен как три 8-разрядных регистра кнопок и осей X/Y по адресам:
| Порт | Адрес | Регистр |
|---|
| #FADF | 1111 1010 1101 1111 | MKEY (кнопки) |
| #FBDF | 1111 1011 1101 1111 | MX (ось X) |
| #FFDF | 1111 1111 1101 1111 | MY (ось Y) |
Регистр MKEY:
- Биты 0–2 — инвертированные значения левой, правой, средней кнопок мыши
- Бит 3 — зарезервирован под четвёртую кнопку (всегда =1)
- Биты 4–7 — значение оси mouse wheel (если поддержана; начальное %0000). Если wheel не поддержана — всегда %1111
При переполнении 8-битных значений координат осей происходит перенос. Значения осей — 8-битное целое со знаком в дополнительном коде.
Спецификация оси mouse wheel публично зафиксирована в сообщении в Fido эхоконференции REAL SPECCY.
Дополнительная информация:
https://speccy.info/Kempston_Mouse
Некоторые исторические реализации и публикации
| Год | Название | Автор(ы) | Особенности |
|---|
| 1986 | Original Kempston Mouse Interface | Kempston | Оригинал |
| 1995 | ZX-Ревю #1 | М.Свечков, К.Мехедов | Схема |
| 1995–97 | Scorpion & Д.К. | Scorpion (СПб) | Контроллер IBM PC-клавиатуры и мыши (схема, прошивка V2.5, инструкция) |
| 1995 | Схема от Михаила Кондратьева | Михаил Кондратьев | — |
| 1996 | Kempston Mouse от Create Soft | Максим Романов (Mad Max & RML) | ZX-Format #5 |
| 1996 | Spectrofon #20 | Владимир Лаpьков | ZX-SPECTRUM и МЫШЬ |
| 1996 | AY Mouse | V.M.G. | ZX Power #1 |
| 1998 | Optron #13 | Рашпиль, Сергей Филимонов | Kempston mouse |
| 1998 | ZX Club #09 | SERGIUS PUZZLER / PROXIMA | Kempston mouse |
| 2000 | Adventurer #11 | Паршуков Юрий/CPU | Простая и маленькая схема |
| 2000 | Deja Vu #0A | Felix Knajzev | Схема на КР580ВВ55А |
| 2003 | DonNews #19 | Bit/XXL | Поддержка оси mouse wheel |
| 2000 | Схема на AT89C2051 | Eugene Stahov | Использует WAIT; исходный код закрыт |
| 2003 | PS/2 -> Kempston Mouse Adapter v2.0 | Studio STALL, Kamil Karimov | AT90S2313/AT90S1200, используется WAIT; код закрыт |
| 2010 | PS/2 -> Kempston Mouse Adapter v4.0 | Kamil Karimov | ATTiny2313 @20 МГц, без WAIT; код закрыт |
| 2006/08/11 | The Kempston Mouse Turbo Interface | Velesoft, Ben Versteeg | PIC16F84A + CPLD XC9572X, master/slave, wheel; код закрыт |
| 2007 | Z-Controller | Алексей Жабин KingOfEvil | KR1878ВЕ1 + EPM7128SLC84; код открыт в 2024 |
| 2010 | ZX Evolution | NedoPC | ATMEGA128, PS/2 клавиатура и мышь; open source |
| 2005 | ZX_Multi_Card ZXMC1/ZXMC2 | caro Kamil Karimov | PS/2 мышь (Kempston с колесом), клавиатура, RS232, RTC; closed source |
| 2016 | Схема для Nemo-BUS | Prusak | Модификация схемы из Spectrofon #20 |
| 2023 | Контроллер для USB клавиатуры и мыши | Игорь Матвеев @azx987sa | CH9350; код открыт в 2025 |
Детали реализации
Для реализации выбрана связка
ATmega8 + EPM3032. Общая идея, схема включения и выбор битов адреса для дешифрации портов взяты из
Deltagon 1.5 (Евгений Королёв @djking26, Игорь Матвеев @azx987sa).
ATmega8:
- Прошивка написана на C. В отдельной ветке есть упрощённая версия на библиотеках Arduino.
- Аппаратные прерывания по фронтам PS/2 MDATA/MCLK и таймеры не использовались для большей понятности кода. Однако сигналы MDATA/MCLK подключены к INT1/INT0 — есть альтернативная прошивка, использующая аппаратное прерывание от PS/2 clock (для разработчиков).
CPLD EPM3032:
- Реализация регистров интерфейса, дешифрации адресов и формирования сигнала IORQGE выполнена на Verilog (есть также менее понятная реализация на VHDL).
- Используется 31 из 32 макроячеек с отключёнными битами оси mouse wheel; 33 макроячейки при включении битов wheel.
- По умолчанию: поддержка двух кнопок и mouse wheel — используется 32 макроячейки.
- Теоретически возможно использование EPM3064 или оптимизация кода.
- Формирование сигнала IORQGE/ происходит исходя из битов адресов A0, A1, A7, A5 и сигнала M1/.
Инициализация:
- При подаче питания до первого пакета от PS/2 мыши в регистры MKEY, MX, MY записываются значения 0xFF, 0x80, 0x60.
- При отключённой поддержке wheel в старших 4 битах MKEY — %1111; при включённой — начальное значение оси %0000.
Отладка:
- Проводилась на Pentagon 2024 и сверялась с эмулятором Unreal Speccy 0.39.0 (референс).
- Подтверждена работа на Scorpion ZS 256, Scorpion ZS 1024, Pentagon 1024ZP Crocodile Edition.
Известные проблемы
- На Scorpion ZS 256 в меню сервисного монитора мышь работает некорректно (при этом тест в RAM работает). Не работает загрузка с ROM диска в ПрофПЗУ при включённой опции графических манипуляторов. Исправлено добавлением сигнала A15 в схему дешифрации (также проблема исправляется использованием сигнала /DOS).
- Некорректная работа регистров осей в CPLD (перепутанные биты) — решается перекомпиляцией и перепрошивкой CPLD.
- На некоторых платах с неправильной реализацией IORQGE возможен конфликт с портом Kempston Joystick.
Сомнительные моменты (решённые)
- PS/2 мышь может требовать задержку перед инициализацией. Решено перезагрузкой контроллера через 2 секунды ожидания инициализации.
- Проблема с Gluk Reset Service: Мышь при включении автоматически не определяется (ATmega не успевает проинициализировать PS/2 мышь за 1–2 с и выставить регистры за ~6 мкс). Варианты решения: (1) удерживать /RESET Z80 контроллером (как в ZXMC); (2) инициализировать регистры сразу после включения. В коде реализован второй вариант.
Bill of Materials (BOM)
| Ref | Колич. | Номинал/Модель | Корпус | Описание |
|---|
| C1–C8 | 8 | 0.1 мкФ | 1206 | Керамический конденсатор |
| C9 | 1 | 10 мкФ | Tantalum SMD (6032-28) | Танталовый (полярный) |
| C10 | 1 | 22 мкФ | Tantalum SMD (6032-28) | Танталовый (полярный) |
| J4 | 1 | Mini-DIN-6 | Mini-DIN-6 female | Разъём PS/2 (зелёный с прямыми ушками) |
| J5 | 1 | 2×03 ISP | PinHeader 2.54mm | ISP разъём (опционально) |
| J7 | 1 | 2×05 JTAG | IDC-Header 2.54mm | JTAG разъём (опционально) |
| R1 | 1 | 2.2 кОм | 1206 | Резистор |
| R2, R3 | 2 | 4.7 кОм | 1206 | Резистор |
| R4–R7 | 4 | 10 кОм | 1206 | Резистор |
| U1 | 1 | ATmega8A-U | TQFP-32 (7×7 мм, 0.8 мм) | 16 МГц, 8 КБ Flash, 1 КБ SRAM, 512 Б EEPROM |
| U2 | 1 | EPM3032ALC44 | PLCC-44 (THT-сокет) | CPLD MAX3000A, 32 макроячейки, 34 I/O |
| U3 | 1 | AMS1117-3.3 | SOT-223-3 (TabPin2) | LDO регулятор, 3.3 В, 1 А |
| U4 | 1 | 74LVC1G125DB | SOT-23-5 | Буфер с 3-состоянием |
| — | 1 | PLCC-44 сокет | THT DIP | Для установки CPLD |
Отладочные компоненты:
- R8, R9 — 2.2 кОм (1206) — подтяжка I2C SDA/SCL
- J6 — разъём 1×04 (PinHeader 2.54mm) — I2C для OLED
Сборка прошивок
ATmega8:
- Требуется: WinAVR-20100110, MSYS2
- Команды: make clean, make all
- Fuses: Low=0xC4, High=0xD9
Altera EPM3032:
- Требуется: Quartus II Web Edition 9.1 SP2 или 13.0 SP1
- Открыть проект → Start Compilation → Programmer (USB Blaster) → выбрать .pof → Program/Configure/Verify → Start
Прошивка
ATmega8:
- Программатор CH341A, ПО NeoProgrammer V2.2. Прижать ISP-гребёнку под углом (можно не припаивать).
Altera EPM3032:
- Altera USB Blaster (или китайский аналог на CH552G — может потребоваться обновление прошивки программатора). Драйвер — из quartus/drivers/usb-blaster.
- Важно: при прошивке CPLD подайте внешнее питание 5V (через ISP или слот ZX-BUS). На практике плата успешно перешивалась на включённом Pentagon 2024.
- Б/у чипы EPM3032 могут быть залочены — можно попытаться разблокировать или заказать у другого поставщика.
Поддержка mouse wheel
| Конфигурация | Код (заменить в Verilog/VHDL) | Макроячейки | Целевое CPLD |
|---|
| 2 кнопки + wheel (по умолчанию) | assign D = MKEY_SEL ? {register_key[7:4], 2'b11, register_key[1:0]} : 8'hZ; | 32 | EPM3032 |
| 3 кнопки без wheel | assign D = MKEY_SEL ? {4'b1111, register_key[3:0]} : 8'hZ; | 31 | EPM3032 |
| 3 кнопки + wheel | assign D = MKEY_SEL ? register_key : 8'hZ; | 34 | EPM3064 |
Отладка
С OLED дисплеем I2C 128×32:
- Запаять R8, R9 (2.2 кОм), подключить дисплей к разъёму I2C.
- Прошить отладочную прошивку ZX_BUS_Mouse_ATmega8_Fuses_C4_D9_Debug_OLED_128x32.hex
- При движении мыши будут выводиться координаты и состояние wheel/кнопок.
Со светодиодом:
- Подключить светодиод (короткий пин — к GND) к контактам SDA и GND разъёма I2C.
- Прошить ZX_BUS_Mouse_ATmega8_Fuses_C4_D9_Debug_LED_SDA_GND.hex
- При успешной инициализации PS/2 светодиод загорается; при нажатии кнопок гаснет.
Тестовое ПО
MousTest (C) 2012 Patrik Rak (raxoft) — в папке test.
Credits (Благодарности)
- Общая идея, схема включения, выбор битов адреса: Deltagon 1.5 (Евгений Королёв @djking26, Игорь Матвеев @azx987sa)
- @Alex_Eburg — ZX BUS PCB Prototype Board
- Black_Cat — BC Info Guide #7 «Стандартизация ZXBus интерфейсов и шин» (c) 2011–2020
- Adam Chapweske — PS/2 Mouse/Keyboard Protocol (1999), The PS/2 Mouse Interface (2003)
- Kris Chambers — Arduino/Wiring Library for 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
- Denis (Новый Уренгой) — тестирование и отладка на Scorpion ZS 256
- @djking26 — локализация проблемы с Gluk Reset Service
Полезные ссылки проекта:
-
photo_3.jpg
42.5 КБ
· Просмотры: 12