;LAST UPDATE: 03.05.2019 savelij
;[СОХРАНЕНИЕ КУСКА ЭКРАНА]
SAVE2X2 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,0
ADR_REST EQU $-2
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,ERS_FLAGS
LD BC,MOUSE_X
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
LD B,HIGH (MOUSE_KEYS);DEC B
IN A,(C)
CP D
JR Z,SETMOU2 ;3.KEYS&7=7(LION17)
CPL
AND 7
SET B_MOUSE_ON,(HL)
RET Z
SETMOU2 RES B_MOUSE_ON,(HL)
SCF
RET
;[ОПРОС ПЕРЕМЕЩЕНИЯ МЫШИ]
MOUSE LD HL,(ARXY)
LD DE,0 ;D=Y КООДИНАТА, E=X КООРДИНАТА
MOUPOS EQU $-2
LD BC,MOUSE_X
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,MOUSE_Y ;ЧТЕНИЕ КООРДИНАТЫ 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+_Y_COORD)
LD L,(IX+_X_COORD)
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+_H_SIZE)
DEC A
CP E
RET C ;КУРСОР ПРАВЕЕ ОКНА
LD A,D
INC H
CP H
RET C ;КУРСОР ВЫШЕ ОКНА ИЛИ НА ВЕРХНЕЙ ПОЛОСКЕ
LD A,H
ADD A,(IX+_V_SIZE)
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+_TEK_PKT_L)
LD H,(IX+_TEK_PKT_H)
LD B,0
LD D,B
LD E,(IX+_NUM_PKT)
SBC HL,DE
ADD HL,BC
LD (IX+_TEK_PKT_L),L
LD (IX+_TEK_PKT_H),H
LD (IX+_NUM_PKT),C
JP COLOR_CURSOR
;[РИСОВАНИЕ КУРСОРА МЫШИ]
DRAW_MOUSE LD BC,0
ARXY EQU $-2
LD A,B
CALL 8881
LD (REST2X2+1),HL
PUSH HL
CALL SAVE2X2
LD A,6
_MORG EQU $-1
INC A
LD HL,ERS_FLAGS
CP 0X0C
JR NZ,_MORG3
LD A,M_NUM_CURSOR
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,(ERS_FLAGS)
AND M_NUM_CURSOR
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+_ADR_MOUSE_L)
LD D,(IX+_ADR_MOUSE_H)
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