User Tag List

Показано с 1 по 10 из 34

Тема: HeroesII - под классический 128+TR-Dos

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #23

    Регистрация
    20.01.2021
    Адрес
    г. Санкт-Петербург
    Сообщений
    804
    Спасибо Благодарностей отдано 
    33
    Спасибо Благодарностей получено 
    298
    Поблагодарили
    92 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    Exclamation

    Да всё там нормально с курсором. Тупо по быстрому собрал демо из мусора Убрать этот глюк - на изичах, но нафиг не сдалось. Гыгы.

    Кстати, подумалось тут, раз переходим к конкретике, нужно привести код мыши. Я использую такую процедуру:

    Код:
    ;***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 вызываю один раз в самом начале инициализации всей графической библиотеки, чтобы засинхронить координаты в коде и координаты в ячейках памяти. Больше не вызываю никогда.

    В прерываниях вызываю
    CALL MOVE ;читаем перемещения мышки из порта
    CALL FIRE ;читаем нажатия мыши


    Инициализацию мыши в таком виде НЕ ИСПОЛЬЗУЮ НИКОГДА:

    Код:
    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 всё норм. Хотелось бы выяснить причину и купировать проблему.

    Может я чёто не так делаю? Например может надо так в прерывании делать?

    CALL MXY
    CALL MOVE ;читаем перемещения мышки из порта
    CALL FIRE ;читаем нажатия мыши

    или ещё какой-нибудь фокус. Может в порт в начале прерывания нуль запихивать? Я не совсем знаток, как порт функционирует. Откуда грязь появляется там, где быть не должно? Может зря я инициализацию выкинул? Может там какая настройка важная есть на этот счёт?...

    Этот пользователь поблагодарил DragonsLord за это полезное сообщение:

    nimdasys_inbox_ru(29.04.2021)

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. WarCraft 1 - под классический 128+TR-Dos
    от DragonsLord в разделе Игры
    Ответов: 984
    Последнее: 17.07.2024, 19:28
  2. Ответов: 70
    Последнее: 20.03.2022, 07:59
  3. Elite - под классический 128+TR-Dos
    от DragonsLord в разделе Игры
    Ответов: 285
    Последнее: 12.03.2022, 00:38
  4. Ответов: 2
    Последнее: 13.04.2021, 15:36
  5. Ответов: 1
    Последнее: 25.07.2018, 19:52

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •