Képernyő


A KARAKTERES KÉPERNYŐ FELÉPÍTÉSE

Ahhoz, hogy továbbléphessünk, meg kell ismerni a karakteres képernyő felépítését, mivel a következő program a képernyőre való írást mutatja be.

A képernyőn látott szöveg nem más, mint a memóriának egy része megjelenítve. Egy betű kiíratása karakteres képernyőn úgy történik, hogy a betű kódját (ASCII kódját) és színét a képernyő-memória megfelelő helyére írjuk. Ennek a memóriának is van egy szegmenscíme, ami jelen esetben 0b800h. Ez a képernyő bal felső karakter pozíciójának címe. Ha nem ebbe a sarokba kívánunk írni, akkor a szegmenscímhez hozzá kell adni egy eltolási (offset) értéket. Ennek értékét könnyen ki lehet kiszámolni, mivel tudjuk, hogy egy karakterhez 2 byte tartozik, az első a karakter kódja, a második a színkód. Megnézzük, hogy egy sorban hány betű fér el (a mintaprogramnál 80), ezt megszorozzuk 2-vel, így megkaptuk egy sor hosszát. Ha például a 7. sor 13. oszlopába kívánunk írni, annak címe 80 karakteres módban 7*80*2+13*2=1146=47Ah tehát a teljes cím: 0B800h:47Ah. Így bármely pozíció címét ki tudjuk számolni. Ezután már csak az a dolgunk, hogy a kiszámolt címre írjuk a kívánt adatot. Itt kell figyelembe venni, hogy a 16 bites regiszternek az alsó 8 bitje tárolódik előbb és utána a felső rész. Így a színkódot az ah a karakterkódot az al regiszterbe kell tenni (vagy bármelyik másikba, de ilyen sorrendben). A színkód byte minden külön bitjének megvan a maga jelentése:


0.bit: Az előtér kék színösszetevője,
1.bit: Az előtér zöld színösszetevője,
2.bit: Az előtér piros színösszetevője,
3.bit: Az előtér intenzitása,
4.bit: A háttér kék színösszetevője,
5.bit: A háttér zöld színösszetevője,
6.bit: A háttér piros színösszetevője,
7.bit: Villogás ki- bekapcsolása (a bit 1 értéke jelenti a villogást).

A kívánt színt úgy tudjuk előállítani, hogy a megfelelő színeket összekeverjük. A 8 féle előtérszínt kiegészíti egy intenzitás bit, amit ha 1 állapotba állítunk, a szín fényesebb lesz. A háttér színét egy villogás bittel egészítették ki, amit ha bekapcsolunk, a betű villogni fog.

Pelda02 Segment ;Szegmensdefinicio.
assume cs:Pelda02,ds:Pelda02 ;Cs es ds regiszterek bealli-
;tasa a szegmens elejere.
Start: mov ax,Pelda02 ;A ds regiszter beallitasa.
mov ds,ax
mov ax,0b800h ;A kepernyomemoria szegmens-
mov es,ax ;cimet es regiszterbe tolti.
mov di,1146 ;A di indexregiszterbe
;beallitja az offsetcimet.
mov al,"A" ;Al regiszterbe az "A" betu
;ascii kodjat tolti.
mov ah,7 ;A betu szinet fekete alapon
;feher szinure allitja.
mov es:[di],ax ;Az es:di alltal mutatott
;cimre irja ax tartalmat azaz
;a fekete alapon feher "A"
;betut.
mov ax,4c00h ;Kilepes a DOS-ba.
int 21h
Pelda02 Ends ;A szegmens vege.
End Start ;A program vege


A program eleje és vége azonos az előzővel, de közé lett iktatva a betű kiíratása. Első lépésben beállítjuk a képernyő-memória szegmenscímét az es szegmensregiszterbe. Amint azt a ds állításánál is tapasztalhattuk, a szegmensregisztereket közvetlenül nem lehet állítani, így az ax regiszteren keresztül írjuk bele a megfelelő értéket. Ezután a már említett offset értéket a di indexregiszterbe tesszük és az így kialakuló memóriacímre kiírjuk ax értékét, majd visszatérünk a DOS-hoz.

Egy szintet vissza, vagy vissza a főmenübe.