procedure TFrm_Main.Beep(nFreq, nDura: Word);
var
VerInfo: TOSVersionInfo;
nStart: DWord;
begin
VerInfo.dwOSVersionInfoSize := SizeOf(VerInfo);
GetVersionEx(VerInfo);
if VerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then
Windows.Beep(nFreq, nDura)
else begin
Asm
push bx
in al, $61
mov bl, al
and al, 3
jne @@Skip
mov al, bl
or al, 3
out $61, al
mov al, $b6
out $43, al
@@Skip:
mov ax, nFreq
out $42, al
mov AL, ah
out $42, al
pop bx
end;
nStart := GetTickCount;
repeat
Application.ProcessMessages;
Until GetTickCount > nStart + nDura;
asm
IN AL, $61
AND AL, $FC
OUT $61, AL
end;
end;
end;
procedure BeepEx(feq:word=1200;delay:word=1);
procedure BeepOff;
begin
asm
in al $61;
and al $fc;
out $61 al;
end;
end;
const
scale=1193180;
var
temp:word;
begin
temp:=scale div feq;
asm
in al 61h;
or al 3;
out 61h al;
mov al $b6;
out 43h al;
mov ax temp;
out 42h al;
mov al ah;
out 42h al;
end;
sleep(delay);
beepoff;
end;