24.11.2006, 21:14
общий
это ответ
Здравствуйте, ISS!
Насколько я понял вы имеете ввиду использование встроенного динамика. Для дос-используются порты:пример в приложении(в WinNT доступ к портам из ring-3 закрыт-работать, при вставке в Win-программу, не будет).Компилировать:tasm.exe <имя файла>.asm tlink.exe <имя файла>.obj -получите рабочую =досовскую= программу. Для Win всё намного проще: есть API-функция:
BOOL Beep(
DWORD dwFreq, // частота звука, в герцах
DWORD dwDuration // длительность звучания, в миллисекундах
);
Для си-самое то, можно обойтись и без асм-вставок.
С уважением, IceW0|f.
Приложение:
;-Prg_7_l.asn;Программа,имитирующая звук сирены.;Изменение высоты звука от 450 до 2100 Гц.;Используется макрос delay (задержка).;При необходимости;можно поменять значение задержки (по умолчанию - для процессораPentium).masmmodel smallstack 100h;макрос задержки, его текст ограничивается директивами macro и endm.;На входе — значение задержки (в икс)delay macro timelocal ext, iterpush cxmov cx, timeext:push cxmov cx,5000iter:loop iterpop cxloop extPop cxendm.data; сегмент данныхtonelow dw 2651 ;нижняя граница звучания 450 Гцcnt db 0; счетчик для выхода из программыtemp dw 7;верхняя граница звучания.code ;сегмент кодаmain: ;точка входа в программуmov ax ,@data ;связываем регистр ds с сегментомmov ds, ax ;данных через регистр ахmov ax ,0 ;очищаем ахgo: ;заносим слово состояния 10110110b(0B6h) в командный регистр (порт 43h)mov al,0B6hout 43h,alin al,61h ;получим значение порта 61h в alor al,3 ;инициализируем динамик и подаем ток в порт 61hout 61h,almov cx,2083 ;количество шагов ступенчатого изменения тонаmusicup:;в ах значение нижней границы частотыmov ax,tonelowout 42h,al ;в порт 42п младшее слово ax:alxchg al,ah ;обмен между al и ahout 42h,al ;в порт 42h старшее слово ах:ahadd tonelow,1 ;повышаем тонdelay 1 ;задержка на 1 мксmov dx,tonelow ;в dx текущее значение высотыmov temp,dx ;temp — верхнее значение высотыloop musicup ;повторить цикл повышенияmov cx,2083 ;восстановить счетчик циклаmusicdown:mov ax,temp ;в ах верхнее значение высотыout 42h,al ;в порт 42h младшее слово ax:almov al,ah ;обмен между al и ahout 42h,al ;в порт 42h старшее слово ax:ahsub temp,1 ;понижаем высотуdelay 1 ;задержка на 1 мксloop musicdown ;повторить цикл пониженияnosound:in al,61h ;получим значение порта 61h в ALand al,0FCh ;выключить динамикout 61h,al ;в порт 61hmov dx,2651 ;для последующих цикловmov tonelow,dxinc cnt ;увеличиваем счетчик проходов, то есть количество звучаний сиреныcmp cnt,5 ;5 раз ?jne go ;если нет, идти на метку goexit:mov ax, 4C00h;стандартный выходint 21hend main ;конец программы