W numerze 20/95 PCkuriera w dziale Dla praktyków ukazał się
artykuł p. Piotra Rotkiewicza opisujący możliwości uzyskania różnych trybów
256-kolorowych na karcie VGA. Po jego przeczytaniu nasunął mi się wniosek, że
podobną metodę można zastosować również w trybach 16-kolorowych.
Jest to o tyle ciekawe, że ze względu na dwukrotnie większą
szykość przesyłania punktów między układami karty można uzyskać na ekranie
spore rozdzielczości, porównywalne z trybami SVGA. Jako przykład
wybrałem tryb 752 x 564 punkty. Taka rozdzielczość zachowuje proporcje
ekranu 4:3, a poza tym pozwala użyć podobnych wartości rejestrów CRT,
jak w opisywanym przez p. Rotkiewicza trybie 376x564 w 256 kolorach.
Procedura
Initgraph rozpoczyna działanie od inicjacji trybu 640x480 w 16
kolorach. Nie zgadzam się tu z autorem wspomnianego artykułu, który
proponuje inicjować tryb BIOS-u tylko w celu uruchomienia programów ze
środowiska zintegrowanego. Uważam, że w procedurze, która będzie
wywoływana prawdopodobnie tylko raz w całym programie, należy
maksymalnie wykorzystać możliwości BIOS-u. Po pierwsze, zmniejsza to
liczbę rejestrów karty wymagających bezpośredniej modyfikacji (dla
omawianego trybu odpada cały sekwencer i prawie cały układ graficzny).
Po drugie, nie trzeba wtedy synchronizować zmiany rejestrów CRT z
wyświetlaniem, gdyż po inicjacji trybu sekwencer znajduje się jeszcze
poza obszarem wyświetlania (BIOS przecież też musi się
zsynchronizować).
Sterownik CRT jest programowany na taki sam sposób wyświetlania jak w
artykule p. Rotkiewicza, ale wydaje mi się, że warto tu podać
interpretację tych danych, a nie tylko wartości rejestrów.
| Zegar punktu - |
28,322 MHz |
| Szerokość wyświetlania - |
94 znaki (752 punkty) |
| Początek powrotu poziomego - |
98. znak |
| Koniec powrotu poziomego - |
111. znak |
Razem - 115 znaków w linii
| Częstotliwość linii - |
30,785 kHz |
| Częstotliwość ramki - |
53,45 Hz |
| Wysokość obrazu - |
564 linie |
| Początek powrotu pionowego - |
567. linia |
| Koniec powrotu pionowego - |
569. linia |
Razem - 576 linii na ramkę
Mimo że wyświetlane są tylko 94 bajty, w pamięci
rezerwujemy 96, co znakomicie upraszcza adresowanie (w celu obliczenia
adresu punktu wykonujemy przesunięcie i trzy dodawania).
Przy wysyłaniu danych do sterownika CRT użyłem bezpośrednio
zakodowanej instrukcji przesłania grupowego, dzięki czemu nie musiałem
posługiwać się rejestrem DS. Rozwiązanie to wymaga jednak wyłączenia przerwań
podczas przesyłania. Spowodowane jest to specyfiką procesorów x86,
które po wywołaniu przerwania zapamiętują tylko jeden przedrostek - po
powrocie z przerwania następne wartości byłyby pobierane z
przypadkowego miejsca segmentu danych. Nie jest to jednak duża wada,
gdyż przy zmianie rejestrów CRT i tak z reguły wyłączamy przerwania.
Kolejną czynnością jest wybranie trzeciego trybu zapisu i zerowego
trybu odczytu płatów pamięci. Wybrałem ten tryb dlatego, że po
ustaleniu koloru rysowania instrukcją OUT, wszystkie operacje
rysowania mogą zostać wykonane przez pojedyncze dostępy do pamięci.
Jest to typowy przypadek dla procedur typu linia czy okrąg.
Oczywiście we własnych procedurach można ustawiać inne
tryby (na przykład procedura wypełniania konturu powinna używać
pierwszego trybu odczytu, a kopiowanie bitmap powinno się odbywać w
drugim trybie zapisu), ale należy potem przywrócić standardowe
ustawienia.
Ostatnią częścią procedury
Initgraph jest ustalenie kolorów
wyświetlania. Po inicjacji trybu 12H rejestry atrybutów wskazują na
rejestry DAC odpowiadające kolorom EGA, co utrudnia uzyskiwanie np.
płynnych przejść kolorów. Należy zatem ustawić rejestry palety na
wartości od 0 do 15 i rejestr ramki na 16, a do odpowiednich rejestrów
DAC załadować właściwe kolory. Takie rozwiązanie zachowuje liniowe
odwzorowanie palety na przetwornik. Pozwala także na zdefiniowanie
osobnego koloru ramki (w trybach standardowych zmiana rejestru DAC #0
powoduje również zmianę koloru ramki). Opisane czynności są wykonywane
za pomocą funkcji systemowych, z powodów, o których wspomniałem.
Omówienia wymaga jeszcze funkcja
Pixel. Pobiera ona bity z kolejnych
płatów pamięci, tworząc w rejestrze CL kolor punktu. Po jej wywołaniu
rejestr wyboru płatu pamięci do odczytu zawiera 3, co należy
uwzględnić przy wywołaniu funkcji Pixel z wnętrza innej procedury
używającej tego rejestru.
Pamięć ekranu nie jest w omawianym trybie w pełni wykorzystana, z
prawej strony zostaje 16 kolumn, a poniżej ekranu ponad 118 linii.
Mogą się one przydać do łatwej implementacji sprite'ów (o ile ktoś je
będzie tworzyć w trybie 16-kolorowym) lub do realizacji ekranu
wirtualnego.
Literatura:
[1] P. Rotkiewicz: "Co to jest XMODE", PCkurier 20/95, s. 87.
[2] M. Borkowski: "VGA - podbijanie rozdzielczości", Bajtek 3/95, s. 19.
[3] R. Wilton: "Komputerowe karty graficzne", Microsoft Press 1994.
[4] N. Kowalczyk, D. Krzemiński: "Sterownik graficzny VGA",
Wydawnictwo Lupus 1993.
|