Page 1 of 1

Помогите разобраться с мышкой и клавиатурой.

Posted: Sun Jul 25, 2010 5:43 pm
by Egor
Недавно наткнулся на эту замечательную ОСь , и вот решил слегка подучить ассемблер. Как не странно с первого раза удалось откампилит и запустить её на VirtualBox , Написал пару простейших программок и столкнулся вот с какими вопросами :
1) Есть ли возможность отловить событие скролла (и реализована ли акселерация)?
2) Возможно ли получить в конкретный момент времени состояния клавиш на клавиатуре ( по документации можно взять их из очереди , но мне необходимо именно несколько зажатых и плюс к тому повторение клавиши начинается после некоторой паузы)
3) и если не сложно обьясните в 3-х словах что такое стэк потока и есть ли какой нить механизм синхронизации

Зарание Спасибо !!!

Re: Помогите разобраться с мышкой и клавиатурой.

Posted: Sun Jul 25, 2010 6:28 pm
by Mario
1.1 Есть библиотека Box_lib, если речь идет о отрисовке графического компонента.
1.2 Есть функция 37.6, если речь идет о получении данных прокрутки.

2. Если речь идет о применении CTRL, SHIFT, ALT, то можно просто сохранять значения полученные функцией 2 как флаги нажатости. Кроме того есть функция 66, для работы с горячими комбинациями клавиш.

3. Функция 51. Стек потока - область выделенная для хранения данных, подобно обычному стеку. Потоки могут работать в одном адресном пространстве, но данные должны хранить отдельно. Синхронизацию придется делать вручную, создавая и поверяя флаги и мьютексы при использовании общих хранилищ данных.

Re: Помогите разобраться с мышкой и клавиатурой.

Posted: Sun Jul 25, 2010 9:02 pm
by Egor
Спасибо за ответ... со скролом я уже разобрался , но вот с клавиатурой мне нужно нечто другое ,нежели горячая комбинация . Вот например я собираюсь написать некое подобие танчиков и там необходимо отлавливать одновременное нажатие стрелочки вправо и вверх - например , так вот есть ли какие нибуть средства для получения "карты" клавиатуры в любой момент времени . Также я заметил что в стандартной игрушке "тенес" , первый раз зажатая клавиша дублируется только через небольшой промежуток времени . Может есть какой нибуть другой способ прочтения клавиши ... например сразу из порта (в DOS я помню 21 порт отзывался на клавиатуру .... будет ли тут это работать)

Re: Помогите разобраться с мышкой и клавиатурой.

Posted: Sun Jul 25, 2010 10:46 pm
by Albom
в КОС можно получать сканкоды клавиш, то есть различать нажатие и отпускание клавиши. в своих программах (например, e80) я делал так: если клавиша нажата, присваиваем определённой переменной значение, соответствующее нажатой клавиши. в процессе игры работаем с этой переменной. если сканкод означает отпускание этой же клавиши, меняем значение переменной. надеюсь, не слишком запутано...

Re: Помогите разобраться с мышкой и клавиатурой.

Posted: Mon Jul 26, 2010 9:02 am
by Mario
Egor
Воспользуйся функцией 66, а затем все той-же функцией 02.
Данные в любом случае поступают последовательно с клавиатуры. Чтобы узнать сканкод требуемой клавиши, можно воспользоваться приложением scancode.

Re: Помогите разобраться с мышкой и клавиатурой.

Posted: Tue Jul 27, 2010 10:50 pm
by Asper
Egor wrote:так вот есть ли какие нибуть средства для получения "карты" клавиатуры в любой момент времени .
"Карта" клавиатуры во всех известных мне системах реализуется в виде массива, который
хранит нули и единицы в соответствии с состояниям клавиш. Получил сканкод нажатой клавиши - пиши в сответствующую позицию 1, и наоборот, получил сканкод отпущенной клавиши - пиши в сответствующую позицию 0.
Код на языке C из fceu для Колибри.

Code: Select all

char *KeyboardGetstate(void) // +
{
	int	j=0;
	
	j=__menuet__getkey();
	if (j==0) return keybuf;
	if (j==224) j=__menuet__getkey();
	switch(j)
	{			
		//Arrow key pressed
		case 72:  keybuf[200]=1;  break;   // Up
		case 80:  keybuf[208]=1;  break;   // Down
		case 75:  keybuf[203]=1;  break;   // Left
		case 77:  keybuf[205]=1;  break;   // Right
		//Arrow key unpressed	
		case 200:  keybuf[200]=0;  break;   // Up
		case 208:  keybuf[208]=0;  break;   // Down
		case 203:  keybuf[203]=0;  break;   // Left
		case 205:  keybuf[205]=0;  break;   // Right
		//F2 pressed
		case 60:  SetWinSize();  break;
		//F3 pressed
		case 61:  LoadNESFile();  break;
		default:
			if (j>0x7F) keybuf[j&0x7F] = 0;
			else keybuf[j]=1;
		break;
	}
	return keybuf;
}
На ассемблере:

Code: Select all

;...

; The code area
        include 'macros.inc'
  
START:                                  ; Точка входа в программу
        call    draw_window
        mcall   66, 1                    ;  установить режим ввода сканкодов с клавиатуры.

still:
        mov     eax, 10
        mcall
        cmp     eax, 1
        je      red 
        cmp     eax, 2
        je      key 
        cmp     eax, 3
        je      button
  
        jmp     still
   
;...   
   
  key:                                  ; Обратка события от клавиатуры (нажатия или отпускания клавиши).
        mcall                            ; Сканкод клавиши возвращается в  ah.                          
        call     update_keymap
        jmp      still

;....

;Вход: ah = скан код клавиши
update_keymap:
        push     edi       ; Лучше сохранять регистры на входе в процедуру...
        xor      al, al
        test     ah, 0x80  ; Проверяем старший бит в регистре ah, 
        jnz      @f          ; если установлен - то клавиша отпущена,
        inc      al            ; если  сброшен - то клавиша нажата
  @@:
        movzx    edi, ah
        mov      [keymap+edi], al ; Обновляем "карту" клавиатуры
        pop      edi       ; ... и восстанавливать на выходе. Это убережёт от некоторых ошибок.
ret

;...

keymap rb 256 dup (0)