====== Воспроизведение мелодий через встроенный динамик компьютера (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.