home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 04 / praxis / bios1.pas next >
Encoding:
Pascal/Delphi Source File  |  1990-01-16  |  6.2 KB  |  177 lines

  1. (* ====================================================== *)
  2. (*                         BIOS1.PAS                      *)
  3. (*    Das EGA/VGA-BIOS: Die CGA-kompatiblen Funktionen    *)
  4. (*                Einige Beispielprozeduren               *)
  5. (*           (c) 1990 Matthias Uphoff & TOOLBOX           *)
  6. (* ====================================================== *)
  7.  
  8. UNIT Bios1;
  9.  
  10. INTERFACE
  11.  
  12. CONST SingleFrame = '┌─┐││└─┘';  (* Zwei vordefinierte    *)
  13.       DoubleFrame = '╔═╗║║╚═╝';  (* Rahmenarten           *)
  14.  
  15. TYPE FrameStr = String[8];
  16.  
  17. VAR  CursorChar: Char;           (* Cursor für Grafikmodi *)
  18.  
  19. PROCEDURE SetVideoMode(ModeNr: Byte);
  20. PROCEDURE SetCursorXY(x, y, Page: Byte);
  21. PROCEDURE WriteCA(ch: CHAR; Attr: Byte;
  22.                   Count: Word; Page: Byte);
  23. PROCEDURE ActivePage(Page: Byte);
  24. PROCEDURE Frame(fs: FrameStr; x1,y1,x2,y2,Attr,Page: Byte);
  25. PROCEDURE ScrollUp(x1,y1,x2,y2,n,Attr: Byte);
  26. PROCEDURE ScrollDown(x1,y1,x2,y2,n,Attr: Byte);
  27. PROCEDURE WriteString(st: String;
  28.                       x, y, ForeColor, BackColor: Byte);
  29. PROCEDURE GraphCursor;
  30.  
  31. (* ====================================================== *)
  32.  
  33. IMPLEMENTATION
  34.  
  35. USES Dos;         (* Einbindung der Prozedur Intr und des *)
  36.                   (* Datentyps Registers für BIOS-Aufrufe *)
  37. VAR R: Registers;
  38.  
  39. PROCEDURE SetVideoMode(ModeNr: Byte);
  40.   (* Intialisiert den Videomodus mit der Nummer ModeNr *)
  41. BEGIN
  42.   R.AH := 0;            (* Funktionsnummer nach AH *)
  43.   R.AL := ModeNr;       (* Modusnummer ins AL-Register *)
  44.   Intr($10,R);          (* BIOS-Call über Interrupt $10 *)
  45. END;
  46.  
  47.  
  48. PROCEDURE SetCursorXY(x, y, Page: Byte);
  49.    (* Setzt den Cursor an die Position x,y der Seite Page *)
  50. BEGIN
  51.   R.AH := 2;            (* Funktionsnummer *)
  52.   R.DH := x;            (* Textkoordinaten nach DH u. DL *)
  53.   R.DL := y;
  54.   R.BH := Page;         (* Bildseite nach BH *)
  55.   Intr($10,R);          (* BIOS-Call über Interrupt $10 *)
  56. END;
  57.  
  58.  
  59. PROCEDURE ActivePage(Page: Byte);
  60.    (* Schaltet die Bildseite Page ein *)
  61. BEGIN
  62.   R.AH := 5;            (* Funktionsnummer *)
  63.   R.AL := Page;         (* zu aktivierende Bildseite *)
  64.   Intr($10,R);          (* BIOS-Call über Interrupt $10 *)
  65. END;
  66.  
  67.  
  68. PROCEDURE WriteCA(ch: CHAR; Attr: Byte;
  69.                   Count: Word; Page: Byte);
  70.    (* Soll heißen: Schreibe Ceichen und Attribut an die *)
  71.    (* aktuelle Cursorposition auf Seite Page mit Count  *)
  72.    (* Wiederholungen                                    *)
  73. BEGIN
  74.   R.AH := 9;            (* Funktionsnummer *)
  75.   R.AL := ORD(ch);      (* Zeichen nach AL *)
  76.   R.BH := Page;         (* Bildschirmseite nach BH *)
  77.   R.BL := Attr;         (* Attribut/Farbe nach BL *)
  78.   R.CX := Count;        (* Zeichenzähler nach CX *)
  79.   Intr($10,R);          (* BIOS-Call über Interrupt $10 *)
  80. END;
  81.  
  82.  
  83. PROCEDURE ScrollUp(x1,y1,x2,y2,n,Attr: Byte);
  84.    (* Rollt ein Textfenster um n Zeilen nach oben. Die   *)
  85.    (* neuen Zeilen werden mit dem Attribut Attr gefüllt. *)
  86.    (* Bei n = 0 wird das gesamte Fenster gelöscht!       *)
  87.    (* Wirkt immer auf die aktuelle Bildschirmseite       *)
  88. BEGIN
  89.   R.AH := 6;                  (* Funktionsnummer *)
  90.   R.AL := n;                  (* Anzahl Textzeilen *)
  91.   R.BH := Attr;               (* Attribut/Farbe *)
  92.   R.CH := y1; R.CL := x1;     (* x1,y1 liegt links oben *)
  93.   R.DH := y2; R.DL := x2;     (* x2,y2 liegt rechts unten *)
  94.   Intr($10,R);                (* BIOS-Call *)
  95. END;
  96.  
  97.  
  98. PROCEDURE ScrollDown(x1,y1,x2,y2,n,Attr: Byte);
  99.    (* Wie ScrollUp, nur nach unten *)
  100. BEGIN
  101.   R.AH := 7;                  (* Funktionsnummer *)
  102.   R.AL := n;                  (* Anzahl Textzeilen *)
  103.   R.BH := Attr;               (* Attribut/Farbe *)
  104.   R.CH := y1; R.CL := x1;     (* x1,y1 liegt links oben *)
  105.   R.DH := y2; R.DL := x2;     (* x2,y2 liegt rechts unten *)
  106.   Intr($10,R);                (* BIOS-Call *)
  107. END;
  108.  
  109.  
  110. PROCEDURE Frame(fs: FrameStr; x1,y1,x2,y2,Attr,Page: Byte);
  111.    (* Zeichnet einen Rahmen auf Bildschirmseite Page mit  *)
  112.    (* den in fs enthaltenen Zeichen und dem Attribut Attr *)
  113.    (* x1,y1 liegt links oben, x2,y2 rechts unten          *)
  114.    VAR y: Byte;
  115. BEGIN
  116.   SetCursorXY(x1,y1,Page);           (* Ecke links oben *)
  117.   WriteCA(fs[1],Attr,1,Page);
  118.   IF x1+1 <= x2-1 THEN BEGIN         (* obere Linie *)
  119.     SetCursorXY(x1+1,y1,Page);
  120.     WriteCA(fs[2],Attr,x2-x1-1,Page);
  121.   END;
  122.   SetCursorXY(x2,y1,Page);           (* Ecke rechts oben *)
  123.   WriteCA(fs[3],Attr,1,Page);
  124.   FOR y := y1+1 TO y2-1 DO BEGIN     (* vertikale Linien *)
  125.     SetCursorXY(x1,y,Page);
  126.     WriteCA(fs[4],Attr,1,Page);
  127.     SetCursorXY(x2,y,Page);
  128.     WriteCA(fs[5],Attr,1,Page);
  129.   END;
  130.   SetCursorXY(x1,y2,Page);            (* Ecke links unten *)
  131.   WriteCA(fs[6],Attr,1,Page);
  132.   IF x1+1 <= x2-1 THEN BEGIN         (* untere Linie *)
  133.     SetCursorXY(x1+1,y2,Page);
  134.     WriteCA(fs[7],Attr,x2-x1-1,Page);
  135.   END;
  136.   SetCursorXY(x2,y2,Page);           (* Ecke rechts unten *)
  137.   WriteCA(fs[8],Attr,1,Page);
  138. END;
  139.  
  140.  
  141. PROCEDURE WriteString(st: String;
  142.                       x, y, ForeColor, BackColor: Byte);
  143.    (* Schreibt in den Grafikmodi einen String an die    *)
  144.    (* Position x,y der Seite 0 mit der Vordergrundfarbe *)
  145.    (* ForeColor und  der Hintergrundfarbe BackColor.    *)
  146.    (* Seite 0 muß aktiv sein!                           *)
  147.    (* Funktioniert nicht im 256-Farben-Modus.           *)
  148.   VAR i: Word;
  149. BEGIN
  150.   ForeColor := (ForeColor XOR BackColor) OR $80;
  151.                            (* Bit 7 = 1 für XOR-Ausgabe *)
  152.   IF Length(st) > 0 THEN   (* Fläche unter String löschen *)
  153.     ScrollUp(x,y,x+Length(st)-1,y,0,BackColor);
  154.   FOR i := 1 TO Length(st) DO BEGIN
  155.     SetCursorXY(x+i-1,y,0);          (* Cursor setzen *)
  156.     WriteCA(st[i],ForeColor,1,0);    (* Zeichen ausgeben *)
  157.   END;
  158. END;
  159.  
  160.  
  161. PROCEDURE GraphCursor;
  162.    (* Läßt in den Grafikmodi an der aktuellen            *)
  163.    (* Cursorposition der Seite 0 einen Cursor erscheinen *)
  164.    (* bzw. wieder verschwinden, falls schon vorhanden.   *)
  165. BEGIN
  166.   WriteCA(CursorChar,15+$80,1,0);  (* Farbbit 7=1 für XOR *)
  167. END;
  168.  
  169. (* ====================================================== *)
  170.  
  171. BEGIN  (* Initialisierungsteil *)
  172.   CursorChar := #219;
  173. END.
  174.  
  175. (* ====================================================== *)
  176. (*                         BIOS1.PAS                      *)
  177.