Проверка нажатия, удержания и отпускания клавиш - Assembler
Формулировка задачи:
Добрый ночи!
Сижу уже несколько часов туплю, не могу понять, почему часть кода с меткой @main не видит удерживаемую клавишу?
Задача в том, что бы написать программу на подобие пианино. И при нажатии и удерживании клавиши должен издаваться звук.
Звук издается перманентно, @main - тут должна проходить у меня проверка на зажатие клавиши, т.е. если клавиша зажата, то еще раз проверить, если клавиша не зажата, тогда отключить звук и ожидать нового нажатия в @main_knp.
В данной версии кода зацикливается на @main, т.к почему-то флаг z стоит в 0 всегда.
Если кто-нибудь подскажет как реализовать это, буду премного благодарен!
P.S. Обдумывал вариант, что бы сравнивать scan-коды из порта 60h, но я пока не понимаю как именно это написать.
P.P.S Звук на клавиши qwerty и zxcvbn, на клавишу enter отключить звук, esc выйти.
P.P.P.S Эмулятор DosBox 0,74.
{$G+} uses crt; const periodArrayValue: array [1..12] of word = (262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494); var periodValue: word; begin asm jmp @main_knp @main: xor ah,1 int 16h JNZ @main JMP @sound_off @main_knp: xor ah,ah int 16h cmp ah,1 je @off cmp ah,1ch je @sound_off cmp ah,10h je @q cmp ah,11h je @w cmp ah,12h je @e cmp ah,13h je @r cmp ah,14h je @t cmp ah,15h je @y cmp ah,2ch je @z cmp ah,2dh je @x cmp ah,2eh je @c cmp ah,2fh je @v cmp ah,30h je @b cmp ah,31h je @n jmp @main_knp @q: mov ax,periodArrayValue[1].word jmp @sound_on @w: mov ax,periodArrayValue[3].word jmp @sound_on @e: mov ax,periodArrayValue[5].word jmp @sound_on @r: mov ax,periodArrayValue[7].word jmp @sound_on @t: mov ax,periodArrayValue[9].word jmp @sound_on @y: mov ax,periodArrayValue[11].word jmp @sound_on @z: mov ax,periodArrayValue[2].word jmp @sound_on @x: mov ax,periodArrayValue[4].word jmp @sound_on @c: mov ax,periodArrayValue[6].word jmp @sound_on @v: mov ax,periodArrayValue[8].word jmp @sound_on @b: mov ax,periodArrayValue[10].word jmp @sound_on @n: mov ax,periodArrayValue[12].word jmp @sound_on @sound_on: mov periodValue,ax mov al,0b6h out 43h,al mov al,periodValue.byte out 42h,al mov al,periodValue.byte+1 out 42h,al in al,61h or al,00000011b out 61h,al jmp @main @sound_off: in al,61h and al,11111100b out 61h,al jmp @main_knp @off: end; end.
Решение задачи: «Проверка нажатия, удержания и отпускания клавиш»
textual
Листинг программы
jmp @KeyChk @Clear: xor ah,ah int 16h @KeyChk:mov ah,1 int 16h jnz @Clear
Объяснение кода листинга программы
- Переменная
ah
используется как регистр для хранения кода нажатой клавиши. - Команда
jmp @KeyChk
переходит к меткеKeyChk
. - Метка
Clear
используется для возврата значения регистраah
в начальное состояние. - Команда
xor ah,ah
сбрасывает значение регистраah
в ноль. - Команда
int 16h
вызывает прерывание, чтобы проверить нажатие клавиши. - Метка
KeyChk
используется для проверки нажатой клавиши. - Команда
mov ah,1
устанавливает значение регистраah
равным 1. - Команда
int 16h
вызывает прерывание для проверки нажатой клавиши. - Команда
jnz @Clear
переходит к меткеClear
, если нажата клавиша. - Если клавиша не нажата, то программа продолжает работу с предыдущего места после команды
int 16h
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д