home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 06 / grdlagen / bios3.pas next >
Pascal/Delphi Source File  |  1990-03-11  |  8KB  |  195 lines

  1. (* ====================================================== *)
  2. (*                      BIOS3.PAS                         *)
  3. (*                EGA/VGA-BIOS-Serie Teil 3               *)
  4. (*               Zeichengenerator-Funktionen              *)
  5. (*           (c) 1990 Matthias Uphoff & TOOLBOX           *)
  6. (* ====================================================== *)
  7.  
  8. UNIT Bios3;
  9.  
  10. INTERFACE
  11.  
  12. TYPE FontName = (INT1F, INT43, ROM8x14, ROM8x8, ROM8x8Hi,
  13.                  ROM9x14, ROM8x16, ROM9x16);
  14.       (* INT1F   : 2. Hälfte des akt. 8x8-CGA-Grafikfonts *)
  15.       (* INT43   : aktueller Font für EGA/VGA-Grafikmodi  *)
  16.       (* ROM8x14 : ROM 8x14-Font                          *)
  17.       (* ROM8x8  : ROM 8x8-Font                           *)
  18.       (* ROM8x8Hi: ROM 2. Hälfte des 8x8-Fonts            *)
  19.       (* ROM9x14 : ROM 9x14-Ersatzzeichen                 *)
  20.       (* ROM8x16 : ROM 8x16-Font, nur VGA                 *)
  21.       (* ROM9x16 : ROM 9x16-Ersatzzeichen, nur VGA        *)
  22.  
  23. FUNCTION CharSize: Word;
  24.    (* Gibt die aktuelle Zeichenhöhe zurück      *)
  25. PROCEDURE UserTextFont(BlockNr, Size: Byte;
  26.                        NrOfChar, FirstChar: Word;
  27.                        Adjust: Boolean; VAR MTable);
  28.    (* Selbstdefinierte Textmodus-Zeichen inst.  *)
  29.    (* BlockNr:   Nummer des Ziel-Speicherblocks *)
  30.    (* Size:      Zeichenhöhe in Rasterzeilen    *)
  31.    (* NrOfChar:  Anzahl der neuen Zeichen       *)
  32.    (* FirstChar: Erstes zu änderndes Zeichen    *)
  33.    (* Adjust:    Zeilenanpassung ja/nein        *)
  34.    (* MTable:    Array mit Zeichenmatritzen     *)
  35. PROCEDURE ROMTextFont(Font: FontName;
  36.                       BlockNr: Byte; Adjust: Boolean);
  37.    (* ROM-Font für Textmodus installieren
  38.    (* Font:      Fontname (s. Typendeklaration) *)
  39.    (* BlockNr:   Nummer des Ziel-Speicherblocks *)
  40.    (* Adjust:    Zeilenanpassung ja/nein        *)
  41. PROCEDURE DefChar(AsciiNr: Byte; VAR MTable);
  42.    (* Ein neues Textmodus-Zeichen mit aktueller *)
  43.    (* Zeichenhöhe in Block 0 installieren       *)
  44.    (* AsciiNr: Ascii-Nr. des Zeichens           *)
  45.    (* MTable:  Array mit einer Zeichenmatrix    *)
  46. FUNCTION LoadFont(FileName: String; VAR MTable): Integer;
  47.    (* Lädt die Fontdatei Filename in die        *)
  48.    (* Variable MTable. Rückgabewerte:           *)
  49.    (* 0:   Datei konnte nicht geladen werden    *)
  50.    (* -1:  Falsches Dateiformat                 *)
  51.    (* > 0: Dateigröße in Bytes                  *)
  52. PROCEDURE SelectBlock(BlockA, BlockB: Byte);
  53.    (* Textmodus- Zeichensatzblöcke wählen       *)
  54.    (* BlockA: Erste Blocknr. EGA 0..3, VGA 0..7 *)
  55.    (* BlockB: Zweite Blocknr. EGA 0..3, VGA 0..7*)
  56. PROCEDURE UserGraFont(Size: Word; Rows: Byte; VAR MTable);
  57.    (* Grafikmodus-Zeichensatz installieren      *)
  58.    (* Size:   Zeichenhöhe in Rasterzeilen       *)
  59.    (* Rows:   Anzahl Bildschirm-Textzeilen      *)
  60.    (* MTable: Array mit Zeichenmatritzen        *)
  61. FUNCTION FontAddr(Font: FontName): Pointer;
  62.    (* Gibt Zeiger auf (ROM-)Zeichensatz zurück  *)
  63.    (* Font: Fontname (siehe Typendeklaration)   *)
  64.  
  65. (* ====================================================== *)
  66.  
  67. IMPLEMENTATION
  68.  
  69. USES Dos;         (* Einbindung der Prozedur Intr und des *)
  70.                   (* Datentyps Registers für BIOS-Aufrufe *)
  71. VAR R: Registers;
  72.  
  73. FUNCTION CharSize: Word;
  74. BEGIN
  75.   R.AH := $11;                    (* Funktionsnummer      *)
  76.   R.AL := $30;                    (* Unterfunktionsnummer *)
  77.   R.BH := 1;                      (* Im Prinzip egal      *)
  78.   Intr($10,R);                    (* BIOS-Call            *)
  79.   CharSize := R.CX;               (* Zeichenhöhe in CX    *)
  80. END;
  81.  
  82. PROCEDURE ROMTextFont(Font: FontName;
  83.                       BlockNr: Byte; Adjust: Boolean);
  84.    PROCEDURE Install(FNr: Byte);
  85.    BEGIN
  86.      R.AL := FNr;                 (* Unterfunktionsnr.    *)
  87.      IF Adjust THEN R.AL := R.AL + $10;
  88.      R.AH := $11;                 (* Funktionsnr.         *)
  89.      R.BL := BlockNr;             (* zu ladender Block    *)
  90.      Intr($10,R);                 (* BIOS-Call            *)
  91.    END;
  92. BEGIN
  93.   CASE Font OF
  94.     ROM8x8:  Install(2);
  95.     ROM8x14: Install(1);
  96.     ROM8x16: Install(4);
  97.   END;
  98. END;
  99.  
  100. PROCEDURE UserTextFont(BlockNr, Size: Byte;
  101.                        NrOfChar, FirstChar: Word;
  102.                        Adjust: Boolean; VAR MTable);
  103. BEGIN
  104.    R.AH := $11;          (* Funktionsnr.                  *)
  105.    IF Adjust THEN        (* mit Textzeilenanpassung       *)
  106.      R.AL := $10           (* Unterfunktionnr             *)
  107.    ELSE                  (* ohne Textzeilenanpassung      *)
  108.      R.AL := $00;          (* Unterfunktionsnr.           *)
  109.    R.BL := BlockNr;      (* zu ladender Speicherblock     *)
  110.    R.BH := Size;         (* Höhe der Zeichen              *)
  111.    R.CX := NrOfChar;     (* Anzahl der Zeichen            *)
  112.    R.DX := FirstChar;    (* Nummer des 1. Zeichens        *)
  113.    R.BP := Ofs(MTable);  (* Offsetadr. der Matrixtabelle  *)
  114.    R.ES := Seg(MTable);  (* Segmentadr. der Matrixtabelle *)
  115.    Intr($10,R);          (* BIOS-Call                     *)
  116. END;
  117.  
  118. PROCEDURE DefChar(AsciiNr: Byte; VAR MTable);
  119. BEGIN
  120.   UserTextFont(0, CharSize, 1, AsciiNr, TRUE, MTable);
  121. END;
  122.  
  123. FUNCTION LoadFont(FileName: String; VAR MTable): Integer;
  124.   VAR f: File;
  125.       fsize: LongInt;
  126. BEGIN
  127.   (*$I-*)
  128.   Assign(f,FileName);
  129.   Reset(f,1);                  (* Recordgröße 1          *)
  130.   (*$I+*)
  131.   IF IOResult <> 0 THEN BEGIN  (* Datei existiert nicht  *)
  132.     LoadFont := 0;
  133.     Exit;
  134.   END;
  135.   fsize := FileSize(f);
  136.   IF (fsize MOD 8 > 0)
  137.     OR (fsize > 32*256) THEN   (* Kein Zeichensatz-Format *)
  138.     LoadFont := -1
  139.   ELSE BEGIN                   (* Datei lesen             *)
  140.     BlockRead(f,MTable,fsize);
  141.     LoadFont := fsize;
  142.   END;
  143.   Close(f);
  144. END;
  145.  
  146. PROCEDURE SelectBlock(BlockA, BlockB: Byte);
  147. BEGIN
  148.   R.AH := $10;      (* Funktion Paletten & Farbregister   *)
  149.   R.AL := $00;      (* Unterfunktion Lade Palettenreg.    *)
  150.   R.BL := $12;      (* Registernr. für Color Plane Enable *)
  151.   IF BlockA <> BlockB THEN
  152.     (* Attributbit 3 ohne Einfluß auf Vordergrundfarbe *)
  153.     R.BH := $7
  154.   ELSE
  155.     (* Attributbit 3 mit Einfluß auf Vordergrundfarbe *)
  156.     R.BH := $F;
  157.   Intr($10,R);      (* BIOS-Call *)
  158.   (* Blockparameter zusammenbasteln: *)
  159.   R.BL := (BlockA AND 3) + (BlockA AND 4) SHL 2 +
  160.           (BlockB AND 3) SHL 2 + (BlockB AND 4) SHL 4;
  161.   R.AH := $11;      (* Funktion Zeichensatz-Generator     *)
  162.   R.AL := 3;        (* Unterfunktion Blockauswahl         *)
  163.   Intr($10,R);      (* BIOS-Call                          *)
  164. END;
  165.  
  166. PROCEDURE UserGraFont(Size: Word; Rows: Byte; VAR MTable);
  167. BEGIN
  168.    R.AH := $11;             (* Funktionsnummer            *)
  169.    R.AL := $21;             (* Unterfunktionsnummer       *)
  170.    R.BL := 0;               (* Zeilenanzahl frei wählbar  *)
  171.    R.CX := Size;            (* Höhe der Zeichen           *)
  172.    R.DL := Rows;            (* Anzahl Textzeilen          *)
  173.    R.ES := Seg(MTable);     (* Segmentadresse Zeichensatz *)
  174.    R.BP := Ofs(MTable);     (* Offsetadresse Zeichensatz  *)
  175.    Intr($10,R);             (* BIOS-Call                  *)
  176. END;
  177.  
  178. FUNCTION FontAddr(Font: FontName): Pointer;
  179.   VAR R: Registers;
  180. BEGIN
  181.   R.AH := $11;                 (* Funktionsnummer         *)
  182.   R.AL := $30;                 (* Unterfunktionsnummer    *)
  183.   R.BH := ORD(Font);           (* Zeichensatz-Kennziffer  *)
  184.   Intr($10,R);                 (* BIOS-Call               *)
  185.   FontAddr := Ptr(R.ES,R.BP);  (* ES=Segment, BP=Offset   *)
  186. END;
  187.  
  188. (* ====================================================== *)
  189.  
  190. BEGIN  (* Initialisierungsteil: Leer *)
  191. END.
  192.  
  193. (* ====================================================== *)
  194. (*                   Ende BIOS3.PAS                       *)
  195.