Справочник программиста на персональном компьютере фирмы IBM. Ввод/вывод - Получение цифрового ввода из игрового порта

ОГЛАВЛЕНИЕ

     7.3.4 Получение цифрового ввода из игрового порта.


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

   Высокий уровень.


   Бейсик использует оператор  STRIG  для  чтения статуса кнопок.
Оператор STRIG достаточно хитрый, чтобы обнаружить нажатие  кноп-
ки, даже если программа  в  данный  момент не занимается статусом
кнопки, т.е.  программа может запросить: "Было ли нажатие кнопки,
со времени моего последнего запроса?"  Это свойство очень полезно

для видеоигр, поскольку программа может заниматься  манипуляциями
с экраном, не  заботясь  о  постоянной  проверке  статуса кнопок.
Однако  это существенно замедляет скорость выполнения  программы,
поскольку проверка статуса кнопок осуществляется после выполнения
каждого оператора.  По этой причине, STRIG работает только  когда
он преднамеренно включен, а он  может включаться и выключаться по
ходу программы.
   STRIG работает двумя способами.  Во-первых, он может  работать
как  функция,  которая  непосредственно  читает  текущие значения
кнопок, в форме X = STRIG(n). Здесь n - кодовый номер:

   0    Кнопка A1 нажата со времени последнего вызова
   1    Кнопка A1 в данный момент отпущена
   2    Кнопка B1 нажата со времени последнего вызова
   3    Кнопка B1 в данный момент отпущена
   4    Кнопка A2 нажата со времени последнего вызова
   5    Кнопка A2 в данный момент отпущена
   6    Кнопка B2 нажата со времени последнего вызова
   7    Кнопка B2 в данный момент отпущена

Во  всех случаях функция возвращает -1, если описание применимо и
0 - если нет.
   Второй способ  использования  STRIG  это  форма,  в которой он
автоматически  переключает на процедуру при нажатии кнопки.  Надо
написать ON STRIG(n) GOSUB номерстроки. Номер строки дает началь-
ный  номер строки процедуры.  Число n относится к кнопке, где 0 =
A1, 2 = B1, 4 = A2 и 6 = B2.   Каждая кнопка может обрабатываться
своей процедурой или может быть одна процедура для всех кнопок.
   Для  активизации  функции STRIG включите в программу  оператор
STRIG(n) ON.  В качестве  значения n используются четыре перечис-
ленных кода.  Чтобы отменить его (ускоряя работу программы) напи-
шите STRIG(n) OFF.  Имеется также  третья возможность.  STRING(n)
STOP приводит к тому, что нажатие кнопки запоминается, но никаких
действий не предпринимается до очередного оператора STRING(n) ON.
Это свойство предохраняет от нежелательных перерывов из-за опера-
тора ON STRING GOSUB.   Тем  не  менее,  при  выполнении  условия
STRIG(n) STOP программа замедляется.
   Следующий  пример показывает действие ON STRIG GOSUB.   Пример
пункта [7.3.3] содержит строки, показывающие форму X = STRIG.

100 ON STRIG(0) GOSUB 5000   'переход на 5000 при нажатии
 .                           'кнопки A1
200 STRIG(0) ON    'включаем проверку нажатия кнопки
 .
300 STRIG(0) STOP  'отменяем уход на процедуру
 .
400 STRIG(0) ON    'возобновляем уход на процедуру
 .
500 STRIG(0) OFF   'отменяем проверку нажатия кнопки
 .
5000 '''здесь находится процедура обработки нажатия кнопки A1
 .
5500 RETURN        'возврат к тому месту, откуда попали сюда

   Средний уровень.


   Только AT предоставляет  поддержку  джойстика на уровне опера-
ционной системы.  Функция 84H прерывания 15H возвращает установку
кнопок в битах 4-7 регистра AL, как  показано ниже.  При входе DX
должен содержать 0; когда DX содержит 1, то вместо этого  возвра-
щаются координаты джойстика [7.3.3]. При возврате регистр перено-
са устанавливается, когда машина не имеет игрового порта.

;---проверяем кнопку #2 джойстика B (бит 7)
   MOV  AH,84H          ;номер функции
   MOV  DX,0            ;запрос состояния кнопок
   INT  15H             ;вызов функции
   JC   NO_JOYSTICK     ;если нет джойстика, то на выход
   TEST AL,10000000B    ;проверяем бит 7
   JNZ  BUTTON_DOWN     ;переход если кнопка нажата

   Низкий уровень.

   Биты  7-4 порта с адресом 201H содержат статус кнопок, связан-
ных с игровым портом.  Значение  битов  меняется в зависимости от
того, присоединены ли джойстики или весла:

Бит          Джойстик                Весло
 7    Кнопка #2 джойстика B     Кнопка весла D
 6    Кнопка #1 джойстика B     Кнопка весла C
 5    Кнопка #2 джойстика A     Кнопка весла B
 4    Кнопка #1 джойстика A     Кнопка весла A

Программе  нужно просто прочитать значение из  порта и  проверить
установку соответствующих битов:

   MOV  DX,201H         ;адрес порта игрового адаптера
   IN   AL,DX           ;получаем значение из него
   TEST AL,0010B        ;проверяем бит 1 (кнопка A2 нажата?)
   JNZ  BUTTON_A2       ;если да, то на процедуру обработки

Программа имеет обычно более важные дела, чем постоянно проверять
игровой  порт, однако настолько же быссмысленно время от  времени
проверять порт, рассовывая  процедуру по разным частям программы.
Чтобы  получить эффект отлова нажатия кнопок, аналогичный описан-
ному в Бейсике, Вам  придется  создать  дополнение  к  прерыванию
времени  суток, как описано в [2.1.7].  Прерывание обычно  выпол-
няется 18.2 раза в секунду и каждый раз Вы можете проверять игро-
вой порт и предпринимать нужные действия при необходимости.