home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 10 / titel / mcga.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-09-06  |  7.3 KB  |  347 lines

  1. (*           (C) 1989 TOOLBOX & Jan Laitenberger            *)
  2. (*      Diese Unit liefert die Grundlage für die Pro-       *)
  3. (*      grammierung des Modus 13h (MCGA) der VGA-Karte      *)
  4. (*               Turbo Pascal 4.0/5.x Unit                  *)
  5. unit MCGA;
  6.  
  7. interface
  8.  
  9. uses crt,dos;
  10.  
  11. TYPE ColorRegBuffer = ARRAY[0..255] OF RECORD
  12.                                         r,g,b : BYTE;
  13.                                       END;
  14.  
  15. var  i: integer;
  16.     c: char;
  17.  
  18. procedure plot (x,y,color: integer);
  19. function getdotcolor (x,y: integer): integer;
  20. procedure initgraphic;
  21. procedure exitgraphic;
  22. procedure print (line: string; color: integer);
  23. procedure setcursor (x,y:integer);
  24. function cursorx: integer;
  25. function cursory: integer;
  26. procedure clearscreen (color: integer);
  27. procedure colorbox (x1,y1,x2,y2,color: integer);
  28. procedure mcgasave (filename: string);
  29. procedure mcgaload (filename: string);
  30. procedure line(x1,y1,x2,y2,color: integer);
  31. PROCEDURE box (x1,y1,x2,y2, color: INTEGER);
  32. PROCEDURE setcolor(nr,red,green,blue : INTEGER);
  33. PROCEDURE readcolor(nr : INTEGER;
  34.                    VAR red,green,blue : INTEGER);
  35. PROCEDURE setcolorblock(startnr : INTEGER;
  36.                        buf : ColorRegBuffer;
  37.                        nr : INTEGER         );
  38. PROCEDURE readcolorblock(startnr : INTEGER;
  39.                         VAR buf : ColorRegBuffer;
  40.                         nr : INTEGER         );
  41.  
  42.  
  43. implementation
  44.  
  45. (* Setzt einen Punkt mit der Farbe  color *)
  46. procedure plot(x,y,color: integer);
  47. begin
  48.  mem[$A000:word(y)*320+word(x)] := color;
  49. end;
  50.  
  51. (* Ermittelt die Farbe des Punktes auf x,y *)
  52. function getdotcolor (x,y: integer): integer;
  53. begin
  54.  getdotcolor := mem[$A000:word(y)*320+word(x)];
  55. end;
  56.  
  57. (* Setzt den MCGA-Modus mit 320*200 Punkten x 256 Farben *)
  58. procedure initgraphic;
  59.  
  60. VAR regs : Registers;
  61.  
  62. begin
  63.  with regs do begin
  64.    ah := 0;
  65.    al := $13
  66.  end;
  67.  intr ($10, regs)
  68. end;
  69.  
  70.  
  71. (* Zurück in den Textmodus *)
  72. procedure exitgraphic;
  73.  
  74. VAR regs : Registers;
  75.  
  76. begin
  77.  with regs do begin
  78.    ah := 0;
  79.    al := $3;
  80.  end;
  81.  intr ($10,regs)
  82. end;
  83.  
  84. (* Schreibt einen String an die Cursorposition *)
  85. procedure print (line: string; color: integer);
  86.  
  87. var i : integer;
  88.    regs : Registers;
  89.  
  90. begin
  91.  for i := 1 to length (line) do
  92.    with regs do begin
  93.      ah := 14;
  94.      al := ord (line [i]);
  95.      bl := color;
  96.      intr ($10,regs)
  97.    end
  98. end;
  99.  
  100. (* Setzt den Cursor auf x,y *)
  101. procedure setcursor (x,y: integer);
  102.  
  103. VAR regs : Registers;
  104.  
  105. begin
  106.   with regs do begin
  107.     ah := 2;  bh := 0;
  108.     dh := y;  dl := x
  109.   end;
  110.   intr ($10, regs)
  111.   end;
  112.  
  113. (* Liest x-Position des Cursors *)
  114. function cursorx: integer;
  115.  
  116. VAR regs : Registers;
  117.  
  118. begin
  119.   with regs do begin
  120.     ah := 3;  bh := 0
  121.   end;
  122.   Intr ($10, regs);
  123.   cursorx := regs.dl
  124. end;
  125.  
  126. (* Liest y-Position des Cursors *)
  127. function cursory: integer;
  128.  
  129. VAR regs : Registers;
  130.  
  131. begin
  132.   with regs do begin
  133.     ah := 3;  bh := 0
  134.   end;
  135.   intr ($10, regs);
  136.   cursory := regs.dh
  137. end;
  138.  
  139. (* Löscht Bildschirm in der Farbe "color" *)
  140. procedure clearscreen (color: integer);
  141. begin
  142.   fillchar (mem[$A000:0000],64000,chr (color));
  143. end;
  144.  
  145. (* Zeichnet gefüllte Box in der Farbe "color" *)
  146. procedure colorbox (x1,y1,x2,y2,color: integer);
  147.  
  148. var i, d: integer;
  149.  
  150. begin
  151.   d := x2-x1;
  152.   for i := y1 to y2 do
  153.     fillchar (mem[$A000:word(i)*320+word(x1)],d,chr (color));
  154. end;
  155.  
  156. (* Sichert den Bildschirm in der Datei "filename" *)
  157. procedure mcgasave (filename: string);
  158.  
  159. var f: file;
  160.  
  161. begin
  162.   assign (f, filename);
  163.   rewrite (f,1);
  164.   blockwrite (f,mem[$a000:0000], 64000);
  165.   close (f)
  166. end;
  167.  
  168.  
  169. (* Lädt einen gesicherten Bildschirm *)
  170. procedure mcgaload (filename: string);
  171.  
  172. var f: file;
  173.  
  174. begin
  175.   assign (f, filename);
  176.   reset (f,1);
  177.   blockread (f, mem[$A000:0000], 64000);
  178.   close (f)
  179. end;
  180.  
  181. (* Zeichnet eine Linie in der Farbe color *)
  182. PROCEDURE line(x1,y1,x2,y2,color: INTEGER);
  183.  
  184. VAR deltax,deltay,abweichung,
  185.     zaehler,x,y,temp        : INTEGER;
  186.  
  187. BEGIN
  188.   abweichung := 0;
  189.   deltax := x2-x1;
  190.   deltay := y2-y1;
  191.   IF deltay <0 THEN BEGIN
  192.     temp := x1; x1 := x2 ; x2 := temp;
  193.     temp := y1; y1 := y2 ; y2 := temp;
  194.     deltax := -deltax;
  195.     deltay := -deltay;
  196.   END;
  197.   plot(x1,y1,color);
  198.   x := x1;
  199.   y := y1;
  200.   IF deltax >= 0 THEN BEGIN
  201.     IF deltax < deltay THEN BEGIN
  202.       FOR zaehler := 1 TO deltay-1 DO BEGIN
  203.         IF abweichung <0 THEN BEGIN
  204.           x := x+1;
  205.           y := y+1;
  206.           plot(x,y,color);
  207.           abweichung := abweichung+deltay-deltax;
  208.         END
  209.         ELSE BEGIN
  210.           y := y+1;
  211.           plot(x,y,color);
  212.           abweichung := abweichung+deltay-deltax;
  213.         END;
  214.       END;
  215.     END ELSE BEGIN
  216.       FOR zaehler := 1 TO deltax-1 DO BEGIN
  217.         IF abweichung <=0 THEN BEGIN
  218.           x := x+1;
  219.           plot(x,y,color);
  220.           abweichung := abweichung+deltay;
  221.         END ELSE BEGIN
  222.           x := x+1;
  223.           y := y+1;
  224.           plot(x,y,color);
  225.           abweichung := abweichung+deltay-deltax;
  226.         END;
  227.       END;
  228.     END;
  229.   END ELSE BEGIN
  230.     IF ABS(deltax) >= deltay THEN BEGIN
  231.       FOR zaehler := 1 TO ABS(deltax)-1 DO BEGIN
  232.         IF abweichung <= 0 THEN BEGIN
  233.           x :=x-1;
  234.           plot(x,y,color);
  235.           abweichung := abweichung+deltay;
  236.         END ELSE BEGIN
  237.           x := x-1;
  238.           y := y+1;
  239.           plot(x,y,color);
  240.           abweichung := abweichung+deltax+deltay;
  241.         END;
  242.       END;
  243.     END ELSE BEGIN
  244.       FOR zaehler := 1 TO deltay-1 DO BEGIN
  245.         IF abweichung <0 THEN BEGIN
  246.           x := x-1;
  247.           y := y+1;
  248.           plot(x,y,color);
  249.           abweichung := abweichung+deltax+deltay;
  250.         END ELSE BEGIN
  251.           y := y+1;
  252.           plot(x,y,color);
  253.           abweichung := abweichung+deltax;
  254.         END;
  255.       END;
  256.     END;
  257.   END;
  258.   plot(x2,y2,color);
  259. END;
  260.  
  261. (* Zeichnet eine Box in der Farbe color *)
  262. PROCEDURE box (x1,y1,x2,y2, color: INTEGER);
  263.  
  264. BEGIN
  265.   line(x1,y1,x2,y1,color);
  266.   line(x1,y2,x2,y2,color);
  267.   line(x1,y1,x1,y2,color);
  268.   line(x2,y1,x2,y2,color);
  269. END;
  270.  
  271.  
  272. (* Setzt ein Farbregister *)
  273. PROCEDURE setcolor(nr,red,green,blue : INTEGER);
  274.  
  275. VAR r : Registers;
  276.  
  277. BEGIN
  278.   WITH R DO BEGIN
  279.     AH := $10;
  280.     AL := $10;
  281.     BX := nr;
  282.     DH := red;
  283.     CH := green;
  284.     CL := blue;
  285.   END;
  286.   INTR($10,R);
  287. END;
  288.  
  289. (* Liest ein Farbregister *)
  290. PROCEDURE readcolor(nr : INTEGER;
  291.                     VAR red,green,blue : INTEGER);
  292.  
  293. VAR R : Registers;
  294.  
  295. BEGIN
  296.   WITH R DO BEGIN
  297.     AH := $10;
  298.     AL := $15;
  299.     BX := nr;
  300.     Intr($10,R);
  301.     red := DH;
  302.     green := CH;
  303.     blue := CL;
  304.   END;
  305. END;
  306.  
  307.  
  308. (* Setzt einen Block von Farbregistern *)
  309. PROCEDURE setcolorblock(startnr : INTEGER;
  310.                         buf : ColorRegBuffer;
  311.                         nr : INTEGER         );
  312.  
  313. VAR R : Registers;
  314.  
  315. BEGIN
  316.   WITH R DO BEGIN
  317.     AH := $10;
  318.     AL := $12;
  319.     BX := startnr;
  320.     ES := Seg(buf);
  321.     DX := Ofs(buf);
  322.     CX := nr;
  323.   END;
  324.   Intr($10,R);
  325. END;
  326.  
  327. (* Liest eine Block von Farbregistern *)
  328. PROCEDURE readcolorblock(startnr : INTEGER;
  329.                          VAR buf : ColorRegBuffer;
  330.                          nr : INTEGER         );
  331.  
  332. VAR R : Registers;
  333.  
  334. BEGIN
  335.   WITH R DO BEGIN
  336.     AH := $10;
  337.     AL := $17;
  338.     BX := startnr;
  339.     ES := Seg(buf);
  340.     DX := Ofs(buf);
  341.     CX := nr;
  342.   END;
  343.   Intr($10,R);
  344. END;
  345.  
  346. END.
  347.