Помощь в написании студенческих работ
Антистрессовый сервис

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

РефератПомощь в написанииУзнать стоимостьмоей работы

При старте MS DOS запрашивает у пользователя текущее время. Введенное значение помещается в 4 байта, хранящие счетчик времени суток (начиная с 0040:006C, младший байт хранится первым). Hо сначала оно преобразуется в форму, в которой подсчитывается время суток, т. е. время преобразуется в число восемнадцатых долей секунды, прошедших с полночи. Это число постоянно обновляется 18.2 раз в секунду… Читать ещё >

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

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

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

Выполнил студент:

Ванюшин А. А Специальность: 220 201.

Форма обучения: дневная Учебный шифр: 607 026.

Руководитель:

Серолапкин А.В.

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.

je outinfo.

jmp next.

outinfo:

pop es.

mov ah, 9.

lea dx, Message ;Сообщение о том что командная строка.

int 21h ;содержит не верный параметр

jmp exit.

next: ;Выполняется если данные в командной строке.

pop es.

cli ;корректны.

mov dx, offset int1Ch.

mov ax, 251Ch ;Устанавливаем новый обработчик прерывания 1Ch.

int 21h.

sti.

mov dx, offset int_7h.

mov ax, 2507h ;Устанавливаем новый обработчик прерывания 07h.

int 21h.

lea dx, Message2 ;Вывод сообщения о том что программа была.

mov ah, 9 ;загружена.

int 21h.

lea dx, start ;Оставляем резидентной.

int 27h.

exit:

mov ah, 4ch.

int 21h.

StrToTime PROC ;Перевод строки времени в число.

xor dh, dh.

mov [count], dh.

lea si, atime.

conv:

xor ax, ax.

mov cx, 10.

mov ah, es:[di].

cmp ah,'0'.

jb res.

cmp ah,'9'.

ja res.

xor ax, ax.

@st:

xor bx, bx.

mov bl, es:[di].

cmp bl,'9'.

ja @e1.

cmp bl,'0'.

jb @e1.

sub bl,'0'.

mul cx.

add ax, bx.

inc di.

jmp @st.

@e1:

inc [count].

call ConvtoBCD.

mov [si], ax.

inc si.

inc si.

inc di.

cmp [count], 3.

jb conv.

xor ax, ax.

jmp stop1.

res:

mov ax, 1.

stop1: ;Содержит 1 если ппроизошла ошибка при переводе.

ret.

ENDP.

StrToMusic PROC ;Преобразует строку содержащую номер мелодии.

xor bx, bx ;в число.

mov bl, es:[di].

cmp bl,'9'.

ja @en1.

cmp bl,'0'.

jb @en1.

sub bl,'0'.

mov [musn], bl.

xor ax, ax.

jmp fin.

@en1:

xor ax, ax.

mov ax, 1 ;Содержит 1 если произошла ошибка при переводе.

fin:

ret.

ENDP.

ConvToBCD PROC ;Преобразует к BCD входные и выходные данные в ax.

push bx.

push cx.

push dx.

mov bx, 10.

div bx.

mov cx, dx.

mov bx, 16.

mul bx.

add ax, cx.

pop dx.

pop cx.

pop bx.

ret.

ENDP.

END Begin.

Заключение.

В ходе выполнения практической работы были закреплены и систематизированы полученные мною теоретические знания. Задача курсовой работы была выполнена:

1. создана система с использованием средств языка программирования ассемблер.

2. Создана система генерации звука .

3. Поставленная задача выполнена.

Список используемой литературы.

1) А. Алексеев — Assembler.

2) А. Фог — Оптимизация для процессоров семейства Pentium.

3) В. Еpшов — Ассемблер и программирование для IBM PC.

4) В. Пирогов — Ассемблер для Windows.

5) В. Юров — Assembler. Учебный курс.

6) Д. Брэдли — Программируем на языке ассемблера.

7) К. Финогенов — Основы языка ассемблера.rar.

8) П. Абель — Ассемблер и программирование для IBM PC.

9) Р. Журден — Справочник программиста на персональном компьютере IBM PC.

Показать весь текст
Заполнить форму текущей работой