Железо - Глюки клавиатуры: почему в играх для двух игроков, при игре вдвоем, компьютер не слушается вашего управления и информация о том, как этого избежать.

Virtual Worlds #01
 ┌────────────────────────────┐
░▒▓ Ошибки клавиатуры. ▓▒░ └────────────────────────────┘

           (C) Time Keeper/MHCG


  Здравствуйте,  уважаемые поль-
зователи  величайшего компьютера
всех времен и народов - SINCLAIR
ZX SPECTRUM'а. ( я думаю, что не
очень громко сказал )...

  Сегодняшний  наш с вами разго-
вор  мы начнем с одного из самых
важных устройств, входящих в лю-
бой  компьютер  любой  марки. Мы
поговорим  о клавиатуре...

  Ведь  ни  на  одном компьютере
нельзя  работать  без клавиатуры
т. к. клавиатура является основ-
ным  устройством передачи данных
от  пользователя  к  компьютеру.
Оказывается,  в Спектруме не все
так  идеально,  как  может пока-
заться на первый взгляд...

  У  клавиатуры  Спектрума  есть
один очень серьезный недостаток.
Я   называю  его  "перекрыванием
клавиатуры".

  Наверное многие из вас начина-
ли   свой   творческий  путь  на
Спектруме с того, что по полдня,
а  то  и  весь день, с утра и до
позднего  вечера играли в игруш-
ки. Уже тогда существовало много
занимательных  игр, рассчитанных
на двух игроков. Мне всегда нра-
вилось   посидеть  часок  другой
вместе с другом за компьютером и
поиграть в Double Dragon, Golden
Axe и др. Но у всех подобных игр
есть один большой недостаток: вы,
наверное,  замечали,  что иногда
при  игре вдвоем, ваш игрок сов-
сем вас не слушался. Например вы
нажимали  влево, а он ни с того,
ни с сего вдруг начинал прыгать.
Причем подобные казусы случались
чаще  всего  когда в игру играли
двое игроков. Это и есть "перек-
рывание клавиатуры".

  Раньше,  как  и  любой  другой
неопытный   user,  я  думал, что
этот трабл возникает в результа-
те  того, что програмисты непра-
вильно опрашивают клавиатуру, но
как  я  был  разочарован,  когда
научившись   программировать  на
ассемблере и написав свою первую
несложную программу, я обнаружил
в   ней  все  тот  же  проклятый
глюк...

  В то время я уже довольно неп-
лохо  разбирался  в схемотехнике
Спектрума, и, найдя у друга схе-
му  Зоновского "Ленинграда-1", я
начал упорно искать причину это-
го странного явления. Оказалось,
что   все  очень  просто.  Клайв
Синклер при разработке схемы де-
лал основную ставку на дешевизну
будущего  компьютера  и старался
делать  ее как можно более прос-
той  и  недорогостоящей.  Именно
из-за этого мы сейчас и страдаем
и  это  касается  не только кла-
виатуры,  но  и многого другого:
неточная  дешифрация  внутренних
портов, из-за чего сейчас возни-
кает  немало проблем с подключе-
нием  дополнительной  периферии,
невозможность загрузки собствен-
ной     операционной    системы,
невозможность прямого программи-
рованния    портов   контроллера
НГМД, закрытая архитектура... Но
это  темы отдельных разговоров и
об  этом  мы еще поднимем вопрос
на   страницах  нашего  журнала.

  Чтобы   понять  истоки  такого
странного  поведения клавиатуры,
нужно   повнимательнее  присмот-
реться  к  схеме компьютера. Как
известно,  клавиатура  Спектрума
представляет собой прямоугольную
матрицу  размером  5*8, т. е. на
нее  идут пять проводов данных и
восемь проводов адресов:


           │       │

           │       │

           │       │
      Q┌/ ─┤  W┌/ ─┤
       │   │   │   │
A10 <──┴───────┴─────────- - - -
(к)        │       │
      A┌/ ─┤  S┌/ ─┤
       │   │   │   │
 A9 <──┴───────┴─────────- - - -
(к)        │       │
      Z┌/ ─┤  X┌/ ─┤
       │   │   │   │
 A8 <──┴───────┴─────────- - - -
(к)        │       │
           │       │
           V       V

         D0(к)    D1(к)


На   рисунке  изображена  только
часть  схемы клавиатуры. Осталь-
ные кнопки сделаны аналогично.


Предположим,   что  пользователь
нажал    одновременно    клавиши
"Q",  "W"  и "A". Посмотрим, что
же  произошло на самом деле: Как
видно  из  схемы клавиатуры, при
нажатии  клавиши "Q", замкнутся
провода  A10(к) и D0(к), при на-
жатии  клавиши  "W",  замкнутся
A10(к)  и D1(к), и, наконец, при
нажатии  клавиши  "A", замкнутся
A9(к) и D0(к)... Ну что, уже до-
гадались?  При нажатии вышепере-
численных  клавишь  соединились:
A10(к)  с  D0(к), A9(к) с D0(к),
но  это означает, что фактически
соединились  A10(к)  и A9(к), но
A10(к) соединен в свою очередь с
D1(к), значит соединились прово-
да  D1(к)  и A9(к), откуда можно
сделать вывод, что автоматически
вместе с "Q","W" и "A", нажалась
еще  и клавиша "S"!!! Вот так-то
вот!  И  незачем было все валить
на  программистов  и  думать что
они  неправильно опрашивают кла-
виатуру.  Насколько я знаю схемы
наших отечественных компьютеров,
все  они  имеют подобный дефект.
Исключение, наверное, составляют
компьютеры    оснащенные    IBM-
клавиатурой,  но я не могу точно
за  это  поручиться т. к. у меня
не было шанса это проверить.

  Конечно,  этот дефект не столь
опасен  при эксплуатации систем-
ных  программ  и при игре в оди-
ночку,  но все же неприятно. Пу-
тей  для  решения  этой проблемы
существует несколько, но мы рас-
смотрим лишь один из них:

  На мой взгляд, проще всего ус-
тановить   буферные  элементы на
каждую клавишу ( по крайней мере
я не нашел более разумного реше-
ния ). Можно например установить
пять  регистров К555ИР23/К555АП5
на шину адреса клавиатуры или на
шину данных. Или, что мне кажет-
ся   более  предпочтительным,  -
приобрести    контроллер    IBM-
клавиатуры.  Технику подключения
и  схему  я  приводить  не буду,
т.к.  это зависит от конкретного
примера,  а рассмотреть все при-
меры,  я  думаю, вряд-ли удастся
т.  к. их очень много. Себе я не
стал устанавливать буферные эле-
менты на каждую клавишу, я всего
лишь поставил два буфера на пор-
ты  Синклер-джойстиков т. к. сам
я  играю  очень  мало, а младшие
братья  предпочитают  в основном
джойстик...