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.