Sterowniki BGI - informacje ogólne
Patryk27
1 Wstęp
2 Komunikacja aplikacji ze sterownikiem
2.1 Inicjacja poprzez podanie ścieżki dostępu:
2.2 Linkowanie do pliku wykonywalnego:
3 Instalacja własnego sterownika
Wstęp
Na początek troszkę historii. Jeszcze w czasach gdzie DOS wiódł prymat, o DX i OpenGL słyszeli nieliczni a całe zastępy programistów pisały w C lub Pascalu (Turbo, Borland, Free Pascal Compiler) firma Borland opracowała sterowniki do tworzenia podstawowych prymitywów graficznych w 2D. W skrócie nazwano je BGI (Borland Graphics Interface). Był to szereg plików o rozszerzeniu *BGI znajdujących się w folderze BGI. Dociekliwi znajdą również pliki *CHR, które są niczym innym jak plikami definiującymi kroje czcionek (odpowiednik plików *TTF - True Type Font).
W Internecie można było spotkać bardzo dużo "silników" graficznych pisanych przez niezależnych programistów. Najczęściej jednak były to silniku operujące na trybie 320x200 pisane praktycznie w czystym assemblerze a to za sprawą bardzo małej prędkości BGI. Niemniej do prostej prezentacji w zupełności starczało. Domyślnie dla TP w folderze można spotkać następujące pliki:
- ATT.BGI
- CGA.BGI
- EGAVGA.BGI
- HERC.BGI
- IBM8514.BGI
- PC3270.BGI
- VESA16.BGI
Z tej listy liczą się tak naprawdę tylko dwa (kto posiada karty graficzne Hercules?) a mianowicie EGAVGA i VESA16. Pierwszy z nich to podstawowy sterownik umożliwiający pracę w rozdzielczości 640x480p. Drugi z nich to sterownik pod nowsze karty graficzne pracujące w standardzie VESA. Umożliwiał on programowanie wysokich rozdzielczości (1280x1024 to nie był już problem). Największym jednak ograniczeniem owych sterowników była ich głębia koloru. Obsługiwały one tylko 16-kolorową paletę. Swojego czasu w Internecie pojawiło się rozszerzenie o plik SVGA256.BGI. Tutaj już było pole do popisu. 256 kolorów i rozdzielczość taka jaką monitor mógł przetworzyć.
Komunikacja aplikacji ze sterownikiem
Do poprawnej pracy aplikacji wykorzystującej owe sterowniki wymagane było podanie ścieżki dostępu do plików *.BGI. Tu trzeba zwrócić uwagę na fakt, że podaje się tylko położenie plików a nie konkretny plik. Za dobór właściwego odpowiadała procedura InitGraph
(o której za chwilkę). Była jeszcze inna opcja, nieco bardziej skomplikowana, ale też bardziej przenośna - sterowniki można było zlinkować do programu. Niestety tak samo jak w przypadku dołączania bibliotek *dll rozmiar aplikacji rozrastał się o wielkość sterowników.
Inicjacja poprzez podanie ścieżki dostępu:
VAR
Driver, Mode :Integer;
BEGIN
Driver := Detect; // autodedekcja karty graficznej
Mode := VGAHI; // ustalenie rozdzielczości
InitGraph(Driver, Mode, 'C:\PASCAL\BGI'); // inicjacja trybu graficznego
// (...)
ProceduryGraficzne;
// (...)
CloseGraph; // Nie jest wymagane aby przejść do trybu tekstowego, aczkolwiek dobry zwyczaj zamykać to co się otwarło
END;
Jak widać obsługa trybu graficznego sprowadza się do kilku wierszy kodu a całość zawiera się pomiędzy InitGraph()..CloseGraph(). W przypadku kiedy sterowniki mają takie same położenie co aplikacja to ścieżka dostępu pozostaje pusta.
W przypadku kiedy aplikacja nie odnajdzie w podanej lokalizacji sterowników wygeneruje komunikat: "Graphics not initialized (use InitGraph)". Warto więc wyposażyć aplikację w mechanizmy obronne przed taką sytuacją. Jakie? Zależy od pomysłowości programisty.
Linkowanie do pliku wykonywalnego:
Tutaj jest nieco więcej zachodu ale zyskuje się na stabilizacji aplikacji. Sterownik i aplikacja stanowią zintegrowaną całość. Po pierwsze trzeba zaopatrzyć się w pliki *.obj (programujący w C i ASM bardziej wiedzą jakie to pliki chodzi). Można szukać gotowych lub dokonać konwersji pliku *BGI na plik *.OBJ za pomocą BINOBJ.EXE. Program wymaga następujących parametrów:
- Nazwa pliku *.BGI
- Nazwa pliku *.OBJ
- Nazwa procedury (będzie potrzebny jej adres do linkowania)
BINOBJ.EXE egavga.bgi egavga.obj EgaVgaDriverProc
Oto kod odpowiedzialny za linkowanie.
UNIT RegBGI;
INTERFACE
PROCEDURE RegisterBGI; { rejestracja sterownikow *.BGI }
IMPLEMENTATION
// dołączenie pliku do modułu
PROCEDURE EgaVgaDriverProc; EXTERNAL;
{$L EGAVGA.OBJ }
PROCEDURE Abort(Msg : STRING);
BEGIN
Writeln(Msg, ': ', GraphErrorMsg(GraphResult));
Halt(1);
END;
PROCEDURE RegisterBGI;
BEGIN
IF RegisterBGIdriver(@EGAVGADriverProc) < 0 THEN
Abort('EGA/VGA');
END;
END.
Podczas dołączania sterowników do aplikacji ścieżka dostępu musi być pusta.
PROGRAM Demo;
USES RegBGI;
VAR
Driver, Mode :Integer;
BEGIN
Driver := Detect; // autodedekcja karty graficznej
Mode := VGAHI; // ustalenie rozdzielczości
InitGraph(Driver, Mode, ''); // inicjacja trybu graficznego
// (...)
ProceduryGraficzne;
// (...)
CloseGraph; // Nie jest wymagane aby przejść do trybu tekstowego, aczkolwiek dobry zwyczaj zamykać to co się otwarło
END;
Instalacja własnego sterownika
Jak pisałem wyżej w internecie jest dostępny sterownik SVGA256.BGI. Aby móc go jednak użyć konieczna jest jego instalacja. Dużo nie opisując zamieszczam kod modułu wraz z przedefiniowanymi trybami graficznymi.
{------------------------------------------}
{ }
{ Modul do obslugi wysokich rozdzielczosci }
{ w trybach 256 kolorowych. Tryby dostepne }
{ tylko dla standardu VESA i SVGA }
{ }
{------------------------------------------}
UNIT Svga256;
INTERFACE
USES Graph, Crt;
CONST
{ dostepne tryby graficzne }
v320x200 = 0;
v640x400 = 1;
v640x480 = 2;
v800x600 = 3;
v1024x768 = 4;
v1280x1024 = 5;
{ funkcje ustawiamy jako daleka po to by moc ja swobodnie wywolac }
FUNCTION DetectSvga256 : Integer; FAR;
PROCEDURE InitSvga256(Path :STRING);
IMPLEMENTATION
VAR GraphDriver, GraphMode, GrErr : integer;
PROCEDURE InitSvga256(Path :STRING);
BEGIN
GraphDriver := InstallUserDriver('SVGA256', @DetectSvga256);
GraphDriver := DETECT;
InitGraph(GraphDriver, GraphMode, Path);
GrErr := GraphResult;
IF GrErr AND $80 = $80 THEN GrErr := GrErr OR $FF00;
IF GrErr <> grOK THEN
BEGIN
ClrScr;
Writeln('Graphics error: ', GraphErrorMsg(GrErr));
Halt(1);
END;
SetColor(White);
END;
FUNCTION DetectSvga256 : Integer;
BEGIN
DetectSvga256 := v640x480;
END;
END.
Użycie jeszcze łatwiejsze:
PROGRAM Demo;
USES Svga256;
BEGIN
InitSvga256('C:\PASCAL\BGI');
// (...)
ProceduryGraficzne;
// (...)
CloseGraph;
END;
Przecinek po spacji, a nie przed nią? Wątpię...
Szkoła
Kto Cię uczył stawiać przecinki?
Oleksy: zakładka 'Przenieś' (zmienilem)
Znalazłem chwilkę czasu i chęci na zrobienie upgrade oryginalnej wersji arta. Mam nadzieję, że poziom merytoryczny nieco wzrósł. Prośba do bardziej zaawansowanych o zmianę tytułu na: "Sterowniki BGI - informacje ogólne" lub coś w tym stylu. Ja nie wiem gdzie zmienić tytuł :)
Nie krzycz tak!!!!!!!!!!!!!!!!!!!!!!!!!!! Nie jesteśmy głusi!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Zapoznaj się z zasadami redagowania artykułów, to nikt nie będzie miał powodu aby edytować.
A czytać możemy?? [rotfl]
che che obszerny a jakze i to jeszcze ja dowalilem troche nekrofili :)
Tja, jakże obszerny tekst.
... chyba ... to po co piszesz, sprawdz i napisz.
W doataku jak ktos jeszcze pisze w
dos'ie
, to calkiem mozliwe, ze chce wykorzystac jakiegos trupa i niekoniecznie musi byc egavga.bgi (tak to jest ok nie ... chyba ...).