home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 09 / tricks / mcga.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1990-08-03  |  8.5 KB  |  376 lines

  1. (* -------------------------------------------------------- *)
  2. (*                        MCGA.PAS                          *)
  3. (*           Unit zur Absteuerung des MCGA-Modus            *)
  4. (*                (c) 1989, 1990 TOOLBOX                    *)
  5. (*      Diese Unit liefert die Grundlage für die Pro-       *)
  6. (*      grammierung des Modus 13h (MCGA) der VGA-Karte      *)
  7. (*               Turbo Pascal 4.0/5.x Unit                  *)
  8. (* -------------------------------------------------------- *)
  9. UNIT MCGA;
  10.  
  11. INTERFACE
  12.  
  13. USES Crt,Dos;
  14.  
  15. TYPE ColorRegBuffer = ARRAY[0..255] OF RECORD
  16.                                          r,g,b : BYTE;
  17.                                        END;
  18.  
  19. VAR  i: INTEGER;
  20.      c: CHAR;
  21.  
  22. PROCEDURE Plot (x,y,color: INTEGER);
  23. PROCEDURE Circle(xmitte, ymitte, radius, farbe: INTEGER);
  24. FUNCTION GetDotColor (x,y: INTEGER): INTEGER;
  25. PROCEDURE InitGraphic;
  26. PROCEDURE ExitGraphic;
  27. PROCEDURE Print (Line: STRING; color: INTEGER);
  28. PROCEDURE SetCursor (x,y:INTEGER);
  29. FUNCTION CursorX: INTEGER;
  30. FUNCTION CursorY: INTEGER;
  31. PROCEDURE ClearScreen (color: INTEGER);
  32. PROCEDURE ColorBox (x1,y1,x2,y2,color: INTEGER);
  33. PROCEDURE MCGASave (filename: STRING);
  34. PROCEDURE MCGALoad (filename: STRING);
  35. PROCEDURE Line(x1,y1,x2,y2,color: INTEGER);
  36. PROCEDURE Box (x1,y1,x2,y2, color: INTEGER);
  37. PROCEDURE SetColor(nr,red,green,blue : INTEGER);
  38. PROCEDURE ReadColor(nr : INTEGER;
  39.                    VAR red,green,blue : INTEGER);
  40. PROCEDURE SetColorBlock(startnr : INTEGER;
  41.                        buf : ColorRegBuffer;
  42.                        nr : INTEGER         );
  43. PROCEDURE ReadColorBlock(startnr : INTEGER;
  44.                         VAR buf : ColorRegBuffer;
  45.                         nr : INTEGER         );
  46.  
  47.  
  48. IMPLEMENTATION
  49.  
  50. (* Setzt einen Punkt mit der Farbe  color *)
  51. PROCEDURE Plot(x,y,color: INTEGER);
  52. BEGIN
  53.  Mem[$A000:WORD(y)*320+WORD(x)] := color;
  54. END;
  55.  
  56. (* Schneller Kreisalgorithmus ohne Sinus und Cosinus *)
  57. (* Diese Prozedur: (c) 1990 Philipps & TOOLBOX       *)
  58. PROCEDURE Circle(xmitte, ymitte, radius, farbe: INTEGER);
  59. VAR
  60.   x, y, md,
  61.   od, sd   : INTEGER;
  62.  
  63. BEGIN
  64.   y := 0; x := radius; md := 0;
  65.   REPEAT
  66.      Plot(xmitte + x, ymitte + y, farbe);
  67.      Plot(xmitte - x, ymitte + y, farbe);
  68.      Plot(xmitte - x, ymitte - y, farbe);
  69.      Plot(xmitte + x, ymitte - y, farbe);
  70.      Plot(xmitte + y, ymitte + x, farbe);
  71.      Plot(xmitte - y, ymitte + x, farbe);
  72.      Plot(xmitte - y, ymitte - x, farbe);
  73.      Plot(xmitte + y, ymitte - x, farbe);
  74.   od := md + y + y + 1;  {  Distanz bei Schritt nach oben  }
  75.   sd := od - x - x + 1;      {  Distanz bei Schrägschritt  }
  76.   y := y + 1; md := od;
  77.   IF Abs(sd) < Abs(od) THEN
  78.   BEGIN
  79.     Dec(x);
  80.     md := sd;
  81.   END
  82.   UNTIL x < y;
  83. END;
  84.  
  85. (* Ermittelt die Farbe des Punktes auf x,y *)
  86. FUNCTION GetDotColor (x,y: INTEGER): INTEGER;
  87. BEGIN
  88.  GetDotColor := Mem[$A000:WORD(y)*320+WORD(x)];
  89. END;
  90.  
  91. (* Setzt den MCGA-Modus mit 320*200 Punkten x 256 Farben *)
  92. PROCEDURE InitGraphic;
  93.  
  94. VAR regs : Registers;
  95.  
  96. BEGIN
  97.  WITH regs DO BEGIN
  98.    ah := 0;
  99.    al := $13
  100.  END;
  101.  Intr ($10, regs)
  102. END;
  103.  
  104. (* Zurück in den Textmodus *)
  105. PROCEDURE ExitGraphic;
  106.  
  107. VAR regs : Registers;
  108.  
  109. BEGIN
  110.  WITH regs DO BEGIN
  111.    ah := 0;
  112.    al := $3;
  113.  END;
  114.  Intr ($10,regs)
  115. END;
  116.  
  117. (* Schreibt einen String an die Cursorposition *)
  118. PROCEDURE Print (Line: STRING; color: INTEGER);
  119.  
  120. VAR i : INTEGER;
  121.    regs : Registers;
  122.  
  123. BEGIN
  124.  FOR i := 1 TO Length (Line) DO
  125.    WITH regs DO BEGIN
  126.      ah := 14;
  127.      al := Ord (Line [i]);
  128.      bl := color;
  129.      Intr ($10,regs)
  130.    END
  131. END;
  132.  
  133. (* Setzt den Cursor auf x,y *)
  134. PROCEDURE SetCursor (x,y: INTEGER);
  135.  
  136. VAR regs : Registers;
  137.  
  138. BEGIN
  139.   WITH regs DO BEGIN
  140.     ah := 2;  bh := 0;
  141.     dh := y;  dl := x
  142.   END;
  143.   Intr ($10, regs)
  144.   END;
  145.  
  146. (* Liest x-Position des Cursors *)
  147. FUNCTION CursorX: INTEGER;
  148.  
  149. VAR regs : Registers;
  150.  
  151. BEGIN
  152.   WITH regs DO BEGIN
  153.     ah := 3;  bh := 0
  154.   END;
  155.   Intr ($10, regs);
  156.   CursorX := regs.dl
  157. END;
  158.  
  159. (* Liest y-Position des Cursors *)
  160. FUNCTION CursorY: INTEGER;
  161.  
  162. VAR regs : Registers;
  163.  
  164. BEGIN
  165.   WITH regs DO BEGIN
  166.     ah := 3;  bh := 0
  167.   END;
  168.   Intr ($10, regs);
  169.   CursorY := regs.dh
  170. END;
  171.  
  172. (* Löscht Bildschirm in der Farbe "color" *)
  173. PROCEDURE ClearScreen (color: INTEGER);
  174. BEGIN
  175.   FillChar (Mem[$A000:0000],64000,Chr (color));
  176. END;
  177.  
  178. (* Zeichnet gefüllte Box in der Farbe "color" *)
  179. PROCEDURE ColorBox (x1,y1,x2,y2,color: INTEGER);
  180.  
  181. VAR i, d: INTEGER;
  182.  
  183. BEGIN
  184.   d := x2-x1;
  185.   FOR i := y1 TO y2 DO
  186.     FillChar (Mem[$A000:WORD(i)*320+WORD(x1)],d,Chr (color));
  187. END;
  188.  
  189. (* Sichert den Bildschirm in der Datei "filename" *)
  190. PROCEDURE MCGASave (filename: STRING);
  191.  
  192. VAR f: FILE;
  193.  
  194. BEGIN
  195.   Assign (f, filename);
  196.   Rewrite (f,1);
  197.   BlockWrite (f,Mem[$a000:0000], 64000);
  198.   Close (f)
  199. END;
  200.  
  201. (* Lädt einen gesicherten Bildschirm *)
  202. PROCEDURE MCGALoad (filename: STRING);
  203.  
  204. VAR f: FILE;
  205.  
  206. BEGIN
  207.   Assign (f, filename);
  208.   Reset (f,1);
  209.   BlockRead (f, Mem[$A000:0000], 64000);
  210.   Close (f)
  211. END;
  212.  
  213. (* Zeichnet eine Linie in der Farbe color *)
  214. PROCEDURE Line(x1,y1,x2,y2,color: INTEGER);
  215.  
  216. VAR deltax,deltay,abweichung,
  217.     zaehler,x,y,temp        : INTEGER;
  218.  
  219. BEGIN
  220.   abweichung := 0;
  221.   deltax := x2-x1;
  222.   deltay := y2-y1;
  223.   IF deltay <0 THEN BEGIN
  224.     temp := x1; x1 := x2 ; x2 := temp;
  225.     temp := y1; y1 := y2 ; y2 := temp;
  226.     deltax := -deltax;
  227.     deltay := -deltay;
  228.   END;
  229.   Plot(x1,y1,color);
  230.   x := x1;
  231.   y := y1;
  232.   IF deltax >= 0 THEN BEGIN
  233.     IF deltax < deltay THEN BEGIN
  234.       FOR zaehler := 1 TO deltay-1 DO BEGIN
  235.         IF abweichung <0 THEN BEGIN
  236.           x := x+1;
  237.           y := y+1;
  238.           Plot(x,y,color);
  239.           abweichung := abweichung+deltay-deltax;
  240.         END
  241.         ELSE BEGIN
  242.           y := y+1;
  243.           Plot(x,y,color);
  244.           abweichung := abweichung+deltay-deltax;
  245.         END;
  246.       END;
  247.     END ELSE BEGIN
  248.       FOR zaehler := 1 TO deltax-1 DO BEGIN
  249.         IF abweichung <=0 THEN BEGIN
  250.           x := x+1;
  251.           Plot(x,y,color);
  252.           abweichung := abweichung+deltay;
  253.         END ELSE BEGIN
  254.           x := x+1;
  255.           y := y+1;
  256.           Plot(x,y,color);
  257.           abweichung := abweichung+deltay-deltax;
  258.         END;
  259.       END;
  260.     END;
  261.   END ELSE BEGIN
  262.     IF Abs(deltax) >= deltay THEN BEGIN
  263.       FOR zaehler := 1 TO Abs(deltax)-1 DO BEGIN
  264.         IF abweichung <= 0 THEN BEGIN
  265.           x :=x-1;
  266.           Plot(x,y,color);
  267.           abweichung := abweichung+deltay;
  268.         END ELSE BEGIN
  269.           x := x-1;
  270.           y := y+1;
  271.           Plot(x,y,color);
  272.           abweichung := abweichung+deltax+deltay;
  273.         END;
  274.       END;
  275.     END ELSE BEGIN
  276.       FOR zaehler := 1 TO deltay-1 DO BEGIN
  277.         IF abweichung <0 THEN BEGIN
  278.           x := x-1;
  279.           y := y+1;
  280.           Plot(x,y,color);
  281.           abweichung := abweichung+deltax+deltay;
  282.         END ELSE BEGIN
  283.           y := y+1;
  284.           Plot(x,y,color);
  285.           abweichung := abweichung+deltax;
  286.         END;
  287.       END;
  288.     END;
  289.   END;
  290.   Plot(x2,y2,color);
  291. END;
  292.  
  293. (* Zeichnet eine Box in der Farbe color *)
  294. PROCEDURE Box (x1,y1,x2,y2, color: INTEGER);
  295.  
  296. BEGIN
  297.   Line(x1,y1,x2,y1,color);
  298.   Line(x1,y2,x2,y2,color);
  299.   Line(x1,y1,x1,y2,color);
  300.   Line(x2,y1,x2,y2,color);
  301. END;
  302.  
  303. (* Setzt ein Farbregister *)
  304. PROCEDURE SetColor(nr,red,green,blue : INTEGER);
  305.  
  306. VAR r : Registers;
  307.  
  308. BEGIN
  309.   WITH r DO BEGIN
  310.     ah := $10;
  311.     al := $10;
  312.     BX := nr;
  313.     dh := red;
  314.     CH := green;
  315.     CL := blue;
  316.   END;
  317.   Intr($10,r);
  318. END;
  319.  
  320. (* Liest ein Farbregister *)
  321. PROCEDURE ReadColor(nr : INTEGER;
  322.                     VAR red,green,blue : INTEGER);
  323.  
  324. VAR r : Registers;
  325.  
  326. BEGIN
  327.   WITH r DO BEGIN
  328.     ah := $10;
  329.     al := $15;
  330.     BX := nr;
  331.     Intr($10,r);
  332.     red := dh;
  333.     green := CH;
  334.     blue := CL;
  335.   END;
  336. END;
  337.  
  338. (* Setzt einen Block von Farbregistern *)
  339. PROCEDURE SetColorBlock(startnr : INTEGER;
  340.                         buf : ColorRegBuffer;
  341.                         nr : INTEGER         );
  342.  
  343. VAR r : Registers;
  344.  
  345. BEGIN
  346.   WITH r DO BEGIN
  347.     ah := $10;
  348.     al := $12;
  349.     BX := startnr;
  350.     ES := Seg(buf);
  351.     DX := Ofs(buf);
  352.     CX := nr;
  353.   END;
  354.   Intr($10,r);
  355. END;
  356.  
  357. (* Liest eine Block von Farbregistern *)
  358. PROCEDURE ReadColorBlock(startnr : INTEGER;
  359.                          VAR buf : ColorRegBuffer;
  360.                          nr : INTEGER         );
  361.  
  362. VAR r : Registers;
  363.  
  364. BEGIN
  365.   WITH r DO BEGIN
  366.     ah := $10;
  367.     al := $17;
  368.     BX := startnr;
  369.     ES := Seg(buf);
  370.     DX := Ofs(buf);
  371.     CX := nr;
  372.   END;
  373.   Intr($10,r);
  374. END;
  375. END.
  376.