Страница 26 из 27
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:
|