Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра САПР
Лабораторна робота №10
з курсу“Архітектура комп’ютера”
на тему: “Програмування системного таймера 8253/8254 та робота з годинником реального часу”.
Лабораторне завдання
Запрограмувати таймер на виконання мелодії -Metallica "Nothing Else Matters" по вказаним кодам:
E3(1/8) P(1/8) E3(1/4) P(1/8) E3(1/8) E2(1/4) P(1/8) E3(1/8) F3(1/8) E3(1/8) D3(1/8) D3(1/8) E3(1/8) D3(1/8) A2(1/8) P(1/8) A2(1/4) P(1/8) A2(1/8) P(1/8) H2(1/8) A2(1/4)
Результати виконаних пунктів завдання
Програма:
.186
.model small
.stack 100h
PORT_B EQU 61H
COMMAND_REG EQU 43H
LATCH2 EQU 42H
B4 EQU 16 ; тривалості нот
B2 EQU B4/2
B1 EQU B4/4
M3 EQU 1 ; ноти
M2 EQU 2
FA EQU 3
RE EQU 4
LA EQU 5
Se EQU 6
FIN EQU 0FFH
.data
; таблиця частот
FREQUENCY DW 896,1809,855,1015,2711,2415
; тривалість нот
BEAT DB B1,B1,B2,B1,B1,B2,B1,B1
DB B1,B1,B1,B1,B1,B1
DB B1,B1,B2,B1,B1,B1,B1,B2
; номер частоти ноти
MELODY DB M3, ,M3, ,M3,M2, ,M3
DB FA,M3,RE,RE,M3,RE
DB LA, ,LA, ,LA, ,Se,LA,FIN
.code
.startup
JMP INIT
; дивимося ноту, отримуємо її частоту і поміщаємо в канал 2
NEXT_NOTE: PUSHA
IN AL,PORT_B ; отримуємо статус порта В
AND AL,0FCH ; виключаємо динамік
OUT 61H,AL ; заміняємо байт
POPA
; Ініціалізація
INIT: PUSHA
IN AL,PORT_B ; отримужмо поточний статус
OR AL,00000011B ; дозволяємо динамік и таймер
OUT PORT_B,AL ; заміняємо байт
MOV SI,0 ; ініціалізуємо вказівник
MOV AL,0B6H ; встановлення для канала 2
OUT COMMAND_REG,AL ; посилаємо в командний регістр
POPA
LEA BX,MELODY ; беремо зміщення для мелодії
MOV AL,[BX][SI] ; беремо код n-ної ноти рядка
CMP AL,0FFH ; перевірка на кінець рядка
JE NO_MORE ; якщо кінець, то на вихід
CBW ; перетворюємо в слово
; отримання частоти
MOV BX,OFFSET FREQUENCY ; зміщення таблиці частот
DEC AX ; починаємо відлік з 0
SHL AX,1 ; *2, оскільки слова
MOV DI,AX ; адресація через DI
MOV DX,[BX][DI] ; отримуємо частоту з таблиці
; починаємо відтворення ноти
MOV AL,DL ; готовимо молодший байт частоти
OUT LATCH2,AL ; посилаємо його
MOV AL,DH ; готовимо старший байт частоти
OUT LATCH2,AL ; посилаємо його
; створення циклу затримки
MOV AH,0 ; номер функцїї читання лічильника
INT 1AH ; отримуємо значення лічильника
MOV BX,OFFSET BEAT ; зміщення таблиці довжин
MOV CL,[BX][SI] ; беремо довжину наступної ноти
MOV CH,0
MOV BX,DX ; беремо молодше слово лічильника
ADD BX,CX ; визначаємо момент закінчення
STILL_SOUND:INT 1AH ; беремо значення лічильника
CMP DX,BX ; порівнюємо із закінченням
JNE STILL_SOUND ; нерівні - продовжуємо звук
INC SI ; переходимо до наступної ноти
JMP NEXT_NOTE
; закінчення
NO_MORE: IN AL,PORT_B ; отримуємо статус порта В
AND AL,0FCH ; виключаємо динамік
OUT 61H,AL ; заміняємо байт
.exit 0
End
Висновок:
На цій лабораторній роботі я навчився програмувати системний таймер 8253/8254 та працювати з годинником реального часу.