Architektury Komputerów

Transkrypt

Architektury Komputerów
Architektury Komputerów - Laboratorium
Informatyka III rok studia dzienne
Ćwiczenie nr 2 Karta grafiki VGA.
Cel ćwiczenia
Celem ćwiczenia jest zapoznanie się z podstawowymi trybami pracy kart graficznych VGA,
sposobami organizacji pamięci oraz metodami dostępu do niej.
Wymagane wiadomości
• Budowa i programowanie typowej karty VGA.
• Podstawowe tryby graficzne (13h, 12h), organizacja oraz dostęp do pamięci karty w tych trybach.
• Podstawy programowania w języku Asembler (struktura programu, segmenty, deklaracje
zmiennych, procedury, mnemoniki rozkazów, przerwania programowe)
Wykorzystywany sprzęt
Komputer PC z kartą graficzną kompatybilną z VGA oraz kompilatorem Asemblera.
Literatura
Piotr Metzger - Anatomia PC.
Tomasz Kopacz - "Karty graficzne VGA i SVGA. Programowanie grafiki"
http://www.iaii.weia.po.opole.pl/dyplomy/Arch_komp/cwicz6.html
http://www.asembler.host.sk/index.php
http://www.komputery-internet.net/asembler/
1
Wprowadzenie
Współczesne systemy komputerowe w zdecydowanej większości wyposażone są
w karty graficzne wywodzące się od typowej karty VGA (video graphic adapter). Standard
VGA oraz SVGA pozwalał na pracę w trybach wielokolorowych o różnych – coraz większych
– rozdzielczościach.
Karta graficzna VGA jest kartą umożliwiającą wykorzystanie maksymalnie 256
kolorów w rozdzielczości 320x200 punktów, lub 16 kolorów przy 640x480 punktów.
Ograniczenie wynika z ilości pamięci wynoszącej w standardzie 256 kB. Do jej popularności
przyczyniła się zgodność z wcześniejszymi kartami: MDA i EGA. Zgodność z kartą CGA
jest częściowa, ponieważ niektóre porty zmieniły adresy. Jeśli sterownik posiada odpowiednio
dużo pamięci, przez właściwe ustawienie rejestrów można uzyskać wyższe rozdzielczości
oraz wybierać z większej dostępnej liczby kolorów. Niezależnie od trybu graficznego
wyświetlane kolory mogą być wybierane z palety 262 144 kolorów.
W miarę rozwoju technologii parametry standardu VGA stały się niewystarczające.
Wielu producentów wyposażało karty w dodatkowe opcje. Rozbudowa obejmuje przede
wszystkim zwiększenie pamięci karty graficznej oraz dodanie nowych trybów. Oprócz
rozdzielczości zwiększeniu uległa liczba jednocześnie wyświetlanych kolorów, która obecnie
pozwala wyświetlać punkty w 224 odcieni. Niestety, różni producenci stosują własne
rozwiązania, co spowodowało powstanie standardu VESA. Ujednolicił on parametry
monitorów współpracujących z kartami SVGA, numerację rozszerzonych trybów graficznych,
interfejs programowy (dodatkowe funkcje BIOS-u). Współczesne karty graficzne swoimi
możliwościami już wykraczają poza tryby określone przez VESA.
Jednym z elementów różniących sterownik VGA od poprzedników jest sposób
generowania sygnału wyjściowego. Sterownik VGA wykorzystując wbudowany przetwornik
CA generuje sygnał analogowy, dzięki czemu do standardowej karty VGA można podłączyć
zarówno monitor kolorowy jak i monochromatyczny, który będzie wyświetlał obraz
w odcieniach szarości. Nowoczesne karty SVGA posiadają nawet do kilkuset
programowalnych rejestrów sterujących, dzięki którym realizujemy wydajną współpracę
systemu ze sterownikiem graficznym. Niestety, częstokroć wykorzystanie pełnych możliwości
karty wymaga współpracy z dedykowanymi dla danej karty sterownikami.
Z punktu widzenia procesora, karta graficzna to zbiór punktów wejścia-wyjścia
i obszar pamięci obrazu – programowanie sterownika sprowadza się zatem do zapisu oraz
odczytu do i z pamięci oraz portów we-wy. Pamięć obrazu jest odwzorowana bezpośrednio
w przestrzeni adresowej procesora, pomiędzy adresami A000:0000h a B000:FFFFh,
pozwalając na wykorzystanie do zapisu lub odczytu instrukcji mov lub movs. Standardowy
sterownik VGA posiada 256 kB pamięci RAM, zaś karty SVGA co najmniej 512 kB. Z tego
2
powodu pamięć obrazu zorganizowana jest na różne sposoby, w zależności od trybu pracy
sterownika. W trybach odziedziczonych po CGA wykorzystywana jest spakowana (packed)
metoda odwzorowania pamięci – w jednym bloku pamięci RAM każdemu punktowi na
ekranie odpowiada fragment bajtu zawierający numer koloru tego punktu. Pole odpowiadające
jednemu punktowi wynosi zwykle 1, 2, 4 lub 8 bajtów – co odpowiada 2, 4, 16 lub 256
kolorom obrazu.
Dla kart EGA i VGA podstawową metodą odwzorowania ekranu jest metoda płatowa
(plannar, bit mapped). Pamięć obrazu podzielona jest na 4 płaty (bloki) po 64 kB każdy.
W każdym bloku jednemu bitowi odpowiada jeden punkt – dzięki takiej strukturze 256 kB
pamięci obrazu zajmuje 64 kB przestrzeni adresowej. Konsekwencją przyjętej organizacji
pamięci jest utrudniony dostęp do danych. Zapis lub odczyt wymaga dodatkowo
programowania rejestrów układu sterownika.
3
Karty graficzne pracują w dwóch trybach – znakowym i graficznym. Poniższa tabela
przedstawia numerację i podstawową charakterystyką standardowych trybów kart VGA.
AL.
00H
01H
02H
03H
04H
05H
06H
07H
0DH
0EH
0FH
10H
11H
12H
13H
Rodzaj
tekstowy
tekstowy
tekstowy
tekstowy
graficzny
graficzny
graficzny
tekstowy
graficzny
graficzny
graficzny
graficzny
graficzny
graficzny
graficzny
Rozdz.
Kolory
Karta
40x25 16/8 szarości CGA/EGA
40x25
16/8
CGA/EGA
80x25
16/ szarości
CGA/EGA
80x25
16/8
CGA/EGA
320x200
4
CGA/EGA
320x200
4 szarości
CGA/EGA
640x200
2
CGA/EGA
80x25
3
MDA/EGA
320x200
16
EGA
640x200
16
EGA
540x350
2
EGA mono
640x350
16
EGA
640x480
2
MCGA
640x480
16
VGA
320x200
256
VGA
Segment pamięci
B8000H
B8000H
B8000H
B8000H
B800H
B800H
B800H
B0000H
A000H
A000H
A000H
A000H
A000H
A000H
A000H
Na zajęciach zajmiemy się trybami graficznymi 13h oraz 12h. Różnią się one
rozdzielczością, ilością możliwych do wyświetlenia kolorów. Różna jest tez
organizacja pamięci, a co z tego wynika – posługiwanie się trybami.
Tryby graficzne:
Włączenie/Wyłączenie trybu graficznego
Do obsługi trybu graficznego służy przerwanie 10H. Funkcja 0H (Ah=0) ma za
zadanie zmiany trybu graficznego/tekstowego. Wymaga umieszczenia w rejestrze AL Numeru
trybu, który chcemy uruchomić. Powrót do trybu tekstowego następuje dla wartości AL = 03h.
4
Tryb 320x200x256 (13h)
W tym trybie do czynienia mamy z najprostszą organizacją pamięci karty graficznej.
Na każdy piksel ekranu przeznaczony jest jeden bajt (możliwość wyświetlenia 256 kolorów).
Na zapamiętanie całego obrazu potrzebne jest 320*200=64000 bajtów. Wartości te
umieszczone są w ciągłej przestrzeni rozpoczynającej się od adresu A000h. Oznacza to, że
aby wyświetlić punkt należy przesłać pod adres A000:OFFSET (gdzie wartość OFFSET
wyznaczana jest jako 320*Y + X a X i Y są współrzędnymi punktu z zerem w lewym górnym
rogu) bajt reprezentujący kolor na ekranie. Punkt o współrzędnych [0,0] ma więc adres
A000H:0
Poniższy kod pokazuje strukturę programu w asemblerze - przełącza kartę w tryb 13h,
czeka na naciśnięcie klawisza, rysuje punkt w środku ekranu po czym wraca do trybu
tekstowego:
DATA1 segment
X
DW 0
Y
DW 0
kolor
DB 0
DATA1 ends
; zmienna przechowująca wsp. X
; zmienna przechowująca wsp. Y
; rezerwujemy 1 bajt na
CODE1 segment
ASSUME cs:CODE1, ds:DATA1, ss:STOS1
START:
;inicjalizacja stosu
mov ax,seg STOS1
mov ss,ax
mov sp,offset top
; przelaczenie karty w graficzny tryb 13h
mov ah,00h
; do AH numer funkcji przerwania 10h
mov al,13h
; do AL numer włączanego trybu
int 10h
; włączamy tryb graficzny 13h
; - oczekiwanie na naciśnięcie dowolnego klawisza
mov ax,0
; funkcja 00 przerwania 16h czeka na klawisz
int 16h
; przerwanie obsługujące klawiaturę
; ustalamy wsp. punktu i jego kolor…
mov X,160
mov Y,100
mov kolor,15
;obliczamy odpowiedni adres w pamieci obrazu
mov AX,0A000h
mov ES,AX
; do ES segment pamieci ekranu
mov AX, Y
mov DX,320
mul DX
mov dx,X
add ax,dx
mov di,ax
mov AL,kolor
; do AL=kolor
mov ES:[DI],AL ; zapalamy punkt w pamieci obrazu;
; znow oczekiwanie na naciśnięcie dowolnego klawisza
mov ax,0
int 16h
; powrot do trybu tekstowego
mov ah,00h
; do AH numer funkcji przerwania 10h
mov al,03h
; do AL numer włączanego trybu
5
int 10h
; 03 oznacza tryb tekstowy
; zakończenie programu
mov ax,4c00h
; wywolaniem funkcji 4ch przerwania INT 21h
int 21h
;kończymy program
CODE1 ends
STOS1 segment STACK
dw 256 dup(?)
top
dw ?
STOS1 ends
END START
Aby w programie korzystać z pętli należy zastosować następującą konstrukcję:
MOV CX, ile_razy_ma_się_wykonać
etykieta1:
(treść w pętli)
LOOP etykieta1
Rejestr CX pełni rolę licznika pętli - w każdym przebiegu jego wartość jest zmniejszana o 1
aż do wartości 0.
Chcąc konstruować pętle zagnieżdżone trzeba przed ponowną inicjacją wartości rejestru CX
(licznik pętli wewnętrznej) zachować na stosie jego poprzednią wartość instrukcją:
PUSH CX
oraz po zakończeniu pętli wewnętrznej odzyskać tę wartość instrukcją:
POP CX
Aby program wywoływał procedurę należy we właściwym miejscu pliku tekstowego umieścić
treść tej procedury a następnie wywołać tę procedurę instrukcją:
CALL nazwaprocedury
Należy zwrócić uwagę na prawidłową inicjację zmiennych i rejestrów wykorzystywanych
w procedurze.
6
Wykonanie ćwiczenia.
W trakcie realizacji ćwiczenia wykorzystujemy kompilator MASM firmy
Microsoft. Aby powstał program wykonywalny należy przy pomocy dowolnego
edytora (edit, notepad) stworzyć tekstowy plik z treścią programu, zapisać go na dysku
jako plik z rozszerzeniem .asm a następnie skompilować poleceniem:
ml [nazwapliku.asm]
Jeśli kompilacja przebiegnie bezbłędnie, automatycznie jest uruchamiany linker
tworząc postać wykonywalną programu (plik z rozszerzeniem *.exe).
Zadanie 1. Tryb graficzny 13h.
1.1 Przeanalizować i zrozumieć działanie programu z wstępu. Następnie uruchomić
go. Zmieniając odpowiednio adres pod który wysyłany jest bajt odpowiadający za
kolor zaobserwować zmianę położenia punktu na ekranie.
1.2 Przystosować program w taki sposób aby zapalanie punktu odbywało się za
pomocą poniższej procedury wywoływanej rozkazem CALL w sposób
przedstawiony poniżej:
...
MOV X,160
MOV Y,100
MOV KOLOR, 0FH
CALL Set_pixel320
....
;
;
;
;
wsp X = 160
wsp Y = 100
kolor = 15
i zapalamy punkt wywolujac procedure
Do określenia współrzędnych punktu procedura powinna korzystać z zadeklarowanych
w segmencie danych dyrektywą DW zmiennych X i Y o rozmiarze słowa. Kolor jest
ustalany za pomocą zmiennej kolor.
1.3 Mając możliwość łatwej zmiany współrzędnych i wykorzystując pętle LOOP
narysować w czwartej linii kreskę na ekranie o długości 100 pikseli w dowolnie
wybranym kolorze .
1.4 Zmodyfikować program tak, by rysował w linii 100 kreskę o długości 256
punktów, z których każdy będzie miał inny kolor.
1.5 Zmieniając adres pod który wysyłany jest bajt odpowiadający za kolor narysować
linię pionową.
1.6. Rozbudować program tak, by korzystając z pętli LOOP rysował na ekranie 256
linii pionowych każda w innym kolorze.
1.7 Narysować na ekranie linie ukośną nachylona po kątem 45 stopni.
7
Tryb 640x480x16 (12h)
W tym trybie do czynienia mamy z nieco inną - płatową organizacją pamięci karty graficznej.
Mamy tutaj do czynienia z dużo większą rozdzielczością, lecz w zamian za to mniejszą ilością
kolorów. W inny sposób osiągamy również zaświecenie punktu na ekranie. Jeden bajt pamięci
odpowiada za 8 pikseli na ekranie, zaś kolor piksela „składany” jest z fragmentów bajtów w
czterech różnych miejscach pamięci. Pozornie bardziej skomplikowana organizacja pamięci w
efekcie pozwala na szybszy dostęp dzięki sprzętowej realizacji tego trybu.
Przykładowa procedura rysująca punkt:
SetPixel640:
mov AX,Y
mov BX,Y
; X ma byc w AX
; Y ma byc w BX
push AX
push BX
push CX
push DX
push AX
mov AX,0A000h ; w ES umieszczamy seg. pam. obrazu
mov ES,AX
pop AX
mov CL,4
shl BX,CL
mov CX,BX
shl BX,1
shl BX,1
add BX,CX ; mnozenie y*80
mov CX,AX
shr CX,1
shr CX,1
shr CX,1
add BX,CX ;dodanie x/8
and AX,7
mov CL,AL
mov AH,080h
shr AH,CL
mov AL, 8
mov DX,3CEh
out DX,AX
mov AL,BYTE PTR ES:[BX]
mov DL,kolor
and DL,0Fh
; w trybie 12 mamy tylko 16 kolorow
mov BYTE PTR ES:[BX],DL
pop DX
pop CX
pop BX
pop AX
ret
Zadanie 2. Tryb graficzny 12h.
2.1 Poprzez wymianę procedury Set_pixel320 na Set_pixel640 i inne odpowiednie zmiany
(należy w odpowiednim miejscu włączyć tryb 12h ) uruchomić program zapalający punkt na
środku ekranu.
2.2 Przygotować program który korzystając z procedury Set_pixel640 i odpowiednich pętli
narysuje na ekranie prostokąt o wierzchołkach (100,100) ,(500,100), (500,300), (100,300)
8

Podobne dokumenty