;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