|
Адаптер управления играми подключает к
системе джойстики и другие
органы управления игрой. Это все
аналоговые устройства - т.е., они
не могут работать с нулями и единицами. Их
входные значения - это
сопротивление, которое ЭВМ не может прочитать
непосредственно.
Адаптер управления играми преобразует
значение сопротивления в
нечто такое, с чем ЭВМ может иметь дело.
Адаптер управления играми не преобразует
значение сопротивления
непосредственно в двоичное число. Вместо
этого адаптер преобразует
значение сопротивления во временную
задержку. Чем больше
сопротивление, тем больше временная
задержка. Эту задержку
компьютер может измерить. Преобразовать
задержку в число,
соответствующее положению джойстика, можно
программным способом.
Нашей задачей является написание
программы, которая преобразует
временную задержку в число.
Адаптер управления играми обслуживает до
четырех входов
сопротивления. Механизм временной задержки
по каждому из этих
входов подключен к отдельному биту порта
ввода-вывода 201H. Когда
вы выводите любое число в порт 201H,
четыре его младших бита
сбрасываются в 0. Биты возвращаются в
состояние 1 после некоторго
интервала времени. Этот интервал времени
определяется значением
сопротивления, подключенного к адаптеру.
Программа на Фиг. 8.18 -
это пример определения значения
сопротивления двух из четырех
входных портов. Эта программа использует
простой метод. Вместо
определения временной задержки всех
четырех портов одновременно,
она обслуживает их последовательно.
Количество времени, нужного для
определения одной задержки, невелико. В
результате, поочередная
обработка этих задержек вместо
одновременной выполняется без
проблем.
Microsoft (R) Macro Assembler Version 5.001/1/80
04:05:57
Фиг. 8.18 Адаптер управления играмиPage1-1
PAGE
,132
TITLE
Фиг. 8.18 Адаптер управления играми
= 0201 GAME_PORT EQU
201H
0000 STACK SEGMENT STACK
00000040[ DW 64 DUP (?)
????
]
0080 STACK ENDS
0000 CODE SEGMENT
ASSUMECS:CODE
0000
GAME_CONTROL PROC FAR
00001E PUSH DS ; Адрес возврата
00012B C0 SUB AX, AX
000350 PUSH AX
0004BA 0201 MOV DX, GAME_PORT
0007B8 B000 MOV AX, 0B000H ; Сегмент дисплейной памяти
000A8E D8 MOV DS, AX
000CB5 21 MOV CH, 21H ; Символ, который
будет записываться в буфер
000EB1 00 MOV CL, 0
0010
WRITE_LOOP:
0010B4 01 MOV AH, 1 ; Выбор
координаты X
0012E8 0042 R CALL POSITION
00158B D8 MOV BX, AX ; Сохранение координаты X в буфере
0017D1 EB SHR BX, 1
0019D1 EB SHR BX, 1 ; Деление
на 4
Фиг. 8.18 Адаптер управления играми (начало)
001BB4 02 MOV AH, 2 ; Выбор
координаты Y
001DE8 0042 R CALL POSITION
0020D0 E8 SHR AL, 1
0022D0 E8 SHR AL, 1
0024D0 E8 SHR AL, 1
0026D0 E8 SHR AL, 1 ; Деление
на 16
0028B4 A0 MOV AH, 160
002AF6 E4 MUL AH ; Преобразование
в смещение в буфере
002C03 D8 ADD BX, AX
002E88 2F MOV [BX], CH ; Сохранение
символа
0030EC IN AL,
DX
003124 10 AND AL, 10H
00333A C1 CMP AL, CL
003574 D9 JE WRITE_LOOP
00378A C8 MOV CL, AL
003980 F9 10 CMP CL, 10H
003C75 D2 JNE WRITE_LOOP
003EFE C5 INC CH ; Следующий
символ
0040EB CE JMP WRITE_LOOP
0042
GAME_CONTROL ENDP
;-----В AH бит маски
0042
POSITION PROC NEAR
004251 PUSH CX
00432B C9 SUB CX, CX ; Начальное значение для цикла ввода
0045EE OUT DX,
AL ; Запуск таймера
0046
POS_LOOP:
0046EC IN AL,
DX
004784 C4 TEST AL, AH
0049E0 FB LOOPNEPOS_LOOP
; Цикл пока 1 - таймер не закончил отсчет
004BB8 0000 MOV AX, 0
004E2B C1 SUB AX, CX ; Определение значения счетчика
005059 POP CX ;в диапазоне 0-255
0051C3 RET
0052
POSITION ENDP
0052 CODE ENDS
END
Фиг. 8.18 Адаптер управления играми (продолжение)
Последняя часть программы на Фиг. 8.18
берет позицию X-Y,
определенную по входу от джойстика, и
записывает символ в
соответствующую позицию дисплея. Адаптер
управления играми также
допускает четыре переключающих ввода,
значения которых можно
прочитать в старших четырех битах порта
201H. Программа в примере
опрашивает один из этих битов переключения,
чтобы перейти от одного
символа к другому и вывести его на экран.
|