Orion-PRO/Sources/BIOS/mou.asm
2021-11-11 12:50:05 +03:00

382 lines
12 KiB
NASM
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; =========================================
;
; Модуль управления мышью для 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
; ===================
; Конец драйвера мыши
; ===================