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 |