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