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ównierz 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ępujace 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 poisu. 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 progamu. 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:

  1. Nazwa pliku *.BGI
  2. Nazwa pliku *.OBJ
  3. 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;

11 komentarzy

Przecinek po spacji, a nie przed nią? Wątpię...

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 edytujcie tego artykułu !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Nie krzycz tak!!!!!!!!!!!!!!!!!!!!!!!!!!! Nie jesteśmy głusi!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Zapoznaj się z zasadami redagowania artykułów, to nikt nie będzie miał powodu aby edytować.

PS : Nie edytujcie tego artykułu !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

A czytać możemy?? [rotfl]

che che obszerny a jakze i to jeszcze ja dowalilem troche nekrofili :)

... ze chce wykorzystac jakiegos trupa ...

PS : Przed edycją skontaktujcie się ze mną !
[email protected]

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 ...).