Смекни!
smekni.com

Создание приложения, обеспечивающего генерацию звука с помощью системного таймера (стр. 3 из 3)

3.2.4 Выходные и выходные данные

Входными данными является номер выбранного пункта меню.

Выходные данные – это сгенерированная мелодия в соответствии с выбранным пунктом.

3.3 Руководство оператора

3.3.1 Назначение программы

Данная программа предназначена для генерации звука с использованием системного таймера посредством системного динамика.

3.3.2 Выполнение программы

1. Для запуска программы необходимо запустить приложение Kur.exe

2. Выбрать любой из предложенных пунктов меню.

3. Для генерации мелодии «Чижик-Пыжик» выберите пункт 1

4. Для генерации мелодии «Подмосковные вечера» выберите пункт 2

5. Для выхода из программы выход из программы выберите пункт q

3.3.3 Сообщения оператору

При загрузке программы выводится простое пользовательское меню:

Enter the point of menu:

1- CHIZHIK-PYZHIK

2 - PODMOCKOVNYE VECHERA

q– Qiute

Если пользователь введет пункт меню, который не предусмотрен программой, то на экран будет выведено сообщение.

ЗАКЛЮЧЕНИЕ

В ходе выполнения курсовой работы было создано приложение, которое способно генерировать мелодии «Чижик-Пыжик» и «Подмосковные вечера».

Для реализации поставленной цели были реализованы следующие задачи:

- Изучены принципы работы системного таймера

- Разработаны алгоритмы для перехвата и обработки прерываний системного таймера

- Создана процедура для извлечения очередного звука

- Создана процедура для обработки символов, введенных с клавиатуры

СПИСОК ЛИТЕРАТУРЫ

1. Абель П. Язык Ассемблера для IBM PC и его программирование - М.: Высшая школа,1992. – 252с.

2. С.В. Зубков Ассемблер для DOS, Windows и Unix – М.: ДМК Пресс, 1999. – 630 с.

3. И. Юров Assembler – СПб.: Питер, 2001. – 624 с.

ПРИЛОЖЕНИЕ 1

Листингпрограммы

Assume CS: Code

Code SEGMENT

286

Start proc; Основная процедура

mov ax,cs

movds,ax; DS = CS

iniflag db 0; Флаг звучания

old_int1c_off dw 0; Смещение старого вектора

old_int1c_seg dw 0; Сегмент старого вектора

tek_mel dw?; Адрес текущей ноты выбранной мелодии

mov ax,351ch

int 21h

mov cs:old_int1c_off,bx

mov cs:old_int1c_seg,es

lea dx,new_int1c

mov ax,251ch

int 21h; DS:DX – адрес новой программы обр.

mov ah,09h

lea dx,menu

int 21h

beg1:

call kbin; Опросклавиатуры

cmp al,'1'

jnz beg2 ; Нет

mov byte ptr iniflag,1; Взведениефлагазвуч.

lea ax,mel1

mov tek_mel,ax

jmp beg1; Переход на начало цикла

beg2:

cmp al,'2'

jnz beg3

mov byte ptr iniflag,1

lea ax,mel2

mov tek_mel,ax

jmp beg1

beg3:

cmp al,'q'

jnz beg4

jmp beg5

beg4:

mov ah,09h

lea dx,er

int 21h

jmp beg1

beg5:

Восстановление старого вектора 1с и выход

mov dx,old_int1c_off

mov ax,old_int1c_seg

mov ds,ax; DS:DX – адрес устанавл. вектора

mov ax,251ch

int 21h

movax,4c00h

int21h

start endp

Новый обработчик прерывания 1ch

new_int1c proc far

pusha

callmuz; Вызов процедура извлечения звука

popa

iret

new_int1c endp

Процедура извлечения очередного звука

tek_mel – адрес текущей ноты выбранной мелодии

muz proc near

test byte ptr cs:iniflag,0ffh; Проверка флага

jnz muz1

muze:

in al,61h ; Чтение состояния системного порта В

and al,0fch; Запрещение звучания (биты 0 и 1)

out 61h,al; Запись в системный порт В

jmp ex ; Выход, если флаг не взведен

muz1:

mov si,cs:tek_mel; Адрес текущей ноты

mov bl,cs:[si]; Текущая нота

cmp bl,255; Пауза?

jnz muz2

Выключение звука

in al,61h

and al,0fch

out 61h,al

inc cs:tek_mel; Переход к адресу след. ноты

jmp ex

muz2:

or bl,bl; = 0?

jnz muz3

jmp muze

muz3:

xor bh,bh

mov ax,cs:noty [bx]

Программирование делителя частоты 2 канала

inc cs:tek_mel; Переход к адресу след. ноты

out 42h,al; Мл.байт частоты. канал 2 таймера

xchg al,ah; AH. AL

out 42h,al; Ст. байт частоты. канал 2 таймера

Разрешение звучания

in al,61h

or al,3; Разрешение звучания (биты 0 и 1)

out 61h,al; Запись в системный порт В

ex:

ret

muz endp

kbin proc near; Ввод с клавиатуры и проверка на выбор игры

mov ah,0

int 16h

ret

kbin endp

Мелодия "ЧижикПыжик"

mel1 db 17,17,255,13,13,255,17,17,255,13,13,255,18,18,255

db 17,17,255,15,15,15,15,255,255

db 8,8,255,8,8,255,8,8,255,10,255,12,255

db 13,13,255,13,13,255,13,13,13,13

db 0

Мелодия "Подмосковные вечера"

mel2 db 1,1,1,4,4,4,8,8,8,4,4,4,6,6,6,6,6,6,4,4,4,3,3,3

db 8,8,8,8,8,8,6,6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1,1

db 0

menu db 10 dup(0ah), 30 dup(20h), 'Enter the point of menu:'

db 0dh,0ah,30 dup(20h),'1 - CHIZHIK-PYZHIK'.0dh,0ah,30 dup(20h),'2 - PODMOCKOVNYE VECHERA'.0dh,0ah,30 dup(20h), 'q - Quit',5 dup(0ah), "$ "

er db 'Incorrect input! Try again!',0dh,0ah,"$ "

Коэффициентыделениядлянот

noty dw 0eeeh,0e18h,0d49h,0c8eh,0bdfh,0b2fh,0abeh

dw 9f7h,968h,8e0h,861h,7e8h,777h,70ch,6a5h,647h

dw 5edh,597h,547h,4fbh,4b4h,470h,430h,3f4h

dw 3bbh,386h,352h,323h,2f6h,2cbh,2a3h,27dh,25ah,238h,218h,1fah

dw 1ddh,1c3h,1a9h,192h,17bh,166h,152h,13fh,12dh,11ch,10ch,0fdh

dw 0

code ends

END

ПРИЛОЖЕНИЕ 2

Рис. 1 - Пользовательское меню

Рис. 2 - Некорректный ввод