Справочник программиста на персональном компьютере фирмы IBM. Ввод/вывод - Получение аналогового ввода через игровой порт
ОГЛАВЛЕНИЕ
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: