Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2011, 12:38   #1
Demonhunterus
Пользователь
 
Регистрация: 16.10.2010
Сообщений: 11
По умолчанию Средства Поддержки Клавиатуры(Assembler)

Добрый день.Столкнулся с такой задачей: разработать программу,которая,используя функции прерывания INT 16h,позволит считать скан-код,ASCII-код и состояние клавиш сдвига.
С задачей считывания скан и ASCII кода справился таким образом

Код:
#include<conio.h>
#include<stdio.h>
int main()
{
  char SCAN,ASCII;
  clrscr();
asm {
	  mov AH,0;
	  int 0x16;
	  mov SCAN,AH;
	  mov ASCII,AL;
	  	  }
printf("Scan code %d\n",SCAN);
printf("ASCII code %d\n",ASCII);
getch();
return 0;
}
А вот с клавишами сдвига у меня возникли проблемы.
Попытался сделать это таким образом,но у меня ничего не получилось:
Код:
#include<conio.h>
#include<stdio.h>
int main()
{
  clrscr();
  char SCAN,ASCII,KEY_FLAG_1,KEY_FLAG_2;
asm {
	  mov AH,0;
	  int 0x16;
	  mov SCAN,AH;
	  mov ASCII,AL;
	  mov AH,0x12;
	  int 0x16;
	  mov KEY_FLAG_1,AH;
	  mov KEY_FLAG_2,AL;
	  }
printf("Scan code %d\n",SCAN);
printf("ASCII code %d\n",ASCII);
printf("Key Flag 1 %d\n",KEY_FLAG_1);
printf("Key Flag 2 %d\n",KEY_FLAG_2);
getch();
return 0;
}
Знаю,что AH =
0 - левый CTRL нажат
1 - левый ALT нажат
2 - правый CTRL нажат
3 - правый ALT нажат
4 - scroll-lock нажат
5 - num-lock нажат
6 - caps-lock нажат
7 - system request нажат

AL =
0 - правый Shift нажат
1 - левый Shift нажат
2 - CTRL нажат
3 - ALT отжат
4 - scroll-lock влючен
5 - num-lock включен
6 - caps-lock включен
7 - insert включен
Отсюда вопрос: как получить правильное значение флага клавиатуры?Спасибо.
Demonhunterus вне форума Ответить с цитированием
Старый 17.09.2011, 12:43   #2
Demonhunterus
Пользователь
 
Регистрация: 16.10.2010
Сообщений: 11
По умолчанию

Догадываюсь,что не зря мне говорили,что флаги AH расположены в BIOS Data Area по адресу 40:18,а AL по адресу 40:17,только вот как считать оттуда какой флаг в данный момент туда занесен и определить,какая клавиша нажата я пока не могу разобраться.
Demonhunterus вне форума Ответить с цитированием
Старый 17.09.2011, 13:41   #3
Demonhunterus
Пользователь
 
Регистрация: 16.10.2010
Сообщений: 11
По умолчанию

Подозреваю,что нужно использовать битовую маску для определение того,какой бит сейчас = 1,скажем 11111111 & 00000010 = 00000010 - т,е. левый альт нажат (AH),но только вот как маску применить к значению,хранящемуся по вот этому адресу 40:18?
Demonhunterus вне форума Ответить с цитированием
Старый 17.09.2011, 21:45   #4
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Есть две команды для проверки определенных бит (Логического И): AND и TEST. Первая изменяет и результат и флаги, вторая - только флаги.
Код:
;допустим в al значение из 40:18
test al,00000010b
jnz левый Shift нажат (al не изменился и его можно повторно проверять)
test al,00000100b
jnz CTRL нажат
...
А после команды and в первом случае в al останется либо 00000010 либо 00000000
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 17.09.2011, 22:14   #5
Demonhunterus
Пользователь
 
Регистрация: 16.10.2010
Сообщений: 11
По умолчанию

Спасибо,разобрался!
Demonhunterus вне форума Ответить с цитированием
Старый 24.09.2011, 10:38   #6
Demonhunterus
Пользователь
 
Регистрация: 16.10.2010
Сообщений: 11
По умолчанию

Снова нужна помощь.Пытаюсь отследить нажатие комбинации клавиш Shift+Alt+F7
Код:
#include<conio.h>
#include<stdio.h>
int main()
{ int i=0; int shift=0; int alt=0;
  unsigned char mask=1;
  unsigned char SCAN,ASCII,KEY_FLAG_1,KEY_FLAG_2;
  clrscr();

asm {
	  mov AH,0;
	  int 0x16;
	  mov SCAN,AH;
	  mov ASCII,AL;
     }

printf("Scan code %d\n",SCAN);
printf("ASCII code %d\n",ASCII);

asm {
	  mov AH,0x12;
	  int 0x16;
	  mov KEY_FLAG_1,AH;
	  mov KEY_FLAG_2,AL;
	  }
for (i=0;i<8;i++) {
if  (mask & KEY_FLAG_1)
{
    if (i==0)
printf ("Left CTRL is pressed\n");
    if (i==1)
printf ("Left ALT is pressed\n");
    if (i==2)
printf ("Right CTRL is pressed\n");
    if (i==3)
printf ("Right ALT is pressed\n");
    if (i==4)
printf ("SCROL-LOCK is pressed\n");
    if (i==5)
printf ("NUM-LOCK is pressed\n");
    if (i==6)
printf ("CAPS-LOCK is pressed\n");
    if (i==7)
printf ("SysRq is pressed\n");
}
mask=mask<<1; }

mask=1;

for (i=0;i<8;i++) {
if  (mask & KEY_FLAG_2)
{
    if (i==0)
printf ("Right SHIFT is pressed\n");
shift=1;
    if (i==1)
printf ("Left SHIFT is pressed\n");
shift=1;
    if (i==2)
printf ("CTRL is pressed\n");
    if (i==3)
printf ("ALT is pressed\n");
alt=1;
    if (i==4)
printf ("SCROL-LOCK is on\n");
    if (i==5)
printf ("NUM-LOCK is on\n");
    if (i==6)
printf ("CAPS-LOCK is on\n");
    if (i==7)
printf ("INSERT is on\n");
}
mask=mask<<1; }
if (shift==1 && alt==1 && SCAN==110)
printf ("SHIFT+ALT+F7\n");
getch();
return 0;
}
При нажатии комбинации ALT+F7 всё равно выдает надпись SHIFT+ALT+F7,будто переменная shift вообще не считается.По-разному пытался переставлять это всё дело,но в итоге доигрался до того,что надпись SHIFT+ALT+F7 начала появлятся всегда,не зависимо от того,какие клавиши были нажаты о_О В чем ошибка-то,помогите разобраться...Или посоветуйте другой способ отследить нажатие комбинации клавиш.Спасибо
Demonhunterus вне форума Ответить с цитированием
Старый 24.09.2011, 11:38   #7
Demonhunterus
Пользователь
 
Регистрация: 16.10.2010
Сообщений: 11
По умолчанию

Нашел такой вот вариант проверки на Shift+F4
Код:
...

(1) No_ext:

(2) mov ah,10h

(3) int 16h

(4) cmp al,0

(5) jnz No_ext

(6) cmp ah,57h

(7) je Shift_f4

(8) jmp No_ext

(9) Shift_f4:

...
Shift+F7,на сколько я понял,будет то же самое,только проверка
Код:
cmp ah,5Ah
Вопрос - как задать проверку Alt+Shift+F7?Есть ли таблица,где есть значение этой комбинации,или же нужно это дело отследить как-то иначе?
Demonhunterus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод с клавиатуры и поиск/Assembler/TASM for Dos Rifler Помощь студентам 8 03.09.2010 08:22
Assembler - ввод данных (имени и фамилии) с клавиатуры и вывод на экран МартинИ Помощь студентам 1 25.05.2010 00:40
как ввести с клавиатуры двузначные и отрицательные числа - Assembler Варвара Помощь студентам 5 20.12.2009 14:29
Разработать резедентную Assembler-программу ключ клавиатуры gogi73 Фриланс 1 15.06.2009 15:51