;---------Prg_7_1.asm---------------
;Программа ,имитирующая звук сирены.
;Изменение высоты звука от 450 Гц до 2100 Гц.
;Используется макрос delay (задержка).
;При необходимости
;можно поменять значение задержки (по умолчанию - для процессора Pentium).
;------------------------------------
masm
model	small
stack	100h
delay macro time
;макрос задержки, его текст ограничивается директивами macro и endm.
;На входе - значение задержки (в мкс)
	local	ext,iter
	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,0B6h
	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	;конец программы

