Board.KolibriOS.org

Official KolibriOS board
It is currently Sat Sep 19, 2020 6:42 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 6 posts ] 
Author Message
PostPosted: Sun Jul 25, 2010 5:43 pm 
Offline

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

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


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

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

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


Top
   
PostPosted: Sun Jul 25, 2010 9:02 pm 
Offline

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


Top
   
PostPosted: Sun Jul 25, 2010 10:46 pm 
Offline
Mentor
User avatar

Joined: Tue Jan 15, 2008 11:27 am
Posts: 756
в КОС можно получать сканкоды клавиш, то есть различать нажатие и отпускание клавиши. в своих программах (например, e80) я делал так: если клавиша нажата, присваиваем определённой переменной значение, соответствующее нажатой клавиши. в процессе игры работаем с этой переменной. если сканкод означает отпускание этой же клавиши, меняем значение переменной. надеюсь, не слишком запутано...


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


Top
   
PostPosted: Tue Jul 27, 2010 10:50 pm 
Offline
User avatar

Joined: Fri Jun 27, 2008 3:22 pm
Posts: 988
Egor wrote:
так вот есть ли какие нибуть средства для получения "карты" клавиатуры в любой момент времени .


"Карта" клавиатуры во всех известных мне системах реализуется в виде массива, который
хранит нули и единицы в соответствии с состояниям клавиш. Получил сканкод нажатой клавиши - пиши в сответствующую позицию 1, и наоборот, получил сканкод отпущенной клавиши - пиши в сответствующую позицию 0.
Код на языке C из fceu для Колибри.
Code:
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:
;...

; 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)


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 6 posts ] 

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited