|
|
Отметим, что в фоновом режиме, оператор X = PLAY(0) возвращает
число нот (до 32), которое осталось сыграть. В многоканальном
режиме на PCjr возвращается число нот в буфере данного канала
(0-2), номер которого указан в скобках.
Низкий уровень.
Просто пошлите счетчик в канал 2, как объяснено в [2.1.1].
Микросхема должна быть предварительно разрешена через порт B
микросхемы интерфейса с периферией 8255 (адрес 61H). Вычислите
требуемое значение счетчика для задвижки, разделив 1.19 миллионов
на требуемую частоту в герцах. Звук будет продолжаться до тех
пор, пока не будут закрыты ворота канала 2. Поэтому Вы должны
сбросить бит 1 порта B в 0, иначе звук будет продолжаться беско-
нечно и может быть прекращен только перезагрузкой компьютера. Для
точного регулирования длительности звука можно использовать счет-
чик времени суток BIOS, как указано в [2.1.6]. В данном примере
генерируется частота 440 герц. Звук прекращается после нажатия
любой клавиши на клавиатуре.
;---рарешение канала 2 установкой порта B микросхемы 8255
PORT_B EQU 61H ;установка адреса порта B
IN AL,PORT_B ;чтение его значения
OR AL,3 ;установка двух младших битов
OUT PORT_B,AL ;посылаем байт в порт B
;---установка регистров ввода/вывода
COMMAND_REG EQU 43H ;адрес командного регистра
CHANNEL_2 EQU 42H ;адрес канала 2
MOV AL,10110110B ;цепочка битов для канала 2
OUT COMMAND_REG,AL ;засылка в командный регистр
;---засылка счетчика в задвижку
MOV AX,2705 ;счетчик = 1190000/440
OUT CHANNEL_2,AL ;посылаем младший байт
MOV AL,AH ;сдвигаем младший байт в AL
OUT CHANNEL_2,AL ;посылаем старший байт
;---ждем нажатия клавиши
MOV AH,1 ;номер функции прерывания 21H
INT 21H ;вызываем прерывание
;---выключение звука
IN AL,PORT_B ;получаем байт из порта B
AND AL,11111100B ;сбрасываем два младших бита
OUT PORT_B,AL ;посылаем байт обратно
2.2.4 Гудок динамика.
Некоторым программам требуется набор предостерегающих гудков.
Их легко создавать на Бейсике, но операционная система не обеспе-
чивает функцию гудка, как таковую, и только косвенно позволяет
получать доступ к гудку, который Вы слышите при старте системы.
Для изменения тона вся процедура генерации звука должна быть
запрограммирована на низком уровне. Для того чтобы гудок соот-
ветствовал подаваемому им сигналу необходимо проявить воображе-
ние. Для предсказания близкой опасности создайте набор понижаю-
щихся тонов [2.2.7] или, если принтер включен, чередуйте гудки
динамика компьютера и принтера (вывод кода ASCII 7 на принтер).
Высокий уровень.
В Бейсике просто напишите BEEP. Вот кусочек кода, который
реагирует на вероятную ошибку гудком и запросом:
100 INPUT "Enter your age",AGE 'запрос возраста
110 IF AGE > 100 THEN BEEP:PRINT"Are you really over 100?"
Для гудков другой частоты и продолжительности используйте
оператор SOUND. Его форма: SOUND частота, длительность , где
частота дается в герцах (3000 - середина диапазона), а длитель-
ность дается в восемнадцатых долях секунды. SOUND 3000,18 дает
гудок длительностью около одной секунды. В нижеприведенном приме-
ре динамик быстро переходит от высокого тона к низкому и обратно,
распугивая все живое в ближайшей окрестности.
100 FOR N = 1 TO 200 'установка числа повторений
110 SOUND 500,1 'звук низкой частоты на 1 секунду
120 SOUND 5000,1 'звук высокой частоты на 1 секунду
130 NEXT 'повтор
Средний уровень.
Операционная система не предоставляет специальной функции для
генерации звука. Но Вы можете вызвать знакомый гудок просто пода-
вая код ASCII 7 на стандартное устройство вывода (т.е. терминал),
используя одну из функций DOS или BIOS. Код ASCII 7 интерпрети-
руется как управляющий символ "звонок" и он не рисуется на экра-
не. Проще всего использовать функцию 2 прерывания 21H:
MOV AH,2 ;функция вывода символа на экран
MOV DL,7 ;посылаем код ASCII 7
INT 21H ;динамик гудит
Низкий уровень.
Для простого гудка лучше всего подходит метод, основанный на
использовании микросхемы интерфейса с периферией 8255 [1.1.1].
Ниже приведен пример, который практически повторяет гудок, кото-
рый Вы слышите при старте системы.
;---гудок динамика
MOV DX,800 ;счетчик числа циклов
IN AL,61H ;читаем порт B 8255
AND AL,0FEH ;выключаем бит таймера 8253
NEXTCYCLE: OR AL,2 ;включаем бит динамика
OUT 61H,AL ;посылаем байт в порт B
MOV CX,150 ;длительность первой половины
CYCLEUP: LOOP CYCLEUP ;задержка пока сигнал высокий
AND AL,0FDH ;выключаем бит динамика
OUT 61H,AL ;посылаем байт в порт B
CYCLEDOWN: LOOP CYCLEDOWN ;задержка пока сигнал низкий
DEC DX ;уменьшаем счетчик циклов
JNZ NEXTCYCLE ;повторяем цикл пока DX не 0
2.2.5 Генерация набора тонов.
В этом подразделе показано как генерировать цепочку звуков,
когда компьютер ничем другим не занят; в следующем будет показано
как выполнить ту же задачу, когда компьютер занят другой работой.
Когда компьютер ничем другим не занят, то можно выводить мелодию
или производить специальные звуковые эффекты; когда же компьютер
занят другой работой, то нельзя производить звуковые эффекты.
Создание звуковых строк является одной из мощнейших возможнос-
тей, предоставляемых Бейсиком. Построение же строк звуков в ас-
семблере требует большой работы. Может быть использован любой из
двух методов генерации звука, предложен
|