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 с.
Листингпрограммы
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
Рис. 1 - Пользовательское меню
Рис. 2 - Некорректный ввод