Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра САПР
Звіт
Про виконання
Лабораторної роботи №10
Тема: Програмування системного таймера 8253/8254
Виконала:
студентка групи КН-3
Львів – 2009
Тема: Програмування системного таймера 8253/8254.
Мета: Навчитися програмувати системний таймер 8253/8254.
Завдання
Запрограмувати таймер на виконання мелодії Ricky Martin “Living La Vida Loca” за вказаним кодом:
Cis3(1/16), P(1/8), P(1/16), Cis3(1/4), P(1/16), P(1/16), A2(1/8), H2(1/8), D3(1/16), P(1/8), P(1/16), D3(1/16), P(1/8), P(1/16), Cis3(1/4), P(1/4), P(1/8), Cis3(1/16), P(1/8), P(1/16), Cis3(1/4), P(1/16), P(1/16), A2(1/8), Gis2(1/8), H2(1/8), P(1/8), A2(1/4), P(1/4), P(1/8), Cis3(1/16), P(1/8), P(1/16), Cis3(1/4), P(1/8), A2(1/8), H2(1/8), D3(1/16), P(1/8), P(1/16), D3(1/16), P(1/8), P(1/16), Cis3(1/4), P(1/4), P(1/8), Cis(1/16), P(1/8), P(1/16), Cis3(1/4), P(1/8).
Короткі теоретичні відомості
061H ■PC/XT■ PPI (програмований периферійний інтерфейс), порт B.
╓7┬6┬5┬4┬3┬2┬1┬0╖ біт
║_│_│_│_│_│0│_│_║
║ ╚═► 0: Таймер 2 вхід (спікер) ═╦═► OR 03H=спікер ON
╚═══► 1: Таймер 2 данні ═════╝ AND 0fcH=спікер OFF
Для занесення частоти звучання динаміка використовую канал 2 системного таймера з адресою 42h
Структура регістра керуючого слова системного таймера:
7 6 5 4 3 2 1 0
Біти:
0 – встановлення типу рахунку таймера (0 – двійковий, 1 – десятковий)
1,2,3 – встановлення режиму роботи вибраного каналу таймера (від 0 до 5-ти)
4,5 – код команди читання/запису регістра лічильника (01 – старший байт, 10 – молодший, 11 – спочатку молодшого, а потім старшого)
6,7 – вибір каналу таймера (0 – 2 канали, 11 – код читання стану каналу)
Код програми
.8086
code segment
org 100h
assume cs:code,ds:code,es:code,ss:code
start:
mov ax,1 ;встановлення значення початкової ноти
push ax
xor ax,ax ;обнулення ax
xor al,00000011b ; встановлення байта дозволу динаміка
out portb,al ; записуєм байт у відповідний порт
mov si,0 ; обнулюю si
mov al,10110110b ; запис значення керуючого регістра
out reg,al ; його завантаження
next:
pop bx ;в стеку - порядковий номер ноти
mov al,bl ; в al - номер ноти
inc bx ; збільшення номера і запис в стек
push bx
cmp al,54 ;53 ноти, якщо 54-та - вихід
je no_more
cbw ; розширення вмісту al до ax
lea bx,freq ; адреса з частотами нот
dec ax ;зменшення пор. номера ноти на 1
shl ax,1 ; множення на 2 (бо працюэмо зі словами)
mov di,ax ; зміщення відносно початку адреси нот до поточної в di
mov dx,[bx][di] ; читаємо в dx частоту ноти
mov al,dl ;записуэмо молодший байт частоти звучання
out chan2,al
mov al,dh ;старший байт
out chan2,al
mov ah,0 ; 0-ва ф-ція - отримати значення системного таймера
int 1ah
lea bx,beat ; завантаження адреси довжин звучання зквуку
mov cl,[bx][si] ; довжина поточної ноти в cx
mov ch,0
mov bx,dx
add bx,cx ; відлік від поточного часу
st_sou:
int 1ah ; знову отримуєм значення системного таймеру
cmp dx,bx ; порівнюєм з потрібним
jne st_sou ; не рівні - продовжуєм звучання
inc si ; додаємо номер довжини ноти
jmp next ; перехід на звучання наступної ноти
no_more:
in al,portb ; дістаємо байт стану динаміка
and al,11111100b ; обнулення бітів активації динаміка
out 61h,al
pop bx ; вирівнювання стеку
mov ah,4ch ; вихід з програми
int 21h
beat db 1,2,1,4,1,1,2,2,1,2,1,1,2,1,4,4,2,1,2,1,4,1,1,2,2,2,2,2,2,4,4,2,1,2,1,4,2,2,2,1,2,1,1,2,1,4,4,2,1,2,1,4,2
freq dw 0432h,0,0,0432h,0,0,0a97h,096fh,03f7h,0,0,03f7h,0,0,0432h,0,0,0432h,0,0,0432h,0,0,0a97h,059ch,096fh,0,096fh,0,0a97h,0,0,0432h,0,0,0432h,0,0a97h,096fh,03f7h,0,0,03f7h,0,0,0432h,0,0,10d0h,0,0,0432h,0
portb equ 61h
chan2 equ 42h
reg equ 43h
code ends
end start
lst – код
Turbo Assembler Version 4.1 01/19/09 14:13:28 Page 1
l10.asm
1 .8086
2 0000 code segment
3 org 100h
4 assume cs:code,ds:code,es:code,ss:code
5 0100 start:
6 0100 B8 0001 mov ax,1 ;встановлення значення початкової ноти
7 0103 50 push ax
8 0104 33 C0 xor ax,ax ;обнулення ax
9 0106 34 03 xor al,00000011b ; встановлення байта дозволу динаміка
10 0108 E6 61 out portb,al ; записуєм байт у відповідний порт
11 010A BE 0000 mov si,0 ; обнулюю si
12 010D B0 B6 mov al,10110110b ; запис значення керуючого регістра
13 010F E6 43 out reg,al ; його завантаження
14 0111 next:
15 0111 5B pop bx ;в стеку - порядковий номер ноти
16 0112 8A C3 mov al,bl ; в al - номер ноти
17 0114 43 inc bx ; збільшення номера і запис в стек
18 0115 53 push bx
19 0116 3C 36 cmp al,54 ;53 ноти, якщо 54-та - вихід
20 0118 74 2B je no_more
21 011A 98 cbw ; розширення вмісту al до ax
22
23 011B BB 0185r lea bx,freq ; адреса з частотами нот
24 011E 48 dec ax ;зменшення пор. номера ноти на 1
25 011F D1 E0 shl ax,1 ; множення на 2 (бо працюэмо зі словами)
26 0121 8B F8 mov di,ax ; зміщення відносно початку адреси нот до поточної в di
27 0123 8B 11 mov dx,[bx][di] ; читаємо в dx частоту ноти
28
29 0125 8A C2 mov al,dl ;записуэмо молодший байт частоти звучання
30 0127 E6 42 out chan2,al
31 0129 8A C6 mov al,dh ;старший байт
32 012B E6 42 out chan2,al
33
34 012D B4 00 mov ah,0 ; 0-ва ф-ція - отримати значення системного таймера
35 012F CD 1A int 1ah
36 0131 BB 0150r lea bx,beat ; завантаження адреси довжин звучання зквуку
37 0134 8A 08 mov cl,[bx][si] ; довжина поточної ноти в cx
38 0136 B5 00 mov ch,0
39
40 0138 8B DA mov bx,dx
41 013A 03 D9 add bx,cx ; відлік від поточного часу
42 013C st_sou:
43 013C CD 1A int 1ah ; знову отримуєм значення системного таймеру
44 013E 3B D3 cmp dx,bx ; порівнюєм з потрібним
45 0140 75 FA jne st_sou ; не рівні - продовжуєм звучання
46 0142 46 inc si ; додаємо номер довжини ноти
47 0143 EB CC jmp next ; перехід на звучання наступної ноти
48 0145 no_more:
49 0145 E4 61 in al,portb ; дістаємо байт стану динаміка
50 0147 24 FC and al,11111100b ; обнулення бітів активації динаміка
51 0149 E6 61 out 61h,al
52
53 014B 5B pop bx ; вирівнювання стеку
54 014C B4 4C mov ah,4ch ; вихід з програми
55 014E CD 21 int 21h
56
57 0150 01 02 01 04 01 01 02+ beat db 1,2,1,4,1,1,2,2,1,2,1,1,2,1,4,4,2,1,2,1,4,1,1,2,2,2,2,2,2,4,4,2,1,2,1, +
Turbo Assembler Version 4.1 01/19/09 14:13:28 Page 2
l10.asm
58 02 01 02 01 01 02 01+ 4,2,2,2,1,2,1,1,2,1,4,4,2,1,2,1,4,2
59 04 04 02 01 02 01 04+
60 01 01 02 02 02 02 02+
61 02 04 04 02 01 02 01+
62 04 02 02 02 01 02 01+
63 01 02 01 04 04 02 01+
64 02 01 04 02
65 0185 0432 0000 0000 0432 + freq dw 0432h,0,0,0432h,0,0,0a97h,096fh,03f7h,0,0,03f7h,0,0,0432h,0,0,0432h,0, +
66 0000 0000 0A97 096F + 0,0432h,0,0,0a97h,059ch,096fh,0,096fh,0,0a97h,0,0,0432h,0,0,0432h,0,0a97h,096fh,03f7h,0,0, +
67 03F7 0000 0000 03F7 + 03f7h,0,0,0432h,0,0,10d0h,0,0,0432h,0
68 0000 0000 0432 0000 +
69 0000 0432 0000 0000 +
70 0432 0000 0000 0A97 +
71 059C 096F 0000 096F +
72 0000 0A97 0000 0000 +
73 0432 0000 0000 0432 +
74 0000 0A97 096F 03F7 +
75 0000 0000 03F7 0000 +
76 0000 0432 0000 0000 +
77 10D0 0000 0000 0432 +
78 0000
79 =0061 portb equ 61h
80 =0042 chan2 equ 42h
81 =0043 reg equ 43h
82
83 01EF code ends
84 end start
Turbo Assembler Version 4.1 01/19/09 14:13:28 Page 3
Symbol Table
Symbol Name Type Value
??DATE Text "01/19/09"
??FILENAME Text "l10 "
??TIME Text "14:13:28"
??VERSION Number 040A
@CPU Text 0101H
@CURSEG Text CODE
@FILENAME Text L10
@WORDSIZE Text 2
BEAT Byte CODE:0150
CHAN2 Number 0042
FREQ Word CODE:0185
NEXT Near CODE:0111
NO_MORE Near CODE:0145
PORTB Number 0061
REG Number 0043
START Near CODE:0100
ST_SOU Near CODE:013C
Groups & Segments Bit Size Align Combine Class
CODE 16 01EF Para none
Результати
Результатом роботи програми є виконання мелодії вказаної в завданні пісні через внутрішній динамік комп’ютера.
Висновки
На цій лабораторній роботі я навчилася програмувати системний таймер 8253/8254.