Proton #13
23 декабря 1997

Кодинг - Определение наличия Kempston Joystick и Kempston Mouse.

╔══════════════════════════════════════════════════════════════╗
║             Кодинг.            ║
╙──────────────────────────────────────────────────────────────╜
(C) EVP-SOFT

            Определение наличия Kempston Joystick.

   На  зарубежном спектруме  Kempston джойстик  выбирается путём
сброса  A5  на шине адреса, таким образом его порт #DF (223), но
на  росийских  спектрумах  стандартным портом Kempston джойстика
стал  порт #1F(31). При отсутствии Kempston мыши это не важно, и
если  какая  нибудь прога будет обращаться к джойстику через #DF
то он будет нормально работать.

   Раскладка  битов  Kempston джойстика такая: D0 - вправо; D1 -
влево; D2 - вниз; D3 - вверх; D4 - огонь, активизированный бит в
отличии  от клавиатуры устанавливается в 1. В некоторых игрушках
встречается  "перевёрнутая"  раскладка битов (например, в Subway
Vigilante).

   Традиционный  способ  определения  наличия Kempston джойстика
основан  на  том, что три старших бита(D5,D6,D7) при его наличии
сброшены в 0. Например:


        XOR     A
        IN      A,(#1F)
        AND     #E0     ;#E0 = %11100000
        JR      Z,джойстик есть
        JR      джойстика нет


или ещё вот так:


        XOR     A
        IN      A,(#1F)
        RLA
        JR      NC,джойстик есть
        JR      джойстика нет


   Однако,  эти способы не работают на многих спектрум-совмести-
мых  машинах, например Scorpion'ы, некоторые Pentagon'ы и многие
другие.  Причин  несколько:  во-первых  на  многих платах не все
старшие  биты порта Kempston джойстика сброшены в 0, бывает, что
они  все  (или  некоторые  из них) установлены в 1; во-вторых на
фирменных спектрумах и на Scorpion'ах при обращении к какому-ни-
будь  отсутствующему  порту из него считывается содержимое порта
атрибутов  ("порт  #FF")  -  именно с этим связаны сложности при
подключении  CDOS-модема  к  Scorpion'у или GRM'у, т.к. на плате
нет такого порта.

   Чтобы устранить вторую причину, надо разобраться, как работа-
ет порт атрибутов. Вывод на экран начинается сразу после прихода
сигнала  INT,  точнее  сразу  после INT'а рисуется верхняя часть
бордюра и в это время порт атрибутов отключается. Когда-же начи-
нает  рисоваться экран, то из порта атрибутов приходят байты ат-
рибутов, которые в данный момент выводятся на монитор (однако, в
те моменты, когда рисуются боковые части бордюра, порт атрибутов
снова отключается) - это явление позволяет синхронизировать бор-
дюрные эффекты. Итак, для определения наличия Kempston джойстика
(а так-же это касается и Kempston мыши) его порт надо опрашивать
только сразу после INT'а, пока порт атрибутов выключен, т.к. по-
том если джойстика нет - из его порта может приходить разный му-
сор порта атрибутов.

   Ну  а  для  устранения первой причины надо определять наличие
Kempston  джойстика  по  младшим  5 битам, но правда в этом есть
один  недостаток,  а именно, если, когда прога проверяет наличие
Kempston  джойстика  его  удерживать - то программа не определит
его присутствие.

   Итак,  оптимальный способ определения Kempston джойстика, ра-
ботает абсолютно на всех машинах со 100% надёжностью:


;
; (C) EVP-SOFT
;
; на время определения наличия Kempston
; джойстика желательно установить режим
; IM 2 и программу обработки прерываний
; сделать короткой:
;I_ADDR  EI
;        RETI
;
TEST_J  HALT            ; сразу после HLT порт атрибутов выключ.
        XOR     A
        IN      A,(#1F)
        AND     #1F     ;#1F = %00011111
        JR      Z,джойстик есть
        JR      джойстика нет


               Определение наличия Kempston Mouse

   Название мыши "Kempston" вовсе не означает, что она подключа-
ется вместо Kempston джойстика. Для подключния Kempston мыши ну-
жен специальный контроллер, т.к. координаты Kempston мыши (в от-
личии  от AY-мыши) вычисляются аппаратно, а не программно. Связь
с контроллером осуществляется через три порта:

#FADF - кнопки,  используются только  три младших бита, если бит
        сброшен в 0, значит кнопка нажата:  D0-правая, D1-левая,
        D2-средняя.
#FBDF - горизонтальные координаты
#FFDF - вертикальные координаты

   Координаты  мыши могут переходить через 0 или #FF. Определить
наличие  Kempston  мыши  можно по тому, что при её отсутствии из
всех  трёх  "мышиных"  портов считывается #FF, разумеется, когда
выключается  порт атрибутов. Если хотя-бы из одного порта пришло
не  #FF, значит мышь есть. Однако, если после включения компа не
прикасаться  к мыши, то из портов координат тоже будет приходить
#FF,  и наличие мыши будет не определить - поэтому после включе-
ния  компа  всегда  сдвигайте  мышь,  иначе  ни одна прога её не
найдёт. Вобщем, наличие Kempston мыши можно определить например,
вот так:


;
; (C) EVP-SOFT
;
; на время определения наличия Kempston
; мыши желательно установить режим IM 2
; и программу обработки прерываний сде-
; лать короткой:
;I_ADDR  EI
;        RETI
;
TEST_M  LD      BC,#FADF
        HALT            ; сразу после HLT порт атрибутов выключ.
        IN      A,(C)
        CPL
        LD      E,A
        INC     B
        HALT            ; этот HLT можно убрать
        IN      A,(C)
        CPL
        OR      E
        LD      E,A
        LD      B,#FF
        HALT            ; а этот HLT желательно оставить
        IN      A,(C)
        CPL
        OR      E
        JR      NZ,мышь есть
        JR      мыши нет




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Interface - Nik-O interview.
От Автора - Еще пару месяцев назад журнал находился в замороженном состоянии, а теперь он перед тобой дорогой читатель.
ENLIGHT RULEZ?! - ENLIGHT 1997 - к чему он прирулит? (день четвертый и пятый).

В этот день...   14 августа