1. Заголовок или название темы должно быть информативным 2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE] 3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора. 5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM! 6. Проверяйте программы перед тем, как выложить их на форум!!
Мелодия системного динамика, Все о системном динамике
Написать программу исполняющую на системном динамике песню про веселых гусей.
К сожалению, я пока не обладаю соответствующими навыками в программировании на ассемблере, но был бы очень признателен людям, которые откликнулись бы на эту тему и написали все что знаю о системном динамике, как к нему обращаться и работать. Как завершение этой темы, общими усилиями, хотелось бы написать процедуру биликанья динамика, т. е. в соответствии от введенной цифры он биликал бы соответствующую ноту. Вот.
; Таблица соответствия номеров полутонов обозначениям нот ; (в буквенной нотации), S - диез C equ 0 ;"до" D equ 2 ;"ре" E equ 4 ;"ми" F equ 5 ;"фа" G equ 7 ;"соль" A equ 9 ;"ля" B equ 11 ;"си" S equ 1 ;#
;--------------------------------------------------------------- ; play - воспроизведение ноты ; note = номер полутона ; octave = номер октавы ; len = длительность для размера 4/4 и заданного темпа
.code .startup ;воспроизведение ноты "ля" первой октавы play A,3,4
;выход mov ax,4C00h int 21h
;--------------------------------------------------------------- ; play_note - начинает воспроизведение ноты ; вход: ; al = номер полутона внутри октавы (0..11) ; ah = номер октавы (3 = первая фортепианная) ; выход: ; нет
play_note proc mov cl,ah ;cl = номер октавы cbw ;ax = номер полутона * 2 shl ax,1 lea bx,notes ;bx = @notes[номер полутона] add bx,ax mov al,0B6h ;загрузка упраляющего слова таймера out 43h,al ;(меандер на 3-м канале) mov ax,[bx] ;ax = notes[номер полутона] * 2^номер октавы shr ax,cl out 42h,al ;загрузка коэффициента деления в 3-й канал таймера mov al,ah out 42h,al in al,61h ;включение динамика or al,3 out 61h,al ret endp
;--------------------------------------------------------------- ; stop_note - выключает динамик ; вход: ; нет ; выход: ; нет
stop_note proc in al,61h and al,not 1 out 61h,al ret endp
;--------------------------------------------------------------- ; delay - задержка ; вход: ; cx = длительность задержки в 1/18 с (точнее - в 65536/1193180 с) ; выход: ; нет
delay proc xor ax,ax mov es,ax @@1: mov ax,es:[46Ch] @@2: hlt cmp ax,es:[46Ch] je @@2 loop @@1 ret endp
.const
; notes - таблица коэффициентов деления для октавы 0 (контроктавы) ; Коэффициенты деления для более высоких октав получаются ; путём умножения значений из таблицы на 2^(номер октавы)