Проверка нажатия, удержания и отпускания клавиш - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д