Deja Vu #09
13 ноября 1999

Coding - coding для чайников: Подробно об одном из способов опроса клавиатуры.

<b>Coding</b> - coding для чайников: Подробно об одном из способов опроса клавиатуры.
(С) SKL-KEEPER aka Колесников Сергей
    Ведущий раздела "Coding для "чайников"
__________________________________________


   Для "чайников". Подробно об одном из
       способов опроса клавиатуры.


   Для  начинающих "кодить" свои программы
неминуемо  встает  вопрос  о том, а как же
              организовать опрос клавиату-
              ры? Ведь  без этого  ни одна
              программа  не обойдется, ка-
              кой бы простой она не была!
                 Есть  несколько  способов
              опроса клавиатуры, например,
              с  использованием  системных
              переменных  KSTATE  и LASTK.
              Думаю, что  эти способы вряд
              ли  вызывают  затруднения  в
              понимании, поэтому на них не
              стоит останавливаться. А вот
              способ опроса клавиатуры,как
              внешнего порта, хоть и изло-
              жен  в ряде компьютерных из-
даний, но изложен как-то не очень доходчи-
во и может быть не  очень понятен. Вот  на
нем мы и остановимся.
   Этот  способ, в отличие от вышеупомяну-
тых, можно применить для организации пере-
мещения  объекта  по экрану одновременно в
двух направлениях, или, например, для кон-
троля  нажатия клавиши одновременно с дру-
гой клавишей (курсорные клавиши и т.п.).
   Опрос клавиатуры этим способом является
единственно  приемлемым в том случае, если
прерывания запрещены. Кстати, это  обстоя-
тельство  можно использовать для ускорения
работы Вашей программы. Поставьте DI перед
опросом клавиатуры,и процессор не будет 50
раз  в секунду вызывать процедуру KEYSCAN.
Хоть  и  небольшая, но  экономия  времени!
Только  не забудьте после выхода из проце-
дуры включить прерывания командой EI...
   Напомню, что опрос клавиатуры этим спо-
собом  производится  по внешнему порту 254
(#FE  HEX). Так как адрес порта клавиатуры
является двухбайтным  числом, то #FE явля-
ется младшим байтом адреса порта, а  стар-
ший  должен быть предварительно установлен
в аккумуляторе.
   Анализируются  пять  младших битов. При
этом, если клавиша нажата, то бит выключен
(наоборот, по сравнению с  Кемпстон-джойс-
тиком). При  этом способе проверяется сос-
тояние одной из половин ряда клавиатуры.

      Рассмотрим рисунок клавиатуры:

N:БИТA│ 0│ 1│ 2│ 3│ 4║ 4│ 3│ 2│ 1│ 0│
──────┼──┼──┼──┼──┼──║──┼──┼──┼──┼──┤  N_
N_  3 │ 1│ 2│ 3│ 4│ 5║ 6│ 7│ 8│ 9│ 0│4 П
П     ├──┼──┼──┼──┼──║──┼──┼──┼──┼──┤  О
О   2 │ Q│ W│ E│ R│ T║ Y│ U│ I│ O│ P│5 Л
Л     ├──┼──┼──┼──┼──║──┼──┼──┼──┼──┤  У
У   1 │ A│ S│ D│ F│ G║ H│ J│ K│ L│ENT6 Р
Р     ├──┼──┼──┼──┼──║──┼──┼──┼──┼──┤  Я
Я   0 │CS│ Z│ X│ C│ V║ B│ N│ M│SS│SPC7 Д
Д     └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘  А
А
         3-#F7             4-#EF
         2-#FB             5-#DF
         1-#FD             6-#BF
         0-#FE             7-#7F


   Небольшое пояснение к рисунку. Над кла-
виатурой, по  горизонтали, я проставил но-
мера  битов, которые  становятся активными
после нажатия определенной клавиши.По вер-
тикали   пронумерованы  номера  полурядов.
Кстати, полуряды  пронумерованы   условно.
Теперь, к примеру, если  мы нажмем клавишу
"1", значит, будет задействован третий по-
луряд, и активным будет нулевой бит.
   А  теперь рассмотрим конкретный пример:
нам  надо организовать опрос клавиатуры на
нажатие  клавиш: "1" и "2". В соответствии
с тем, какая клавиша  нажата, будем менять
цвет бордюра (так нагляднее). Итак...

KEY  HALT      ;Ждем следующее прерывание
     XOR A     ;обнуляем аккумулятор.
     LD A,#F7  ;заносим  в аккумулятор
               ;наш полуряд (третий).
     IN A,(#FE);младший бит адреса порта.
     BIT 0,A   ;определяем состоян. бита,
               ;соответствующ.клавише "1"
               ;если бит активен, то флаг
               ;Z=1, если нет, то Z=0.
     JR Z,BLUE ;если Z=1, то операция
               ;JR Z... будет выполняться
               ;если Z=0, мы ее "проско-
               ;чили".
     LD A,#F7  ;опять наш полуряд.
     IN A,(#FE);опрос клавы.
     BIT 1,A   ;определяем состояние пер-
               ;вого бита, который соот-
               ;ветствует клавише "2".
     JR Z,RED  ;здесь аналогично предыду-
               ;щему.
     JR KEY    ;больше опрашивать ничего
               ;не надо, "зацикливаемся".
BLUE LD A,1    ;в аккумулят. - цвет синий
     OUT (254),A; BORDER 1.
     RET
RED  LD A,2    ;двойка соответст. красному
     OUT (254),A; BORBER 2.
     RET


   Надеемся, Вам  стало все понятно. Обра-
тите внимание на  то, что биты правого по-
луряда идут справа  налево. Чтоб уж совсем
и  навсегда  разобраться  с этим вопросом,
приведем  для примера ту  же программу, но
для другого полуряда.Организуем опрос кла-
виш: "9" и "0":


KEY  HALT      ;ждем следующее прерывание
     XOR A     ;обнуляем аккумулятор.
     LD A,#EF  ;заносим  в аккумулятор
               ;наш полуряд (четвертый).
     IN A,(#FE);младший бит адреса порта.
     BIT 0,A   ;определяем состоян. бита,
               ;соответствующ.клавише "0"
               ;если бит активен, то флаг
               ;Z=1, если нет, то Z=0.
     JR Z,BLUE ;если Z=1, то операция
               ;JR Z,BLUE будет выпол-
               ;няться
     LD A,#EF  ;опять наш полуряд.
     IN A,(#FE);опрос клавы.
     BIT 1,A   ;определяем состояние пер-
               ;вого бита, который соот-
               ;ветствует клавише "9".
     JR Z,RED  ;здесь аналогично предыду-
               ;щему.
     JR KEY    ;"зацикливаемся".
BLUE LD A,1
     OUT (254),A
     RET
RED  LD A,2
     OUT (254),A
     RET


   С  этим  покончили. А  если нам понадо-
бится определить нажатие клавиши совместно
с CAPS SHIFT? Вот программка, где мы дела-
ем опрос нажатия клавиш "6" и "7" совмест-
но с CAPS SHIFT:


KEY  HALT      ;ожидаем прерывание.
     XOR A     ;обнулили аккумулятор.
     LD A,#FE  ;т.к. CAPS SHIFT находится
               ;в нулевом полуряду.
     IN A,(#FE);опрос клавы.
     BIT 0,A   ;определяем состояние
               ;нулевого бита.
     JR NZ,PROG;если клав. "CSh" не нажа-
               ;та, мы пойдем к метке
               ;PROG, где у нас какая-то
               ;своя программа, если же
               ;нажата, Z=1 и JR Z,PROG
               ;мы "проскочим".
     LD A,#EF   ;здесь берем 4 полуряд.
     IN A,(#FE) ;опрос клавы.
     BIT 3,A    ;третий бит-клавиша "7".
     CALL Z,BLUE;если нажата->метка BLUE.
     LD A,#EF   ;четвертый полуряд.
     IN A,(#FE) ;опрос клавы.
     BIT 4,A    ;четвертый бит - кл."6".
     CALL Z,RED ;если нажата ->метка RED.
PROG .......... ;здесь находится Ваша
     .......... ;программа, например,
     .......... ;опрос других клавиш.
     JR KEY     ;зацикливаемся.
BLUE LD A,1     ;тут уже все понятно...
     OUT (254),A
     RET
RED  LD A,2
     OUT (254),A
     RET


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

     LD BC,nnnn
     IN A,(C)   ;ввод данных из порта
                ;в аккумулятор.

   Здесь  nnnn - адрес внешнего порта, ус-
танавливаемого  в BC. Надо только помнить,
что в регистре С  будет #FE (постоянно), а
в В - значение, соответствующее номеру по-
луряда. Например, для  нашей  первой прог-
раммки вместо:

     LD A,#F7
     IN A,(#FE)


следует набрать:

     LD BC,#F7FE
     IN A,(C)


   Еще одна небольшая тонкость.
   Проверку  бита  0  можно производить не
командой  BIT 0,A, а  командой  RRCA, если
проверяемая клавиша крайняя на клавиатуре,
как, например, клавиши Q,A и P.
   Как известно, RRCA  означает ROTATE AC-
CUMULATOR RIGHT WITHOUT CARRY (вращать ак-
кумулятор вправо без флага переноса). Флаг
переноса хоть  и изменяется с учетом резу-
льтата операции, но во вращении не  участ-
вует.
   Использование команды RRCA экономит па-
мять, т.к.  это однобайтная команда. Когда
мы с ее помощью производим  ротацию содер-
жимого  аккумулятора  вправо, при  нажатии
проверяемой  клавиши  флаг  С  выключается
(C=0). Таким образом, вместо:

     BIT 0,A
     JR Z,BLUE


в  нашей первой  программе можно поставить
конструкцию:

     RRCA
     JR C,BLUE ;если клавиша не нажата,
               ;на что указывает установ-
               ;ленный бит, команда "про-
               ;скакивается".

   А вот кусочек  программы, с помощью ко-
торой  можно проверить  нажатие клавиш O и
P:
      ........
KEY1  LD A,#DF    ;кл. O и P - 5 полуряд
      IN A,(#FE)
      RRCA        ;клавиша P
      JR C,LABEL1 ;метка условная.
;т.к. клавиши  O и P находятся в одном по-
;луряду, выполнять  команду IN дважды  нет
;необходимости. Просто еще раз сдвинем би-
;ты аккумулятора вправо.

     RRCA         ;клавиша О
     JR C,LABEL2
     .........    ;ну, и так далее.

   Думаю, на этом можно и закончить.
   В  заключение  хочу поблагодарить Рыль-
ских Андрея (ICB) за  помощь  в подготовке
статьи.
------------------------------------------
P.S. А нам, в свою очередь, хочется побла-
годарить Колесникова Сергея за его  актив-
ную деятельность в плане подготовки статей
для журнала, и поздравить его с назначени-
ем на должность ведущего раздела. Нам дей-
ствительно приятно иметь дело с такими вот
людьми!!!
------------------------------------------




Другие статьи номера:

Апперативчик - вступление от авторов.

Апперативчик - Об управлении в Deja Vu.

Апперативчик - Халява №2: о пиратах и взломанных версиях журнала.

Апперативчик - Dejavu Info: Как приобрести журнал Deja Vu.

Тема - Swap: "От письма до бандероли" как найти в своем городе Спектрумистов.

Тема - Тусовка: CSP'99 - интервью со Slack Den.

Тема - Тусовка: CSP'99 - интервью с main coder'ом молодой Новосибирской группы AREASoft

Тема - Тусовка: CSP'99 - интервью с одним из издателей электронного журнала Deja Vu' Daniel/Playgear Co./Binary Dimension.

Тема - Тусовка: CSP'99 - интервью с одним из участников Рыбинской группы Cav/Auryn.

Тема - Тусовка: CSP'99 - интервью с отцом группы Playgear классным дядькой Ze Pagan.

Тема - Тусовка: CSP'99 - интервью с main coder'ом Flash и по совместительству одним из основателей группы - Alex Rider.

Тема - Тусовка: CSP'99 - опрос, как прошла party в двух словах, общие впечатления.

Тема - Тусовка: Сказание о том, как проходило Crazy Siberian Party 1999.

Капля припоя - HD диски: Доработка контроллера дисковода для работы с HD-дисками.

Капля припоя - Решение пpоблемы 1.2Мб дисковода.

Капля припоя - увеличение объема ОЗУ до 1024к на SPECCY варианта Таганрог 128К!

Капля припоя - схема программатора для микросхем постоянных запоминающих устройств (ПЗУ).

Капля припоя - о матричных принтерах.

Капля припоя - ISA-Spectrum: плата вставляемая в ISA слот IBM, являющееся частью или полным компьютером ZX-Spectrum.

Software - Демосцена: Обзор'инг демозов: 63 bit III, Jam, Anamnesis, 7 Up, 63 bit IV, DemoDyin, Napalm, Crapmo 2, Bunch of Arce, Devotion, WorkStop, Energy, Yes.

Software - Обзор Игр: MIST: Monstrland Part Two, Bomb Lakes, Marbles, KluXer, 4x4 Puzzle, Солдатики, Кораблики.

Software - Gun Commander: руководство пользователя.

Coding - coding для чайников: цивилизованный выход в TR-DOS.

Coding - coding для чайников: Подробно об одном из способов опроса клавиатуры.

Coding - coding для чайников: как устроен "Boot" изнутри.

Coding - coding для чайников: доработка MINI BOOT V3.0.

Coding - процедура печати 42 символа в строке (с трабутами), процедура быстрой печать спрайта с точностью до пикселя.

Coding - быстрай печать 64 символов в строке.

Coding - Конверсия числа со стека калькулятора в символьную строку.

Coding - быстрая печать спрайта 2х2 знакоместа, с точностью до знакоместа.

Coding - Hrust Library свободноpаспpостpаняемая библиотека пpоцедуp, с помощью котоpых можно упаковывать и pаспаковывать pазличные данные.

Coding - Обработка ошибок TR-DOS при работе через #3D13.

Coding - набор процедур для построения пользовательского интерфейса.

Coding - пишим вирус невидимку для TR-DOS.

Another world - Иллюзия безопасности: Страшные сказки о безопасности Windows и Internet (часть первая).

Доска почета - 3 метода отличить pеальный ZX Spectrum от эмулятоpов.

Доска почета - устав национального Фонда Спектрума (HФСП).

Доска почета - Резервы: попытка представить совершенный ZX Spectrum.

Доска почета - Накипело: "А жив ли еще Speccy, курилка?" Размышления в слух.

Доска почета - Ща скажу №1: оптимизация процедур, анонс журнала и новой аркадной игрушки.

Доска почета - Ща скажу №1: разборки Serg'a и Playgear, Взлом телефонных карт, анонс Crazy Siberian Party '2000.

Доска почета - Краткая история кемеровской группы Digital Life Group.

Семь и 1/2 - Студенческая мифология.

Семь и 1/2 - День дурака 2 (окончание).

Семь и 1/2 - Сказочки для детей.

Семь и 1/2 - Особенности национального рулеза или чисто Сибирский проект (повесть о Crazy Siberian Party 1999).

Пробы пера - воспоминания: новелла по игре "Черный Ворон".

Пробы пера - рассказ "Элексир Зверя".

Пробы пера - "Last Warrior".

Реклама - текстовая реклама и обьявления.

Реклама - графическая реклама и обьявления.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Правила пользовани бредом - Лучше ни читать.
От редакции - в этом номере: содержание номера.
Конкурс - Уровни к Laser Squad
Железо - Югославия - полигон?
От авторов - Вoт и нaчaлись дoлгoждaные мaйские пpaздники и я нaчaл нaбиpaть этo oчеpеднoе письмo...

В этот день...   18 апреля