Адаптер управления играми

    Адаптер управления играми подключает к системе джойстики и другие

    органы управления игрой. Это все аналоговые устройства - т.е., они

    не могут работать с нулями и единицами. Их входные значения - это

    сопротивление, которое ЭВМ не может прочитать непосредственно.

    Адаптер управления играми преобразует значение сопротивления в

    нечто такое, с чем ЭВМ может иметь дело.

 

      Адаптер управления играми не преобразует значение сопротивления

    непосредственно в двоичное число. Вместо этого адаптер преобразует

    значение сопротивления во временную задержку. Чем больше

    сопротивление, тем больше временная задержка. Эту задержку

    компьютер может измерить. Преобразовать задержку в число,

    соответствующее положению джойстика, можно программным способом.

    Нашей задачей является написание программы, которая преобразует

    временную задержку в число.

 

      Адаптер управления играми обслуживает до четырех входов

    сопротивления. Механизм временной задержки по каждому из этих

    входов подключен к отдельному биту порта ввода-вывода 201H. Когда

    вы выводите любое число в порт 201H, четыре его младших бита

    сбрасываются в 0. Биты возвращаются в состояние 1 после некоторго

    интервала времени. Этот интервал времени определяется значением

    сопротивления, подключенного к адаптеру. Программа на Фиг. 8.18 -

    это пример определения значения сопротивления двух из четырех

    входных портов. Эта программа использует простой метод. Вместо

    определения временной задержки всех четырех портов одновременно,

    она обслуживает их последовательно. Количество времени, нужного для

    определения одной задержки, невелико. В результате, поочередная

    обработка этих задержек вместо одновременной выполняется без

    проблем.

             Microsoft (R) Macro Assembler Version 5.00                1/1/80 04:05:57

             Фиг. 8.18 Адаптер управления играми                       Page     1-1

 

                                           PAGE ,132

                                           TITLE      Фиг. 8.18 Адаптер управления играми

 

              = 0201                GAME_PORT  EQU  201H

 

              0000                        STACK      SEGMENT STACK

              0000      0040[                   DW   64 DUP (?)

                      ????

                                ]

              0080                        STACK      ENDS

 

              0000                        CODE SEGMENT

                                           ASSUME  CS:CODE

              0000                        GAME_CONTROL     PROC FAR

              0000      1E                      PUSH DS         ; Адрес возврата

              0001      2B C0                   SUB  AX, AX

              0003      50                      PUSH AX

              0004      BA 0201                  MOV  DX, GAME_PORT

              0007      B8 B000                  MOV  AX, 0B000H ; Сегмент дисплейной памяти

              000A      8E D8                   MOV  DS, AX

 

              000C      B5 21                   MOV  CH, 21H    ; Символ, который будет записываться в буфер

              000E      B1 00                   MOV  CL, 0

              0010                        WRITE_LOOP:

              0010      B4 01                   MOV  AH, 1            ; Выбор координаты X

              0012      E8 0042 R               CALL POSITION

              0015      8B D8                   MOV  BX, AX      ; Сохранение координаты X в буфере

              0017      D1 EB                   SHR  BX, 1

              0019      D1 EB                   SHR  BX, 1            ; Деление на 4

 

                         Фиг. 8.18 Адаптер управления играми (начало)

              001B      B4 02                   MOV  AH, 2            ; Выбор координаты Y

              001D      E8 0042 R               CALL POSITION

              0020      D0 E8                   SHR  AL, 1

              0022      D0 E8                   SHR  AL, 1

              0024      D0 E8                   SHR  AL, 1

              0026      D0 E8                   SHR  AL, 1            ; Деление на 16

              0028      B4 A0                   MOV  AH, 160

              002A      F6 E4                   MUL  AH         ; Преобразование в смещение в буфере

              002C      03 D8                   ADD  BX, AX

              002E      88 2F                   MOV  [BX], CH   ; Сохранение символа

              0030      EC                      IN   AL, DX

              0031      24 10                   AND  AL, 10H

              0033      3A C1                   CMP  AL, CL

              0035      74 D9                   JE   WRITE_LOOP

              0037      8A C8                   MOV  CL, AL

              0039      80 F9 10                CMP  CL, 10H

              003C      75 D2                   JNE  WRITE_LOOP

              003E      FE C5                   INC  CH         ; Следующий символ

              0040      EB CE                   JMP  WRITE_LOOP

 

              0042                        GAME_CONTROL     ENDP

 

                                     ;-----  В AH бит маски

 

              0042                        POSITION   PROC NEAR

              0042      51                      PUSH CX

              0043      2B C9                   SUB  CX, CX      ; Начальное значение для цикла ввода

              0045      EE                      OUT  DX, AL      ; Запуск таймера

              0046                        POS_LOOP:

              0046      EC                      IN   AL, DX

              0047      84 C4                   TEST AL, AH

              0049      E0 FB                   LOOPNE  POS_LOOP ; Цикл пока 1 - таймер не закончил отсчет

              004B      B8 0000                  MOV  AX, 0

              004E      2B C1                   SUB  AX, CX      ; Определение значения счетчика

              0050      59                      POP  CX         ;  в диапазоне 0-255

              0051      C3                      RET

              0052                        POSITION   ENDP

              0052                        CODE ENDS

                                           END

 

                Фиг. 8.18 Адаптер управления играми (продолжение)

 

      Последняя часть программы на Фиг. 8.18 берет позицию X-Y,

    определенную по входу от джойстика, и записывает символ в

    соответствующую позицию дисплея. Адаптер управления играми также

    допускает четыре переключающих ввода, значения которых можно

    прочитать в старших четырех битах порта 201H. Программа в примере

    опрашивает один из этих битов переключения, чтобы перейти от одного

    символа к другому и вывести его на экран.

Hosted by uCoz