====== Воспроизведение мелодий через встроенный динамик компьютера (PC-Speaker) в GNU/Linux ======
Демонстрационная программа: [[http://soft.self-made-free.ru/spk_play.pas|spk_play.pas]]
program spk_play;
{
Program for playing melodys on PC-Speaker.
For GNU/Linux 64 bit version. Root priveleges needed.
Version: 2.
Written on FreePascal.
Copyright (C) 2019 Artyomov Alexander
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
}
{$MODE OBJFPC}
{$ASMMODE INTEL}
{$CODEPAGE UTF8}
uses SysUtils,X86;
procedure spkon; assembler;
asm
push rax
in al, 61h
or al, 03h
out 61h, al
pop rax
end;
procedure spkoff; assembler;
asm
push rax
in al, 61h
or al, 03h
xor al, 03h
out 61h, al
pop rax
end;
procedure spk(b : word);
var hb, lb : byte;
begin
hb := hi(b); lb := lo(b);
asm
push rax
mov al, 0B6h
out 43h, al
mov al, lb
out 42h, al
mov al, hb
out 42h, al
pop rax
end;
end;
begin
// Разрешить (на уровне операционной системы) своей
// программе нужные для работы с динамиком порты
// ввода-вывода 42h, 43h и 61h. Запуск программы только от рута.
fpioperm($42, 2, 1); // fpioperm($42, 1, 1); fpioperm($43, 1, 1);
fpioperm($61, 1, 1);
spkon; // Включить динамик.
spk(1000); // Установить частоту воспроизведения. Частота 1193280 div tone.
Sleep(100); // Подождать.
spk(2000);
Sleep(100);
spkoff; // Выключить динамик.
end.
Юнит: [[http://soft.self-made-free.ru/spkunit.pas|spkunit.pas]]
unit spkunit;
{$MODE OBJFPC}
{$ASMMODE INTEL}
{$CODEPAGE UTF8}
{
Unit for playing melodys on PC-Speaker.
For GNU/Linux 64 bit version. Root priveleges needed.
Version: 3.
Written on FreePascal (https://freepascal.org/).
Copyright (C) 2000-2019 Artyomov Alexander
http://self-made-free.ru/ (Ex http://aralni.narod.ru/)
aralni@mail.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
}
interface
uses X86;
procedure spk(b : word); procedure spkon; procedure spkoff;
implementation
procedure spkon; assembler;
asm
push rax
in al, 61h
or al, 03h
out 61h, al
pop rax
end;
procedure spkoff; assembler;
asm
push rax
in al, 61h
or al, 03h
xor al, 03h
out 61h, al
pop rax
end;
procedure spk(b : word);
var hb, lb : byte;
begin
hb := hi(b); lb := lo(b);
asm
push rax
mov al, 0B6h
out 43h, al
mov al, lb
out 42h, al
mov al, hb
out 42h, al
pop rax
end;
end;
initialization
fpioperm($42, 2, 1);
fpioperm($61, 1, 1);
end.