Код:
;***KEMPMOUSE**
; #FADF - состояние кнопок мышки:
; bit 0 - левая кнопка,
; bit 1 - правая кнопка,
; bit 2 - средняя кнопка.
; #FBDF - X-координата мышки
; #FFDF - Y-координата мышки
; Восстановление координат
MXY LD A,#FB ; Прочитать состоянии X-координаты
IN A,(#DF) ; мышки и
LD (MOUSE_X+1),A ; занести его в метку MOUSE_X
LD A,#FF ; Прочитать состоянии Y-координаты
IN A,(#DF) ; мышки и
LD (MOUSE_Y+1),A ; занести его в метку MOUSE_Y
RET
; Проверка состояния кнопок мышки
FIRE LD A,#FA;DF ; Чтение байта состояния кнопок
IN A,(#DF)
RRA ; Проверка нажатия левой кнопки
JP NC,L_BUT ; Если нажата, то прейти на метку L_BUT
RRA ; Проверка нажатия правой кнопки
JP NC,R_BUT ; Если нажата, то прейти на метку R_BUT
RET ; Кнопки не были нажаты (третья кнопка
; не используется)
L_BUT ld a,(NAJALIKN) ; нажата левая кнопка мыши
or 16
ld (NAJALIKN),a
RET
R_BUT ld a,(NAJALIKN) ; нажата правая кнопка мыши
or 32
ld (NAJALIKN),a
RET
; Движение мышки. X=0..255, Y=0..191
MOVE LD A,#FB
IN A,(#DF) ; Читаем состояние X-координаты мышки
MOUSE_X LD E,0 ; В регистре E предыдущая X-координата
LD (MOUSE_X+1),A ; Сохраняем новую координату
SUB E ; Проверяем изменилась ли X-координата
CALL NZ,MOVE_X ; Если да, то вызываем подпрог. MOVE_X
LD A,#FF
IN A,(#DF) ; Читаем состояние Y-координаты мышки
MOUSE_Y LD E,0 ; В регистре E предыдущая Y-координата
LD (MOUSE_Y+1),A ; Сохраняем новую координату
SUB E ; Проверяем изменилась ли Y-координата
CALL NZ,MOVE_Y ; Если да, то вызываем подпрог. MOVE_Y
RET
MOVE_Y JP M,MOUSE_D ; Если флаг S = 1, значит мышку дви-
; гали вниз, иначе вверх
MOUSE_U ;ADD A,A ; Увеличиваем смешение в два раза
LD D,A ; Сохраняем его в рег. D
LD A,(OLDHL) ; Берем текущую Y-координату курсора
SUB D ; Уменьшаем ее
JR NC,$+3 ; Если результат оказался меньше 0,
XOR A ; то обнулить Y-координату
LD (OLDHL),A ; Заносим новую Y-координату курсора
RET
MOUSE_D NEG ; Приводим смешение в нормальный вид
;ADD A,A ; Увеличиваем смешение в два раза
LD D,A ; Сохраняем его в рег. D
LD A,(OLDHL) ; Берем текущую Y-координату курсора
ADD A,D ; Увеличиваем ее
JR C,MM_2 ; Если результат оказался больше 255,
CP 192 ; или больше 191, то
JR C,$+4
MM_2 LD A,191 ; меняем его на 191
LD (OLDHL),A ; Заносим новую Y-координату курсора
RET
MOUSE_L NEG ; Приводим смешение в нормальный вид
;ADD A,A ; Увеличиваем смешение в два раза
LD D,A ; Сохраняем его в рег. D
LD A,(OLDHL+1) ; Берем текущую X-координату курсора
SUB D ; Уменьшаем ее
JR NC,$+3 ; Если результат оказался меньше 0,
XOR A ; то обнулить X-координату
LD (OLDHL+1),A ; Заносим новую X-координату курсора
RET
MOVE_X JP M,MOUSE_L ; Если флаг S = 1, значит мышку дви-
; гали влево, иначе вправо
MOUSE_R ;ADD A,A ; Увеличиваем смешение в два раза
LD D,A ; Сохраняем его в рег. D
LD A,(OLDHL+1) ; Берем текущую X-координату курсора
ADD A,D ; Увеличиваем ее
JR NC,$+4 ; Если результат оказался больше 255,
LD A,255 ; то меняем его на 255
LD (OLDHL+1),A ; Заносим новую X-координату курсора
RET
NAJALIKN defb 0
YMOUSE defb 90 ;Y
XMOUSE defb 120 ;X
MXY вызываю один раз в самом начале инициализации всей графической библиотеки, чтобы засинхронить координаты в коде и координаты в ячейках памяти. Больше не вызываю никогда.
Код:
KEMPMOUSE LD A,#90 ; Хитрожопые
OUT (#7F),A ; манипуляции
OUT (#5F),A ; для Питерских компов
LD BC,#FADF
IN A,(C) ; Считываем в A состояние порта #FADF
PUSH AF ; и сохраняем его на стеке
AND #F8 ; Проверка старших пяти битов на 1
CP #F8
CALL NZ,NOTMOUS ; Вызов подпрограммы отключения мышки
INC B
IN L,(C) ; Считываем в L состояние порта #FBDF
LD B,#FF
IN H,(C) ; Считываем в H состояние порта #FFDF
POP AF ; Восстанавливаем регистр A
CP L ; Проверка на совпадение значений
JR NZ,$+6 ; Если байты разные, то на YESMOUSE
CP H ; Если одинаковые, то проверям дальше
CALL Z,NOTMOUS ; Если опять сопали, то на откл. мышки
CALL MXY ; чтобы курсор не прыгал в неизвестном направлении
YESMOUS ; мышка обнаружена
CALL MOVE
CALL FIRE
JP QUIT
NOTMOUS ; мышка не подключена
JP QUIT
QUIT
;JP YESMOUS
RET
Что скажут гуру глубокого копания? Если заметите крамольное место - сообщите, почему бажит и как исправить. Повторяю, в чистом виде - всё прекрасно работает и не глючит. Как только привинтил на "Героев" - наблюдаю в Spin считывание мусора - мышка дрыгается самопроизвольно. В Unreal всё норм. Хотелось бы выяснить причину и купировать проблему.