mirror of
https://github.com/romychs/Orion-PRO.git
synced 2025-11-09 20:35:59 +03:00
382 lines
12 KiB
NASM
382 lines
12 KiB
NASM
; =========================================
|
||
;
|
||
; Модуль управления мышью для Orion-PRO
|
||
;
|
||
; MOU01.AS 14.02.96
|
||
; MOU02.AS 17.04.96
|
||
; MOU.AS 25.04.97
|
||
;
|
||
; =========================================
|
||
|
||
MSCTL LD A,IXL ; DB 0DDh, LD A,L
|
||
OR A
|
||
JP NZ,MSC1
|
||
|
||
; ---------------------------------------------
|
||
; Промежуточная функция перемещения курсора в окне
|
||
; Вход:
|
||
; (MSX) - координата X мыши
|
||
; (MSY) - координата Y мыши
|
||
; (MSMODE) - режим отображения мыши
|
||
; (MSPADR) - адрес шаблона мыши в сегменте
|
||
; (MSPSEG) - сегмент шаблона мыши
|
||
; (MSPH) - высота шаблона мыши
|
||
; (MSPL) - ширина шаблона мыши
|
||
; (MSPD) - смещение шаблона мыши в пределах байта
|
||
; (MSSTY) - шаг мыши по Y
|
||
; (MSSTX) - шаг мыши по X
|
||
; (MSBSEG) - 4 номера сегментов буфера сохранения
|
||
; (MSBADR) - адрес буфера сохранения в сегментах
|
||
; Выход:
|
||
; "CY" - указатель вне окна или переполнение буфера сохранения области экрана
|
||
; иначе:
|
||
; A - код нажатой кнопки:
|
||
; 80H - левая кнопка
|
||
; 40H - правая кнопка
|
||
; (MSX) - координата X мыши
|
||
; (MSY) - координата Y мыши
|
||
; Особенности: используются временные двухбайтовые ячейки (DMX),(DMY),(NDMX),(NDMY),(MSJ1)..(MSJ8)
|
||
;
|
||
INMS CALL INM0 ; Переустановить параметры курсора
|
||
|
||
; Вычисление шагов приращения координат
|
||
LD HL,(MSSTY)
|
||
PUSH HL
|
||
LD H,0 ; HL - шаг по Y
|
||
LD (DMY),HL
|
||
LD A,L
|
||
DEC H
|
||
NEG
|
||
LD L,A
|
||
LD (NDMY),HL
|
||
POP HL
|
||
LD L,H
|
||
LD H,0 ; HL - шаг по X
|
||
LD (DMX),HL
|
||
LD A,L
|
||
DEC H
|
||
NEG
|
||
LD L,A
|
||
LD (NDMX),HL
|
||
|
||
; Отображение указателя мыши
|
||
LD BC,(MSY)
|
||
LD DE,(MSX)
|
||
LD A,NCURON
|
||
CALL TVOUT
|
||
JR NC,INM1
|
||
LD A,NCUROF
|
||
CALL TVOUT
|
||
SCF
|
||
JR INM7
|
||
|
||
; Ожидание отпускания кнопки мыши
|
||
INM1 CALL MOUSE
|
||
BIT 4,A ; ЛКМ
|
||
JR Z,INM1
|
||
BIT 5,A ; ПКМ
|
||
JR Z,INM1
|
||
|
||
; Ожидание отпускания клавиш клавиатуры
|
||
INM01 CALL STTS
|
||
JR NZ,INM01
|
||
|
||
; Лвижение мыши до нажатия любой кнопки
|
||
INM2 CALL MSINK ; MOUSE + INKEY
|
||
JR NC,INM2
|
||
|
||
LD (MSY),BC
|
||
LD (MSX),DE ; Сохранение текущих X,Y
|
||
LD L,A
|
||
LD A,NCUROF
|
||
CALL TVOUT ; Погасить мышь
|
||
LD A,L
|
||
AND 0x30
|
||
CP 0x30 ; Нажаты кнопки?
|
||
JR NZ,INM4 ; Да
|
||
LD A,L
|
||
BIT 0x0,A
|
||
CALL Z,MLEFT
|
||
BIT 0x1,A
|
||
CALL Z,MRIGHT
|
||
BIT 0x2,A
|
||
CALL Z,MDOWN
|
||
BIT 0x3,A
|
||
CALL Z,MUP
|
||
LD A,NCURON
|
||
CALL TVOUT ; Отобразить мышь
|
||
JR NC,INM2 ; Норма. В окне
|
||
; Выход за пределы окна
|
||
LD BC,(MSY)
|
||
LD DE,(MSX) ; Прежние координаты
|
||
LD A,NCURON ; Отображение мыши на старом месте
|
||
CALL TVOUT
|
||
JR INM2
|
||
|
||
INM4 XOR A
|
||
BIT 4,L
|
||
JR NZ,INM5
|
||
SET 7,A
|
||
INM5 BIT 5,L
|
||
JR NZ,INM6
|
||
SET 6,A
|
||
INM6 OR A
|
||
|
||
; Восстановление параметров курсора
|
||
INM7 PUSH AF
|
||
LD BC,(MSJ6)
|
||
LD DE,(MSJ7)
|
||
LD HL,(MSJ8)
|
||
LD A,NCURBS ; адрес буфера
|
||
CALL TVOUT
|
||
LD BC,(OPER2)
|
||
LD HL,(MSJ5)
|
||
LD A,NCURPS ; адрес шаблона
|
||
CALL TVOUT
|
||
LD BC,(MSJ1)
|
||
LD DE,(MSJ2)
|
||
LD HL,(OPER1)
|
||
LD A,NCURSS ; размеры
|
||
CALL TVOUT
|
||
LD C,H
|
||
LD A,NCURMS ; режим курсора
|
||
CALL TVOUT
|
||
POP AF
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Мышь влево
|
||
; ----------------------------------------------
|
||
MLEFT LD HL,(NDMX)
|
||
ADD HL,DE
|
||
EX DE,HL
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Мышь вправо
|
||
; ----------------------------------------------
|
||
MRIGHT LD HL,(DMX)
|
||
ADD HL,DE
|
||
EX DE,HL
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Мышь вниз
|
||
; ----------------------------------------------
|
||
MDOWN LD HL,(DMY)
|
||
ADD HL,BC
|
||
LD B,H
|
||
LD C,L
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Мышь вверх
|
||
; ----------------------------------------------
|
||
MUP LD HL,(NDMY)
|
||
ADD HL,BC
|
||
LD B,H
|
||
LD C,L
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Процедура опроса мыши и клавиатуры
|
||
; Выход:
|
||
; "CY" - нажата кнопка или перемещение мыши
|
||
; A - код мыши
|
||
; ----------------------------------------------
|
||
MSINK CALL MOUSE ; Опрос мыши
|
||
AND 0x3F
|
||
CP 0x3F
|
||
SCF
|
||
RET NZ ; Мышь сработала
|
||
LD HL,0x200 ; Пауза
|
||
MSINK0 DEC HL
|
||
LD A,H
|
||
OR L
|
||
JR NZ,MSINK0
|
||
CALL INFST ; Опрос клавиш курсора
|
||
AND 0xF0
|
||
JR NZ,MSINK1
|
||
|
||
; Клавиши курсора не нажаты, значит ВК или АР2
|
||
CALL INKEY
|
||
LD L,0x1F
|
||
CP 0x0D ; ВК?
|
||
JR Z,MSINK5
|
||
LD L,0x2F
|
||
CP 0x1B ; AP2?
|
||
JR Z,MSINK5
|
||
XOR A
|
||
RET
|
||
|
||
MSINK1 LD L,0x3F
|
||
BIT 4,A ; Влево?
|
||
JR Z,MSINK2
|
||
RES 0,L
|
||
|
||
MSINK2 BIT 5,A ; Вверх?
|
||
JR Z,MSINK3
|
||
RES 3,L
|
||
MSINK3 BIT 6,A ; Вправо?
|
||
JR Z,MSINK4
|
||
RES 1,L
|
||
MSINK4 BIT 7,A ; Вниз?
|
||
JR Z,MSINK5
|
||
RES 2,L
|
||
MSINK5 LD A,L
|
||
SCF
|
||
RET
|
||
|
||
; ----------------------------------------------
|
||
; Переустановка параметров курсора
|
||
; ----------------------------------------------
|
||
INM0 LD A,NCURMR
|
||
CALL TVOUT ; Режим курсора
|
||
|
||
LD H,C
|
||
LD A,NCURSR
|
||
CALL TVOUT ; Размеры курсора
|
||
|
||
LD (MSJ1),BC
|
||
LD (MSJ2),DE
|
||
LD (OPER1),HL
|
||
LD A,NCURPR
|
||
CALL TVOUT ; Адрес шаблона
|
||
|
||
LD (OPER2),BC
|
||
LD (MSJ5),HL
|
||
LD A,NCURBR ; Адрес буфера сохр. инф. под курсором
|
||
CALL TVOUT
|
||
|
||
LD (MSJ6),BC
|
||
LD (MSJ7),DE
|
||
LD (MSJ8),HL
|
||
|
||
; Установка параметров стрелки мыши
|
||
CALL GETMMD
|
||
LD A,NCURMS
|
||
CALL TVOUT ; Установка размера мыши
|
||
|
||
CALL GETMSZ
|
||
LD BC,0
|
||
LD A,NCURSS
|
||
CALL TVOUT ; Размер шаблона мыши
|
||
|
||
CALL GETMPA
|
||
LD A,NCURPS
|
||
CALL TVOUT ; Адрес шаблона
|
||
|
||
CALL GETMBA
|
||
LD A,NCURBS
|
||
JP TVOUT ; Буфер для сохранения
|
||
|
||
MSC1 DEC A
|
||
JR NZ,MSC2
|
||
|
||
; ----------------------------------------------
|
||
; Установка режима вывода мыши
|
||
; ----------------------------------------------
|
||
SETMMD LD A,C
|
||
LD (MSMODE),A
|
||
RET
|
||
|
||
MSC2 DEC A
|
||
JR NZ,MSC3
|
||
|
||
; ----------------------------------------------
|
||
; Получение режима вывода мыши
|
||
; ----------------------------------------------
|
||
GETMMD LD A,(MSMODE)
|
||
LD C,A
|
||
RET
|
||
|
||
MSC3 DEC A
|
||
JR NZ,MSC4
|
||
|
||
; ----------------------------------------------
|
||
; Установка размеров указателя мыши
|
||
; ----------------------------------------------
|
||
SETMSZ LD (MSPH),DE
|
||
LD (MSSTY),BC
|
||
LD A,L
|
||
LD (MSPD),A
|
||
RET
|
||
|
||
MSC4 DEC A
|
||
JR NZ,MSC5
|
||
|
||
; ----------------------------------------------
|
||
; Получение размеров указателя мыши
|
||
; ----------------------------------------------
|
||
GETMSZ LD DE,(MSPH)
|
||
LD BC,(MSSTY)
|
||
LD A,(MSPD)
|
||
LD L,A
|
||
RET
|
||
|
||
MSC5 DEC A
|
||
JR NZ,MSC6
|
||
|
||
; ----------------------------------------------
|
||
; Установка адреса шаблона мыши
|
||
; ----------------------------------------------
|
||
SETMPA LD (MSPADR),HL
|
||
LD A,C
|
||
LD (MSPSEG),A
|
||
RET
|
||
|
||
MSC6 DEC A
|
||
JR NZ,MSC7
|
||
|
||
; ----------------------------------------------
|
||
; Получение адреса шаблона мыши
|
||
; ----------------------------------------------
|
||
GETMPA LD HL,(MSPADR)
|
||
LD A,(MSPSEG)
|
||
LD C,A
|
||
RET
|
||
|
||
MSC7 DEC A
|
||
JR NZ,MSC8
|
||
|
||
; ----------------------------------------------
|
||
; Установка адреса буфера сохранения для мыши
|
||
; ----------------------------------------------
|
||
SETMBA LD (MSBADR),HL
|
||
LD (MSBSEG),BC
|
||
LD (MSBSEG+2),DE
|
||
RET
|
||
|
||
MSC8 DEC A
|
||
JR NZ,MSC9
|
||
|
||
; ----------------------------------------------
|
||
; Получение адреса буфера сохранения для мыши
|
||
; ----------------------------------------------
|
||
GETMBA LD HL,(MSBADR)
|
||
LD BC,(MSBSEG)
|
||
LD DE,(MSBSEG+2)
|
||
RET
|
||
|
||
MSC9 DEC A
|
||
RET NZ
|
||
|
||
; ----------------------------------------------
|
||
; Определение длины буфера для сохранения
|
||
; ----------------------------------------------
|
||
GETMLN PUSH BC
|
||
PUSH HL
|
||
CALL INM0
|
||
LD A,NCURLN
|
||
CALL TVOUT
|
||
PUSH DE
|
||
CALL INM7
|
||
POP DE
|
||
POP HL
|
||
POP BC
|
||
RET
|
||
|
||
; ===================
|
||
; Конец драйвера мыши
|
||
; ===================
|