; LAST UPDATE: 14.02.2025 savelij
; сохранение куска экрана
SAVE2X2 LD HL,SYSFLAGS
BIT SYSFLAGS.B_VIDEO_MODE,(HL)
RET NZ
LD HL,(ADR_REST)
LD DE,MOUSE_BUFF
LD B,8
.L1 LD A,(HL)
LD (DE),A
INC DE
INC L
LD A,(HL)
LD (DE),A
INC DE
DEC L
CALL INC_H
DJNZ .L1
RET
; восстановление куска экрана
REST2X2 LD HL,SYSFLAGS
BIT SYSFLAGS.B_VIDEO_MODE,(HL)
RET NZ
LD HL,(ADR_REST)
LD DE,MOUSE_BUFF
LD B,8
.L1 LD A,(DE)
LD (HL),A
INC DE
INC L
LD A,(DE)
LD (HL),A
INC DE
DEC L
CALL INC_H
DJNZ .L1
RET
DETECTMOUSE LD HL,SYSFLAGS
LD BC,0xFBDF
LD E,0x20
EI
HALT
IN D,(C) ; 1.стабильность X
.L1 IN A,(C)
CP D
JR NZ,.L2
DEC E
JR NZ,.L1 ; 2.keys<>X
DEC B
IN A,(C)
CP D
JR Z,.L2 ; 3.keys&7=7(LION17)
CPL
AND 7
SET SYSFLAGS.B_MOUSE_PRESENT,(HL)
RET Z
.L2 RES SYSFLAGS.B_MOUSE_PRESENT,(HL)
SCF
RET
MOUSE LD HL,SYSFLAGS
BIT SYSFLAGS.B_VIDEO_MODE,(HL)
RET NZ
LD HL,(ARXY)
LD DE,(MOUPOS) ; D=Y коодината, E=X координата
LD BC,MOUSE_X
IN A,(C) ; чтение координаты X
LD (MOUPOS),A
SUB E
JR Z,MOUNX
JP P,MOUPX
ADD A,L
JR C,.L1
XOR A
.L1 LD L,A
JR MOUNX
MOUPX ADD A,L
JR C,.L1
CP 0xF9
JR C,.L2
.L1 LD A,0xF9
.L2 LD L,A
MOUNX LD BC,MOUSE_Y
IN A,(C) ; чтение координаты Y
LD (MOUPOS+1),A
SUB D
JR Z,MOUNY
NEG
JP P,MOUPY
ADD A,H
JR C,.L1
XOR A
.L1 LD H,A
JR MOUNY
MOUPY ADD A,H
JR C,.L1
CP 0xB8
JR C,.L2
.L1 LD A,0xB8
.L2 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
.L2 SRL D
SRL E
DJNZ .L2
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)
BIT B_ADR_PUNKT,(IX+_NUM_PKT)
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+_NUM_PKT)
SBC HL,DE
ADD HL,BC
LD (IX+_NUM_PKT),C
LD (IX+_TEK_PKT_L),L
LD (IX+_TEK_PKT_H),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,SYSFLAGS
CP 0x0C
JR NZ,_MORG3
LD A,SYSFLAGS.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,(SYSFLAGS)
AND SYSFLAGS.M_CURSOR_NUM
LD HL,SPRAR
JR Z,_MORG2
LD HL,SPRAR2
_MORG2 LD B,8
POP DE
.L2 PUSH BC
LD B,C
LD C,(HL)
INC HL
PUSH HL
LD L,(HL)
EX DE,HL
LD A,0xFF
LD D,0
.L1 SCF
RL C
RLA
SLA E
RL D
DJNZ .L1
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 .L2
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