Sterowniki BGI - informacje ogólne


Spis treści

     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;

Informacje
Ostatnia modyfikacja 19-03-2008 11:18 Ostatni autor Oleksy_Adam
Ilość wyświetleń 3569 Wersja 7
Komentarz
Coldpeer dnia 19-03-2008 17:37
Oleksy: zakładka 'Przenieś' (zmienilem)
Oleksy_Adam dnia 19-03-2008 11:19
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ł :)
lukasz1235 dnia 18-03-2008 21:21
Nie edytujcie tego artykułu !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Nie krzycz tak!!!!!!!!!!!!!!!!!!!!!!!!!!! Nie jesteśmy głusi!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
nav dnia 18-03-2008 21:09
Zapoznaj się z zasadami redagowania artykułów, to nikt nie będzie miał powodu aby edytować.
cyriel dnia 18-03-2008 21:05
PS : Nie edytujcie tego artykułu !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

A czytać możemy?? [rotfl]
reichel dnia 18-03-2008 17:12
che  che  obszerny  a  jakze  i  to  jeszcze  ja  dowalilem  troche  nekrofili  :)
... ze  chce  wykorzystac  jakiegos  trupa ...
Coldpeer dnia 18-03-2008 14:20
PS : Przed edycją skontaktujcie się ze mną !
patryk432@onet.eu


Tja, jakże obszerny tekst.
reichel dnia 18-03-2008 10:44
... 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 ...).
SebaZ dnia 18-03-2008 09:14
Przecinek po spacji, a nie przed nią? Wątpię...
Patryk27 dnia 18-03-2008 07:24
Szkoła
SebaZ dnia 18-03-2008 07:20
Kto Cię uczył stawiać przecinki?

Katalog
Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 0.1116 sek. (zapytań SQL: 11)