INIMOUS
 
;TODO для ATM читать начальные координаты мыши
 
       if !ATM
 
;при проверке наличия мыши требует память 0xb8b9..0xbb00
 
        EI 
 
        HALT 
 
        LD HL,#BA00
 
        PUSH HL
 
        POP DE
 
        INC E
 
        LD B,E
 
        ld C,L
 
        LD (HL),#B9
 
        LD A,H
 
        LDIR 
 
        DEC (HL)
 
        LD HL,#C9AF
 
        LD (#B9B8),HL
 
        LD (#B8B9),HL
 
        LD I,A
 
        IM 2
 
        EI 
 
        HALT ;test databus == 0xff
 
        IM 1
 
        LD A,#80
 
        OUT (127),A
 
        JR NZ,NOMOUSE ;databus != 0xff
 
       LD A,-1
 
        LD BC,0xfadf
 
        IN C,(C)
 
        LD A,0xfb
 
        IN A,(#DF)
 
        LD B,A
 
        LD (OLDXmouse),A
 
        LD A,0xff
 
        IN A,(#DF)
 
        LD (OLDYmouse),A
 
        CP B
 
        RET NZ
 
        CP C
 
        RET NZ
 
;all 3 mouse ports equal => no mouse
 
NOMOUSE
 
        ld hl,0x003e
 
        ld (mouseXportreadpatch),hl
 
        ld (mouseYportreadpatch),hl
 
        ;LD A,62
 
        ;LD (OLDX-2),A
 
        ;LD (OLDY-2),A
 
        ;XOR A
 
        ;LD (OLDX-1),A
 
        ;LD (OLDY-1),A
 
       endif
 
        RET 
 
 
 
;onint
 
MOUSE
 
nokeytimer=$+1
 
        ld a,0;-1 ;счётчик фреймов, где не использовалось управление
 
        inc a
 
        jr nz,$+3
 
        dec a
 
        ex af,af' ;'
 
        CALL INKEY
 
       ld a,b
 
       ld (cursorkeys),a
 
        LD A,C
 
MOUSEx=$+1
 
        LD HL,maxXwin/2
 
MOUSEy=$+1
 
        LD B,waterYwin+4
 
ARVEL=$+1
 
        LD DE,0
 
KEY=$+1
 
        CP 0
 
        LD (KEY),A
 
        call nz,resetnokeytimer
 
    ;корректируем скорости
 
        RRA 
 
        RRA 
 
        CPL 
 
        ;JR NZ,MANTORM
 
        AND 15
 
        JR NZ,MANnTORMOZ
 
        LD A,128 ;(a&15) == 0
 
        CP D
 
        JR NC,$+3
 
        INC D
 
        SRA D
 
        call nz,resetnokeytimer
 
        CP E
 
        JR NC,$+3
 
        INC E
 
        SRA E
 
        call nz,resetnokeytimer
 
MANnTORMOZ
 
        RRA 
 
        JR nc,$+3
 
        dec D
 
        RRA 
 
        JR nc,$+3
 
        inc D
 
        RRA 
 
        JR nc,$+3
 
        inc E
 
        RRA 
 
        JR nc,$+3
 
        dec E
 
    ;корректируем X
 
        LD A,0xfb
 
mouseXportreadpatch=$
 
        IN A,(#DF)
 
OLDXmouse=$+1
 
        LD C,0
 
        LD (OLDXmouse),A
 
        SUB C
 
        call nz,resetnokeytimer
 
        ADD A,E
 
        LD E,A
 
        JP Z,MXQQ
 
        JP P,MXP
 
;dx<0
 
      ; SRA A
 
       PUSH BC
 
       LD C,A
 
       LD B,-1
 
       ADD HL,BC
 
       POP BC
 
       ;ADD A,L
 
        jr C,MXQ
 
       CALL MXZRO
 
       LD HL,0
 
       ;CALL NC,MXZRO
 
        JR MXQ
 
MXP   ; DEC A
 
      ; SRL A
 
       ;SUB -8
 
       PUSH BC
 
       LD C,A
 
       LD B,0
 
       ADD HL,BC
 
       LD BC,maxXwin
 
       SBC HL,BC
 
       ADD HL,BC
 
       POP BC
 
       jr C,MXQ ;x<maxXwin
 
       CALL MXZRO
 
       LD HL,maxXwin
 
       ;ADD A,L
 
       ;CALL C,MXZRO
 
       ;SUB 8
 
MXQ    ;LD L,A
 
MXQQ
 
    ;корректируем Y
 
        LD A,0xff
 
mouseYportreadpatch=$
 
        IN A,(#DF)
 
OLDYmouse=$+1
 
        LD C,0
 
        LD (OLDYmouse),A
 
        SUB C
 
        call nz,resetnokeytimer
 
        SUB D
 
        JR Z,MYQQ
 
        CPL 
 
        JP M,MYP
 
      ; SRA A
 
        ADD A,B
 
        JR C,MYQ
 
        XOR A
 
        LD D,A
 
        JR MYQ
 
MYP   ; INC A
 
      ; SRA A
 
        ADD A,B
 
        CP maxYwin;/2;64
 
        JR C,MYQ
 
        XOR A
 
        LD D,A
 
        LD A,maxYwin;/2;64
 
MYQ     LD B,A
 
MYQQ    LD A,B
 
        LD (MOUSEy),A
 
        LD (ARVEL),DE
 
 
 
       ex af,af' ;' ;a=счётчик фреймов, где не использовалось управление
 
       ld (nokeytimer),a ;счётчик фреймов, где не использовалось управление
 
 
 
       if STICKMOUSEXTOGRID
 
;TODO отключать во время полёта снаряда, не получится через манипуляцию nokeytimer
 
        or a
 
        jr z,Mouse_stickskip ;управление использовалось
 
        ld a,l
 
        and 7
 
        jr z,Mouse_stickskip;Mouse_stickdomoveq ;уже прилипли к сетке
 
mouse_oldmdx=$+1
 
        ld a,0 ;последний -dx, не равный 0
 
        rla
 
        inc hl
 
        jr c,Mouse_stickdomoveq ;old dx>=0
 
        dec hl
 
        dec hl
 
Mouse_stickskip ;управление использовалось
 
        ld a,(MOUSEx)
 
        sub l
 
        jr z,Mouse_stickdomoveq
 
        ld (mouse_oldmdx),a
 
Mouse_stickdomoveq
 
       endif
 
 
 
        LD (MOUSEx),HL
 
        RET 
 
 
 
resetnokeytimer
 
       ex af,af' ;'
 
        xor a ;счётчик фреймов, где не использовалось управление
 
       ex af,af' ;'
 
        ret
 
 
 
MXZRO
 
        XOR A
 
        SUB E
 
        JP P,$+4
 
        INC A
 
        SRA A
 
        LD E,A
 
       ;XOR A
 
        RET 
 
 
 
INKEY
 
        ld bc,0xffff
 
        LD A,0xbf
 
        IN A,(-2)
 
        RRA 
 
        JR C,$+4
 
        RES 1,b ;enter
 
        LD A,0x7f
 
        IN A,(-2)
 
        CPL 
 
        AND 31
 
        jr z,$+4
 
        RES 0,b ;space
 
        ld a,0xdf
 
        IN A,(-2)
 
        RRA 
 
        JR C,$+4
 
        RES 4,C ;P
 
        RRA 
 
        JR C,$+4
 
        RES 5,C ;O
 
        LD A,-5
 
        IN A,(-2)
 
        RRA 
 
        JR C,$+4
 
        RES 2,C
 
        LD A,-3
 
        IN A,(-2)
 
        RRA 
 
        JR C,$+4
 
        RES 3,C
 
        ld a,0xfe
 
        in a,(0xfe)
 
        rra
 
        jr nc,INKEY_cursor
 
        ld a,0xef
 
        IN A,(0xfe)
 
        RRCA 
 
        RLA 
 
        RLA 
 
        OR #C3
 
        and c
 
        LD C,A ;11LRDU11
 
        ret
 
INKEY_cursor
 
        ld a,0xf7
 
        in a,(0xfe)
 
        bit 4,a ;5=L
 
        jr nz,$+4
 
        res 5,b
 
        ld a,0xef
 
        IN A,(0xfe) ;DUR??
 
        bit 2,a
 
        jr nz,$+4
 
        res 4,b
 
        rra
 
        or 0xf3
 
        and b
 
        ld b,a ;11LRDUef cursor
 
        ret