home *** CD-ROM | disk | FTP | other *** search
- (* ====================================================== *)
- (* 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 *)