PS2 клавиатура для старых самопальных компов

Публичный форум для http://www.nedopc.org/nedopc

Moderator: Shaos

User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

PS2 клавиатура для старых самопальных компов

Post by HardWareMan »

Я вот подумал тут кое чего, и решил поделиться с вами.

На форуме уже пролетала мысль заюзать быстрый PIC и эмулировать КР580ВВ55 в целом. Это, конечно, самое красивое решение. Однако, скорость чипа должна быть большой, чтобы на лету брать и отдавать данные. В итоге, пока ни к чему не пришли. Я предлагаю более дешевый (но одновременно и более громоздкий) подход. Допустим, нам незачем эмулировать ВВ55, тем более, эта самая ВВ55 уже стоит в системе. Нам достаточно правильно выставлять сигналы на ее портах. А с этим справится даже АТ89С51. Но, есть засада. Как узнать, какой порт в какую сторону смотрит? Ведь выяснилось, что у Специалиста софт крутит портом как хочет. Значит, надо хранить состояние направления! Но как его получить? Вот тут и есть засада.
На самом деле, все слово состояния нам смотреть и не надо. Порт управления содержит следующие биты:

Code: Select all

Бит    Описание
D0     Порт C (0-3): 1 вход, 0 выход
D1     Порт В: 1 вход, 0 выход
D2     Режим: 0 MODE0, 1 MODE1
D3     Порт C (4-7): 1 вход, 0 выход
D4     Порт А: 1 вход, 0 выход
D5     Режим: 0 MODE0, 1 MODE1 (при D6=0)
D6     Режим: 0 MODE0/MODE1, 1 MODE2
D7     =1
Бит    Описание
D0     Значение бита порта С
D1     \
D2      Адрес бита порта С
D3     /
D4     X
D5     X
D6     X
D7     =0
Режим нам побоку, главное - направление, а значит D4 для порта А, D1 для порта B и D3+D0 для порта С. При этом, D7 должен быть =1, т.к. есть режим побитного управления портом С. Нарисовалась следующая схема (картинка кликабельна):
Image
Полярность сигнала сброса совпадает у ВВ55 и АТ89С51, это хорошо. Так же, после сброса ВВ55 находится на входе, поэтому регистр (выполнен в виде 4х D-триггеров) устанавливается в 1. Ну а дальше, мы просто отслеживаем ситуацию, когда A0=A1=D7=1 и CS=WR=0. Сигнал WR одинаков у ВМ80 и Z80 - он стробирует во время устойчивых данных, поэтому хоть триггер и записывает при 0->1 на тактовом входе, данные все равно будут записаны (по спаду сигнала WR). Получается, 4 корпуса мелкосхем, 1 контроллер и ВВ55, которая может быть уже впаяна. Естественно, прямо все порты соединять не обязательно, только те, что используются в матрице. Саму мелкосхему так же можно запихать в какую-нибудь CPLD, но в данный момент важно чтобы было дешево и доступно.
Дополнительно, есть еще такая мысль. В нормальных условиях комп никогда не устанавливает все порты на выдачу, иначе катастрофа. А мы можем сделать так. И тогда, контроллер может отслеживать эту ситуацию как исключение и брать данные с портов. Например, для смены раскладки, зажигания лампочек или еще чего. Например, если все порты на выдачу, и при этом мы передаем данные через порт А, а через порт С стробируем (т.к. этот порт позволяет побитное управление).
Обсуждаем.
User avatar
Error404
Maniac
Posts: 269
Joined: 05 Oct 2006 04:45
Location: Moscow

Post by Error404 »

А у спеца не было что-ли диодов на матрице и можно было сканировать матрицу в двух направлениях? И сканирующа линия должна была быть всегда одна?
Всем добра!
aviator
Maniac
Posts: 291
Joined: 10 Dec 2008 08:39
Location: Стокгольм, Швеция

Post by aviator »

А может лучше не мудрить, а реализовать нормальный физический интерфейс PS/2 (событийный) и заменить подпрограммы чтения/сканирования клавиатуры? Тогда и клавиатуру можно будет использовать наиболее полно.
Перестанет работать с десяток программ, которые лезут напрямую к ВВ55 или сканируют клавиатуру напрямую, через порты - так это и не страшно, все равно эта кривизна имеет историческое, нежели практическое, значение.
С уважением, Сергей.
Caro
Fanat
Posts: 88
Joined: 21 Nov 2002 11:09
Location: E-burg/Russia

Post by Caro »

Error404 wrote:А у спеца не было что-ли диодов на матрице и можно было сканировать матрицу в двух направлениях? И сканирующа линия должна была быть всегда одна?
Матрица 12*6 без диодов. Сканировать можно или по 6 строкам или по 12 столбцам, без разницы.
Для эмуляции контроллером это создает дополнительные трудности, но в принципе задача решаемая.
Last edited by Caro on 26 Jan 2009 06:10, edited 1 time in total.
User avatar
shoorick
Doomed
Posts: 487
Joined: 05 Nov 2007 05:08
Location: Украина

Post by shoorick »

Перестанет работать с десяток программ, которые лезут напрямую к ВВ55 или сканируют клавиатуру напрямую, через порты
экзотическое сканирование клавы на специалисте встречалось (по крайней мере мною) только в играх. хотя с другой стороны - ради каких программ тогда восстанавливать эти компы? :)
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

shoorick wrote:
Перестанет работать с десяток программ, которые лезут напрямую к ВВ55 или сканируют клавиатуру напрямую, через порты
экзотическое сканирование клавы на специалисте встречалось (по крайней мере мною) только в играх. хотя с другой стороны - ради каких программ тогда восстанавливать эти компы? :)
Вот именно, все должно работать в оригинале.
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

Насколько я помню, проблема была не в эмуляции ВВ55, а в быстрой смене выходных сигналов при смене входных (максимум 10 тактов при 2МГц - менее 5мкс). Тут скорее подойдёт статическое ОЗУ, медленно обновляемое контроллером.

Мне казалось, что проблему уже решили http://zx.pk.ru/showthread.php?t=9294
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

b2m wrote:Мне казалось, что проблему уже решили http://zx.pk.ru/showthread.php?t=9294
Неее... Это абсолютно не то. Это заточка под стандартный 8х7 (8х8) РК (он же Орион). Они не используют динамическое переключение направления. Там можно действительно просто подключить и не париться. А вот в Спеце такое не проканает. Я тут даже думал брутальный вариант: у меня есть мешок К176КТ1, и на них собрать (1 корпус - 4 ключа). 100% совместимость. %)

* * *

Давайте развивать тему.
Я думаю, что при правильном планировании времени, можно решить эту задачу. Например, какой самый жесткий вариант? Правильно, запись сканирующего сигнала в один порт и тут же чтение из другого(-их, это в случае со Спецом, при сканировании на 6 и чтении на 12). Известно, что М1 занимает 4 такта и на i8080 и на Z80, делаем вывод, что время между записью и чтением будет:

Code: Select all

1234 123 1234 123
  O    W   O    R
O - Opcode
W - Write
R - Read
Т.е. 5-6 тактов, а затем надо выдать результат. В худшем случае со Спектрумом (3,5МГц) это будет 5*(1/3,5)=1,4мкс. Для той же ATMega при 16МГц это примерно 1,4/(1/16)=22 команды (я же верно понимаю, что AVR выполняет опкод каждый такт?). Поэтому, преобразование данных надо делать при записи. Т.е. юзаем 2 внешних интерупта: на чтение и на запись, при записи, отслеживаем куда и делаем табличный расчет (или быстрый математический) какие данные должны быть в регистрах чтения, согласно матрице нажатых клавиш. А при прерывании чтения тупо отдавать одну из 4х ячеек, хранящих значения порта. Работа с PS/2 настолько медленна, что она в принципе укладывается в фоновый опрос. В итоге, мы упираемся только в 1 тайминг: время реагирования на прерывание. И оба должны быть вычислены после начала на обращение (причем чтение несколько растянуто - есть время).
Теперь вопрос: каково типичное время реагирования на прерывание у разных быстрых чипов (AVR/PIC/etc..)?
User avatar
fifan
Devil
Posts: 912
Joined: 06 Oct 2006 03:17
Location: г.Лянтор,Сургутского р-на,ХМАО

Post by fifan »

HardWareMan правильной дорогой идет, только запись в порт/чтение из порта ВВ55 длиться всего 500 нс - успеваем опрашивать PS/2, перкодировать коды клавиатуры, отправить их в порт? Я если помните процедуру записи/чтения портов возложил на ПЛИС, коды хранил в ППЗУ, а опрашивал PS/2 ПИКом.
http://www.nedopc.org/nedopc/upload/8255Emul3.rar
Для операций с портами ВВ55 у меня не хватало времени реализовать их в ПИКе, я возложил их на ПЛИС. Алгоритм такой:
1. Отслеживаем обращение к ВВ55, типа прерывание по выводу /CS;
2. Если это посылка в порт байта сканирования, то по байту "бегущего нуля", номеру порта в ППЗУ находим байт ответа (появления) "бегущего нуля";
3. В фоновом режиме опрашиваем PS/2 клаву и если момент опроса совпал по времени с подготовленным байтом и еще и на пересечении нашлась имено та клавиша - выдаем байт в порт ответа ВВ55;
4. Биты не связанные с матрицей 12х6 клавиатуры (магнитофон, звук, клавиша SHIFT) принимаются/передаются напрямую.

P.S. Я как писал эмулятор только на бумаге (вернее плата уже есть), времени нет и первая цель сам Специалист MX New, а затем уже эмулятор ВВ55/эмулятор клавы...
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

HardWareMan wrote:у меня есть мешок К176КТ1, и на них собрать (1 корпус - 4 ключа). 100% совместимость. %)
А этот мешок не влезет в какую-нибудь ПЛИС?
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
Caro
Fanat
Posts: 88
Joined: 21 Nov 2002 11:09
Location: E-burg/Russia

Post by Caro »

Посмотрел сейчас как в Мониторе Специалиста реализован опрос матрицы клавиатуры.
Для начала надо помнить что колонки матрицы сканируются 8-мю битами порта A, и 4-мя младшими битами пора C (3..0).
6 строк матрицы подключены к старшим (7..2) битам порта B.
Алгоритм интересный:
1) Порт A и 4-ре младших бита порта C включаются на чтение, а порт B на запись. При этом на выходе порта B выдаются все 0.
2a) Читается порт A и если в нем обнаруживается хотя бы один ноль (нажата одна из клавиш) то переходим к пункту 3.
2b) Читается порт C и если в нем обнаруживается хотя бы один ноль (нажата одна из клавиш) то переходим к пункту 3.
3) Порт B переключается на чтение, а порт A и младшие биты порта C на запись. При этом на выходах A и C(3..0) выдаются все 0.
4) Читается порт B и если обнаруживается хотя бы один 0 (нажата одна из клавиш) то по информации полученной в пунктах 2 и 4 вычмсляется код нажатой клавиши.
Времени между переключениями портов и чтением очень много, учитывая еще и то, что они реализованы процедурами.
Так что эмулировать такой алгоритм сканирования я думаю достаточно легко и не потрбует значительных ресурсов.
Надо будет глянуть, как сканируется клавиатура в играх.
User avatar
fifan
Devil
Posts: 912
Joined: 06 Oct 2006 03:17
Location: г.Лянтор,Сургутского р-на,ХМАО

Post by fifan »

Caro wrote:Посмотрел сейчас как в Мониторе Специалиста реализован опрос матрицы клавиатуры.
...
А сколько это занимает в тактах ВМ80 при условии,что клавиша нажата?
User avatar
shoorick
Doomed
Posts: 487
Joined: 05 Nov 2007 05:08
Location: Украина

Post by shoorick »

Caro wrote:Надо будет глянуть, как сканируется клавиатура в играх.
можно начинать с игры "Пещера" - там опрашивались целиком столбцы. т.е. в инструкции управление цифровыми клавишами, но реально можно было смещаться вниз, где было даже удобней играть. были игры, где опрашивались целиком строки, но я точно уже не помню какие :)
Caro
Fanat
Posts: 88
Joined: 21 Nov 2002 11:09
Location: E-burg/Russia

Post by Caro »

fifan wrote:А сколько это занимает в тактах ВМ80 при условии,что клавиша нажата?
Независимо от того, нажата она или нет, выполняется это в такой последовательности:
mov (PPI_Control),a ; запись байта в порт управления ВВ55
ret ; возврат из процедуры записи байта в порт управления
mov (PPI_A),a ;чтение порта подключенного к столбцу или строке матрицы.
Для Z80 команда ld(mov) выполняется за 13 тактов, а команда ret за 10.
Таким образом получаем не менее 23 тактов между изменением уровня входного сигнала и чтением его состояния.
Для тактовой частоты 2 Мгц это 11.5 мксек.
Last edited by Caro on 27 Jan 2009 07:47, edited 1 time in total.
Caro
Fanat
Posts: 88
Joined: 21 Nov 2002 11:09
Location: E-burg/Russia

Post by Caro »

HardWareMan wrote:каково типичное время реагирования на прерывание у разных быстрых чипов (AVR/PIC/etc..)?
Порядка 4..5 тактов.