Смекни!
smekni.com

Программируемый периферийный интерфейс. Генерация звука с запретом и без запрета прерываний (стр. 1 из 2)

Министерство образования и науки Российской федерацииФедеральное Агентство по образованиюГОУ ВПО Московский Государственный Открытый университетЧебоксарский институт (филиал) Кафедра информационных технологий и программированияКурсовая работаПо дисциплине:«Вычислительные машины, системы и сети»Программируемый периферийный интерфейс. Генерация звука с запретом и без запрета прерываний. Выполнил студент:Ванюшин А.АСпециальность: 220201Форма обучения: дневнаяУчебный шифр: 607026Руководитель:Серолапкин А.В. 2008 г.

Оглавление

1. Постановка задачи

2. Пояснение

3. Код программы

4. Заключение

5. Список литературы


1. Постановка задач

Генерация звука. И обработка прерываний.

генерация звук система программа

2. Пояснение

Установка и чтение таймера.

Все IBM PC используют микросхему таймера 8253 (или 8254) для согласования импульсов от микросхемы системных часов. Число циклов системных часов преобразуется в один импульс, а последовательность этих импульсов подсчитывается для определения времени, или они могут быть посланы на громкоговоритель компьютера для генерации звука определенной частоты. Микросхема 8253 имеет три идентичных независимых канала, каждый из которых может программироваться.

Микросхема 8253 работает независимо от процессора. Процессор программирует микросхему и затем обращается к другим делам. Таким образом 8253 действует как часы реального времени - она считает свои импульсы независимо от того, что происходит в компьютере.

Однако, максимальный программируемый интервал составляет приблизительно 1/12 секунды. Для подсчета интервалов времени в часы и минуты нужны какие-то другие средства. Именно по этой причине импульсы от нулевого канала микросхемы таймера накапливаются в переменной, находящейся в области данных BIOS. Этот процесс показан на рис. 2-1. Это накопление обычно называется подсчетом времени суток. 18.2 раза в секунду выход канала 0 обрабатывается аппаратным прерыванием (прерыванием таймера), которое ненадолго останавливает процессор и увеличивает счетчик времени суток.

Число 0 соответствует полночи 12:00; когда счетчик достигает значения эквивалентного 24 часам, он сбрасывается на ноль. Другое время в течение суток легко определяется делением показателя счетчика на 18.2 для каждой секунды. Счетчик времени суток используется в большинстве операций, связанных со временем.

Программирование микросхемы таймера 8253/8254.

Каждый из трех каналов микросхемы таймера 8253 (8254 для AT) состоит из трех регистров. Доступ к каждой группе из трех регистров осуществляется через один порт; номера портов от 40H до 42H соответствуют каналам 0 - 2. Порт связан с 8-битным регистром ввода/вывода, который посылает и принимает данные для этого канала. Kогда канал запрограммирован, то через этот порт посылается двухбайтное значение, младший байт сначала. Это число передается в 16-битный регистр задвижки (latch register), который хранит это число и из которого копия помещается в 16-битный регистр счетчика. В регистре счетчика число уменьшается на единицу каждый раз, когда импульс от системных часов пропускается через канал. Kогда значение этого числа достигает нуля, то канал выдает выходной сигнал и затем новая копия содержимого регистра задвижки передвигается в регистр счетчика, после чего процесс повторяется. Чем меньше число в регистре счетчика, тем быстрее ритм. Все три канала всегда активны: процессор не включает и не выключает их. Текущее значение любого из регистров счетчика может быть прочитано в любой момент времени, не влияя на счет.

Каждый канал имеет две входные и одну выходную линии. Выходная линия выводит импульсы, возникающие в результате подсчета. Hазначение этих сигналов варьируется в зависимости от типа IBM PC:

Установка/чтение времени

При старте MS DOS запрашивает у пользователя текущее время. Введенное значение помещается в 4 байта, хранящие счетчик времени суток (начиная с 0040:006C, младший байт хранится первым). Hо сначала оно преобразуется в форму, в которой подсчитывается время суток, т.е. время преобразуется в число восемнадцатых долей секунды, прошедших с полночи. Это число постоянно обновляется 18.2 раз в секунду прерыванием таймера. Когда появляется очередной запрос на время, то текущее значение счетчика времени суток преобразуется обратно в привычный формат часы-минуты-секунды. Если при старте не было введено значения, то счетчик устанавливается в ноль, как будто сейчас полночь. Kомпьютеры снабженные микросхемой календаря-часов могут автоматически устанавливать счетчик времени суток.

Установка/чтение даты.

При включении компьютера MS DOS запрашивает у пользователя текущие дату и время. Время записывается в области данных BIOS. Дата же содержится в переменной в COMMAND.COM. Она хранится в формате трех последовательных байтов, которые содержат соответственно день месяца, номер месяца и номер года, начиная с 0, где 0 соответствует 1980 году. В отличии от счетчика времени суток, адрес даты в памяти меняется с изменением версии DOS и положением в памяти COMMAND.COM. По этой причине для получения даты всегда надо использовать готовые утилиты Бейсика или MS DOS, а не обращаться к этой переменной напрямую.

Машины, оборудованные микросхемой календаря-часов, автоматически устанавливают время и дату с помощью специальной программы (обычно запускаемой при старте через файл AUTOEXEC.BAT). Kак получить доступ к микросхеме календаря-часов, см. [2.1.4]. Отметим также, что когда счетчик времени суток BIOS переходит через отметку 24 часов, MS DOS меняет дату.

3. Кодпрограммы.

.286

.MODEL TINY

.CODE

ORG 100h

Begin:

jmp start

DATASEG

PPI_PORT EQU 061h

ON EQU 03

OFF EQU 0FCh

MOD_PORT EQU 43h

FRQ_PORT EQU 42h

TIMERSET EQU 0B6h

PLRE EQU 5 ;Количество повторов

NUM EQU 16 ;количество нот

Music dw 131,5,262,5,294,5,330,5,350,5,392,5,440,5,491,5;1-ая мелодия

dw 491,5,440,5,392,5,350,5,330,5,294,5,262,5,131,5;2-ая

dw 262,5,491,5,262,5,491,5,262,5,491,5,262,5,491,5;3-ая

dw 491,3,294,3,294,3,330,3,294,3,350,3,491,3,491,3;4-ая

Message db ’ nevernj’,13,10,'$'

Message1 db 'The program have already been loaded. Unload y/n? $'

Message2 db 'The program was loaded$'

Message3 db 10,13,'The program was unloaded$'

atime dw 3 DUP(0)

time dw 3 DUP(0)

filename db 'time.dat',0 ;Имяфайласданными

timeinfo db 50 DUP(?) ;Времяизфайла

cmdinfo db 50 DUP(?) ;Командная строка

oldintoff dw ? ;Смещение старого обработчика прерывания 1Ch

oldintseg dw ? ;Сегмент старого обработчика прерывания 1Ch

oldintoff7 dw ? ;Смещение старого обработчика прерывания 7h

oldintseg7 dw ? ;Сегмент старого обработчика прерывания 7h

count db 0

musn db 1 ;Номер воспроизводимой мелодии

Play PROC ;Воспроизведение музыки

;Включим Speaker

in al,PPI_PORT

or al,ON

out PPI_PORT,al

mov [count],0

R_play:

inc [count]

xor ax,ax

mov al,cs:[musn]

dec ax

mov bx,28

mul bx

mov si,ax

mov di,00

LoopM:

mov ax,cs:word ptr Music[si]

push ax

mov ax,TIMERSET

out MOD_PORT,ax

pop ax

push ax

and ax,0FFh

out FRQ_PORT,ax

pop ax

shr ax,8

out FRQ_PORT,ax

push si

mov ah,0

int 1Ah

pop si

mov bx,dx

push ax

add si,2

add di,2

mov ax,cs:word ptr Music[si]

add bx,ax

pop ax

Loop1:

push si

mov ah,0

int 1Ah

pop si

cmp dx,bx

jle Loop1

add si,2

add di,2

cmp di,NUM+NUM

jnz LoopM

cmp [count],PLRE

jb R_Play

;Выключим

in al,PPI_PORT

and al,OFF

out PPI_PORT,al

ret

Play ENDP

inmem PROC ;Восстановление старого обработчика прерывания

push ds

mov ax,251Ch

mov dx,cs:word ptr oldintseg

mov ds,dx

mov dx,cs:word ptr oldintoff

int 21h

mov ax,2507h

mov dx,cs:word ptr oldintseg7

mov ds,dx

mov dx,cs:word ptr oldintoff7

int 21h

pop ds

ret

inmem ENDP

release PROC ;Удаление из памяти

mov ah,49h

mov cx,cs

mov es,cx

int 21h

ret

release ENDP

int1Ch: ;обработчикпрерывания

pushf

call cs:dword ptr oldintoff

pusha

push ds

push es

mov ah,2

push cs

pop ds

int 1Ah ;Получение системного времени

lea di,time ;Смещение массива со временем в di

mov [di],ch ;Часы

add di,2

mov [di],cl ;Минуты

add di,2

mov [di],dh ;Секунды

mov cx,3

push ds

pop es

lea di,time

lea si,atime

repe cmpsw ;Сравнение по словам времени системы и будильника

jne ext

mov al,20h ;Сообщение контроллеру прерываний

out 20h,al ;о завершении прерывания

pop es

pop ds

popa

call inmem ;Востановление старого обработчика прерываний

cli ;Запрет прерываний

call play ;Воспроизведение музыки

sti ;Разрешение прерываний

call release ;Освобождение памяти

iret ;Выход из обработчика

ext: ;Переход сюда если время не совпало

mov al,20h

out 20h,al

pop es

pop ds

popa

iret

int_7h: ;Прерывание используется для завершения

pusha ;в случае если программа загружена в

push es ;резедентную память вызывается из

push ds ;вновь загруженной программы

call inmem

call release

pop ds

pop es

popa

iret

start: ;Начало программы, до текущего места программ

push cs ;останется резидентной

pop ds

mov ax,351Ch ;Получаем старый вектор прерывания 1Ch

int 21h

cmp bx,offset int1Ch

jne @ne

mov ah,9

lea dx,Message1 ;Сообщение о том что программа уже загружена

int 21h

lp_a:

mov ah,8

int 21h

cmp al,'y'

je unl

cmp al,'Y'

je unl

cmp al,'n'

je st_p

cmp al,'N'

je st_p

jmp lp_a

unl:

int 7h

lea dx,Message3

mov ah,9

int 21h

st_p:

mov ah,4Ch

int 21h

@ne:

mov oldintoff,bx

mov oldintseg,es

mov ax,3507h ;Получаем и сохраняем старый вектор прерывания 07h

int 21h

mov oldintoff7,bx

mov oldintseg7,es

mov ah,3Dh ;Открытьфайл

mov al,0

lea dx,filename

int 21h

mov bx,ax ;Прочитатьизфайла

mov ah,3Fh

mov cx,100

mov dx,offset timeinfo ;Содержимоефайлав timeinfo

int 21h

push ds

pop es

lea di,timeinfo

call StrToTime

lea di,timeinfo

mov ch,10

mov cl,13

@met1:

mov ax,[di]

inc di

cmp ax,cx

jne @met1

inc di

call StrToMusic

mov ah,3Eh ;Закрытьфайл

mov bx,ax

int 21h

mov ah,62h

int 21h ;Получаем сегмент в котором командная строка

push es

mov es,bx

mov di,80h ;Смещение начиная с которого начинается

;команднаястрока

@1:

inc di

mov ah,es:[di]

cmp ah,32

je @1

cmp ah,13

je next

cmp ah,'/';

jne outinfo

inc di

mov ah,es:[di]

cmp ah,'t' ;Проверка на параметр /t

jne @2

inc di

push ax

call StrToTime

cmp ax,1

je outinfo

pop ax

mov ah,es:[di]

@2:

mov bl,es:[di]-1

cmp bl,13

je next

cmp bl,'/'

jne outinfo

cmp ah,'m'

jne outinfo ;Проверканапараметр /m

inc di

call StrToMusic

cmp ax,1