описанная процедура для получения значения счетчика и по нему вычисляется
время; если будет получено сообщение о сбросе таймера, то ДОС изменит
также и дату. Таким образом, ДОС выполняет все эти вычисления только
тогда,когда требуется указать время, что упрощает функции процедуры
обслуживания прерываний от таймера, которая должна выполняться 18 раз в
секунду. Если к ДОС будет хотя бы один запрос времени за день, то
проверить это, оставив Ваш компьютер включенным на 24 часа. К концу Вашей
проверки время дня будет по прежнему правильным, а дата ошибочной).
Если Вы будете сами считывать или устанавливать показания таймера с
помощью этих процедур системы BIOS, это может помешать правильному отсчету
времени и даты в ДОС. ДОС устанавливает значение счетчика таймера таким
образом, как будто он был запущен в полночь, после чего ДОС полностью
полагается на значение признака сброса таймера. Любая установка или
считывание показаний таймера Вашими программами естественно окажет влияние
на отсчет времени в ДОС. Если Ваши программы будут только считывать
показания таймера, это может привести к перехвату сообщения о сбросе
таймера, что нарушит порядок отсчета даты в ДОС.
Теперь мы рассмотрели все процедуры системы BIOS-ПЗУ.
Вы могли обратить внимание на два упущения в составе этих процедур. В
то время как все устройства, подключаемые стандартным образом, имеют
поддерживающие их служебные процедуры,совершенно не поддерживается игровой
адаптер. Это происходит потому, что такая поддержка просто не нужна. Я
могу только предполагать почему это произошло; одна из возможных причин
может заключаться в том, что форма "ИБМ" не сочла этот адаптер достаточно
важной составной частью системы, которой требуется какая-либо поддержка на
уровне системы BIOS. Возможно, также что игровой адаптер был доставлен к
системе на достаточно поздней стадии ее разработки и его поддержка не
могла быть включена в систему BIOS, размещенную в ПЗУ.
Еще одна недостающая часть системы BIOS - это набор процедур для
обслуживания встроенного динамика. Почему они не были включены в систему -
это для меня загадка. В следующем разделе мы рассмотрим работу динамика и
то, как извлекать из него звуки под управлением программы.
11.5. Рецензия звука с помощью динамика
К сожалению, в системе BIOS нет универсальных процедур обслуживания
встроенного в IBM/PC динамика. Хотя в системе имеются две подпрограммы,
позволяющие извлекать звуки из динамика, но они могут использоваться
только внутри самой системы BIOS - это не служебные процедуры общего
пользования.
В данном разделе мы поясним работу динамика и поясним основы его
использования.Дисковый пакет, прилагающийся к этой книге, содержит
служебные подпрограммы на Ассемблере,которые обеспечат Вам доступ ко всем
возможностям динамика.
Любой громкоговоритель - будь то часть высококачественной системы
воспроизведения звука, телефонный динамик или динамик IBM/PC - работает за
счет получения последовательности электрических импульсов, которые
вызывают отклонение диафрагмы динамика, вызывающее колебания воздуха,
образующие звук. В обычном динамике, поступающие импульсы имеют различную
мощность (громкость) и длительность (частоту или высоту тона). Простой
динамик IBM/PC не позволяет регулировать громкость и звук образуется
просто последовательностью электрических импульсов. Ток к динамику
подается и отключается в режиме простого двоичного управления. Частота
импульсов тока определяет звуковую частоту, вырабатываемую динамиком.
Например, если ток включается и выключается 300 раз в секунду, то динамик
генерирует звук частотой 300 герц.
Схемы управления динамиком очень интересно организованы и
обеспечивают два способа формирования звука. Импульсы, посылаемые
динамику, управляются комбинацией программного сигнала и программируемого
таймера. Два способа формирования звука определяются тем, используется
таймер или нет.
Сначала рассмотрим как формируется звук без использования таймера.
Чтобы заставить динамик звучать программа должна задавать импульсы нужной
частоты в течение нужного времени. Хотя это делается на ассемблере, я
использовал Паскале-подобные конструкции просто для иллюстрации логики
этой операции. Предположим, что необходимо воспроизвести звук с частотой
300 герц, который должен звучать половину секунды. Вот что необходимо
сделать:
повторить 150 раз { то есть, 1/2 секунды, при частоте 300 Гц }
начало
импульс отключения динамика
задержка на 1/600 секунды {половина цикла}
{задержка времени выполняется с помощью холостого цикла,
повторяющегося нужное число раз}
импульс включения динамика
задержка еще на 1/600 секунды {вторая половина цикла}
конец;
Если Вы внимательно изучите программу на ассемблере BEEP/WARBLE,
приведенную в виде листинга 3.2. в главе 3, Вы заметите, что она работает
именно таким образом.
Это очень хороший способ воспроизведения звука, но он не позволяет
программе ничего делать, кроме генерации звука. Фактически, эта маленькая
программа использует весь ресурс микропроцессора 8088, не делая ничего
кроме подсчета времени и формирования импульсов для динамика. Для этого
есть более совершенный способ, использующий таймер.
Одна из скрытых возможностей IBM/PC - это наличие программируемого
таймера. Он не измеряет никаких промежутков времени, а только подсчитывает
импульсы основного тактового генератора системы. Для этого таймера
задается число, называемое коэффициентом деления (или просто делителем), и
он подсчитывает число импульсов тактового генератора и сравнивает это
число с делителем. Когда эти числа сравняются, таймер выдает сигнал и
снова начинает подсчет с нуля.
Системный тактовый генератор работает на чистоте 1,19мГц. Так что
если таймер запрограммирован на 10000 импульсов, он будет выдавать сигналы
примерно 100 раз в секунду. Можно добиться любой частоты импульсов на
выходе таймера, подбирая соответствующий делитель. После загрузки делителя
схемы динамика запускаются для работы под управлением таймера, после чего
выходные сигналы таймера будут управлять частотой формируемого звука, а
компьютер может выполнять любую другую работу.
Такой способ управления динамиком позволяет программам работать, пока
динамик воспроизводит звук. Таким образом организована работа одной из
процедур Бейсика, фоновая музыка или MB. Необходимо заметить, что при
формировании звука с помощью таймера, он продолжает звучать до тех пор,
пока он не будет отключен той же программой , которая его запустила.
Листинг 3.2. может использоваться в качестве примера формирования
звуков без использования таймера. Программа на ассемблере, представленная
листингом 11.1., показывает как запустить звучание динамика с помощью
таймера.
Приложение 11.1. Текст программы генерации звука с использованием
таймера (Ассемблер).
a440seg segment 'code'
assume cs:a440seg
a440 proc far
mov al,0b6h
out 67,al
mov ax,2711
out 66,al
mov al,ah
out 66,al
in al,97
or al,03
out 97,al
int 20h
a440 endp
a440seg ends
end