home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 07 / grdlagen / bios4.pas < prev    next >
Pascal/Delphi Source File  |  1990-04-05  |  8KB  |  191 lines

  1. (* ====================================================== *)
  2. (*                  Das EGA/VGA-BIOS:                     *)
  3. (*                 Diverse Funktionen                     *)
  4. (*           (c) 1990 Matthias Uphoff & TOOLBOX           *)
  5. (* ====================================================== *)
  6.  
  7. UNIT Bios4;
  8.  
  9. INTERFACE
  10.  
  11.   (* Konstanten für die Spezifikation der beim Aufruf *)
  12.   (* von SaveStatus zu sichernden Bereiche            *)
  13. CONST VRegs = 1;      (* Bit 0: Videoregisterinhalte  *)
  14.       VData = 2;      (* Bit 1: Video-Datenbereiche   *)
  15.       DACRegs = 4;    (* Bit 2: DAC- und Farbregister *)
  16.  
  17.   (* Typen für die Abfrage der VGA-Statusinformationen *)
  18. TYPE DisplayCode = (NoDisplay, MDA, CGA, Unused1,
  19.                     EGAColor, EGAMono, PGA,
  20.                     VGAMono, VGAColor, Unused2, Unused3,
  21.                     MCGAMono, MCGAColor);
  22.  
  23.      (* Cursorposition für eine Bildseite *)
  24.      PosType =
  25.        RECORD
  26.          x,y: BYTE;
  27.        END;
  28.  
  29.      (* Modusunabhängige Statusinfos, s. Tabelle 6 *)
  30.      StaticTable =
  31.        RECORD
  32.            (* Verfügbare Videomodi *)
  33.          Modes: ARRAY[0..2] OF BYTE;
  34.          Reserved1: ARRAY[0..3] OF BYTE;
  35.            (* verfügbare vertikale Textmodus-Auflösung *)
  36.          VResAvailable: BYTE;
  37.            (* verfügbare Zeichensatzblöcke *)
  38.          FontBlocks: BYTE;
  39.            (* davon gleichzeitig darstellbar *)
  40.          BlocksUsable: BYTE;
  41.            (* diverse Adapter-Eigenschaften *)
  42.          MiscFeatures: WORD;
  43.          Reserved2: ARRAY[0..2] OF BYTE;
  44.            (* verfügbare Save Pointer-Funktionen *)
  45.          SavePointerFeatures: BYTE;
  46.        END;
  47.  
  48.      StaticPointer = ^StaticTable;
  49.  
  50.      (* VGA-Statusinformationen, siehe Tabelle 5 *)
  51.      VGAStatus =
  52.        RECORD
  53.          StaticAddr: StaticPointer;  (* siehe oben *)
  54.          VideoMode: BYTE;            (* akt. Videomodus *)
  55.          NrOfColumns: WORD;          (* Textspalten *)
  56.          PageSize: WORD;             (* Bildseitengröße *)
  57.          PageStart: WORD;            (* Start Bildseite *)
  58.          CursorPos: ARRAY[0..7] OF PosType; (* Cursorpos. *)
  59.          CursorStart: BYTE;          (* Cursorform *)
  60.          CursorEnd: BYTE;
  61.          ActivePage: BYTE;           (* Aktive Bildseite *)
  62.          CRTCPortAddr: WORD;         (* CRTC-Portadresse *)
  63.          ModeCtrlReg: BYTE;
  64.          ColorSelectReg: BYTE;
  65.          NrOfRows: BYTE;             (* Textzeilen *)
  66.          CharSize: WORD;             (* Zeichenhöhe *)
  67.          ActiveDisplay: DisplayCode;
  68.          AlternateDisplay: DisplayCode;
  69.          NrOfColors: WORD;           (* verfügbare Farben *)
  70.          NrOfPages: BYTE;            (* verfügbare Seiten *)
  71.          VRes: BYTE;                 (* vert. Auflösung *)
  72.          PrimaryFont: BYTE;          (* 1. Fontblock *)
  73.          SecondaryFont: BYTE;        (* 2. Fontblock *)
  74.          MiscBits: BYTE;          (* Diverse Infos *)
  75.          Reserved1: ARRAY[0..2] OF BYTE;
  76.          VideoMem: BYTE;             (* Größe Video-RAM *)
  77.          SavePointerStatus: BYTE;
  78.          Reserved2: ARRAY[0..12] OF BYTE;
  79.       END;
  80.  
  81. PROCEDURE CopyString(p1,x1,y1,p2,x2,y2: BYTE; n: WORD);
  82.    (* Kopiert in den Textmodi n Zeichen mitsamt Attribut *)
  83.    (* von der Position x1,y1 der Seite p1 an die         *)
  84.    (* Position x2,y2 der Bildseite p2                    *)
  85. FUNCTION IsVGA: BOOLEAN;
  86.    (* Gibt TRUE zurück, wenn eine VGA-Karte vorhanden ist *)
  87. PROCEDURE ReadStatus(VAR Status: VGAStatus);
  88.    (* Liest die VGA-Statusinformationen und   *)
  89.    (* gibt sie in der Variablen Status zurück *)
  90. FUNCTION SaveStatus(SaveBits: WORD): BOOLEAN;
  91.    (* Speichert die durch SaveBits spezifizierten *)
  92.    (* VGA-Statusinformationen in einem Puffer     *)
  93.    (* Gibt bei korrekter Ausführung TRUE zurück   *)
  94. PROCEDURE RestoreStatus;
  95.    (* Restauriert die durch BufferP referenzierten *)
  96.    (* und Content angegebenen Statusinformationen  *)
  97.  
  98. (* ====================================================== *)
  99.  
  100. IMPLEMENTATION
  101.  
  102. USES Dos;
  103.  
  104. VAR R: Registers;      (* Prozessorregister *)
  105.     BufferP: POINTER;  (* Zeiger auf Statuspuffer *)
  106.     Content: WORD;     (* aktueller StatusPufferinhalt *)
  107.  
  108. PROCEDURE CopyString(p1,x1,y1,p2,x2,y2: BYTE; n: WORD);
  109. VAR PageLength: WORD ABSOLUTE $0000:$044C;
  110.       (* BIOS Variable: Länge der Bildseite *)
  111.     NrOfColumns: WORD ABSOLUTE $0000:$044A;
  112.       (* BIOS-Variable: Anzahl Textspalten *)
  113. BEGIN
  114.   R.AH := $12;       (* Funktionsnr. für Alternate Select *)
  115.   R.BL := $10;       (* UF Videokonfiguration *)
  116.   Intr($10,R);       (* BIOS-Call *)
  117.   IF R.BH = 0 THEN   (* Farbbildschirm *)
  118.     R.ES := $B800      (* Segmentadresse $B800 *)
  119.   ELSE               (* ansonsten Monochrom *)
  120.     R.ES := $B000;     (* Segmentadresse $B000 *)
  121.   R.AH := $13;       (* Funktionsnr. für Stringausgabe *)
  122.   R.AL := 2;         (* UF Zeichen/Attributstring *)
  123.   R.BH := p2;        (* Ausgabe auf Seite p2 *)
  124.   R.CX := n;         (* Anzahl der Zeichen *)
  125.   R.DH := y2;        (* Ausgabezeile *)
  126.   R.DL := x2;        (* Ausgabespalte *)
  127.     (* Bildspeicher-Offsetadresse berechnen: *)
  128.   R.BP := p1 * PageLength + (NrOfColumns * y1 + x1) * 2;
  129.   Intr($10,R);       (* BIOS-Call *)
  130. END;
  131.  
  132. FUNCTION IsVGA: BOOLEAN;
  133. BEGIN
  134.   R.AH := $1A;          (* Funktiom Display Combination *)
  135.   R.AL := 0;            (* Code lesen                   *)
  136.   Intr($10,R);          (* BIOS-Call *)
  137.   IsVGA := R.AL = $1A;  (* VGA-Identifizierung anhand des *)
  138. END;                    (* Kontroll-Rückgabewertes        *)
  139.  
  140. PROCEDURE ReadStatus(VAR Status: VGAStatus);
  141. BEGIN
  142.   R.AH := $1B;          (* Funktionsnummer *)
  143.   R.BX := 0;            (* Implementationstyp *)
  144.   R.ES := Seg(Status);  (* Segmentadresse Puffer *)
  145.   R.DI := Ofs(Status);  (* Offsetadresse Puffer *)
  146.   Intr($10,R);          (* BIOS-Call *)
  147. END;
  148.  
  149. FUNCTION SaveStatus(SaveBits: WORD): BOOLEAN;
  150. BEGIN
  151.   BufferP := NIL;            (* Pufferzeiger ungültig *)
  152.   Content := SaveBits;       (* Pufferinhalt merken *)
  153.   R.CX := SaveBits;          (* Zu sichernden Bereiche *)
  154.   R.AH := $1C;               (* Funktionsnummer *)
  155.   R.AL := 0;                 (* UF Puffergröße ermitteln *)
  156.   Intr($10,R);               (* BIOS-Call, Resultat in BX *)
  157.   IF (R.AL = $1C) AND
  158.     (MaxAvail >= R.BX*64) THEN BEGIN
  159.     (* Funktion wird unterstützt und genug Speicher frei: *)
  160.     GetMem(BufferP, R.BX*64);  (* Puffer reservieren *)
  161.     R.CX := SaveBits;          (* Zu sichernden Bereiche *)
  162.     R.ES := Seg(BufferP^);     (* Segmentadresse Puffer *)
  163.     R.BX := Ofs(BufferP^);     (* Offsetadresse Puffer *)
  164.     R.AH := $1C;               (* Funktionsnummer *)
  165.     R.AL := 1;                 (* UF Status sichern *)
  166.     Intr($10,R);               (* BIOS-Call *)
  167.   END;
  168.   SaveStatus := BufferP <> NIL;
  169. END;
  170.  
  171. PROCEDURE RestoreStatus;
  172. BEGIN
  173.   IF BufferP <> NIL THEN BEGIN
  174.     (* Es wurde bereits was abgespeichert: *)
  175.     R.CX := Content;         (* Pufferinhalt *)
  176.     R.ES := Seg(BufferP^);   (* Segmentadresse Puffer *)
  177.     R.BX := Ofs(BufferP^);   (* Offsetadresse Puffer *)
  178.     R.AH := $1C;             (* Funktionsnummer *)
  179.     R.AL := 2;               (* UF Status zurückschreiben *)
  180.     Intr($10,R);             (* BIOS-Call *)
  181.   END;
  182. END;
  183.  
  184. (* ====================================================== *)
  185.  
  186. BEGIN  (* Initialisierungsteil *)
  187.   BufferP := NIL;    (* Kein Statuspuffer vorhanden *)
  188. END.
  189.  
  190. (* ====================================================== *)
  191.