МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра САПР
Звіт про виконання лабораторної роботи №10
на тему: “ПРОГРАМУВАННЯ ВИВОДУ ІНФОРМАЦІЇ НА ЕКРАН НА ЕОМ З МІКРОПРОЦЕСОРОМ Intel 8086(80286)”
з курсу: “ Комп’ютери та мікропроцесорні системи ”
Виконав
студент групи КН-3
Львів - 2006
МЕТА РОБОТИ
Вивчити основні можливості керування екраном в текстовому та графічному режимах.
КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ
Однією з основних складових будь-якого персонального компьютера є монітор. Усі дисплеї можна розділити на монохромні та кольорові (графічні).
Для роботи монохромного монітора задіяно 4 кбайти оперативної пам`яті, яка розміщена з адреси В0000Н. Дану область пам`яті називають дисплейним буфером. Два кбайти з 4-х використано для збереження кодів символів (25 стрічок по 80 позицій в кожній) і 2 кбайти для байтів-атрибутів, які забезпечують підкреслення, виділення яскравістю, інвертування та мигання.
Для роботи стандартного кольорового графічного монітора використано 16 кбайт пам`яті, яка починається з адреси В8000. Такий дисплей може працювати в кольоровому чи чорно-білому режимі. Дисплейний буфер забезпечує екранні сторінки (0-3) для екрана на 80 стовпчиків та 8 сторінок (0-7) для екрана на 40 стовпчиків. Байт-атрибут містить таку інформацію для символа, який відображається на дисплеї:
Фон Текст
Атрибут: BL R G B I R G B
Номер бітів: 7 6 5 4 3 2 1 0
де R, G, B - бітові позиції, які керують відповідно червоним, зеленим та синім променем в кольоровому моніторі. Біт 7 (BL) - встановлює мигання, а біт 3 (І) - інтенсивність світіння. Дана структура байта-атрибута справедлива для монограмного та графічного дисплея в текстовому режимі.
Усі екранні операції виконуються за допомогою команди переривання INT 10H, яка передає керування BIOS.
При використанні цього переривання в регістр АН заноситься код, який визначає функцію переривання.
АН=00: Встановлення режиму. Вміст регістра AL може бути таким:
00 - 40х25 чорно-білий текстовий режим;
01 - 40х25 стандартний 16-кольоровий текстовий режим;
02 - 80х25 чорно-білий текстовий режим;
03 - 80х25 стандартний 16-кольоровий текстовий режим;
04 - 320х200 стандартний 4-кольоровий графічний режим;
05 - 320х200 чорно-білий графічний режим;
06 - 640х200 чорно-білий графічний режим;
07 - 80х25 чорно-білий стандартний монохромний;
0D - 320х200 16-кольоровий графічний режим (EGA);
0E - 640х200 16-кольоровий графічний режим (EGA);
0F - 640х350 чорно-білий графічний режим (EGA);
10 - 640х350 64-кольоровий графічний режим (EGA);
Наступний приклад встановлює чорно-білий стандартний монохромний режим 80х25:
MOV AH, 00
MOV AL, 07
INT 10H
АН=01: Встановлення розміру курсора. Біти 4-0 в регістрі СН визначають розмір у вертикальному напрямку, а біти 4-0 у регістрі CL - для горизонтального напрямку. Можна встановити будь-який розмір курсора по вертикалі: від 0 до 14 для монохромних та від 0 до 7 для більшості кольорових моніторів.
АН=02: Встановлення позиції курсора. Ця функція встановлює курсор на екрані у відповідності з координатами стрічки та стовпчика. В регістр ВН - номер сторінки (0-3) DH - стрічка, DL - стовпчик.
Наведемо приклад:
MOV AH, 02
MOV BH, 01
MOV DH, 10
MOV DL, 10
INT 10H
AH=03: Читання теперішнього місця знаходження курсора. Функція повертає в DH - номер стрічки, а в DL - номер стовпчика. (Виконуючи цю функцію, необхідно в регістр ВН занести номер сторінки.)
АН=04: Читання місцезнаходження світлового пера.
АН=05: Вибір активної сторінки.
Приклад:
MOV AH, 05
MOV AL, сторінка
INT 10H
АН=06: Прокрутка екрана вверх. В регістр AL заносять кількість стрічок, ВН - атрибут, DX - координати. Подальші команди виконують прокрутку всього екрана на одну стрічку вверх:
MOV AH, 06 02 H
MOV BH, 07
MOV CX, 0000
MOV DX,184FH
INT 10H
AH=07: Прокрутка екрана вниз.
АН=08: Читання атрибута/символа в біжучій позиції курсора. Приклад:
MOV AH, 09
MOV AL, символ
MOV BH, cторінка
MOV BL, атрибут
MOV CX, повторення
INT 10H
АН=ОА: Вивід символа в біжучу позицію курсора. Приклад:
MOV AH, 0АН
MOV AL, символ
MOV BH, cторінка
MOV CX, повторення
INT 10H
АН=13: Вивід символьної стрічки (лише для АТ). Дана функція дозволяє виводити на екран символьні стрічки з встановленням і переміщенням курсора:
MOV AH, 13Н
MOV AL, сервіс
MOV BH, cторінка
MOV BР, адреса
MOV CX, довжина
MOV DX, екран
INT 10H
Значення в регістрі AL вказують:
0 - використати атрибут і не перемістити курсор;
1 - використати атрибут і перемістити курсор;
2 - вивести символ, потім атрибут і не перемістити курсор;
3 - вивести символ, потім атрибут і перемістити курсор.
Організувати вивід на екран, окрім використання десятого пере-ривання BIOS, можна за допомогою двадцять першого переривання DOS. Для цього необхідно в регістрі АН записати 09 та присвоїти ім`я масиву даних, який необхідно вивести на термінал. В кінці стрічки даних необхідно записати знак долара $, цей знак дасть змогу припинити вивід. Наведемо приклад виводу на екран стрічки даних:
NAME DB ‘IIIIII?’, ‘$’
MOV AH, 09
LEA DX, NAME
При середній роздільчій здатності кожний байт забезпечує чотири пікселі, які пронумеровані від 0 до 3:
Кожний піксел може бути зафарбований в один з чотирьох кольорів. Дане обмеження зумовлене тим, що у двох бітах можна розмістити чотири комбінації з нулів та одиниць. Для комбінації 00 можна вибрати будь-який колір фону з 16 можливих або вибрати 01, 10 та 11 для однієї з двох можливих палітр. Кожна палітра може мати три кольори:
С1 С0 Палітра 0 Палітра 1
0 0 фон фон
0 1 зелений голубий
1 0 червоний бузковий
1 1 коричневий білий
Для вибору кольору палітри та фону використовують переривання INT 10H. Для прикладу, якщо вибрати колір фону синій і палітру 1, то можливі кольори для піксела будуть синій, голубий, бузковий та білий. Байт, який містить значення 00011011, відображає синю, голубу, бузкову та білу точки.
Якщо необхідно задати колір палітри, то можна використати 10Н BIOS переривання. Наведемо приклад:
MOV AH,0BH встановлення коду палітри
MOV BH,01 вибір палітри
MOV BL,00 (зелений, червоний, коричневий)
INT 10H
ВН=00 визначає колір фону і бордюра у відповідності з вмістом регістра BL. Колір фону від 1 до 16 відповідає шістнадцятковим значенням від 0 до F;
BH=01 вибирає палітру відповідно до вмісту регістра BL (0 або 1);
Функція ОСН - виводить точку на екран. Приклад:
MOV AH,0СH
INT 21H
Розглянемо детальніше текстовий та графічний режими для кольорового монітора. Текстовий режим призначений для звичайних обчислень з виводом букв та цифр на екран. Цей режим однаковий для чорно-білих та кольорових моніторів. Текстовий режим забезпечує роботу з повним набором ASCII-кодів (256 символів). Кожний символ на екрані може відображатися в одному з 16 кольорів на одному з восьми кольорів фону. Бордюр екрана може мати також один з 16 кольорів.
Для побудови 16 кольорів використовують три основні (червоний, зелений, синій) та два однакові яскравості:
I R G B I R G B
Чорний 0 0 0 0 Сірий 1 0 0 0
Синій 0 0 0 1 Яскраво-синій 1 0 0 1
Зелений 0 0 1 0 Яскраво-зелений 1 0 1 0
Голубий 0 0 1 1 Яскраво-голубий 1 0 1 1
Червоний 0 1 0 0 Яскраво-червоний 1 1 0 0
Бузковий 0 1 0 1 Яскраво-бузковий 1 1 0 1
Коричневий 0 1 1 0 Яскраво-коричнев. 1 1 1 0
Білий 0 1 1 1 1 Яскраво-білий 1 1 1 1
Отже, будь-які символи можна відобразити на екрані в одному з 16-кольорів. Фон будь-якого символа може мати один з перших восьми кольорів. Окрім того, використовуючи байт-атрибут можна отримати мигаючі символи. Для прикладу, наведено типові значення атрибутів:
Текст по фону: Біт: 7 6 5 4 3 2 1 0
BL R G B I R G B
Чорний по білому 0 0 0 0 0 0 0 0
Синій по чорному 0 0 0 0 0 0 0 1
Червоний по синьому 0 0 0 1 0 1 0 0
Голубий по зеленому 0 0 1 0 0 0 1 1
Світло-бузковий по білому 0 1 1 1 1 1 0 1
Сірий по зеленому 1 0 1 0 1 0 0 0
Текст програми
(шестикутник, який можна переміщати по екрану)
.186
sseg segment stack
db 256 dup(?)
sseg ends
dseg segment 'data'
x1 dw 80
y1 dw 10
x2 dw 200
y2 dw 10
x3 dw 270
y3 dw 125
x4 dw 200
y4 dw 240
x5 dw 80
y5 dw 240
x6 dw 10
y6 dw 125
pochx dw ?
pochy dw ?
zbily dw ?
zbilx dw ?
col db 1
dseg ends
cseg segment 'code'
assume ss:sseg,cs:cseg,ds:dseg
start: jmp main
main: mov ax,dseg
mov ds,ax
mov ax,12h ;640x480x16
int 10h
call shestuk
m1: call read
cmp al,1bh
je endpr
cmp al,4bh ;a
je m2
cmp al,4dh ;d
je m3
cmp al,50h ;s
je m4
cmp al,48h ;w
je m5
jmp m1
m2: mov col,0
call shestuk
mov si,-10
call inc_ad
mov col,1
call shestuk
jmp m1
m3: mov col,0
call shestuk
mov si,10
call inc_ad
mov col,1
call shestuk
jmp m1
m4: mov col,0
call shestuk
mov si,10
call inc_ws
mov col,1
call shestuk
jmp m1
m5: mov col,0
call shestuk
mov si,-10
call inc_ws
mov col,1
call shestuk
jmp m1
endpr:
mov ax,0003h
int 10h
mov ax,4c00h
int 21h
line proc near
pusha
mov pochx,bx
mov pochy,ax
mov ax,cx
sub ax,pochx
jns dx_pos ;Якщо додатнє(SF=0)
neg ax
mov zbilx,1
jmp dx_neg
dx_pos: mov zbilx,-1
dx_neg: mov bx,dx
sub bx,pochy
jns dy_pos
neg bx
mov zbily,1
jmp dy_neg
dy_pos: mov zbily,-1
dy_neg: shl ax,1
shl bx,1
call tochka
cmp ax,bx
jna dx_le_dy
mov di,ax
shr di,1
neg di
add di,bx
cycle:
cmp cx, pochx
je exit_bres
cmp di,0
jl fractlt0
add dx, zbily
sub di,ax
fractlt0:
add cx, zbilx
add di,bx
call tochka
jmp cycle
dx_le_dy:
mov di,bx
shr di,1
neg di
add di,ax
cycle2:
cmp dx, pochy
je exit_bres
cmp di,0
jl fractlt02
add cx, zbilx
sub di,bx
fractlt02:
add dx,zbily
add di,ax
call tochka
jmp cycle2
exit_bres: popa
ret
line endp
tochka proc near
pusha
mov ah,0ch
mov al,col
mov bh,0
int 10h
popa
ret
tochka endp
shestuk proc near
pusha
mov cx,x1
mov dx,y1
mov bx,x2
mov ax,y2
call line
xchg cx,bx
xchg dx,ax
mov bx,x3
mov ax,y3
call line
xchg cx,bx
xchg dx,ax
mov bx,x4
mov ax,y4
call line
xchg cx,bx
xchg dx,ax
mov bx,x5
mov ax,y5
call line
xchg cx,bx
xchg dx,ax
mov bx,x6
mov ax,y6
call line
xchg cx,bx
xchg dx,ax
mov bx,x1
mov ax,y1
call line
popa
ret
shestuk endp
read proc near ;Вхід 0 вихід-al ASCII -код цифри
mov ah,8
int 21h
ret
read endp
inc_ad proc near
add x1,si
add x2,si
add x3,si
add x4,si
add x5,si
add x6,si
cmp x3,640
jg m6
cmp x6,0
jl m7
ret
inc_ad endp
inc_ws proc near
add y1,si
add y2,si
add y3,si
add y4,si
add y5,si
add y6,si
cmp y1,0
jl m8
cmp y5,480
jg m9
ret
inc_ws endp
m6: jmp m2
m7: jmp m3
m8: jmp m4
m9: jmp m5
cseg ends
end start
Текст програми
(рисування синьо-жовтого прапору)
.model small
.stack 64
.286 ; директива процесора (для інструкцій popa і pusha)
.data
color db ?
x1 dw 64
y1 dw 70
fon dw 0007h
x2 dw 526
y2 dw 170
y3 dw 270
s1 dw 60
p2 dw 69
s2 dw 400
.code
main proc far
mov ax,@data ; ініціалізуємо ds
mov ds,ax ; адресою сегменту даних
mov es,ax ; ініціалізуємо екстрасегмент даних
mov ah,0fh ; отримуємо поточний
int 10h ; відеорежим
push ax ; і зберігаємо його
mov ax,0012h ; встановлення графічного режиму
int 10h ; 640 стовпців і 480 стрічок
mov ah,0bh ; запит на встановлення фону
mov bx,fon ; сірий фон
int 10h ; переривання Bios
call paint ; виклик процедури рисування прапору
mov ah,10h ; очікування натиску
int 16h ; будь-якої клавіші
pop ax ; відновлення
mov ah,00h ; початкового відеорежиму
int 10h ; переривання Bios
mov ax,4c00h ; запит на завершення програми (передача управління ОС)
int 21h
main endp
; Процедура рисування прапору
paint proc near
pusha ; зберігаємо значення всіх регістрів
mov bx,00 ; встановлення сторінки
mov cx,x1 ; задаємо стовпчик
mov dx,y1 ; задаємо строку
label1:
mov color,1h ; встановлення голубого кольору
mov ah,0ch ; запит на рисування пікселя
mov al,color ; голубим кольором
int 10h ; переривання Bios
inc cx ; перейти до наступного стовпця
cmp cx,x2 ; перевіряємо чи дійшли до стовпця 576
jne label1 ; ні - повторюємо
mov cx,x1 ; так - переходимо на початок стрічки (стовпець 64)
inc dx ; переходимо на наступну стрічку
cmp dx,y2 ; перевіряємо чи дійшли до строки 170
jne label1 ; ні - повторюємо
jmp label2 ; так - переходимо на мітку label2
label2:
mov color,0eh ; встановлення жовтого кольору
mov ah,0ch ; запит на рисування пікселя
mov al,color ; жовтим кольором
int 10h ; переривання Bios
inc cx ; перейти до наступного стовпця
cmp cx,x2 ; перевіряємо чи дійшли до стовпця 576
jne label2 ; ні - повторюємо
mov cx,x1 ; так - переходимо на початок стрічки (стовпець 64)
inc dx ; переходимо на наступну стрічку
cmp dx,y3 ; перевіряємо чи дійшли до строки 270
jne label2 ; ні - повторюємо
mov cx,x1 ; встановлюємо 64 стовпець
mov dx,s1 ; і 60 строку
label3:
mov color,06h ; встановлення коричневого кольору
mov ah,0ch ; запит на рисування пікселя
mov al,color ; коричневим кольором
int 10h ; переривання Bios
inc cx ; перейти до наступного стовпця
cmp cx,p2 ; перевіряємо чи дійшли до стовпця 69
jne label3 ; ні - повторюємо
mov cx,x1 ; так - переходимо на початок стрічки (стовпець 64)
inc dx ; переходимо на наступну стрічку
cmp dx,s2 ; перевіряємо чи дійшли до строки 400
jne label3 ; ні - повторюємо
popa ; відновлюємо значення всіх регістрів
ret ; повернення з процедури
paint endp
end main
Висновок: на цій лабораторній роботі я вивчив основні можливості керування екраном в текстовому та графічному режимах.