Проверка нажатия, удержания и отпускания клавиш - 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.