ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.07.2020
Просмотров: 3162
Скачиваний: 1
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 раза в секунду и каждый раз Вы можете проверять игро-
вой порт и предпринимать нужные действия при необходимости.
Приложения.
Приложение А. Двоичные и шестнадцатиричные числа и адресация
памяти.
Основной единицей хранения данных в компьютере является бит. В
большинстве микрокомпьютеров восемь битов объединены в байт, при
этом каждый бит байта может быть установлен или "включен" (= 1)
или сброшен или "выключен" (= 0), допуская 256 разных вариантов.
Таким образом, в одном байте можно представить 256 разных симво-
лов (расширенный набор кодов ASCII) или целое число в диапазоне
от 0 до 255. Хотя мы привыкли записывать эти числа в десятичной
форме, они могут записываться также в двоичной или шестнадцати-
ричной форме - их значения при этом не изменяются, а программы
могут с одинаковой легкостью читать эти значения как в той, так и
в другой форме. Вместо того, чтобы говорить, что в одном байте
могут храниться числа от 0 до 255, можно сказать, что могут хра-
ниться двоичные числа от 00000000 до 11111111 или шестнадцатирич-
ные числа от 00 до FF. Поскольку можно перепутать разные формы,
то двоичные и шестнадцатиричные числа отмечаются специальным
образом. В языке ассемблера за двоичными числами следует буква B,
а за шестнадцатиричными числами - буква H, например, 11111111B
или FFH. Бейсик фирмы Microsoft предваряет шестнадцатиричные
числа символами &H, например &FFH; к сожалению, он не распознает
числа в двоичной форме.
Двоичные числа:
Когда содержимое байта представляется в двоичной форме, то
требуется 8 цифр. Каждая цифра соответствует одному биту, которые
нумеруются от 0 до 7. Как и в десятичных числах цифры распола-
гаются справа налево, от младших к старшим разрядам. В отличии от
десятичных чисел, в которых каждая последующая цифра весит в 10
раз больше своей соседки справа, двоичные цифры имеют только
вдвое больший вес. Таким образом, самая правая цифра считает
единицы, вторая - двойки, третья - четверки и т.д., до значения
128 для восьмой цифры байта. Это означает, что если первая цифра
равна 1, то прибавление к ней 1 приводит к тому, что она станет
0, а 1 будет перенесена во вторую цифру, как для десятичных чисел
9 + 1 = 0 и перенос единицы в следующий разряд. Вот как числа
первого десятка представляются в двоичной форме:
00000000 0
00000001 1
00000010 2
00000011 3
00000100 4
00000101 5
00000110 6
00000111 7
00001000 8
00001001 9
00001010 10
В этой последовательности большинство нулей слева необязатель-
ны, т.е. эту последовательность можно записать и в виде 0, 1, 10,
11, 100, 101 и т.д. Нули включены только для того, чтобы напом-
нить Вам, что байт составляется восемью цифрами, соответствующими
битам. В то время как набор нулей и единиц может быть несколько
утомительным, Вы можете легче работать с двоичными числами, если
будете представлять их себе следующим образом:
бит 7 6 5 4 3 2 1 0
значение 128 64 32 16 8 4 2 1
Когда Вы встречаете двоичное число 10000001, то установлены биты
7 и 0. Бит 7 соответствует 128, а бит 0 - 1, поэтому десятичное
значение байта равно 129. Если этот байт представляет символ, то
он соответствует коду ASCII 129, который представляет букву u с
умляутом (в альтернативной кодировке ГОСТа - букву Б). Наоборот,
чтобы определить цепочку битов для буквы A, которая равна ASCII
Приложение Б. Битовые операции в Бейсике.
В Бейсике нельзя использовать числа в двоичной форме. Он расс-
матривает цепочку битов 11000000 как 11 миллионов, а не как 192.
Однако манипуляции с цепочками битов часто необходимы при прог-
раммировании, поскольку требуется читать и изменять содержимое
статусных байтов и статусных регистров.
В большинстве случаев к цепочкам битов применяются две логи-
ческие операции. Это операции ИЛИ (OR) и И (AND) и обе они дос-
тупны в Бейдиапазоне
от 0 до 255. Хотя мы привыкли записывать эти числа в десятичной
форме, они могут записываться также в двоичной или шестнадцати-
ричной форме - их значения при этом не изменяются, а программы
могут с одинаковой легкостью читать эти значения как в той, так и
в другой форме. Вместо того, чтобы говорить, что в одном байте
могут храниться числа от 0 до 255, можно сказать, что могут хра-
ниться двоичные числа от 00000000 до 11111111 или шестнадцатирич-
ные числа от 00 до FF. Поскольку можно перепутать разные формы,
то двоичные и шестнадцатиричные числа отмечаются специальным
образом. В языке ассемблера за двоичными числами следует буква B,
а за шестнадцатиричными числами - буква H, например, 11111111B
или FFH. Бейсик фирмы Microsoft предваряет шестнадцатиричные
числа символами &H, например &FFH; к сожалению, он не распознает
числа в двоичной форме.
Двоичные числа:
Когда содержимое байта представляется в двоичной форме, то
требуется 8 цифр. Каждая цифра соответствует одному биту, которые
нумеруются от 0 до 7. Как и в десятичных числах цифры распола-
гаются справа налево, от младших к старшим разрядам. В отличии от
десятичных чисел, в которых каждая последующая цифра весит в 10
раз больше своей соседки справа, двоичные цифры имеют только
вдвое больший вес. Таким образом, самая правая цифра считает
единицы, вторая - двойки, третья - четверки и т.д., до значения
128 для восьмой цифры байта. Это означает, что если первая цифра
равна 1, то прибавление к ней 1 приводит к тому, что она станет
0, а 1 будет перенесена во вторую цифру, как для десятичных чисел
9 + 1 = 0 и перенос единицы в следующий разряд. Вот как числа
первого десятка представляются в двоичной форме:
00000000 0
00000001 1
00000010 2
00000011 3
00000100 4
00000101 5
00000110 6
00000111 7
00001000 8
00001001 9
00001010 10
В этой последовательности большинство нулей слева необязатель-
ны, т.е. эту последовательность можно записать и в виде 0, 1, 10,
11, 100, 101 и т.д. Нули включены только для того, чтобы напом-
нить Вам, что байт составляется восемью цифрами, соответствующими
битам. В то время как набор нулей и единиц может быть несколько
утомительным, Вы можете легче работать с двоичными числами, если
будете представлять их себе следующим образом:
бит 7 6 5 4 3 2 1 0
значение 128 64 32 16 8 4 2 1
Когда Вы встречаете двоичное число 10000001, то установлены биты
7 и 0. Бит 7 соответствует 128, а бит 0 - 1, поэтому десятичное
значение байта равно 129. Если этот байт представляет символ, то
он соответствует коду ASCII 129, который представляет букву u с
умляутом (в альтернативной кодировке ГОСТа - букву Б). Наоборот,
чтобы определить цепочку битов для буквы A, которая равна ASCII
блоки.
Набору блоков предшествует "лидер", который состоит из 256 байтов
ASCII 1. Лидер завершается нулевым битом синхронизации. Затем
следует байт синхронизации со значением 16H, а затем 256 байтов
данных. После этого идут 2 байта контроля ошибок, а затем новый
блок данных, сопровождающийся парой байт проверки ошибок и т.д.
Вся последовательность завершается четырехбайтным "хвостом",
содержащим коды ASCII 1.
Для чтения данных с кассеты на до использовать функцию 2 пре-
рывания 15H. Нет необходимости открывать файл, как это делается
при дисковых операциях. ES:BX указывают на буфер в памяти, куда
будут посылаться данные, а CX - число байтов, которые надо счи-
тать. При возврате DX сообщит сколько байтов прочитано на самом
деле, а ES:BX будут указывать на последний считанный байт плюс 1.
Флаг переноса будет равен 0, если чтение прошло успешно, а в
противном случае AH будет содержать 1, если проблема с контролем
ошибки, 2 - при ошибке чтения данных и 3 - при отсутствии данных
на ленте.
Функция 3 прерывания 15H записывает данные на кассету. ES:BX
указывают на первый байт данных, а CX содержит число байтов,
которое надо записать. При возврате ES:BX указывают на байт,
следующий за последним записанным. Мотор управляется функциями 0
(включение) и 1 (выключение) прерывания 15H. Для этих функций нет
выходных регистров.
7.3.2 Чтение позиции светового пера.
Хотя очень немногие компьютеры оснащены световым пером, тем не
менее это одно из немногих вспомогательных устройств, которое
поддерживается как оборудованием, так и операционной системой.
Световое перо работает с помощью небольшого оптического детектора
на кончике пера. По ходу сканирования экрана электронным лучом
инициируется импульс оптического детектора, когда пучок достигает
точки экрана, над которой находится перо. Время возникновения
этого импульса, относительно сигналов горизонтальной и вертикаль-
ной синхронизации, позволяет определить позицию светового пера.
Высокий уровень.
Бейсик может определять позицию светового пера двумя способа-
ми. При первом программа непрерывно определяет статус пера. При
втором, когда перо используется, то управление временно передает-
ся процедуре, обеспечиваемой Вашей программой. Для непрерывного
контроля за пером надо использовать оператор PEN как функцию в
форме X = PEN(n), где n - кодовый номер, определяющий какую ин-
формацию Вы хотите получить о пере и его позиции. Возможные зна-
чения n такие:
0 возвращает -1, если перо было выключено со времени послед-
него запроса, 0 - если нет
1 возвращает последнюю координату x (0-319 или 0-639), в ко-
торой перо было включено (оно могло быть впоследствии
передвинуто, если оставалось включенным)
2 возвращает последнюю координату y (0-199), в которой перо
было включено.
3 возвращает -1, если перо включено и 0 - если нет
4 возвращает текущую x координату (0-319 или 0-639) пера
5 возвращает текущую y координату (0-199) пера
6 возвращает позицию - номер строки (1-24), в которой перо
было последний раз активизировано
7 возвращает позицию - номер столбца (1-40 или 1-80), в ко-
торой перо было последний раз активизировано
8 возвращает текущую позицию - номер строки (1-24)
9 возвращает текущую позицию - номер столбца (1-40 или 1-80)
В данном примере определяется включено ли перо, и если это
так, то берется текущее его положение:
100 IF NOT PEN(3) THEN 130 'проверяем включено ли перо
110 X = PEN(4) 'получаем координату точки по оси x
120 Y = PEN(5) 'получаем координату точки по оси y
130 ... 'продолжаем программу
Более гибкие возможности использования светового пера предос-
тавляются оператором ON PEN GOSUB. Этот оператор указывает номер
строки, в которой начинается процедура, активизируемая при вклю-
чении пера. Бейсик достигает этого проверкой состояния пера после
выполнения каждой его инструкции. Процедура может получить пози-
цию пера и предпринять требуемые действия. Когда процедура закан-
чивается, то программа продолжается с того места, где она была
при включении пера.
ON PEN GOSUB не работает до тех пор, пока она не активизирова-
на оператором PEN ON. PEN OFF отменяет ее работу. Смысл этого
состоит в том, что постоянная проверка статуса пера замедляет
работу программы, поэтому ее надо осуществлять только когда это