        MAIN "",134

MICE    EQU 0

;таблица для разгона курсора с
;клавиатуры (зависимость смещения в
;пикселях от продолжительности нажатия
;на кнопку перемещения курсора)
KSPD    DB 0,1,1,1,2,2,2,3,3,4,4,5,6,7
        DB 8,9,10,12,14,16
KSPDE   ;указывает на байт, следующий
        ;за таблицей

;Таблица для очень чувствительной мыши
MSPD    DB 0,1,2,4,7,10,14,19,25,32,40
MSPDE

;Для настройки драйвера надо
;вызвать DRIVER+0 передав ему
;в A - 0 (для правши) или 255(для левши)
;если на выходе флаг нуля установлен, то
;мышь не распознана автоматически, но
;реально отключить опрос мыши можно
;занеся в переменную MICE число 0
;А если надо принудительно включить
;мышь, занесите в MICE не 0
;
;Вот эту процедуру вам и надо вызывать
;для достижения желаемого результата
;
MOVING  LD A,(MICE)
        OR A
        LD DE,0
        CALL NZ,DRIVER+6;DE-MOUSE OFFSET
                        ;A-MOUSE BUTTONS
        LD (BATON),A
;ОПРАШИВАЕМ К ОПКИ клавиатуры
;если не хотите кнопки перемещения
;здесь, то закомментарьте эти строки и
;добавьте
;       xor a:ld c,a и опрашивайте клаву
;в другом месте.  о здесь для опроса
;самое место ;)
        XOR A
        LD C,A

        AND #0F         ; АЖАТА К OПКA
                        ;ПЕРЕМЕЩЕ ИЯ?
        JR Z,MOVL       ;ЕСЛИ  ЕТ
                        ;ТО СБРАСЫВАЕМ
                        ;СЧЕТЧИК И ТОВ
        LD A,0
SPD     EQU $-1
        CP KSPDE-KSPD-1
        ADC A,0
MOVL    LD (SPD),A
        ADD A,KSPD
        LD L,A
        ADC A,KSPD/256
        SUB L
        LD H,A
        LD B,(HL)       ;B-СМЕЩЕ ИЕ
                        ;В ПИКСЕЛЯХ ДЛЯ
                        ;КЛАВЫ

        BIT 0,C
        LD A,E
        JR Z,KNL
        SUB B           ;LEFT
        JP PO,$+5
        LD A,128

KNL     BIT 1,C
        JR Z,KNR
        ADD A,B         ;RIGHT
        JP PO,$+5
        LD A,127
KNR     LD E,A

        LD A,D
        BIT 2,C
        JR Z,KND
        ADD A,B         ;DOWN
        JP PO,$+5
        LD A,127

KND     BIT 3,C
        JR Z,KNU
        SUB B
        JP PO,$+5
        LD A,128
KNU     LD D,A
;DE - СМЕЩЕ ИЕ МЫШИ И КЛАВИАТУРЫ
        LD HL,(ARWX)
        BIT 7,D
        JR Z,DOWN
        LD A,D
        ADD A,H
        LD H,A
        SBC A,A
        AND H
        LD H,A
        JR NODOWN
DOWN    LD A,D
        ADD A,H
        JR NC,$+4
        LD A,#BF
        CP #C0
        JR C,$+4
        LD A,#BF
        LD H,A
NODOWN  BIT 7,E
        JR Z,RIGHT
        LD A,E
        ADD A,L
        LD L,A
        SBC A,A
        AND L
        LD L,A
        JR NORIGHT
RIGHT   LD A,E
        ADD A,L
        JR NC,$+3
        SBC A,A
        LD L,A
NORIGHT LD (ARWX),HL

        LD A,C
        RRA 
        RRA 
        RRA 
        RRA 
        AND 3
        OR 0
BATON   EQU $-1
        LD C,A

        LD HL,CANCEL
        XOR A
        BIT 1,C
        LD (HL),A
        JR Z,$+3        ;состояние cancel
        INC (HL)
        INC HL

        BIT 0,C
        LD (HL),A
        JR Z,$+3
        INC (HL)        ;состояние fire
        INC HL

        LD (HL),A
        INC E
        DEC E
        JR Z,NO_X
        JP M,GO_L
        SET 1,(HL)
        JR NO_X
GO_L    SET 0,(HL)
NO_X    INC D
        DEC D
        JR Z,NO_Y
        JP M,GO_U
        SET 3,(HL)
        JR NO_Y
GO_U    SET 2,(HL)
NO_Y    RET 

;переменные для связи с BGE
ARWX    DB 0;Последовательность
ARWY    DB 0;должна
CANCEL  DB 0;быть
FIRE    DB 0;именно
DIRECT  DB 0;такая (сами просили ;)))

;состояние direct:
;bit0 - left, bit1 - right, bit2 - down
;bit3 - up

;includ'им драйвер
;В BGE желательно выделить для него
;память байт этак в 256 по какому-нибудь
;фиксированому адресу (напр. #5b00)
;и подгружать его во время загрузки
;BGE (напр. файл mouse.drv)

;----------------------------------
;файл mouse.C
;----------------------------------
;точка входа для внешнего драйвера мыши
;можете его поместить в отдельный файл
;и приложить его исходник (в формате
;простого текста)
;
;Драйвер имеет 3 точки входа:
;+0 - настройка драйвера:
;  А ВХОДЕ:
; РЕГ. A:
;  #00 - СТА ДАРТ АЯ МЫШЬ
;  #FF - МЫШЬ ДЛЯ ЛЕВШИ
;  А ВЫХОДЕ
; ZF:
; 0 - МЫШЬ  АЙДЕ А
; 1 - МЫШЬ  Е  АЙДЕ А
;
;+3 - остановка курсора. Вызывать, в
; принципе, не обязательно. Сложно
; объяснить, но иногда это очень нужно.
; В данном драйвере я реализовал это
; просто копированием текущего
; содержимого портов мыши в переменные,
; хранящие значения этих портов при
; предыдущем вызове процедуры опроса
; мыши
;
;+6 - процедура опроса мыши.
; на входе: ничего
; на выходе:
;  DE - смещение в пикселях:
;   D - смещение по оси Y (
;   положительное для перемещения вниз)
;   Е - смещение по оси X (положительное
;   при перемещении вправо)
;  A - состояние кнопок мыши (1-нажата)
;   0 бит - fire
;   1 Бит - cancel

;--------------------
;начало драйвера
;--------------------
DRIVER  JP M_INIT       ; АСТРОЙКА
                        ;ДРАЙВЕРА
        JP STOPCUR      ;СТОПИМ КУРСОР
;---------------------------------------
;ДРАЙВЕР МЫШИ. ВОЗВРАЩАЕТ В DE СМЕЩЕ ИЕ
;В ПИКСЕЛЯХ (D-Y, E-X)
;В A-СОСТОЯ ИЕ К ОПОК (1 -  АЖАТА)
;0 BIT - FIRE
;1 BIT - CANCEL
;---------------------------------------
GMOUSE  LD A,(MSPDE-1)
        LD D,A
        LD E,A
                        ;В DE-МАКСИМАЛЬ-
                        ; ЫЕ СМЕЩЕ ИЯ
                        ;ИЗ ТАБЛИЦ
        LD A,#FF        ;ЧИТАЕМ СЧЕТЧИК
        IN A,(#DF)      ;ПО Y

        LD C,0          ;СТАРОЕ З АЧЕ ИЕ
OLD_FF  EQU $-1         ;ПОРТА Y
        LD (OLD_FF),A
        SUB C           ;В A-СМЕЩЕ ИЕ
                        ;СЧЕТЧИКОВ МЫШИ

        JP P,M_UP
;СМЕЩАЕМСЯ В ИЗ
        NEG 
        CP MSPDE-MSPD
        JR NC,GMDX
        ADD A,MSPD      ;БЕРЕМ СМЕЩЕ ИЕ
        LD L,A          ;ПО Y ИЗ ТАБЛИЦЫ
        ADC A,MSPD/256
        SUB L
        LD H,A
        LD D,(HL)
        JR GMDX

M_UP    CP MSPDE-MSPD   ;СМЕЩАЕМСЯ ВВЕРХ
        JR NC,GMU1
        ADD A,MSPD
        LD L,A
        ADC A,MSPD/256
        SUB L
        LD H,A
        LD D,(HL)
GMU1    XOR A
        SUB D
        LD D,A
;СМЕЩЕ ИЕ ПО Y СФОРМИРОВА О.
GMDX
;А АЛОГИЧ О ФОРМИРУЕМ СМЕЩЕ ИЕ ПО X
        LD A,#FB
        IN A,(#DF)
        LD C,0
OLD_FB  EQU $-1
        LD (OLD_FB),A
        SUB C
        JP M,M_LF
        CP MSPDE-MSPD
        JR NC,MBATON
        ADD A,MSPD
        LD L,A
        ADC A,MSPD/256
        SUB L
        LD H,A
        LD E,(HL)
        JR MBATON
M_LF    NEG 
        CP MSPDE-MSPD
        JR NC,GML1
        ADD A,MSPD
        LD L,A
        ADC A,'MSPD;.H
        SUB L
        LD H,A
        LD E,(HL)
GML1    XOR A
        SUB E
        LD E,A
;В DE ТЕПЕРЬ СМЕЩЕ ИЕ В ПИКСЕЛЯХ
MBATON  ;ОПРАШИВАЕМ К ОПКИ
        LD A,0
REVBTN  EQU $-1
        OR A
        LD A,#FA
        IN A,(#DF)
        CPL 
        JR NZ,REVERSE;МЫШЬ ДЛЯ ЛЕВШИ
        AND 3
        RET 
REVERSE RRA 
        RL L
        RRA 
        RR L
        LD A,L
        AND 3
        RET 

;---------------------------------------
;И ИЦИАЛИЗАЦИЯ ДРАЙВЕРА
; А ВХОДЕ:
; РЕГ. A:
;  #00 - СТА ДАРТ АЯ МЫШЬ
;  #FF - МЫШЬ ДЛЯ ЛЕВШИ
; А ВЫХОДЕ (ПРИ ВКЛЮЧЕ  ОМ АВТОДЕТЕКТЕ)
; ZF
; 0 - МЫШЬ  АЙДЕ А
; 1 - МЫШЬ  Е  АЙДЕ А

;---------------------------------------
M_INIT  LD (REVBTN),A
        CALL STOPCUR    ;СТОПИМ МЫШЬ
        EI              ;АВТОДЕТЕКТ
                        ;ПРОИСХОДИТ
                        ;ПРИ РАЗРЕШЕ  ЫХ
                        ;ПРЕРЫВА ИЯХ,
                        ;ЧТОБ ПРИ
                        ;ОТСУТСТВИИ МЫШИ
                        ; Е ПРОЧИТАЛИСЬ
                        ;ОТОБРАЖАЕМЫЕ
                        ;В ДА  ЫЙ МОМЕ Т
                        ;АТРИБУТЫ (ЕСЛИ
                        ; А КОМПЕ РЕАЛИ-
                        ;ЗОВА  ПОРТ #FF
        HALT            ;ЕСЛИ ИЗO ВСЕХ
        LD BC,#FFDF     ;ПОРТОВ МЫШИ
        IN A,(C)        ;ЧИТАЕТСЯ ОД О
        LD B,#FB        ;И ТО ЖЕ ЧИСЛО,
        IN E,(C)        ;ТО, СКОРЕЕ
        DEC B           ;ВСЕГО МЫШЬ
        IN D,(C)        ;ОТСУТСТВУЕТ.
        CP E
        RET NZ
        SUB D
        RET 
;---------------------------------------
;ОСТА ОВКА КУРСОРА
STOPCUR LD A,#FF
        IN A,(#DF)
        LD (OLD_FF),A
        LD A,#FB
        IN A,(#DF)
        LD (OLD_FB),A
        RET 

        LEN= $-#6000
