home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1990
/
07
/
grdlagen
/
bios3.pas
next >
Wrap
Pascal/Delphi Source File
|
1990-03-11
|
8KB
|
195 lines
(* ====================================================== *)
(* BIOS3.PAS *)
(* EGA/VGA-BIOS-Serie Teil 3 *)
(* Zeichengenerator-Funktionen *)
(* (c) 1990 Matthias Uphoff & TOOLBOX *)
(* ====================================================== *)
UNIT Bios3;
INTERFACE
TYPE FontName = (INT1F, INT43, ROM8x14, ROM8x8, ROM8x8Hi,
ROM9x14, ROM8x16, ROM9x16);
(* INT1F : 2. Hälfte des akt. 8x8-CGA-Grafikfonts *)
(* INT43 : aktueller Font für EGA/VGA-Grafikmodi *)
(* ROM8x14 : ROM 8x14-Font *)
(* ROM8x8 : ROM 8x8-Font *)
(* ROM8x8Hi: ROM 2. Hälfte des 8x8-Fonts *)
(* ROM9x14 : ROM 9x14-Ersatzzeichen *)
(* ROM8x16 : ROM 8x16-Font, nur VGA *)
(* ROM9x16 : ROM 9x16-Ersatzzeichen, nur VGA *)
FUNCTION CharSize: Word;
(* Gibt die aktuelle Zeichenhöhe zurück *)
PROCEDURE UserTextFont(BlockNr, Size: Byte;
NrOfChar, FirstChar: Word;
Adjust: Boolean; VAR MTable);
(* Selbstdefinierte Textmodus-Zeichen inst. *)
(* BlockNr: Nummer des Ziel-Speicherblocks *)
(* Size: Zeichenhöhe in Rasterzeilen *)
(* NrOfChar: Anzahl der neuen Zeichen *)
(* FirstChar: Erstes zu änderndes Zeichen *)
(* Adjust: Zeilenanpassung ja/nein *)
(* MTable: Array mit Zeichenmatritzen *)
PROCEDURE ROMTextFont(Font: FontName;
BlockNr: Byte; Adjust: Boolean);
(* ROM-Font für Textmodus installieren
(* Font: Fontname (s. Typendeklaration) *)
(* BlockNr: Nummer des Ziel-Speicherblocks *)
(* Adjust: Zeilenanpassung ja/nein *)
PROCEDURE DefChar(AsciiNr: Byte; VAR MTable);
(* Ein neues Textmodus-Zeichen mit aktueller *)
(* Zeichenhöhe in Block 0 installieren *)
(* AsciiNr: Ascii-Nr. des Zeichens *)
(* MTable: Array mit einer Zeichenmatrix *)
FUNCTION LoadFont(FileName: String; VAR MTable): Integer;
(* Lädt die Fontdatei Filename in die *)
(* Variable MTable. Rückgabewerte: *)
(* 0: Datei konnte nicht geladen werden *)
(* -1: Falsches Dateiformat *)
(* > 0: Dateigröße in Bytes *)
PROCEDURE SelectBlock(BlockA, BlockB: Byte);
(* Textmodus- Zeichensatzblöcke wählen *)
(* BlockA: Erste Blocknr. EGA 0..3, VGA 0..7 *)
(* BlockB: Zweite Blocknr. EGA 0..3, VGA 0..7*)
PROCEDURE UserGraFont(Size: Word; Rows: Byte; VAR MTable);
(* Grafikmodus-Zeichensatz installieren *)
(* Size: Zeichenhöhe in Rasterzeilen *)
(* Rows: Anzahl Bildschirm-Textzeilen *)
(* MTable: Array mit Zeichenmatritzen *)
FUNCTION FontAddr(Font: FontName): Pointer;
(* Gibt Zeiger auf (ROM-)Zeichensatz zurück *)
(* Font: Fontname (siehe Typendeklaration) *)
(* ====================================================== *)
IMPLEMENTATION
USES Dos; (* Einbindung der Prozedur Intr und des *)
(* Datentyps Registers für BIOS-Aufrufe *)
VAR R: Registers;
FUNCTION CharSize: Word;
BEGIN
R.AH := $11; (* Funktionsnummer *)
R.AL := $30; (* Unterfunktionsnummer *)
R.BH := 1; (* Im Prinzip egal *)
Intr($10,R); (* BIOS-Call *)
CharSize := R.CX; (* Zeichenhöhe in CX *)
END;
PROCEDURE ROMTextFont(Font: FontName;
BlockNr: Byte; Adjust: Boolean);
PROCEDURE Install(FNr: Byte);
BEGIN
R.AL := FNr; (* Unterfunktionsnr. *)
IF Adjust THEN R.AL := R.AL + $10;
R.AH := $11; (* Funktionsnr. *)
R.BL := BlockNr; (* zu ladender Block *)
Intr($10,R); (* BIOS-Call *)
END;
BEGIN
CASE Font OF
ROM8x8: Install(2);
ROM8x14: Install(1);
ROM8x16: Install(4);
END;
END;
PROCEDURE UserTextFont(BlockNr, Size: Byte;
NrOfChar, FirstChar: Word;
Adjust: Boolean; VAR MTable);
BEGIN
R.AH := $11; (* Funktionsnr. *)
IF Adjust THEN (* mit Textzeilenanpassung *)
R.AL := $10 (* Unterfunktionnr *)
ELSE (* ohne Textzeilenanpassung *)
R.AL := $00; (* Unterfunktionsnr. *)
R.BL := BlockNr; (* zu ladender Speicherblock *)
R.BH := Size; (* Höhe der Zeichen *)
R.CX := NrOfChar; (* Anzahl der Zeichen *)
R.DX := FirstChar; (* Nummer des 1. Zeichens *)
R.BP := Ofs(MTable); (* Offsetadr. der Matrixtabelle *)
R.ES := Seg(MTable); (* Segmentadr. der Matrixtabelle *)
Intr($10,R); (* BIOS-Call *)
END;
PROCEDURE DefChar(AsciiNr: Byte; VAR MTable);
BEGIN
UserTextFont(0, CharSize, 1, AsciiNr, TRUE, MTable);
END;
FUNCTION LoadFont(FileName: String; VAR MTable): Integer;
VAR f: File;
fsize: LongInt;
BEGIN
(*$I-*)
Assign(f,FileName);
Reset(f,1); (* Recordgröße 1 *)
(*$I+*)
IF IOResult <> 0 THEN BEGIN (* Datei existiert nicht *)
LoadFont := 0;
Exit;
END;
fsize := FileSize(f);
IF (fsize MOD 8 > 0)
OR (fsize > 32*256) THEN (* Kein Zeichensatz-Format *)
LoadFont := -1
ELSE BEGIN (* Datei lesen *)
BlockRead(f,MTable,fsize);
LoadFont := fsize;
END;
Close(f);
END;
PROCEDURE SelectBlock(BlockA, BlockB: Byte);
BEGIN
R.AH := $10; (* Funktion Paletten & Farbregister *)
R.AL := $00; (* Unterfunktion Lade Palettenreg. *)
R.BL := $12; (* Registernr. für Color Plane Enable *)
IF BlockA <> BlockB THEN
(* Attributbit 3 ohne Einfluß auf Vordergrundfarbe *)
R.BH := $7
ELSE
(* Attributbit 3 mit Einfluß auf Vordergrundfarbe *)
R.BH := $F;
Intr($10,R); (* BIOS-Call *)
(* Blockparameter zusammenbasteln: *)
R.BL := (BlockA AND 3) + (BlockA AND 4) SHL 2 +
(BlockB AND 3) SHL 2 + (BlockB AND 4) SHL 4;
R.AH := $11; (* Funktion Zeichensatz-Generator *)
R.AL := 3; (* Unterfunktion Blockauswahl *)
Intr($10,R); (* BIOS-Call *)
END;
PROCEDURE UserGraFont(Size: Word; Rows: Byte; VAR MTable);
BEGIN
R.AH := $11; (* Funktionsnummer *)
R.AL := $21; (* Unterfunktionsnummer *)
R.BL := 0; (* Zeilenanzahl frei wählbar *)
R.CX := Size; (* Höhe der Zeichen *)
R.DL := Rows; (* Anzahl Textzeilen *)
R.ES := Seg(MTable); (* Segmentadresse Zeichensatz *)
R.BP := Ofs(MTable); (* Offsetadresse Zeichensatz *)
Intr($10,R); (* BIOS-Call *)
END;
FUNCTION FontAddr(Font: FontName): Pointer;
VAR R: Registers;
BEGIN
R.AH := $11; (* Funktionsnummer *)
R.AL := $30; (* Unterfunktionsnummer *)
R.BH := ORD(Font); (* Zeichensatz-Kennziffer *)
Intr($10,R); (* BIOS-Call *)
FontAddr := Ptr(R.ES,R.BP); (* ES=Segment, BP=Offset *)
END;
(* ====================================================== *)
BEGIN (* Initialisierungsteil: Leer *)
END.
(* ====================================================== *)
(* Ende BIOS3.PAS *)