|
Staf Wagemakers
Grafisch programmeren in Assembler (DOS)Grafisch programmeren in Assembler (DOS)Inhoudsopgave
1. Naar een VGA resolutie gaan.De BIOS interrupt welke voor grafische funktie gebruikt wordt is INT 10h. Met de funktie AH = 00, kunnen naar tussen de verschillende video mode omschakelen (zie onderstaande tabel).
We zullen het in hoofdzaak over de laatste (12h) resolutie hebben in de volgende paragraven. Tegenwoordig hebben de meeste VGA-kaarten ook zgn. "Super VGA" - resoluties, om naar deze resolutie te gaan kunnen we ook INT 10h AH=00h gebruiken. Dit geeft echter problemen doordat elke fabrikant van VGA-kaarten hiervoor anderen waarde voor AL neemt. Of m.a.w. dit is niet gestandaardiseerd. Om deze problemen op te lossen heeft men de VESA-bios ontwikkeld, de meeste moderne VGA-kaarten beschikken over zo'n bios. In onderstaande tabel ziet je hoe je naar de "VESA Super VGA"-resolutie moet gaan.
Indien de funktie wordt ondersteund is AH = 00h, wordt de funktie niet ondersteund komt is AH = 01h. De in de volgende paragraven besproken onderwerpen kunnen ook voor de VESA-resolutie 800 x 600 16 kleuren gebruikt worden.
2. Naar het video geheugen schrijvenDe standaard IBM VGA kaart heeft 16 kleuren, bijgevolg wordt elke pixel voorgesteld door 4 bits (2^4 = 16). Bij VGA in resolutie 640 x 480 16 kleuren maakt men om dit te bekomen gebruik van kleurbanken (bitplanes voor de engelstaligen), enkel basiskleur (Rood, Groen, Blauw, Intensiteit) heeft zijn eigen geheugengebied (kleurbank) in het geheugen van de VGA kaart. Het basis adres is voor al de 4 kleurbanken gelijk namelijk A000:0000h, en geheugen georiënteerd (memory mapped), om te bepalen naar welke kleurbank we schrijven kunnen we de VGA kaart instellen met het zgn. Map Mask register. In het Map Mask register kunnen schrijven door in het indexregister van de sequencer in te stellen, dit gebeurt via het poort adres 03C4h. Onderstaande tabel geeft de mogelijke funkties weer, door in het overeenstemmende dataregister (03C5h) te schrijven kunnen we de sequencer programmeren. register selektie met poort adres 03C4h.
Met het Map Mask register kunnen we dus bepalen naar welke kleurbank we schrijven.
Is bv. bit 0 gezet dan zal zullen naar de blauwe kleurbank schrijven, zijn bit 0 en 1 gezet (3) dan zullen we naar de blauwe en de groene kleurbank schrijven. Zoals meestal is de theorie ingewikkelder dan de praktijk volgend praktisch voorbeeld zal (hopelijk?) het voorgaande verduidelijken.
Vermits met mov ax,0F02h , out dx,ax alle kleurbanken geselekteerd zijn krijgen we de kleur wit. In die we dit vervangen door mov ax,0102h krijgen we de kleur blauw. 3. Aangepaste kleurenEen groot voordeel van VGA t.o.v. EGA (buiten de hogere resolutie) is de mogelijkheid om kleuren aan te passen. Op deze manier is het mogelijk om tekeningen er "echter" te laten uit zien. Om kleuren aan te passen kan men op 2 manieren te werk gaan; rechtstreeks de hardware programmeren of gebruik maken we van de INT 10h funktie. Deze laatste is het eenvoudigste en garandeert ook de kompatibiliteit met zgn. kloon VGA kaarten. Met INT 10h AX = 1010h kunnen we de kleurwaarde instellen van 1 kleur, BX bevat het kleurregister, CH de groenwaarde, CL de blauwwaarde en DH de roodwaarde. Nu komen het kleurregister en het kleurnummer niet helemaal met elkaar overeen, dit kunnen we oplossen door eerst van een bepaalde kleur eerst het kleurregister waarde op te vragen. Met INT 10h, AX = 1007h kunnen we dit doen, in BL zetten het kleurnummer na uitvoering van INT 10h komt in bh het kleurregisternummer. Volgend voorbeeld bewijs opnieuw dat de praktijk eenvoudiger is dan de theorie.
4. Uit het VGA scherm lezen
Het lezen uit het VGA scherm is (zoals je waarschijnlijk al vermoede)
analoog aan het schrijven naar het VGA scherm. Nu moeten we de
grafische controller instellen in de lees mode dit gebeurt het adres-
03CEh & het dataregister 03CFh.
Mode instelling via poort adres 03CEh.
Door op het poort adres 03CEh de waarde 3 te zetten stellen we dus de lees mode in, met 03CF bepalen de kleurbank waaruit we lezen. In onderstaande tabel ziet u welke waarde over een komt met welke kleurbank.
kleurbank selektie via poort adres 03CFh
Onderstaande procedure demonstreert het voorgaande, ze lees uit de 4 kleurbanken (BGRI) een byte, SI geeft aan welke byte gelezen wordt.
5. Schrijfmodes instellenIn paragraaf 2 hebben we bekeken hoe we data op het scherm kunnen
plaatsen. We kunnen deze data op 4 manieren op het scherm tonen;
vervanging, AND, OR en XOR. Dit kunnen we instellen via het "Data
Rotate/Function Select" register (zie tabel paragraaf 2.). Door het
03CEh de waarde 3 te plaatsen selekteren we het "Data Rotate/Function
Select" data register.
mode selektie via poort adres 03CFh
voorbeeld:
Bovenstaand voorbeeld stelt de VGA-kaart op XOR schrijf mode in. 6. Het tekenen van een lijn.Het teken van een lijn in assembler is niet zo eenvoudig, bovendien is het belangrijk niet al te ingewikkelde funktie te gebruiken (zoals vb. cos, sin, ...), dit zou het geheel te moeilijk maken en de procedure vertragen. Het meeste gebruikte algoritme om een lijn te tekenen met pixels is het Bresenham algoritme welk in 1965 in het IBM System Jourlan gepubliceerd werd. De vergelijking van een rechte is : y = (dy/dx).x ![]() Ligt de gewenst lijn dichter tegen het punt A, moet het punt A getekend worden anders het punt B. Of m.a.w. is de afstand a kleiner dan b moet het punt A getekend worden anders B.
Indien we di uit het vorige punt willen berekenen:
Voor de stap in x-richting (xi - xi-1) nemen we 1.
De waarde van (yi - yi-1) is afhankelijk van waar het punt geplaatst moet worden, (yi - yi-1) zal 1 zijn indien het punt A geplaatst wordt (yi-1 + 1) en zal 0 zijn indien het punt B geplaatst wordt (yi = yi-1).
Indien het punt A geplaatst moet worden is : (di - di-1) = 2.(dy - dx) Onderstaand Turbo Pascal programma voorbeeld zal het Bresenham algoritme verduidelijken.
7. Geraadpleegde werken:
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| © 2012 Staf Wagemakers | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||