Pascal


Jak zmienić czcionkę w trybie tekstowym?

Jeśli znudziła nam się czcionka jaką standardowo posługujemy się w trybie tekstowym możemy stworzyć własne fonty. Aby to zrobić posłużymy sie assemblerem. Istnieje funkcja przerwania 10h pozwalająca zmienić wygląd dowolnego znaku.

Należy pamiętać o tym, że nie tworzymy zupełnie nowych znaków tylko zmieniamy wygląd już istniejących.

Przypatrzmy się więc naszemu przerwaniu:

AX = 1110h
ES:BP -> tablica z opisem wzoru
CX = ilość znaków do zapisu
DX = numer znaku w kodzie ASCII
BL = blok (płat) pamięci
BH = ilość bajtów do zapisu jednego znaku

Standardowo znak ma wymiary 8x16 pikseli. Aby ułatwić sobie tworzenie nowych znaków możemy stworzyć typ, który będzie tablicą znaków o wymiarach właśnie 8x16:

12345678 1 2 3 4 ##### 5 # # 6 # # 7 # # 8 ##### 9 # # 10 # # 11 # # 12 13 14 15 16

Gdzie znaki różne od spacji (w tym przypadku "#") oznaczają piksele, które będą się "świecić" i utworzą nasz nowy znak. Jednak tablicy w takiej postaci nie możemy wykorzystać do naszego przerwania. Musimy ją trochę zmienić. Robimy to tak, że każdy piksel będzie opisany przez jeden bit (wartość 1 dla pikseli tworzących znak i wartość 0 dla pikseli w kolorze tła). Jeśli teraz zamienimy każdy znak z naszej tablicy różny od zera na bit wartości 1, a każdą spację na bit wartości jeden powstanie nam nowa tablica:

12345678 1 00000000 2 00000000 3 00000000 4 01111100 5 01000100 6 01000100 7 01000100 8 01111100 9 01000100 10 01000100 11 01000100 12 00000000 13 00000000 14 00000000 15 00000000 16 00000000

Powstała nam tym samym tablica 16 wierszy po 8 bitów, a 8 bitów to bajt, zatem otrzymaliśmy 16 bajtów opisujących nasz znak.

Teraz wystarczy zamienić bity na bajty:

12345678 1 00000000 = 0 2 00000000 = 0 3 00000000 = 0 4 01111100 = 124 5 01000100 = 68 6 01000100 = 68 7 01000100 = 68 8 01111100 = 124 9 01000100 = 68 10 01000100 = 68 11 01000100 = 68 12 00000000 = 0 13 00000000 = 0 14 00000000 = 0 15 00000000 = 0 16 00000000 = 0

...i tak powstaje 16 elementowa tablica = (0,0,0,124,68,68,68,124,68,68,68,0,0,0,0,0) i tą tablicę należy wrzucić pod ES:BP.

I jeszcze krótkie wyjaśnienie, jakie wartości podajemy w poszczególnych rejestrach:

CX = 1 (ustawiamy jeden znak)
DX = numer znaku w kodzie ASCII jaki chcemy zastąpić
BL = 0 (wrzucamy do płatu zerowego)
BH = 16 (opis naszego znaku zajmuje właśnie 16 bajtów)

Jak to zrealizować w Pascalu?

Ładujemy moduł DOS i tworzymy zmienną r typu registers. Za jej pomocą możemy odwoływać się do rejestrów:

r.ax := $1110;
r.cx := 1;
r.dx := charNum;
r.bl := 0;
r.bh := $10;
r.es := seg(fontArray);
r.bp := ofs(fontArray);
intr($10,r);

Tutaj fontArray to tabica z opisem znaku, a charNum to zmienna zawierająca kod ASCII definiowanego znaku.

Trzeba pamiętać, że nowe czcionki będą działać tylko w trybie pełnego ekranu. Jeśli korzystamy z Windows i otworzymy program w okienku to i tak zobaczymy standardowe fonty.

Co zrobić, żeby z powrotem przywrócić standardowy wygląd czcionek?

Wystarczy skorzystać z procedury modułu CRT - TextMode(...), np. TextMode(CO80) wywoła standardowy tryb 80x25 znaków w kolorze.

Zachęcam jak zwykle do analizy dołączonego przeze mnie źródła - czcionka.pas.

Dodał: ifrost​, www
Dział: Pascal


 

ComputerSun.pl na FaceBooku
Polecamy lekturę:

Mac OS X Tiger. Skuteczne rozwiązania



X

Zapisz się na biuletyn serwisu ComputerSun.pl, aby otrzymać poradnik:

Zabezpieczanie sieci bezprzewodowych. Przydatne wskazówki jak chronić sieć domową przed intruzami

Imię:  
Email:
Tak, akceptuję Politykę Prywatności