;LAST UPDATE; 03.05.2019 savelij
 
 
 
;СОХРАНЕНИЕ КУСКА ЭКРАНА
 
SAVE2X2         LD HL,FLAGS
 
                BIT B_VIDEO_MODE,(HL)
 
                RET NZ
 
                LD HL,(ADR_REST)
 
                LD DE,MOUSE_BUFF
 
                LD B,8
 
SAVE2X21        LD A,(HL)
 
                LD (DE),A
 
                INC DE
 
                INC L
 
                LD A,(HL)
 
                LD (DE),A
 
                INC DE
 
                DEC L
 
                CALL INC_H
 
                DJNZ SAVE2X21
 
                RET
 
 
 
;ВОССТАНОВЛЕНИЕ КУСКА ЭКРАНА
 
REST2X2         LD HL,FLAGS
 
                BIT B_VIDEO_MODE,(HL)
 
                RET NZ
 
                LD HL,(ADR_REST)
 
                LD DE,MOUSE_BUFF
 
                LD B,8
 
REST2X21        LD A,(DE)
 
                LD (HL),A
 
                INC DE
 
                INC L
 
                LD A,(DE)
 
                LD (HL),A
 
                INC DE
 
                DEC L
 
                CALL INC_H
 
                DJNZ REST2X21
 
                RET
 
 
 
DETECTMOUSE     LD HL,FLAGS
 
                LD BC,0XFBDF
 
                LD E,0X20
 
                EI
 
                HALT
 
                IN D,(C)                        ;1.СТАБИЛЬНОСТЬ X
 
SETMOU1         IN A,(C)
 
                CP D
 
                JR NZ,SETMOU2
 
                DEC E
 
                JR NZ,SETMOU1                   ;2.KEYS<>X
 
                DEC B
 
                IN A,(C)
 
                CP D
 
                JR Z,SETMOU2                    ;3.KEYS&7=7(LION17)
 
                CPL
 
                AND 7
 
                SET B_MOUSE_PRESENT,(HL)
 
                RET Z
 
SETMOU2         RES B_MOUSE_PRESENT,(HL)
 
                SCF
 
                RET
 
 
 
MOUSE           LD HL,FLAGS
 
                BIT B_VIDEO_MODE,(HL)
 
                RET NZ
 
                LD HL,(ARXY)
 
                LD DE,(MOUPOS)                  ;D=Y КООДИНАТА, E=X КООРДИНАТА
 
                LD BC,0XFBDF
 
                IN A,(C)                        ;ЧТЕНИЕ КООРДИНАТЫ X
 
                LD (MOUPOS),A
 
                SUB E
 
                JR Z,MOUNX
 
                JP P,MOUPX
 
                ADD A,L
 
                JR C,$+3
 
                XOR A
 
                LD L,A
 
                JR MOUNX
 
 
 
MOUPX           ADD A,L
 
                JR C,$+6
 
                CP 0XF9
 
                JR C,$+4
 
                LD A,0XF9
 
                LD L,A
 
MOUNX           LD BC,0XFFDF                    ;ЧТЕНИЕ КООРДИНАТЫ Y
 
                IN A,(C)
 
                LD (MOUPOS+1),A
 
                SUB D
 
                JR Z,MOUNY
 
                NEG
 
                JP P,MOUPY
 
                ADD A,H
 
                JR C,$+3
 
                XOR A
 
                LD H,A
 
                JR MOUNY
 
 
 
MOUPY           ADD A,H
 
                JR C,$+6
 
                CP 0XB8
 
                JR C,$+4
 
                LD A,0XB8
 
                LD H,A
 
MOUNY           LD (ARXY),HL
 
                RET
 
 
 
MOUOPT          LD H,(IX+1)
 
                LD L,(IX+0)
 
                LD DE,(ARXY)
 
                LD B,3
 
                SRL D
 
                SRL E
 
                DJNZ $-4
 
                LD A,E
 
                CP L
 
                RET C                           ;КУРСОР ЛЕВЕЕ ОКНА
 
                LD A,L
 
                ADD A,(IX+3)
 
                DEC A
 
                CP E
 
                RET C                           ;КУРСОР ПРАВЕЕ ОКНА
 
                LD A,D
 
                INC H
 
                CP H
 
                RET C                           ;КУРСОР ВЫШЕ ОКНА ИЛИ НА ВЕРХНЕЙ ПОЛОСКЕ
 
                LD A,H
 
                ADD A,(IX+2)
 
                SUB 3
 
                CP D
 
                RET C                           ;КУРСОР НИЖЕ ОКНА ИЛИ НА ПОСЛЕДНЕЙ ПОЛОСКЕ
 
;КУРСОР В ПРЕДЕЛАХ РАБОЧЕЙ ОБЛАСТИ
 
                LD A,(IX+_NUM_KOL_H)
 
                AND A
 
                JR NZ,.L1               
 
                OR (IX+_NUM_KOL_L)
 
                JR Z,.L1
 
;ПРОВЕРКА ДЛЯ КОЛИЧЕСТВА ПУНКТОВ МЕНЬШЕ ВЫСОТЫ ОКНА - 2
 
                PUSH HL
 
                LD L,A
 
                LD H,(IX+_NUM_KOL_H)
 
                LD A,D
 
                SUB (IX+_Y_COORD)
 
                LD C,A
 
                LD B,0
 
                AND A
 
                SBC HL,BC
 
                POP HL
 
                RET C
 
 
 
.L1             LD A,D
 
                SUB H
 
                LD C,A
 
                LD L,(IX+8)
 
                LD H,(IX+9)
 
                BIT 7,(IX+7)
 
                JR Z,MOUOPT1
 
                LD B,0
 
                LD C,(HL)
 
                INC HL
 
                LD E,(HL)
 
                INC HL
 
                LD D,(HL)
 
                EX DE,HL
 
                SBC HL,BC
 
                LD C,A
 
                ADD HL,BC
 
                EX DE,HL
 
                LD (HL),D
 
                DEC HL
 
                LD (HL),E
 
                DEC HL
 
                LD (HL),A
 
                JP COLOR_CURSOR
 
 
 
MOUOPT1         LD B,0
 
                LD D,B
 
                LD E,(IX+7)
 
                SBC HL,DE
 
                ADD HL,BC
 
                LD (IX+7),C
 
                LD (IX+8),L
 
                LD (IX+9),H
 
                JP COLOR_CURSOR
 
 
 
DRAW_MOUSE      LD BC,(ARXY)
 
                LD L,B
 
                LD H,0
 
                ADD HL,HL
 
                LD DE,BUFTSC
 
                ADD HL,DE
 
                LD A,C
 
                RRCA
 
                RRCA
 
                RRCA
 
                AND 0X1F
 
                ADD A,(HL)
 
                INC HL
 
                LD H,(HL)
 
                LD L,A
 
                LD (ADR_REST),HL
 
                PUSH HL
 
                CALL SAVE2X2
 
                LD A,(_MORG)
 
                INC A
 
                LD HL,FLAGS
 
                CP 0X0C
 
                JR NZ,_MORG3
 
                LD A,M_CURSOR_NUM
 
                XOR (HL)
 
                LD (HL),A
 
                XOR A
 
_MORG3          LD (_MORG),A
 
                LD A,(ARXY)
 
                AND 7
 
                CPL
 
                ADD A,9
 
                LD C,A
 
                LD A,(FLAGS)
 
                AND M_CURSOR_NUM
 
                LD HL,SPRAR
 
                JR Z,_MORG2
 
                LD HL,SPRAR2
 
_MORG2          LD B,8
 
                POP DE
 
PRAR0           PUSH BC
 
                LD B,C
 
                LD C,(HL)
 
                INC HL
 
                PUSH HL
 
                LD L,(HL)
 
                EX DE,HL
 
                LD A,0XFF
 
                LD D,0
 
PRAR1           SCF
 
                RL C
 
                RLA
 
                SLA E
 
                RL D
 
                DJNZ PRAR1
 
                AND (HL)
 
                OR D
 
                LD (HL),A
 
                INC L
 
                LD A,(HL)
 
                AND C
 
                OR E
 
                LD (HL),A
 
                DEC L
 
                CALL INC_H
 
                EX DE,HL
 
                POP HL
 
                INC HL
 
                POP BC
 
                DJNZ PRAR0
 
                RET
 
 
 
;МЕСТОПОЛОЖЕНИЕ КУРСОРА
 
OPMSPL          LD E,(IX+0X10)
 
                LD D,(IX+0X11)
 
                LD A,D
 
                OR E
 
                RET Z                           ;АДРЕС ОПИСАТЕЛЕЙ НЕ ЗАДАН
 
                PUSH IX
 
                PUSH DE
 
                POP IX
 
                LD HL,(ARXY)                    ;H=Y, L=X
 
                SRL H
 
                SRL H
 
                SRL H
 
                SRL L
 
                SRL L
 
                SRL L                           ;HL=HL/8
 
NXTPOS2         LD A,(IX+0)
 
                INC A
 
                JR Z,ENDWI
 
                LD A,L
 
                CP (IX+1)
 
                JR C,NXTPOS1                    ;КУРСОР ЛЕВЕЕ
 
                LD A,(IX+1)
 
                ADD A,(IX+4)
 
                DEC A
 
                CP L
 
                JR C,NXTPOS1                    ;КУРСОР ПРАВЕЕ
 
                LD A,H
 
                CP (IX+2)
 
                JR C,NXTPOS1                    ;КУРСОР ВЫШЕ
 
                LD A,(IX+2)
 
                ADD A,(IX+3)
 
                DEC A
 
                CP H
 
                JR C,NXTPOS1                    ;КУРСОР НИЖЕ
 
                LD A,(IX+5)                     ;ПОЛУЧИЛИ КОД КНОПКИ  
 
ENDWI           POP IX                          ;ПОПАЛИ В ЗАДАННУЮ ЗОНУ
 
                RET                             ;ВЫХОДИМ
 
 
 
NXTPOS1         LD DE,6                         ;ПОКА НИКУДА НЕ ПОПАЛИ
 
                ADD IX,DE                       ;ПЕРЕХОДИМ К ПРОВЕРКЕ СЛЕДУЩЕГО
 
                JR NXTPOS2