home *** CD-ROM | disk | FTP | other *** search
- (* ====================================================== *)
- (* BIOS1.PAS *)
- (* Das EGA/VGA-BIOS: Die CGA-kompatiblen Funktionen *)
- (* Einige Beispielprozeduren *)
- (* (c) 1990 Matthias Uphoff & TOOLBOX *)
- (* ====================================================== *)
-
- UNIT Bios1;
-
- INTERFACE
-
- CONST SingleFrame = '┌─┐││└─┘'; (* Zwei vordefinierte *)
- DoubleFrame = '╔═╗║║╚═╝'; (* Rahmenarten *)
-
- TYPE FrameStr = String[8];
-
- VAR CursorChar: Char; (* Cursor für Grafikmodi *)
-
- PROCEDURE SetVideoMode(ModeNr: Byte);
- PROCEDURE SetCursorXY(x, y, Page: Byte);
- PROCEDURE WriteCA(ch: CHAR; Attr: Byte;
- Count: Word; Page: Byte);
- PROCEDURE ActivePage(Page: Byte);
- PROCEDURE Frame(fs: FrameStr; x1,y1,x2,y2,Attr,Page: Byte);
- PROCEDURE ScrollUp(x1,y1,x2,y2,n,Attr: Byte);
- PROCEDURE ScrollDown(x1,y1,x2,y2,n,Attr: Byte);
- PROCEDURE WriteString(st: String;
- x, y, ForeColor, BackColor: Byte);
- PROCEDURE GraphCursor;
-
- (* ====================================================== *)
-
- IMPLEMENTATION
-
- USES Dos; (* Einbindung der Prozedur Intr und des *)
- (* Datentyps Registers für BIOS-Aufrufe *)
- VAR R: Registers;
-
- PROCEDURE SetVideoMode(ModeNr: Byte);
- (* Intialisiert den Videomodus mit der Nummer ModeNr *)
- BEGIN
- R.AH := 0; (* Funktionsnummer nach AH *)
- R.AL := ModeNr; (* Modusnummer ins AL-Register *)
- Intr($10,R); (* BIOS-Call über Interrupt $10 *)
- END;
-
-
- PROCEDURE SetCursorXY(x, y, Page: Byte);
- (* Setzt den Cursor an die Position x,y der Seite Page *)
- BEGIN
- R.AH := 2; (* Funktionsnummer *)
- R.DH := x; (* Textkoordinaten nach DH u. DL *)
- R.DL := y;
- R.BH := Page; (* Bildseite nach BH *)
- Intr($10,R); (* BIOS-Call über Interrupt $10 *)
- END;
-
-
- PROCEDURE ActivePage(Page: Byte);
- (* Schaltet die Bildseite Page ein *)
- BEGIN
- R.AH := 5; (* Funktionsnummer *)
- R.AL := Page; (* zu aktivierende Bildseite *)
- Intr($10,R); (* BIOS-Call über Interrupt $10 *)
- END;
-
-
- PROCEDURE WriteCA(ch: CHAR; Attr: Byte;
- Count: Word; Page: Byte);
- (* Soll heißen: Schreibe Ceichen und Attribut an die *)
- (* aktuelle Cursorposition auf Seite Page mit Count *)
- (* Wiederholungen *)
- BEGIN
- R.AH := 9; (* Funktionsnummer *)
- R.AL := ORD(ch); (* Zeichen nach AL *)
- R.BH := Page; (* Bildschirmseite nach BH *)
- R.BL := Attr; (* Attribut/Farbe nach BL *)
- R.CX := Count; (* Zeichenzähler nach CX *)
- Intr($10,R); (* BIOS-Call über Interrupt $10 *)
- END;
-
-
- PROCEDURE ScrollUp(x1,y1,x2,y2,n,Attr: Byte);
- (* Rollt ein Textfenster um n Zeilen nach oben. Die *)
- (* neuen Zeilen werden mit dem Attribut Attr gefüllt. *)
- (* Bei n = 0 wird das gesamte Fenster gelöscht! *)
- (* Wirkt immer auf die aktuelle Bildschirmseite *)
- BEGIN
- R.AH := 6; (* Funktionsnummer *)
- R.AL := n; (* Anzahl Textzeilen *)
- R.BH := Attr; (* Attribut/Farbe *)
- R.CH := y1; R.CL := x1; (* x1,y1 liegt links oben *)
- R.DH := y2; R.DL := x2; (* x2,y2 liegt rechts unten *)
- Intr($10,R); (* BIOS-Call *)
- END;
-
-
- PROCEDURE ScrollDown(x1,y1,x2,y2,n,Attr: Byte);
- (* Wie ScrollUp, nur nach unten *)
- BEGIN
- R.AH := 7; (* Funktionsnummer *)
- R.AL := n; (* Anzahl Textzeilen *)
- R.BH := Attr; (* Attribut/Farbe *)
- R.CH := y1; R.CL := x1; (* x1,y1 liegt links oben *)
- R.DH := y2; R.DL := x2; (* x2,y2 liegt rechts unten *)
- Intr($10,R); (* BIOS-Call *)
- END;
-
-
- PROCEDURE Frame(fs: FrameStr; x1,y1,x2,y2,Attr,Page: Byte);
- (* Zeichnet einen Rahmen auf Bildschirmseite Page mit *)
- (* den in fs enthaltenen Zeichen und dem Attribut Attr *)
- (* x1,y1 liegt links oben, x2,y2 rechts unten *)
- VAR y: Byte;
- BEGIN
- SetCursorXY(x1,y1,Page); (* Ecke links oben *)
- WriteCA(fs[1],Attr,1,Page);
- IF x1+1 <= x2-1 THEN BEGIN (* obere Linie *)
- SetCursorXY(x1+1,y1,Page);
- WriteCA(fs[2],Attr,x2-x1-1,Page);
- END;
- SetCursorXY(x2,y1,Page); (* Ecke rechts oben *)
- WriteCA(fs[3],Attr,1,Page);
- FOR y := y1+1 TO y2-1 DO BEGIN (* vertikale Linien *)
- SetCursorXY(x1,y,Page);
- WriteCA(fs[4],Attr,1,Page);
- SetCursorXY(x2,y,Page);
- WriteCA(fs[5],Attr,1,Page);
- END;
- SetCursorXY(x1,y2,Page); (* Ecke links unten *)
- WriteCA(fs[6],Attr,1,Page);
- IF x1+1 <= x2-1 THEN BEGIN (* untere Linie *)
- SetCursorXY(x1+1,y2,Page);
- WriteCA(fs[7],Attr,x2-x1-1,Page);
- END;
- SetCursorXY(x2,y2,Page); (* Ecke rechts unten *)
- WriteCA(fs[8],Attr,1,Page);
- END;
-
-
- PROCEDURE WriteString(st: String;
- x, y, ForeColor, BackColor: Byte);
- (* Schreibt in den Grafikmodi einen String an die *)
- (* Position x,y der Seite 0 mit der Vordergrundfarbe *)
- (* ForeColor und der Hintergrundfarbe BackColor. *)
- (* Seite 0 muß aktiv sein! *)
- (* Funktioniert nicht im 256-Farben-Modus. *)
- VAR i: Word;
- BEGIN
- ForeColor := (ForeColor XOR BackColor) OR $80;
- (* Bit 7 = 1 für XOR-Ausgabe *)
- IF Length(st) > 0 THEN (* Fläche unter String löschen *)
- ScrollUp(x,y,x+Length(st)-1,y,0,BackColor);
- FOR i := 1 TO Length(st) DO BEGIN
- SetCursorXY(x+i-1,y,0); (* Cursor setzen *)
- WriteCA(st[i],ForeColor,1,0); (* Zeichen ausgeben *)
- END;
- END;
-
-
- PROCEDURE GraphCursor;
- (* Läßt in den Grafikmodi an der aktuellen *)
- (* Cursorposition der Seite 0 einen Cursor erscheinen *)
- (* bzw. wieder verschwinden, falls schon vorhanden. *)
- BEGIN
- WriteCA(CursorChar,15+$80,1,0); (* Farbbit 7=1 für XOR *)
- END;
-
- (* ====================================================== *)
-
- BEGIN (* Initialisierungsteil *)
- CursorChar := #219;
- END.
-
- (* ====================================================== *)
- (* BIOS1.PAS *)