Таймер и музыка через порты спикера(asm)


Добавил:DMT
Дата создания:24 января 2008, 1:32
Дата обновления:24 января 2008, 1:32
Просмотров:13603 последний вчера, 6:50
Комментариев: 0
Таймер и музыка
Одно из наиболее распространенных применений таймера - ге-нерация звуковых сигналов и воспроизведение музыки. Таймер позволяет воспроизводить музыку в фоновом режиме, т. е. во время работы программы может звучать музыка (в самом простом виде ее воспроизведения).
Как мы уже говорили, канал 2 микросхемы 8254 связан с гро-мкоговорителем компьютера. Однако громкоговоритель не просто соединен с выходом OUT канала 2. Порт вывода 6Ih также ис-пользуется для управления громкоговорителем. Младший бит по-рта 61h подключен ко входу GATE канала 2 таймера. Этот бит при установке в 1 разрешает работу канала, т. е. генерацию им-пульсов для громкоговорителя.
Дополнительно для управления громкоговорителем используется бит 1 порта 61h. Если этот бит установлен в 1, импульсы от канала 2 таймера смогут проходить на громкоговоритель.
Таким образом, для включения звука надо выполнить следую-щие действия:
запрограммировать канал 2 таймера на нужную частоту (т. е. загрузить регистр счетчика канала нужным значе-нием) ;
для включения звука установить в 1 два младших бита порта 61h.
Так как остальные б битов порта 61h используются для других целей, установка младших битов должна выполняться таким об-разом, чтобы значения остальных битов не были изменены. Для этого вначале надо считать байт из порта 61h в рабочую ячейку памяти, установить там нужные биты, затем вывести новое зна-чение байта в порт 61h.
Очевидно, что для выключения звука надо сбросить два млад-ших бита порта 61h в 0 (при этом нельзя изменять значение ос-тальных битов этого порта).
Мелодия (одноголосая), как известно, состоит из нот, разде-ленных или не разделенных паузами. При проигрывании мелодии необходимо для каждой ноты программировать соответствующим образом канал 2 таймера и включать громкоговоритель (с помо-щью порта 61h) на определенное время, равное длительности ноты. Затем программа должна выключить динамик и выдержать паузу, если требуется, перед проигрыванием следующей ноты.
Программа может генерировать звуки и другим способом, не используя таймер. Для этого нужно сбросить младший бит порта 61h и, управляя битом 1 этого порта, формировать импульсы для громкоговорителя, т. е. программа должна устанавливать этот бит то в 0, то в 1 с некоторым периодом. Высота генерируемого звука будет соответствовать этому периоду.
Можно также комбинировать эти два способа, получая разно-образные звуковые эффекты.
Для проигрывания мелодии в фоновом режиме можно предло-жить следующий способ, основанный на использовании периоди-ческого прерывания от канала 0 таймера.
Основная идея заключается в использовании прерывания 1Ch, которое вырабатывается таймером с частотой примерно 18,2 Гц. Ваш обработчик этого прерывания осуществляет контроль за вы-боркой нот из массива, содержащего мелодию, и программирова-ние микросхемы 8254. Например, один раз в полсекунды обработ-чик проверяет, не пора ли прекратить звучание одной ноты и на-чать проигрывание следующей ноты. Если пора, он выключает громкоговоритель и перепрограммирует канал 8254 на новую час-тоту, соответствующую следующей ноте.
Основное преимущество использования таймера для проигры-вания мелодии - независимость констант, используемых для программирования канала таймера от производительности системы. Ва-ша мелодия будет звучать одинаково и на медленной IBM XT, и на Super - AT с процессором 80486, но при условии, что Вы будете использовать таймер и для организации задержек при исполнении мелодии.
Для определения значения, которое должно быть записано в регистр счетчика канала 2 таймера, надо разделить 1193180 на требуемую частоту в герцах.
В таблице ниже приведены частоты нот для второй октавы. При повышении (понижении) тона на октаву частота соответствующей ноты умножается (делится) на два.
Нота Частота, Гц
До 261,7
До-диез 277,2
Ре 293,7
Ре-диез 311,1
Ми 329,6
Фа 349,2
Фа-диез 370,0
Соль 392,0
Соль-диез 415,3
Ля 440,0
Ля-диез 466,2
Си 493,9

Текст программы
Код на ASM
  1. code_seg segment
  2. TSRprog proc far
  3. assume cs:code_seg
  4. org 100h
  5. begin:
  6. mov cx,72
  7. lea si,music
  8. beg: push cx
  9. in al,61h
  10. and al,0ffh-3
  11. out 61h,al
  12. mov al,10110110b
  13. out 43h, al
  14. cmp cx,37
  15. jae M2
  16. dec si
  17. dec si
  18. M2:
  19. mov ax,cs:[si]
  20. cmp cx,37
  21. jb M1
  22. inc si
  23. inc si
  24. M1:
  25. out 42h,al
  26. mov al,ah
  27. out 42h,al
  28. in al,61h
  29. or al,3
  30. out 61h, al
  31. in al,61h
  32. mov ax,8600h
  33. mov bx,cs
  34. mov es,bx
  35. lea bx,flag
  36. mov cx,7
  37. mov dx,0A120h
  38. int 15h
  39. bue:
  40. pop cx
  41. loop beg
  42. in al,61h
  43. and al,0ffh-3
  44. out 61h,al
  45. mov ax,4c00h
  46. int 21h
  47. flag db 0
  48. music dw 9119,8609,8125,7671,7240,6834,6450,6088,5746,5424,5119,4832
  49. dw 4559,4304,4062,3835,3620,3416,3224,3043,2873,2711,2559,2415
  50. dw 2280,2152,2031,1918,1810,1708,1612,1522,1437,1356,1280,1208
  51. index db 0
  52. TSRprog endp
  53. code_seg ends
  54. end begin
При использовании обязательна ссылка на http://DMTSoft.ru
up