Если имеется в виду PC-speaker, то так (пример из Юрова): Код | ;---------Prg_7_1.asm--------------- ;Программа ,имитирующая звук сирены. ;Изменение высоты звука от 450 Гц до 2100 Гц. ;Используется макрос delay (задержка). ;При необходимости ;можно поменять значение задержки (по умолчанию - для процессора Pentium). ;------------------------------------
model small stack 100h delay macro time local ext,iter ;макрос задержки, его текст ограничивается директивами macro и endm. ;На входе - значение задержки (в мкс)
push cx mov cx,time ext: push cx mov cx,5000 iter: loop iter pop cx loop ext pop cx endm .data ;сегмент данных tonelow dw 2651 ;нижняя граница звучания = 450 Гц cnt db 0 ;счётчик для выхода из программы temp dw ? ;верхняя граница звучания .code ;сегмент кода main: ;точка входа в программу mov ax,@data ;связываем регистр ds с сегментом mov ds,ax ;данных через регистр ax xor ax,ax ;очищаем ax go: ;заносим слово состояния 10110110b(0В6h) в командный регистр (порт 43h) mov al,10110110b out 43h,al in al,61h ;получим значение порта 61h в al or al,3 ;инициализируем динамик и подаем ток в порт 61h out 61h,al mov cx,2083 ;количество шагов ступенчатого изменения тона musicup: ;в ax значение нижней границы частоты mov ax,tonelow out 42h,al ;в порт 42h младшее слово ax :al xchg al,ah ;обмен между al и ah out 42h,al ;в порт 42h старшее слово ax:ah add tonelow,1 ;повышаем тон delay 1 ;задержка на 1 мкс mov dx,tonelow ;в dx текущее значение высоты mov temp,dx ;temp - верхнее значение высоты loop musicup ;повторить цикл повышения mov cx,2083 ; восстановить счетчик цикла musicdown: mov ax,temp ;в ax верхнее значение высоты out 42h,al ;в порт 42h младшее слово ax :al mov al,ah ;обмен между al и ah out 42h,al;в порт 42h старшее слово ax :ah sub temp,1 ;понижаем высоту delay 1 ;задержка на 1 мкс loop musicdown ;повторить цикл понижения nosound: in al,61h ;получим значение порта 61h в AL and al,0FCh ;выключить динамик out 61h,al ;в порт 61h mov dx,2651 ;для последующих циклов mov tonelow,dx inc cnt ;увеличиваем счётчик проходов, то есть ;количество звучаний сирены cmp cnt,5 ;5 раз ? jne go ;если нет, идти на метку go exit: mov ax,4c00h ;стандартный выход int 21h end main ;конец программы
|
--------------------
Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей
|