Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateC
C sharpCalculatoareCorel drawDot netExcelFox pro
FrontpageHardwareHtmlInternetJavaLinux
MatlabMs dosPascalPhpPower pointRetele calculatoare
SqlTutorialsWebdesignWindowsWordXml

Afisarea in mod grafic

calculatoare



+ Font mai mare | - Font mai mic



Afisarea in mod grafic

1 Utilizarea intreruperii 10h

Placile grafice au o zona tampon in memoria RAM a carei copie se regaseste in ecran. In modul grafic, aceasta zona incepe in general la adresa 0A000H (vezi si Anexa 2 pentru diverse moduri grafice). Orice scriere in memorie in aceasta zona se va reflecta asupra ecranului in functie de modul de lucru ales pentru placa grafica.



Stabilirea atributelor ecranului se poate face cu intreruperea INT 10 H, care ofera mai multe servicii aflate in BIOS in functie de continutul lui AH. Mentionam in continuare unele dintre acestea, restul functiilor fiind prezentat in Anexa2 :

Functia 0: Stabilire mod de lucru

AH = 0;

AL = Identificator de mod.

Ex: Pentru AL = 10 H modul 640x480x 16 culori;

Pentru AL = 13 H modul 320x200x256 culori.

Urmatoarea secventa va trece ecranul in modul 13H:

Exemplul 1:

;Mod video 320x200

mov ah,0

mov al,13h

int 10h

Functia 06: Defilare ecran

AH=06h;

AL=Numar de randuri cu care se face defilarea. Pentru AL=0 se face stergerea ecranului.

BH = Atributele liniilor inserate

Urmatoarea secventa va face stergerea ecranului:

Exemplul 2:

sterge: ;Sterge ecran

mov ah,06h

mov al,0

int 10h

Functia 0CH: Afisare punct

AH= 0CH;

AL= numarul culorii;

CX= coordonata x (x=0 in extrema stanga a ecranului);

DX= coordonata y (y=0 in extrema superioara a ecranului).

Observatie: Functia 0CH este lenta si nu se recomanda pentru imagini cu un numar mare de puncte.

Urmatoarea secventa afiseaza un punct la coordonatele aflate in CX si DX, cu culoarea data de AL:

Exemplul 3:

afis:  ;Afiseaza un punct la x=CX, y=DX si ;culoare=AL

mov ah,0Ch ;functia 0Ch

int 10h ;cheama functia bios

Urmatoarea secventa afiseaza o linie orizontala , la y = DX din puncte cu culori crescatoare.

Exemplul 4:

linie:

mov ah,0Ch ;functia 0Ch

int 10h ;call bios service

inc bh ;Calculeaza culoarea pentru ;urmatorul punct

mov al,bh ;Copie intr-un alt registru pt ;prelucrare

shr al,5 ;Se iau numai cei 3 biti mai ;semnificativi din registrul de culoare

inc cx ;Calculeaza x pentru urmatorul punct

cmp cx,600 ;Se afiseaza o linie de 600 puncte

jne linie

Functia OBH : Stabilire paleta de culori

AH=0BH;

BH=modul (0 pentru chenar, 1 pentru imagine);

BL=Numarul paletei (In general intre 0 si 65).

Exemplul 5:

Urmatoarea secventa stabileste paleta 8 pentru elementele de imagine:

;Paleta

mov ah,0bh

mov bh,1

mov bl,8

int 10h

2 Scrierea directa in memoria de ecran

Utilizarea intreruperii 10h pentru afisarea in ecran este destul de lenta, si de aceea se recomanda scrierea directa in memoria de ecran. Aceasta incepe la adresa 0A000H in modul grafic si are dimensiuni dependente de rezolutia modului grafic ales.

Urmatoarea secventa introduce adresa zonei ecran in registrul extrasegment si scrie un dublu octet continut in CX la coordonatele date de DI:

Exemplul 6:

MOV AX, 0A000H

MOV ES, AX

MOV ES:[DI], CX

Daca se doreste calculul offset-ului (in exemplul de mai sus DI) in functie de coordonatele dorite X si Y continute de exemplu in AX respectiv BX se poate folosi o secventa de felul urmator:

Exemplul 7:

MOV DI, X ; DI = X

MOV DX, Y ; Se face o copie a lui Y in alt ;registru

; Instructiunile urmatoare fac inmultirea cu 320

SHL BX, 8 ; Shift Y left 8

SHL DX, 6 ; Shift Y left 6

ADD DX, BX ; DX = Y SHL 8 + Y SHL 6

; Se aduna acum coordonata X

ADD DI, DX ; DI = Y x 320 + X

MOV AL, Culoare

MOV ES:[DI],CX; Afiseaza pixelii lui CX

Pentru afisarea unui segment cu AX=x1, BX=y, CX=x2, DL=culoare se poate face transferul in memoria ecran a continutului registrului AL cu instructiunea STOSB ca in exemplul urmator:

Exemplul 8:

PUSH DX ; DX salvat pentru a putea fi utilizat ;in calcule

SUB CX, AX ; CX = X2 - X1 Lungimea segmentului

MOV DI, AX ; DI = X1

MOV DX, BX ; DX = Y

SHL BX, 8 ; Shift Y left 8

SHL DX, 6 ; Shift Y left 6

ADD DX, BX ; DX = Y SHL 8 + Y SHL 6

ADD DI, DX ; DI = Y x 320 + X

POP DX ; Reface vechiul DX, care contine ;culoarea (in DL)

MOV AL,DL ; Culoarea este pusa in AL

REP STOSB ; Repeta stocarea lui AL in CX locatii ; consecutive de la adresa din DI

Mod de lucru:

Pentru testarea programelor care urmeaza, se poate folosi rularea cu TD, ecranul putand fi vazut dupa rulare cu F9, eventual cu comanda User Screen din submeniul View ( Alt+F5). Se recomanda ca programele sa se incheie cu o bucla infinita de tipul :

term: jmp term

deoarece iesirea normala, cu INT 21h poate afecta informatia afisata pe User Screen, in functie de caracteristicile sistemului de operare folosit.

Daca se foloseste bucla infinita, iesirea din ea se poate face cu tasta WINDOWS aflata intre tastele CTRL si ALT, urmata de un click dreapta pe taskul respectiv de pe TaskBar si comanda Close. Este absolut necesara inchiderea acestei ferestre, deoarece altfel memoria ramane incarcata si la un moment dat poate sa fie depasita. Oricum, anumite procese raman incarcate si daca apare mesaj de depasire a memoriei, se va reporni sistemul.

P 1 Se va scrie un program care sa afiseze un punct in ecran, la x=100 si y=50, culoarea =2, folosind INT 10H.

Indicatie: Mai intai va trebui sa se stabileasca modul video 320x 200 ca in exemplul 1

P 2 Se va scrie un program care sa afiseze o linie in ecran la x1=50, y1=50, lungimea=100, culoarea=2, folosind INT 10H.

Indicatie: se va folosi un contor, CX, care va fi incrementat si se va relua bucla pana cand CX ajunge la valoarea x1+lungimea.

P 3 Se va modifica programul 2 pentru a afisa 50 de linii cu aceiasi parametri initiali, dar cu y crescator.

Indicatie: Se va include bucla anterioara intr-o noua bucla care il modifica pe DX.

P 4 Se va modifica programul 3 pentru a afisa linii formate din puncte cu culori crescatoare (linii verticale cu diverse culori).

Indicatie: Se va incrementa AL in interiorul buclei care traseaza o linie.

P 5 Se va modifica programul 3 pentru a afisa linii cu culori crescatoare (linii orizontale de diferite culori).

Indicatie: Se va incrementa AL in exteriorul buclei care traseaza o linie.

P 6 Se va scrie un program care sa afiseze un punct de coordonate x1=160, y1=0 si culoare=3, direct prin scriere in memoria ecran, in modul grafic 320 x 200.

Indicatie: Daca se pune x1 in DI si culoarea in AL, se poate folosi instructiunea STOSB. Evident, adresa memoriei ecran, 0A000h va trebui sa fie in prealabil scrisa in ES.

P 7 Se va completa programul pentru a afisa o linie orizontala din 200 de puncte incepand din coltul din stanga sus al ecranului (X1=0, Y1=0), cu culoarea 5.

Indicatie: Se poate folosi programul anterior, punand in CX lungimea liniei si prefixul REPZ la instructiunea STOSB.

P 8 Se va modifica programul pentru a afisa o linie orizontala de 200 de puncte la pozitia X1=100, Y1=0.

Indicatii: Inainte de afisarea liniei, registrul DI care tine adresa punctului va fi incarcat cu X1.

P 9 Se va modifica programul pentru a afisa o linie orizontala de 200 de puncte la pozitia X1=100, Y1=1.

Indicatie: Inainte de afisarea liniei, registrul care retine coordonata initiala, DI, va trebui adunat cu 320 (numarul de puncte dintr-o linie).

P 10 Se va modifica programul pentru a afisa o linie orizontala de 200 de puncte la pozitia X1=100, Y1=50.

Indicatie: Inainte de afisarea liniei, registrul care retine coordonata initiala, DI, va trebui adunat cu Y1*320 (de Y1 ori numarul de puncte dintr-o linie). Inmultirea se va face prin deplasari spre stanga, ca in lucrarea de laborator nr. 6. O parte dintr-o realizare posibila a programului este prezentata in continuare:

Linieo:

mov di,x1 ;DI contine X1

mov bp,y1 ;BP contine Y1

mov cx,lung ;CX contine numarul de puncte

mov al,culoarea;In AL este culoarea

mov dx,bp ;Se face inmultirea

shl dx,6 ;lui BP (adica a lui Y1) cu 320

shl bp,8 ;Prin copiere in DX

add bp,dx ;deplasari la stanga si adunare

add di,bp ;Deplasamentul obtinut se aduna la ;adresa initiala

repz stosb ;Se face transferul sirului

P 11 Se va modifica programul pentru a afisa o linie verticala de 50 de puncte la pozitia X1=100, Y1=50.

Indicatii:

Trebuie ca fiecare nou punct sa fie pus la o adresa cu 320 mai mare decat cel precedent. Prin urmare, nu mai poate fi folosita instructiunea STOSB, ci trebuie in locul ei o bucla de tipul:

lv1: add di,320 ;Noul punct este cu 320 mai ;departe in memoria de ecran

mov es:[di],al ;Pune punctul

loop lv1 ;Repeta de CX ori

P 12 Se va modifica programul de mai sus pentru a afisa o linie oblica spre dreapta jos, cu x1=100, y1=50 si lungimea 50 de puncte.

Indicatie: Adresa unui nou punct se obtine prin sumare cu 321 (adica 320+1) fata de adresa celui anterior.

P 13 Se va modifica programul de mai sus pentru a afisa o linie oblica spre stanga jos, cu x1=100, y1=50 si lungimea 50 de puncte.

Indicatie: Adresa unui nou punct se obtine prin sumare cu 319 (adica 320-1) fata de adresa celui anterior.

P 14 Se va modifica programul de la punctul P 11 pentru a afisa 100 de linii verticale identice, cu x1 crescator. Se va obtine un dreptunghi plin.

Indicatii:

Se va folosi un contor (de exemplu BX) care va fi contine initial 100 si va fi scazut la fiecare trasare a unei linii.

Pentru ca linia sa inceapa de fiecare data de la acelasi y1, registrul DI care contine adresa primului punct dintr-o linie va trebui salvat la inceputul buclei de linie (care il va modifica), si readus la sfarsitul buclei, cand va fi incrementat cu 1 pentru avansul pe x. Dupa aceea se va decrementa contorul si se va face saltul conditionat.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 2204
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved