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


     7.3.3 Получение аналогового ввода через игровой порт.


   Игровой порт может поддерживать 2 джойстика или 4 "весла". Для
джойстика он сообщает две  координаты  и  статус двух кнопок; для
весла он сообщает одну координату и статус одной кнопки. Несколь-
ко вспомогательных устройств, таких  как графическое табло, также
может быть подключено к игровому порту; их работа может осуществ-
ляться параллельно с работой  джойстика.  Данный  раздел посвящен
чтению  координат, а в следующем обсуждается как получить  статус
кнопок.

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


   Функция STICK возвращает позиции  по осям, указываемую следую-
щими кодовыми номерами:

   0    ось X джойстика A
   1    ось Y джойстика A
   2    ось X джойстика B
   3    ось Y джойстика B

Вам нужно написать, например, X = STICK(0) и в X будет содержать-
ся значение координаты X для  джойстика  A.  Но эта функция имеет
ловушку, о которой Вам необходимо знать. Только при использовании
кода  0  действительно читаются координаты  джойстика,  при  этом
читаются все 4 значения. Кодовые номера 1-3 просто сообщают пока-
зания, прочитанные кодом 0. Чтобы получить последние 3 координаты
Вам необходимо перед этим использовать функцию X = STICK(0), даже
если Вам не нужно знать значение, возвращаемое кодом 0.
   Джойстики  отличаются  по  своим  физическим  характеристикам,
поэтому необходимо настраивать их,  чтобы их предельные положения
совпадали  с границами экрана.  В следующем примере показано  как
это делается. В  примере  непрерывно  рисуется  точка, в позиции,
указываемой джойстиком, действие, которое требуется, чтобы диапа-
зон значений,  принимаемых  игровым  портом,  преобразовывался  в
диапазон позиций экрана.

100 '''получаем предельные показания джойстика
110 STRIG ON            'разрешаем кнопки
120 V= STRIG(0)         'чистим старые показания
130 PRINT "Briefly push button 1 when stick is farthest to left"
140 XLEFT = STICK(0)    'получаем самое левое значение
150 IF STRIG(0) = 0 THEN 140  'ждем нажатия кнопки
160 STRIG OFF: FOR N = 1 TO 1000: NEXT: STRIG ON
170 PRINT "Briefly push button 1 when stick is farthest to right"
180 XRIGHT = STICK(0)   'получаем самое правое значение
190 IF STRIG(0) = 0 THEN 180  'ждем нажатия кнопки
200 STRIG OFF: FOR N = 1 TO 1000: NEXT: STRIG ON
210 PRINT "Briefly push button 1 when stick is farthest to top"
220 V = STICK(0): YTOP = STICK(1)  'самое верхнее значение
230 IF STRIG(0) = 0 THEN 220  'ждем нажатия кнопки
240 STRIG OFF: FOR N = 1 TO 1000: NEXT: STRIG ON
250 PRINT "Briefly push button 1 when stick farthest to bottom"
260 V = STICK(0): YBOTTOM = STICK(1)  'самое нижнее значение
270 IF STRIG(0) = 0 THEN 260  'ждем нажатия кнопки
280 STRIG OFF           'закончили
290 '''получаем множители для установки на размер экрана
300 XRIGHT = XRIGHT - XLEFT   'горизонтальный размер
310 XMULTIPLIER = 320/XRIGHT  'вычисляем число точек на деление
320 YBOTTOM = YBOTTOM - YTOP  'вертикальный размер
330 YMULTIPLIER = 200/B/YBOTTOM  'число точек на деление
340 '''теперь вычисляем координаты в режиме умеренного разрешения
350 X = STICK(0)        'получаем горизонтальную позицию
360 Y = STICK(1)        'получаем вертикальную позицию
370 X = (X - XLEFT)*XMULTIPRIER  'приводим к экрану
380 Y = (Y - YTOP)*YMULTIPRIER   '
390 PSET(X,Y)           'выводим точку в нужной позиции
400 GOTO 350            'повторяем

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


   Только  AT предоставляет поддержку джойстика на уровне  опера-
ционной системы.  Это функция 84H прерывания 15H, которая возвра-
щает координаты, причем:

   AX  =  координата X джойстика A
   BX  =  координата Y джойстика A
   CX  =  координата X джойстика B
   DX  =  координата Y джойстика B

При входе поместите в DX 1. Когда в DX содержится 0, то эта функ-
ция возвращает состояние кнопок джойстика  [7.3.4].  При возврате
флаг переноса установлен, когда у машины нет игрового порта.

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


   Информация  о  координатах обоих джойстиков или  всех  четырех
весел хранится в одном байте,  доступ  к  которому осуществляется
через порт 201H. Вот значение его битов:

Бит             Джойстик                  Весло

 3      координата Y джойстика B      координата весла D
 2      координата X джойстика B      координата весла C
 1      координата Y джойстика A      координата весла B
 0      координата X джойстика A      координата весла A

   Координата  может  описываться одним битом за  счет  измерения
временных интервалов.  Пошлите в  порт байт с произвольным значе-
нием.   Это приведет к тому, что младшие 4 бита обнулятся.  Затем
постоянно считывайте значение из порта, замеряя интервал времени,
через который интересующий Вас бит станет равным 1. Этот интервал
пропорционален позиции джойстика по интересующей Вас оси.  Макси-
мальны еинтервалы соответствуют  нижней позиции по оси Y и правой
позиции по оси X.  Независимо от позиции, биты меняются от 0 к  1
очень быстро, по сравнению с  механической  скоростью перемещения
джойстика или весла.  Поэтому программа может с большой точностью
получить сначала позицию координаты Y, а затем позицию координаты
X.   Нет необходимости тестировать каждую координату отдельно.  В
данном примере определяется координата X джойстика A.

;---получаем координату X джойстика A
   MOV  DX,201H         ;адрес игрового порта
   OUT  DX,AL           ;посылаем в порт произвольное значение
   MOV  AH,1            ;проверяем бит 1
   MOV  SI,0            ;инициализируем счетчик
NEXT:   IN   AL,DX      ;читаем значение из порта
   TEST AL,AH           ;проверяем бит 1
   JE   FINISHED        ;выход, когда бит установлен
   INC  SI              ;иначе, увеличиваем счетчик
   LOOP NEXT            ;на начало цикла
FINISHED:


 
« Предыдущая статья   Следующая статья »