Ajuriohjelmat

<

VGA-kortin toiminnan perusteet

VGA-TV-muuntimieni ajuriohjelmilla on yksi teht�v�: asettaa n�ytt�kortti l�hett�m��n sellaisessa muodossa ja oikealla p�ivitystaajuudella. PC:n n�ytt�korttien perusrakenne perustuu IBM:n kehitt�m��n VGA-standardiin. T�ss� perusratkaisussa grafiikkakortti koostuu koko kortin toimintaa ohjaavasta videokontrollerista, videomuistista, kellogeneraattorista sek� analogisen monitorisignaalin tuottavasta RAMDAC-piirist�. N�iden lis�ksi kortilla on muistipiiri, joka sis�lt�� tietokoneen BIOSin laajennuksen, joka k�istt�� videokortin k�sittelyn perusrutiinit (mm. eri grafiikkatilojen alustusrutiinit ja tekstin tulostusrutiinit). Kuva 19 esitt�� tyypillisen nykyp�iv�n PC:n grafiikkakortin rakenteen

Kuva 19

Kuva 19: PC:n grafiikkakortin rakenne

Nykyaikaisissa videokorteissa ulostulevan videon ajastuksen m��r��v�t videokontrollerin ajastusasetukset sek� k�ytettyn kellogeneraattorin tuottaman piksellikellon taajuudesta. Ohjelmoitava kellogeneraattori on monessa kortissa sis��nrakennettuna RAMDAC-piiriin, mutta voi olla my�s t�ysin erillinenkin piiri.

Videoajastuksen ohjelmointi

VGA-kortin rakenne on sellainen, ett� n�ytt�kortin videoajastukset ohjelmoidaan videokontrollerin rekistereill� ja valitsemalla sopiva piksellikello. Alkuper�isess� VGA-kortissa oli vain muutama kidekello, joiden taajuuksia voitiin k�ytt�� suoraan sellaisenaan tai jakaa kahdella tai nelj�ll�. N�ill� keinoilla pystyttiin hyvin muodostamaan kaikki tavalliset VGA-tilat sek� haluttaessa erikoisempiakin grafiikkatiloja.

Nykyaikaississa PC:n grafiikkakorteissa on tyypillisesti ohjelmoitava kellogeneraattori, joka pystyy synnytt�m��n hyvin suuren m��r�n eri kellotaajuuksia. T�ll�isen kellopiirin tuottama kellotaajuus voidaan s��t�� ohjelmallisesti kellopiirin rekisterej� s��t�m�ll�. Markkinoilla olevissa grafiikkakorteissa on k�yt�s�s hyvin monia erilaisia kellopiirej�, joita ohjataan eri tavoin. Monet kellogenerattoreista on erillisi� piirej�, mutta my�s moni nopeista RAMDAC-piireist� sis�lt�� ohjelmoitavan kellogeneraattorin.

Ajurin toiminta eri n�ytt�tiloissa

PC:n n�ytt�kortit perustuvat IBM:n VGA-n�yt�nohjaimeen. T�ss� n�yt�nohjaimessa on kaksi toiminnoiltaan hyvin erilaista toimintatilaa: tekstitila ja grafiikkatila. N�iden tilojen toiminnan erilaisuudesta johtuen niit� kannattaa k�sitell� ajurissa eri tiloissa.

Toiminta tekstitilassa

Standardi VGA-n�yt�n 80x25 tekstitila k�ytt�� 16x8 piksellin kokoisia fontteja. T�ss� tilassa n�yt�n resoluutio on siis 400 vaakaviivaa. T�ll�inen m��r� vaakajuovia ei mahdu yhteen television puolikuvaan. Lomittelun k�ytt� ei kannata tekstitiloissa, koska se tekee tyypillisist� tekstifonteista v�risevi�. Paras ratkaisu saada normaali 25-tekstirivinen n�ytt�tila n�kyviin televisioruudulle on siirty� k�ytt�m��n 8x8 pikselin fontteja, joiden avulla juovam��r� saadaan pudotetta 200 juovaan, mik� mahtuu hyvin normaalin television n�kyv�lle ruutualuelle. N�in ei tarvita lomittelun k�ytt�� ja ruudun teksti on vapaa. 8x8 pikselin fontin k�ytt�minen on k�tev�, koska t�m� fontti l�ytyy vakiona VGA-kortteista. Fortin vaihtaimisen lis�ksi pit�� VGA-kortin piksellikello jakaa kahdella sek� muuttaa synkronointisignaaleita s��t�vi� ajastusrekistereit�. siten, ett� pyyhk�isytaajuus ja p�ivitystaajuus ovat niin tarkkaan televisiostandardien mukaisia kuin mahdollista.

Grafiikkatilat joissa 200 vaakajuovaa

VGA-kortin 320x200 piksellin tilassa jokainen piksellirivi pyyhk�ist�� normaalitilassa kahdesti VGA-monitorille. T�m� n�ytt�tila on helppo saada televisiruudulle kun ensin poistetaan juovantuplaus ja jaetaan piksellikellon taajuus kahdella. N�in juovam��r� on riitt�v�n pieni mahtuakseen telesion yhteen kentt��n ja vaakapyyhk�isytaajuus saadaan television haluamaan arvoon. Kun n�m� on tehty, niin tarvitsee en�� s��t�� ruudun p�ivitystaajuus ja juovien m��r� sopivaksi, mik� onnistuu lis��m�ll� ruudun yl�- ja alareunaan tarvittava m��r� mustaa reunusta.

Grafiikkatilat joissa 480 vaakajuovaa

480-linjaiset 60 Hz tilat n�kyv�t suoraan NTSC-televisiossa kunhan n�ytt�kortin piksellikello jaetaan kahdella ja lomittelu laitetaan p��lle. N�in saadaan n�ytt�tila, jossa muutama pisrerivi menee n�kyv�n televisioruudun alueen yli. PAL-television tapauksessa lis�t��n riitt�v� m��r� mustaa reunusta, ett� PAL:in n�kyv�t 560 linjaa tulevat t�yteen. N�in kuvan yl�- ja alareunoihin j�� pienet mustat palkit.

Grafiikkakorteissa, joissa lomittelua ei ole mahdollista saada toimimaan (ei tuettu ominaisuus tai ei ohjelmointitietoa saatvana) 480-linjaiset tilat voidaan toimimaan ilman lomitusta seuraavalla tavalla: esitet��n lomittelematonta kuvaa televisioon ja j�tet��n joka toinen pisterivi grafiikkatilasta n�ytt�m�tt�. T�m� onnistuu m��rittelem�ll� n�ytt�kortin kasvattamaan n�ytt�muistin lukemisen aloitusosoitetta kahden pisterivin mitan verran jokaisen pisterivin kohdalla.

Grafiikkatilat joissa 600 juovaa

600-linjaiset tilat saa n�kyviin PAL-televisioon kun lomittelu laitetaan p��lle ja piksellikellon arvo s��det��n sopivaksi. N�in saadaan n�ytt�tila, jossa muutama pisterivi menee n�kyv�n televisioruudun alueen yli, koska vain noin 560 linjaa mahtuu television n�kyv�lle alueelle.

Jos n�ytt�kortti ei tue lomittelua, niin grafiikkatila voidan esitt�� my�s j�tt�m�ll� joka toinen pisterivi n�ytt�m�tt�.

Kuvan koon s��t� vaakasuunnassa

Kuvan koon s��t�minen vaakasuunnassa onnistuu n�ytt�kortin piksellikelloa s��t�m�ll�. Kasvattamalla piksellikellon taajuutta ja samalla levent�m�ll� kuvan reunuksia sen verran ett� pyyhk�isytaajuus pysyy vakiona n�kyv�� kuva-alaa saa kavennettua. Vastaavalla tavalla piksellikelloa hidastamalla kuvasta saa leve�mm�n. PerusVGA-kortissa ei ole kovin laajaa valikoimaa erilaisia kellotaajuuksia, mutta l�hes kaikissa nykyisin markkinoilla olevissa edistyneemmiss� grafiikkakorteissa on ohjelmoitava kellogenerattori, jolla voi tuottaa hyvin suuren valikoiman erilaisia piksellikellon arvoja.

DOS-ajurit

DOS-ajurien toimintaperiaatteena on korvata n�ytt�kortin BIOSissa sijaitsevat n�ytt�kortin tilan alustusrutiinit sellaisilla, jotka alustavan�yt�n taajuudet normaalista poikkevalla kuvataajuudelle. Mihink��n muuhun n�ytt�kortin BIOS-rutiineihin ei tarvitse koskea.

Ajuri voidaan hyvin toteuttaa muistinvaraisella (TSR) ohjelmalla, joka korvaa BIOSin rutiinit linkkautumalla keskeytysvektoriin 10h. Ajuriohjelma toimii siten, ett� jos k�ytet��n mit� tahansa muuta kuin ruututilan alustusrutiinia, ajuriohjelma kutsuu alkuper�ist� BIOS-rutiinia. Ruututilan alustusrutiinia (keskeytysvektori 10h alirutiini 00h) kutsuttaessa ajuohjelma kutsuu ensin alkuper�ist� BIOS-rutiinia ja t�m�n j�lkeen kirjoittaa omat erikoisarvonsa VGA-kortin ajastusta ohjaaviin rekistereihin. Kutsumalla alkuper�ist� BIOS-rutiini voidaan kaikki korttikohtaiset ja muuten hankalat alustusrutiinit hoitaa varmsti toimivalla tavalla ja sen j�lkeen ainoastaan muutetaan niit� rekisterej�, joita on pakko muuttaa.

Toteutin ajurin konekielt� k�ytt�en, koska n�in ajurista saa mahdollisimman pienen sek� tekem��n juuri ne asiat joita on tarpeen tehd�. Jos ajuriohjelman olisi kirjoittanut mill� tahansa korkean tason ohjelmointikielell� assembly-kielen sijasta, olisi ohjelmasta tullut kooltaan paljon suurempi sek� alttiimpi odottamattomille yhteensopivuusongelmille. Kirjoittamalla ohjelman suoraan konekielelle, voi olla varma mit� ohjelma tarkalleen tekee ja mihin se koskee.

Edell� kuvatulla menetelm�ll� on kohtuullisen helppoa tehd� toimia ajuriratkaisu, joka toimii hyvin l�hes kaikkien DOS-ohjelmien kanssa. T�m�n tyyppinen ajuriohjelma valitettavasti toimi sellaisten ohjelmien kanssa, jotka itse alustavat jonkin standardeista poikkeavan n�ytt�tilan.

Ajureissa k�ytetyt VGA-kortin ajastusrekisterien arvot olen saanut tutkimalla mit� kaupallisten t�ll� tekniikalla toteutettujen VGA-TV-muuntimien ajurit tekev�t VGA-kortille. N�iden ajurieden l�hdekoodia ei ole tarvinnut tutkia, koska kaikki VGA-kortin normaalit rekisterit on luettavissa ohjelmallisesti, joten riitt� kun k�ynnist�� valmiin ajurin ja sen j�lkeen oman rekisterien arvojen tallennusohjelman. Koska kaikki markkinoilla oleet t�ll�iset muuntimet ovat olleet USA:n markkinoille, ne tuottavat NTSC-standardin mukaista kuvaa. K�ytt�en n�it� rekisteriarvoja mallina ja hiukan muokkaamalla VGA-kortin rekisterien arvoja sain n�ist� aikaan PAL-n�ytt�tilat.

Liitteess� 1 l�ytyy kirjoittamani ajuriohjelman assembler-kielinen l�hdekoodi.

Ajurin ohjelmoinnin er��n� ongelmana on, ett� VGA-kortissa on m��ritely hyvin monia erilaisia n�ytt�tiloja, joista jokainen t�ytyy ajurissa huomioida ja k�sitell� erikseen. Viel� normaalin VGA-kortin parikymment� perustulaa hyvin hallitseekin, mutta kaikkia korttikohtaisia superVGA-tiloja ja niiden erityisasioita on melko mahdotonta tukea. N�iden korttikohtaisten ominaisuuksien tukeminen on erityisen vaikeaa, koska korttivalmistajilta on tyypillisesti hyvin hankala saada tarvittavia ohjelmointitietoja heid�n korttiensa ohjelmointiin. Ainoa valmistaja, jolta sain k�ytt��n kunnollista teknist� tietoa oli Matrox, jolta sain tarvitsemiani ohjelmointitietoja vasta kun otin heihin yhteytt� mainiten yhteydenotossani projektisssa mukana olevan korttivalmistajan kanssa jo yhteisty�t� tekev�n ihmisen nimen.

Windows 3.1 ajurit

Windows 3.1 varten ei ollut tarvetta kirjoittaa mit��n erillisi� ajureita, koska nornaalissa perusVGA-tilassa se k�ytt�� ruututilojen alustamiseen BIOS-rutiineja muidenkin DOS-ohjelmien tapaan. Jos DOS-ajuri ladataan muistiin ennen Windowsin k�ynnit�mist�, niin se tekee hommansa niin kuin pit��, jos se tukee sit� ruutilaa, joka Windowsin on asennettu. Toimivuus on hyv� esimerkiksi peruVGA-ruudulla (640x480 resoluutio 16 v�rill�). Windowsin tapauksessa kapeat ikkunan reunaviivat aiheuttavat h�iritsev�� v�rin��.

Windows 95 ajurit

Windows 95:n kanssa on mahdollista rajoitetusti k�ytt�� DOS-ajureita, kunhan ne laitetaan latautumaan ennen varsinaisen Windowsin k�ynnist�mist�. T�m� ratkaisu ei ole kuitenkaan mitenk��n toimintavarma, koska sen toimivuus riippuu k�ytetyist� n�ytt�kortin ajureista.

Er�s ratkaisu ongelmaan olisi kirjoittaa oma ajuriohjelma Windows 95:een, mutta se ei vaikuttanut hyv�lle ajatukselle, koska suuren m��r� erilaisia n�ytt�kortteja tukevan ajurin kirjoittaminen on hyvin hankala, koska jokainen tarvitsee omanlaisensa koodin ajastusten ohjelmoimiseen. Lis�ksi t�ll�isen ajurin kirjoittamista varten olisi tarpeen hankkia sopiva C-k��nt�j� sek� ajurinkirjoituksen kehityspaketti, mik� vaikutti turhan kalliille hankinnalle hy�tyihin n�hden.

Koska ajurin kirjoittaminen vaikutti liian hankalalle ja kalliille projektille, p��tin katsoa vaihtoehtoa olemassaolevian ajurien y�dynt�miseen. Normaali Windowsin vakiomonitoriajuri tarjoaa erilaisia vaihtoehtoja ruudun p�ivitystaajuuden s��t�misene monitorien asetustiedostoja muttamalla. Tekem�ll� oman erikoismonitorityypin on mahdollista saada aikaa normaalista poikkeavia p�ivitystaajuuksia, mutta t�ss� projektissa tarvittavia lomitettuja ja tarkaan oikealla taajuudella toimivia ruututiloja ei t�ll� tavoin voinut saada aikaan.

Scitech softwaren (www.scitechsoft.com) kauppaama Scitech Display Doctor -apuohjelmalla on mahdollista saada tavallisia Windowsin asetuksia monipuolisemmat s��d�t eri ruututiloille. T�m� ohjelma tarjosi melkein kaikki tarvittavat s��t�mahdollisuudet, mutta v�ltt�m�t�nt� lomituksen tukea t�st�k��n ohjelmasta ei l�ytynyt.

Lopputuksena p��tin tyyty� n�ytt�korttivalmistajakohtaiseen ratkaisuun. Matrox toimittaa ainakin Millenium, Mystique ja Millenium II -grafiikkakorttiensa kanssa Powerdesk-nimisen apuohjelman, jonka avulla on mahdollista s��t�� hyvin tarkkaan millaista signaalia n�ytt�kortit l�htett� monitorille. T�m�n ohjelman avulla on mahdollista laittaa lomitus p��lle, s��t�� tarkkaan piksellikellon taajuus sek� synkronointisignaalien sek� ruudun reunusten leveys. Kuva 20 esitt�� Powerdesk-apuohjelman tarjoamia s��t�mahdollisuuksia.

Kuva 20

Kuva 20: Matrox Powerdesk -ohjelman tarjoamat ajastuksen s��t�mahdollisuudet ja er��t esimerkkiasetukset er��lle tietokonemonitorille.

Ohjelmalla tehdyt asetukset tallettuvat ASCII-muotoiseen monitorien tietokokantaan. PAL-televisolle k�ytt�m�ni asetukset 640x480 resoluutiolle ovat seuraavat (ote monitoritietokantatiedostosta MGA.MON):

[User-Defined.PAL]
640X480  =     I, *User-Defined_PAL_,(640X480)

[*User-Defined_PAL_,(640X480)]
PIXEL_CLK   =   14319
H_DISP   =   640
H_FPORCH   =   80
H_SYNC   =   40
H_BPORCH   =   160
H_SYNC_POL   =   1
V_DISP   =   240
V_FPORCH   =   35
V_SYNC   =   5
V_BPORCH   =   30
V_SYNC_POL   =   1
INTERLACE_ENABLE  =   1

Linux ajurit

Linuxissa k�ytetty Xfree86-ikkunointij�rjestelm� tarjoaa hyv�t mahdollisuudet n�ytt�kortin asetusten viritykseen, koska kaikkia n�ytt�kortin ajastuksene liittyvi� asetuksia on mahdollista s��t�� Xconfig-nimisen asetustiedoston asetuksilla. T�ss� asetustiedostossa jokaista ruututilaa varten on yksi asetusrivi, joka m��ritt�� ruutilan resoluution ja ajastukset. K�ytett�vien ruututilojen resoluutiot eiv�t ole rajoittuneet yleisesit k�ytettyihin (640x480, 800x600, 1024x768 jne.), vaan resoluutio on mahdollista m��ritt�� hyvin vapaasti kulloinkin tilanteeseen sopivimmaksi. Seuraava esetustiedoston rivi muodostaa hyvin televisossa toimivan PALi-nimisen resoluution 704x552 pistett�:

ModeLine "PALi"       13.5  704 720 792 864  552 572 605 625 Interlace
T�m� resoluutio on hyvin k�yt�nn�llinen, koska se t�ytt�� hyvin normaalin television kuva-alan mutta ei mene h�iritsev�sti n�kyv�n alueen reunojen yli. Lis�ksi t�m� resoluutio tarjoaa melko neli�nmuotoiset pikselit.

Televisiossa n�kyv� tyypillisempi 640x480 resoluutio saadaan aikaan seuraavilla asetuksilla:

Modeline  "640x480xTV"  15.00   640 728 792 960  480 509 517 573 Interlace

Tomi Engdahl <[email protected]>

Takaisin sis�llyslyetteloon