Здесь приведен перевод статьи [1], описывающий оригинальную разработку, позволяющую подключить стандартную клавиатуру PC/AT (PS/2) в качестве клавиатуры ZX Spectrum.
Что в реальности представляет из себя ZX-Spectrum? Почти все, что Вы хотели бы знать об этой старой 8-битной системе, пришедшей из далеких 80-х, можно найти на сайтах World of Spectrum [2] и Planet Sinclair [3].
[Немного теории]
Для тех, кто не знаком с клавиатурой Spectrum: это простая матрица сканирования на 5 входов и 8 выходов. Эту матрицу контактов процессор z80 читает командой ассемблера in с одним или несколькими из старших сигналов адреса A8..A15, которые будут притягивать к лог. 0 пять бит данных D0..D4 при нажатии клавиши. Биты данных вычитываются через Sinclair ULA (ULA расшифровывается как uncommitted logic array, т. е. некоммутируемая логическая матрица). Нажатая клавиша подключает к лог. 0 (через диод) входной разряд ULA, подключенный к клавиатуре. Этот входной разряд подтянут к лог. 1 через резистор 10k, поэтому нажатая клавиша передает лог. 0 с шины адреса (один из выходных сигналов A8..A15) на входной разряд (один из входных сигналов D0..D4). Получается очень дешевый и эффективный способ получить клавиатуру из 40 клавиш, поскольку 8 сигналов адреса и 5 бит данных дают матрицу из 8x5 = 40 клавиш.
Таким образом, чтобы эмулировать оригинальное поведение такой клавиатуры с помощью стандартной клавиатуры AT (PS/2), нужно всего лишь прочитать AT-код нажатой клавиши, превратить его в 5 бит данных входов ULA, и поместить эти данные на разряды D0..D4 шины данных Spectrum в тот момент, когда произошло чтение Z80 по адресу, в котором один (или несколько) из старших бит адреса A8..A15 равны 0. Просто, не так ли?
[Как устроена клавиатура YAZSAKI]
Разработка состоит только из 2 основных компонентов - микроконтроллер Amtel AVR ATtiny45 (MCU) и микросхемы сложной программируемой логики XC9572 Xilinx (CPLD, complex programmable logic device).
К ATtiny45 подключена стандартная AT-клавиатура, он инициализирует её и обменивается с ней данными через 2 сигнала (PS/2 это обычный интерфейс I2C или TWI в терминологии Atmel). При инициализации клавиатура PS/2 переводится в режим "scan code set 3", где упрощается кодировка клавиш (нет расширенных скан-кодов), что упрощает их декодирование. Также запрещается функция автоповтора клавиш (auto-repeat) - автоповтор поддерживается самим Spectrum, так что это не требуется реализовывать на стороне клавиатуры. Программа микроконтроллера по таблице транслирует 127 возможных AT-кодов клавиш в биты столбца и строки клавиатуры Spectrum. Подробнее см. исходный код микроконтроллера [7].
В завершение микроконтроллер последовательным кодом записывает состояние всех 40 клавиш клавиатуры в микросхему CPLD Xilinx. CPLD работает как устройство памяти на 40 бит, где хранятся состояния клавиш "нажато" и "отпущено", и эти состояния передаются в схему Spectrum, когда его процессор z80 их запрашивает.
Важная вещь, которую делает CPLD помимо хранения данных клавиш - обработка чтений I/O от процессора Spectrum! Когда Spectrum читает клавиатуру инструкцией IN системы команд z80, код логики CPLD детектирует наличие сигнала IORGE, когда сигнал на линии /RD процессора Z80 переходит в лог. 0, что означает чтение клавиатуры, и помещает на разряды D4..D0 состояние массива бит клавиш. Эти биты управляются сигналами разрядов адреса A8..A15, они разрешают сканирование определенного столбца клавиатуры, и соответствуют определенным данным D4..D0 строк матрицы клавиатуры. Поскольку ULA эффективно 'изолирована' от шины данных Specturm, то CPLD получает приоритет, поэтому данные Spectrum читает без препятствий и нет конфликта со стороны ULA.
Чем такой дизайн отличается от других подобных разработок [8]? Он наиболее точно эмулирует аппаратную матрицу клавиатуры. Оригинальный Spectrum может читать больше одной строки клавиш за одну операцию IN, и может выводить лог. 0 на большее количество столбцов линий адреса клавиатуры. Большое достоинство дизайна на CPLD в том, что он может симулировать подобное поведение без особых проблем. Так например, если 2 адресные линии A8 и A10 находятся в состоянии лог. 0, то CPLD выведет состояния отпущено/нажато на обе соответствующие строки шины данных, поэтому чтение клавиатуры будет происходить точно так же, как и в оригинальном Spectrum.
[Технические замечания по работе MCU и CPLD]
Система последовательного сдвига бит, передаваемых от MCU к CPLD, очень проста. MCU переводит сигнал mem reset в состояние лог. 1, затем в лог. 0, чтобы установить в 0 внутренний счетчик адреса CPLD. Затем MCU помещает каждый бит, представляющий состояние каждой клавиши, на сигнал mem data микросхемы CPLD, сопровождая их перепадом в лог. 1 тактового сигнала mem clk, так все состояния бит клавиатуры передаются во внутреннюю 40-битную память CPLD. Передачу каждого бита MCU сопровождает переводом в лог. 1 тактового сигнала mem clk (означает чтение бита данных) и переводом в лог. 0 сигнала mem clk (переход к следующему биту). По спаду сигнала тактов CPLD обновляет внутренний счетчик адреса, обозначающий место положения каждого из 40 состояний клавиш в массиве памяти. После того, как все 40 бит переданы, After MCU переводит сигнал mem reset в состояние лог. 1, снова тем самым сбрасывая в 0 внутренний счетчик адреса CPLD. Процесс передачи 40 бит данных состояния клавиатуры показан на диаграмме ниже.
Таблица преобразования кодов AT-клавиатуры, хранящаяся в памяти MCU, позволяет пометить одновременно нажатыми несколько клавиш Spectrum, находящихся в двух разных строках его оригинальной матрицы клавиатуры. Также MCU может установить нажатыми все клавиши в одной столбце матрицы. Это действительно полезно для AT-кода клавиши 'delete', которая транслируется в коды spectrum для 'shift' и '0'. Также клавиши со стрелками AT-клавиатуры декодируются в нажатия клавиш spectrum 'shift' + клавиши направления.
Распределение выводов CPLD выполнена таким образом, чтобы сделать разводку печатной платы (PCB) максимально простой, насколько это возможно, так что проводники поместились на одну сторону платы. Плата получилась односторонней, требуется только одна проволочная перемычка, так что плату проще изготовить в домашних условиях.
В памяти MCU и CPLD осталось достаточно места для улучшений и доработок. Исходный код и печатная плата предоставляются [1, 7] для свободной модификации, улучшения, хакинга и изучения.
Печатная плата и схема выполнены в среде Cadsoft's Eagle v4.1 [4]. Программа MCU написана на ассемблере AVR (среда AVR Studio 4.1 [5]). Код CPLD написан на языке VHDL с использованием среды разработки Xilinx webpack ISE 8.2 [6].
[Ссылки]
1. Yet Another ZX-Spectrum AT Keyboard Interface site:jrok.com. 2. World of Spectrum site:worldofspectrum.org. 3. Planet Sinclair site:rk.nvg.ntnu.no. 4. Переход с PCAD на Eagle. 5. AVR Studio 4.13, 4.14, 4.19, 5.0 и не только. 6. Как установить Xilinx ISE Design Tools. 7. 160709YAZSAKI-ZX-Spectrum-PS2-keyboard.ZIP. 8. ZX-Spectrum PS/2 Keyboard site:avray.ru. |