Уч. пособие к лабораторной работе Программирование системных устройств (1015477), страница 2
Текст из файла (страница 2)
Подставьте полученное число в команду, помеченную меткой wt: и снова запустите программу на обработку. При наличии камертона или абсолютного слуха проверьте частоту звучания сигнала 440 Гц. При отклонении частоты от заданной в процедуре beep проверьте правильность перевода частоты системного генератора в шестнадцатиричную форму и правильность записи команд загрузки этого числа в регистры (dx, ax). Запишите число команд задержки и число повторений цикла задержки, обеспечивающие 10-секундное звучание сигнала.
6. Изучите исходный код подпрограмм файла «playsnd.asm». Перенесите в сокращенный вариант процедуры sound этого модуля параметры, определяющие частоту системного генератора и длительность звучания сигнала 0.01 с, найденные при запуске предыдущей программы.
7. Получите у преподавателя или воспользуйтесь своим вариантом нотной записи музыкального фрагмента. Составьте таблицу частот (в герцах) и соответствующую ей таблицу длительностей звучания всех нот (в единицах равных 0.01 с) музыкального фрагмента. Для составления этих таблиц воспользуйтесь таблицей частот звучания нот семи октав, приведенной в приложении. При определении частоты звучания ноты также можно воспользоваться формулой
Fi = Fk 2(i-k)/12 или Fi = 440 2(i-46)/12,
где i – номер ноты в таблице, Fk – известная частота звучания ноты с номером k, (i-k) – количество полутонов музыкального звукоряда между нотами i и k (в октаве – 12 полутонов, а частоты одноименных нот соседних октав отличаются вдвое).
Длительность звучания целой ноты полагается равной 2 с, то есть двести 0.01-секундных интервалов, половинной ноты – 1 с (100 интервалов) и т.д. Паузы кодируются тоном частотой 30000 Гц, заведомо не слышимой ухом, соответствующей длительности.
8. Запишите содержание составленных таблиц в качестве аргументов операторов определения данных freq dw и time dw модуля playsnd.asm. Окончание таблицы частот обозначается 2-байтовым завершающим словом, состоящим из одних единиц (0ffffh). Число слов в таблице частот с учетом завершающего слова должно быть на единицу больше числа слов в таблице длительностей. При повторении нескольких подряд идущих значений в таблицах частот или длительностей при записи пользуйтесь оператором повторения данных dup.
9. Запустите файл playsnd.asm на обработку с помощью командного файла:
talr playsnd.
Если воспроизведенная встроенным динамиком ПК мелодия содержит ошибки, то проверьте правильность кодировки и записи таблиц частот и длительностей.
Исходный код подпрограмм файла «sound.asm »
Структура вызовов подпрограмм и расположения данных.
; Генерация сигнала заданной частоты и длительности
astack segment stack
dw 48 dup (?) ; стек размером 96 байт
astack ends
adata segment
buffer db 'time= . ',' sec $' ; область памяти для вывода на дисплей времени звучания
hsecs db ? ; место для записи сотых долей секунды текущего времени
secs db ? ; место для записи секунд текущего времени
tmp db ? ; место временного хранения управляющего слова системного порта
adata ends
start segment
assume cs:start,ds:adata,ss:astack,es:adata
;
sound proc
; Генерация сигнала длительностью 1/100 сек.
; с частотой, передаваемой в регистре [DI]
push ax
push bx
push cx
push dx
push di
mov al,0B6h ; задание номера счетчика и выбор режима его работы
out 43h,al
mov dx,0010h ; вместо 0010h подставьте значение двух старших байта входной частоты
mov ax,1000h ; вместо 1000h подставьте два младших байта входной частоты в Гц
div di ; вычисление длительности периода
out 42h,al ; запись в счетчик младшего байта периода
jcxz $+2 ; задержка
jcxz $+2
mov al,ah
out 42h,al ; запись в счетчик старшего байта периода
in al,61h ; сохранение текущего управляющего слова
mov tmp,al ; ...в ячейке tmp
or al,3 ; включение...
out 61h,al ; ...таймера
mov ah,2ch ; запрос системного времени
int 21h
mov secs,dh
mov hsecs,dl
wt: mov cx,30000 ; вместо 30000 подставьте точное количество повторения цикла
spkon: jcxz $+2 ; вставьте нужное
jcxz $+2 ; количество
loop spkon ; команд задержки
dec bx
jnz wt
mov al,tmp
out 61h,al ; выключение таймера
mov ah,2ch ; запрос системного времени
int 21h
sub dl,hsecs ; вычисление сотых долей секунды
jnc sub_sec
add dl,100
dec dh
sub_sec:sub dh,secs ; вычисление секунд звучания
mov secs,dh
mov al,dl
cbw
lea di,buffer+9
call convert ; преобразование сотых секунды в ASCII-код
mov al,secs
cbw
lea di,buffer+6
call convert ; преобразование секунд в ASCII-код
mov ah,9
mov dx,offset buffer
int 21h ; вывод результатов на экран