Аппаратное обеспечение персонального компьютера

       

Программа TMSOUND


Программа TMSOUND (листинг 5.2) проигрывает мелодию с помощью системного таймера.

Листинг 5.2. Файл tmsound\tmsound.с

// =====================================================

// Проигрывание музыки с помощью таймера

//

// (C) Фролов А.В, 1997

//

// E-mail: frolov@glas.apc.org

// WWW:    http://www.glasnet.ru/~frolov

//            или

//         http://www.dials.ccas.ru/frolov

// =====================================================

#include <stdio.h>



#include <conio.h>

#include <dos.h>

void sound(int, int);

void tm_sound(int freq, int time);

void tm_delay(int ticks);

// Массив частот для мелодии

int mary[] =

{

  330, 294, 262, 294, 330, 330, 330,

  294, 294, 294, 330, 392, 392,

  330, 294, 262, 294, 330, 330, 330, 330,

  294, 294, 330, 294, 262, 0

};

// Массив длительностей

int del[] =

{

  5, 5, 5,  5, 5, 5,  10,

  5, 5, 10, 5, 5, 10,

  5, 5, 5,  5, 5, 5,  5, 5,

  5, 5, 5,  5, 20

};

int main(void)

{

  int i;

  for(i=0 ;mary[i] != 0 ;i++)

    tm_sound(mary[i], del[i]);

 

  return 0;

}

/**

*.Name         tm_sound

*.Title        Формирование тона заданной длительности

*

*.Descr        Эта функция предназначена для генерации

*              на громкоговорителе тона заданной

*              длительности и частоты

*

*.Proto        void tm_sound(int freq, int time);

*

*.Params       int freq - частота в герцах;

*              int time - длительность в периодах работы

*               таймера

**/

void tm_sound(int freq, int time)

{

  int cnt;

  // Задаем режим канала 2 таймера

  outp(0x43, 0xb6);

  // Вычисляем задержку для загрузки в

  // регистр счетчика таймера

  cnt = (int)(1193180L / freq);

  // Загружаем регистр счетчика таймера - сначала

  // младший, затем старший байты

  outp(0x42, cnt & 0x00ff);

  outp(0x42, (cnt &0xff00) >> 8);

  // Включаем громкоговоритель. Сигнал от

  // канала 2 таймера теперь будет проходить


  // на вход громкоговорителя

  outp(0x61, inp(0x61) | 3);

  // Выполняем задержку.

  tm_delay(time);

  // Выключаем громкоговоритель.

  outp(0x61, inp(0x61) & 0xfc);

}

/**

*.Name         tm_delay

*.Title        Формирование задержки по таймеру

*

*.Descr        Эта функция формирует задержку, используя

*              системный таймер

*

*.Proto        void tm_delay(int ticks)

*

*.Params       int ticks - величина задержки в периодах работы таймера

**/

void tm_delay(int ticks)

{

  _asm

  {

    push si

    mov  si, ticks

    mov  ah, 0

    int  1ah

    mov  bx, dx

    add  bx, si

delay_loop:

    int  1ah

    cmp  dx, bx

    jne  delay_loop

    pop  si

  }

}


Содержание раздела