Переполнение буфера клавиатуры

  • Автор темы APTEM
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

APTEM

#1
Простейшая музыкальная программа. Проблема в том, что при долгом нажатии на клавишу (музыка активируется при нажатии на 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);
(46):sound(ch1,5,590);
(49):sound(ch1,6,650);
(50):sound(ch1,7,720);

end;
until ch1=27;

closegraph;
end.
 
D

deeka

#2
А зачем просто SetFillStyle? или вы просто не понимаете значение этой команды? И что вы хотите? В целом?
Легче format c:
 
L

logosman

#3
Несомненно переполнение!!! И вообще при работе с 60h портом желательно вешать свой обработчик на IRQ 1.
Но для этого случая посоветую поставить:

...
repeat
asm
push 40h
pop es
mov al,es:[1ch]
mov es:[1ah],al
end;

ch1:=port[$60];
...

{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}
Или равносильно:
...
repeat
mem[$40:$1a]:=mem[$40:$1c];
ch1:=port[$60];
...

GRAPH.TPU сегодня должно быть стыдно использовать!!! Надо делать самому!!!
 
K

klizardin

#5
проблемка в том что нужно не только читать из порта 60h но еще и сообщать о том что код клавиши прочитан и соответственно можно выдавать вам на прочтение следующий кажись за это отвечает порт 61h. А чем были не доспадобы стандартные функции чтения с клавиатуры ?
 
Статус
Закрыто для дальнейших ответов.