home *** CD-ROM | disk | FTP | other *** search
- (* ====================================================== *)
- (* Das EGA/VGA-BIOS: *)
- (* Diverse Funktionen *)
- (* (c) 1990 Matthias Uphoff & TOOLBOX *)
- (* ====================================================== *)
-
- UNIT Bios4;
-
- INTERFACE
-
- (* Konstanten für die Spezifikation der beim Aufruf *)
- (* von SaveStatus zu sichernden Bereiche *)
- CONST VRegs = 1; (* Bit 0: Videoregisterinhalte *)
- VData = 2; (* Bit 1: Video-Datenbereiche *)
- DACRegs = 4; (* Bit 2: DAC- und Farbregister *)
-
- (* Typen für die Abfrage der VGA-Statusinformationen *)
- TYPE DisplayCode = (NoDisplay, MDA, CGA, Unused1,
- EGAColor, EGAMono, PGA,
- VGAMono, VGAColor, Unused2, Unused3,
- MCGAMono, MCGAColor);
-
- (* Cursorposition für eine Bildseite *)
- PosType =
- RECORD
- x,y: BYTE;
- END;
-
- (* Modusunabhängige Statusinfos, s. Tabelle 6 *)
- StaticTable =
- RECORD
- (* Verfügbare Videomodi *)
- Modes: ARRAY[0..2] OF BYTE;
- Reserved1: ARRAY[0..3] OF BYTE;
- (* verfügbare vertikale Textmodus-Auflösung *)
- VResAvailable: BYTE;
- (* verfügbare Zeichensatzblöcke *)
- FontBlocks: BYTE;
- (* davon gleichzeitig darstellbar *)
- BlocksUsable: BYTE;
- (* diverse Adapter-Eigenschaften *)
- MiscFeatures: WORD;
- Reserved2: ARRAY[0..2] OF BYTE;
- (* verfügbare Save Pointer-Funktionen *)
- SavePointerFeatures: BYTE;
- END;
-
- StaticPointer = ^StaticTable;
-
- (* VGA-Statusinformationen, siehe Tabelle 5 *)
- VGAStatus =
- RECORD
- StaticAddr: StaticPointer; (* siehe oben *)
- VideoMode: BYTE; (* akt. Videomodus *)
- NrOfColumns: WORD; (* Textspalten *)
- PageSize: WORD; (* Bildseitengröße *)
- PageStart: WORD; (* Start Bildseite *)
- CursorPos: ARRAY[0..7] OF PosType; (* Cursorpos. *)
- CursorStart: BYTE; (* Cursorform *)
- CursorEnd: BYTE;
- ActivePage: BYTE; (* Aktive Bildseite *)
- CRTCPortAddr: WORD; (* CRTC-Portadresse *)
- ModeCtrlReg: BYTE;
- ColorSelectReg: BYTE;
- NrOfRows: BYTE; (* Textzeilen *)
- CharSize: WORD; (* Zeichenhöhe *)
- ActiveDisplay: DisplayCode;
- AlternateDisplay: DisplayCode;
- NrOfColors: WORD; (* verfügbare Farben *)
- NrOfPages: BYTE; (* verfügbare Seiten *)
- VRes: BYTE; (* vert. Auflösung *)
- PrimaryFont: BYTE; (* 1. Fontblock *)
- SecondaryFont: BYTE; (* 2. Fontblock *)
- MiscBits: BYTE; (* Diverse Infos *)
- Reserved1: ARRAY[0..2] OF BYTE;
- VideoMem: BYTE; (* Größe Video-RAM *)
- SavePointerStatus: BYTE;
- Reserved2: ARRAY[0..12] OF BYTE;
- END;
-
- PROCEDURE CopyString(p1,x1,y1,p2,x2,y2: BYTE; n: WORD);
- (* Kopiert in den Textmodi n Zeichen mitsamt Attribut *)
- (* von der Position x1,y1 der Seite p1 an die *)
- (* Position x2,y2 der Bildseite p2 *)
- FUNCTION IsVGA: BOOLEAN;
- (* Gibt TRUE zurück, wenn eine VGA-Karte vorhanden ist *)
- PROCEDURE ReadStatus(VAR Status: VGAStatus);
- (* Liest die VGA-Statusinformationen und *)
- (* gibt sie in der Variablen Status zurück *)
- FUNCTION SaveStatus(SaveBits: WORD): BOOLEAN;
- (* Speichert die durch SaveBits spezifizierten *)
- (* VGA-Statusinformationen in einem Puffer *)
- (* Gibt bei korrekter Ausführung TRUE zurück *)
- PROCEDURE RestoreStatus;
- (* Restauriert die durch BufferP referenzierten *)
- (* und Content angegebenen Statusinformationen *)
-
- (* ====================================================== *)
-
- IMPLEMENTATION
-
- USES Dos;
-
- VAR R: Registers; (* Prozessorregister *)
- BufferP: POINTER; (* Zeiger auf Statuspuffer *)
- Content: WORD; (* aktueller StatusPufferinhalt *)
-
- PROCEDURE CopyString(p1,x1,y1,p2,x2,y2: BYTE; n: WORD);
- VAR PageLength: WORD ABSOLUTE $0000:$044C;
- (* BIOS Variable: Länge der Bildseite *)
- NrOfColumns: WORD ABSOLUTE $0000:$044A;
- (* BIOS-Variable: Anzahl Textspalten *)
- BEGIN
- R.AH := $12; (* Funktionsnr. für Alternate Select *)
- R.BL := $10; (* UF Videokonfiguration *)
- Intr($10,R); (* BIOS-Call *)
- IF R.BH = 0 THEN (* Farbbildschirm *)
- R.ES := $B800 (* Segmentadresse $B800 *)
- ELSE (* ansonsten Monochrom *)
- R.ES := $B000; (* Segmentadresse $B000 *)
- R.AH := $13; (* Funktionsnr. für Stringausgabe *)
- R.AL := 2; (* UF Zeichen/Attributstring *)
- R.BH := p2; (* Ausgabe auf Seite p2 *)
- R.CX := n; (* Anzahl der Zeichen *)
- R.DH := y2; (* Ausgabezeile *)
- R.DL := x2; (* Ausgabespalte *)
- (* Bildspeicher-Offsetadresse berechnen: *)
- R.BP := p1 * PageLength + (NrOfColumns * y1 + x1) * 2;
- Intr($10,R); (* BIOS-Call *)
- END;
-
- FUNCTION IsVGA: BOOLEAN;
- BEGIN
- R.AH := $1A; (* Funktiom Display Combination *)
- R.AL := 0; (* Code lesen *)
- Intr($10,R); (* BIOS-Call *)
- IsVGA := R.AL = $1A; (* VGA-Identifizierung anhand des *)
- END; (* Kontroll-Rückgabewertes *)
-
- PROCEDURE ReadStatus(VAR Status: VGAStatus);
- BEGIN
- R.AH := $1B; (* Funktionsnummer *)
- R.BX := 0; (* Implementationstyp *)
- R.ES := Seg(Status); (* Segmentadresse Puffer *)
- R.DI := Ofs(Status); (* Offsetadresse Puffer *)
- Intr($10,R); (* BIOS-Call *)
- END;
-
- FUNCTION SaveStatus(SaveBits: WORD): BOOLEAN;
- BEGIN
- BufferP := NIL; (* Pufferzeiger ungültig *)
- Content := SaveBits; (* Pufferinhalt merken *)
- R.CX := SaveBits; (* Zu sichernden Bereiche *)
- R.AH := $1C; (* Funktionsnummer *)
- R.AL := 0; (* UF Puffergröße ermitteln *)
- Intr($10,R); (* BIOS-Call, Resultat in BX *)
- IF (R.AL = $1C) AND
- (MaxAvail >= R.BX*64) THEN BEGIN
- (* Funktion wird unterstützt und genug Speicher frei: *)
- GetMem(BufferP, R.BX*64); (* Puffer reservieren *)
- R.CX := SaveBits; (* Zu sichernden Bereiche *)
- R.ES := Seg(BufferP^); (* Segmentadresse Puffer *)
- R.BX := Ofs(BufferP^); (* Offsetadresse Puffer *)
- R.AH := $1C; (* Funktionsnummer *)
- R.AL := 1; (* UF Status sichern *)
- Intr($10,R); (* BIOS-Call *)
- END;
- SaveStatus := BufferP <> NIL;
- END;
-
- PROCEDURE RestoreStatus;
- BEGIN
- IF BufferP <> NIL THEN BEGIN
- (* Es wurde bereits was abgespeichert: *)
- R.CX := Content; (* Pufferinhalt *)
- R.ES := Seg(BufferP^); (* Segmentadresse Puffer *)
- R.BX := Ofs(BufferP^); (* Offsetadresse Puffer *)
- R.AH := $1C; (* Funktionsnummer *)
- R.AL := 2; (* UF Status zurückschreiben *)
- Intr($10,R); (* BIOS-Call *)
- END;
- END;
-
- (* ====================================================== *)
-
- BEGIN (* Initialisierungsteil *)
- BufferP := NIL; (* Kein Statuspuffer vorhanden *)
- END.
-
- (* ====================================================== *)
-