Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Переполнение буфера клавиатуры


Автор: APTEM 30.4.2004, 16:54
Простейшая музыкальная программа. Проблема в том, что при долгом нажатии на клавишу (музыка активируется при нажатии на z,x,c,v,b,n) звук ведет себя очень странно. Кажется переполнение буфера клавиатуры. Как можно решить эту проблему?

uses crt,graph;

var ch:char;
i,j:integer;
ch1: byte;

procedure Sound(cc: byte; i:integer;F:single);
var k:word;
c:byte;
begin
k:=round(1.193e6/f);
port[$43]:=$be;
port[$42]:=lo(k);
port[$42]:=hi(k);

setfillstyle(1,12);
bar(i*50,100,(i+1)*50-5,300);

c:=port[$61];
port[$61]:=c or 3;
repeat until (port[$60]<>cc);
port[$61]:=c and (not 3);

setfillstyle(1,i);
bar(i*50,100,(i+1)*50-5,300);

end;

begin

i:=detect;
initgraph(i,j,'d:\tp7');{pri zapisi na disk C:\ zamenit d:\tp7 na c:\tp7}

for i:=1 to 7 do
begin
setfillstyle(1,i);
bar(i*50,100,(i+1)*50-5,300);
end;

repeat
ch1:=port[$60];
(* writeln(port[$60]);*)
case ch1 of
(44):sound(ch1,1,440);
(45):sound(ch1,2,460);
(46):sound(ch1,3,490);
(47):sound(ch1,4,530);
(4:sound(ch1,5,590);
(49):sound(ch1,6,650);
(50):sound(ch1,7,720);

end;
until ch1=27;

closegraph;
end.

Автор: Jin X 30.4.2004, 22:08
Перед until поставь
Код
while KeyPressed do ReadKey

Автор: Lonley 1.5.2004, 21:40
Можно попробовать очищать буфер клавиатуры полсле вывода звука
ну подумай когда его личшу поставить
Код

CLRBUF PROC
CLI
PUSH AX
PUSH ES
MOV AX,40h
MOV ES,AX
MOV AL,BYTE PTR ES:[1CH]
MOV BYTE PTR ES:[1AH],AL
POP ES
POP AX
STI
RET
CLRBUF ENDP

Код не мой а из книги В.Ю.Пирогова

Автор: APTEM 2.5.2004, 17:16
Jin X
Спасибо, это частично решило проблему... Попробую добить до конца...

Автор: YAA 19.7.2004, 23:09
Странно в смысле прерывается? Так это же гудок биос!!! Можно или расширить буффер клавы, или перехватить 09h - один из обработчиков клавы (2ой).

Автор: Uri 27.7.2004, 14:39
Пример _правильного_ чтения символа с клавиатуры:

Код

        push    ax
        in      al,60H            ;read the key
        mov     [ch1],al
        in      al,61H            ;get value of keyboard control lines
        mov     ah,al             ; save it
        or      al,80h            ;set the "enable kbd" bit
        out     61H,al            ; and write it out the control port
        xchg    ah,al             ;fetch the original control port value
        out     61H,al            ; and write it back
        pop     ax

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)