home *** CD-ROM | disk | FTP | other *** search
- (* ====================================================== *)
- (* BIOS2.PAS *)
- (* Das EGA/VGA-BIOS: *)
- (* Die Programmierung der Paletten- und Farbregister *)
- (* Konstanten, Typen und Beispielprozeduren *)
- (* (c) 1990 Matthias Uphoff & TOOLBOX *)
- (* ====================================================== *)
-
- UNIT Bios2;
-
- INTERFACE
-
- CONST PBlue = 1; (* Palettenwert für primäres Blau *)
- PGreen = 2; (* Palettenwert für primäres Grün *)
- PRed = 4; (* Palettenwert für primäres Rot *)
- SBlue = 8; (* Palettenwert für sekundäres Blau *)
- SGreen = 16; (* Palettenwert für sekundäres Grün *)
- SRed = 32; (* Palettenwert für sekundäres Rot *)
-
- TYPE (* ===================== EGA/VGA =================== *)
- (* Tabelle mit Paletten- und Overscan-Werte: *)
- PaletteType = ARRAY[0..16] OF Byte;
- (* ===================== VGA only ================== *)
- (* Die drei Grundfarben als Aufzähltyp: *)
- PrimaryColors = (Red, Green, Blue);
- (* Die zulässigen Intensitätsstufen: *)
- Intensity = 0..63;
- (* Der Farbwert zusammengesetzt aus 3 Grundfarben *)
- ColorValue = ARRAY[PrimaryColors] OF Intensity;
-
- CONST (* ==================== EGA/VGA =================== *)
- (* Die Standardpalette in den 16-Farben-Modi *)
- DefaultPal: PaletteType = ($0,$1,$2,$3,$4,$5,$14,$7,
- $38,$39,$3A,$3B,$3C,$3D,$3E,
- $3F,$0);
-
- PROCEDURE SetPalReg(RegNr, Color: Byte);
- PROCEDURE SetAllPal(Pal: PaletteType);
- (* ===================== VGA only ================== *)
- FUNCTION ReadPalReg(RegNr: Byte): Byte;
- PROCEDURE SetColorReg(RegNr: Word; Color: ColorValue);
- PROCEDURE SetColorBlock(FirstReg, NrOfRegs: Word;
- VAR Colors);
- PROCEDURE ReadColorBlock(FirstReg, NrOfRegs: Word;
- VAR Colors);
- PROCEDURE GrayScale(FirstReg, NrOfRegs: Word);
-
- (* ====================================================== *)
-
- IMPLEMENTATION
-
- USES Dos; (* Einbindung der Prozedur Intr und des *)
- (* Datentyps Registers für BIOS-Aufrufe *)
- VAR R: Registers;
-
- PROCEDURE SetPalReg(RegNr, Color: Byte);
- (* Schreibt den Wert Color in das Palettenreg. RegNr *)
- BEGIN
- R.AH := $10; (* Funktionsnummer *)
- R.AL := 0; (* Unterfunktionsnummer *)
- R.BH := Color; (* Der Farbwert nach BH *)
- R.BL := RegNr; (* Die Registernummer nach BL *)
- Intr($10,R); (* BIOS-Call *)
- END;
-
- PROCEDURE SetAllPal(Pal: PaletteType);
- (* Setzt alle Paletten- und das Overscan-Register *)
- (* gemäß den Angaben in der Tabelle Pal *)
- BEGIN
- R.AH := $10; (* Funktionsnummer *)
- R.AL := $2; (* Unterfunktionsnummer *)
- R.ES := Seg(Pal); (* Die Segmentadresse der Tabelle *)
- R.DX := Ofs(Pal); (* Die Offsetadresse der Tabelle *)
- Intr($10,R); (* Friß oder stirb! *)
- END;
-
- FUNCTION ReadPalReg(RegNr: Byte): Byte;
- (* Gibt den Inhalt des Palettenregisters RegNr zurück *)
- BEGIN
- R.AH := $10; (* Funktionsnummer *)
- R.AL := $7; (* Unterfunktionsnummer *)
- R.BL := RegNr; (* Registernummer nach BL *)
- Intr($10,R);
- ReadPalReg := R.BH; (* Inhalt wird in BH verraten *)
- END;
-
- PROCEDURE SetColorReg(RegNr: Word; Color: ColorValue);
- (* Schreibt den Farbwert Color in Das Farbreg. RegNr *)
- BEGIN
- R.AH := $10; (* Funktionsnummer *)
- R.AL := $10; (* Unterfunktionsnummer *)
- R.BX := RegNr; (* Registernummer nach BX *)
- R.CH := Color[Green]; (* Grünanteil nach CH *)
- R.CL := Color[Blue]; (* Blauanteil nach CL *)
- R.DH := Color[Red]; (* Rotanteil nach DH *)
- Intr($10,R); (* BIOS-Call *)
- END;
-
- PROCEDURE SetColorBlock(FirstReg, NrOfRegs: Word;
- VAR Colors);
- (* Schreibt die in der Tabelle Colors enthaltenen *)
- (* Farbwerte in die Farbregister ab FirstReg. *)
- (* NrOfRegs gibt die Länge der Tabelle an. *)
- BEGIN
- R.AH := $10; (* Funktionsnummer *)
- R.AL := $12; (* Unterfunktionsnummer *)
- R.BX := FirstReg; (* Erstes Farbregister *)
- R.CX := NrOfRegs; (* Anzahl Farbregister *)
- R.ES := Seg(Colors); (* Segmentadresse der Tabelle *)
- R.DX := Ofs(Colors); (* Offsetadresse der Tabelle *)
- Intr($10,R); (* BIOS-Call *)
- END;
-
- PROCEDURE ReadColorBlock(FirstReg, NrOfRegs: Word;
- VAR Colors);
- (* Schreibt die Farbwerte ab Farbregister FirstReg *)
- (* in die Tabelle Colors. *)
- (* NrOfRegs gibt die Länge der Tabelle an. *)
- BEGIN
- R.AH := $10; (* Funktionsnummer *)
- R.AL := $17; (* Unterfunktionsnummer *)
- R.BX := FirstReg; (* Erstes Farbregister *)
- R.CX := NrOfRegs; (* Anzahl Farbregister *)
- R.ES := Seg(Colors); (* Segmentadresse der Tabelle *)
- R.DX := Ofs(Colors); (* Offsetadresse der Tabelle *)
- Intr($10,R); (* BIOS-Call *)
- END;
-
- PROCEDURE GrayScale(FirstReg, NrOfRegs: Word);
- (* Wandelt die Farbwerte ab Farbregister Firstreg *)
- (* in Graustufen um. *)
- BEGIN
- R.AH := $10; (* Funktionsnummer *)
- R.AL := $1B; (* Unterfunktionsnummer *)
- R.BX := FirstReg; (* erstes Registers *)
- R.CX := NrOfRegs; (* Anzahl der Register *)
- Intr($10,R); (* BIOS-Call *)
- END;
-
- (* ====================================================== *)
-
- BEGIN (* Initialisierungsteil: Nix los *)
- END.
-
- (* ====================================================== *)
- (* Ende BIOS2.PAS *)