Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2011, 18:38   #1
ТриСемёрки
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 61
По умолчанию Вывод звука

Простенькая программа, взятая из ЛЕКЦИЙ!
Ошибок нет!
Нет и звукового сигнала ...


Код:
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <dos.h>
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif

// Процедура для выдачи звукового сигнала
void BEEP ()
{
_asm {
mov bx,0
mov ax,0x0e07
int 10h
}
}
// Описание программы-обработчика прерывания будильника
void interrupt alarm(__CPPARGS);
// Переменная для хранения старого вектора будильника
void interrupt (*old_4a)(__CPPARGS);
void main(void)
{
clrscr();
// Подключаем свой обработчик прерывания будильника, старое значение вектора 0x4a сохраняем
old_4a = _dos_getvect(0x4a);
_dos_setvect(0x4a, alarm);
// Устанавливаем будильник
_asm {
mov ah , 0x02 // Читаем текушее время
int 1ah
mov al , cl // Копируем минуты из cl в al
add ax , 1 // Прибавляем к значению в al, значение 1
mov cl , al // Копируем обратно
mov ah , 0x06 //Устанавливаем будильник на срабатывание через 1 мин
int 1ah
}
// Для того чтобы сбросить будильник нужно нажать любую клавишу.
getch();
// Сбрасываем будильник и восстанавливаем вектор прерывания будильника
_asm {
mov ah,0x07 //Сброс будильника
int 1ah
}
//Восстанавливаем вектор прерывания
_dos_setvect(0x4a, old_4a);
printf("Ready");
getch();
}
//Подпрограмма получает управление при срабатывании будильника.
// Ее назначение - выдать звуковой сигнал.
void interrupt alarm(__CPPARGS)
{

BEEP();
printf("Stop");
}
Проблема, видимо, не в звуке. Программа не устанавливает свой обработчик прерывания (иначе звука бы не было, но "Стоп" бы выводился).

Кстати, пробую "обнулить" будильник в CMOCE, но ничего не получается

Код:
Код:
_AH=0x07;
Выдержка из лекции: "Доступ к часам реального времени возможен либо через ячейки CMOS-памяти (используя порты 70h и 71h), либо через специальные функции BIOS (прерывание 1Ah BIOS), что более предпочтительно с точки зрения независимости работы программы от особенностей аппаратуры."

Если обращаюсь к CMOS-памяти используя порты 70h и 71h, значения ячеек будильника меняется, но будильник не работает, если используя специальные функции BIOS (прерывание 1Ah BIOS) значения ячеек не меняется и соответственно будильник не работает.
ТриСемёрки вне форума Ответить с цитированием
Старый 08.04.2011, 19:14   #2
ТриСемёрки
Пользователь
 
Регистрация: 12.05.2010
Сообщений: 61
По умолчанию

Дело в железе или в защищенном режиме винды?
(Проверяю и в винде и в DosBox-е)
ТриСемёрки вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Захват звука, Обработка(пре-амп), и вывод f1re Мультимедиа в Delphi 5 23.08.2011 19:58
Вывод звука с микрофона на колонки ZBEP Помощь студентам 3 28.01.2011 17:14
Вывод отдельного звука на TB и на компьютере ArtInt Софт 2 29.10.2009 20:45
Вывод звука на колонки KapeLLaN Общие вопросы C/C++ 3 18.02.2008 13:03
Вывод звука. C++ Oznob Помощь студентам 0 04.12.2007 01:43