home *** CD-ROM | disk | FTP | other *** search
- {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X-}
- {$M 16384,0,655360}
- (*===================================================================*)
- (* MODE13H.PAS *)
- (* Demo- und Grundgerüst für die Programmierung des Modus 13h *)
- (* (320 * 200 in 256 Farben) *)
- (* Copyright (C) 1993 te-wi Verlag *)
- (*===================================================================*)
-
- PROGRAM Mode13hDemo;
-
- USES
- Crt, Dos;
-
- CONST
- Black = 0; Blue = 1; Green = 2;
- Cyan = 3; Red = 4; Magenta = 5;
- Brown = 6; LightGray = 7; DarkGray = 8;
- LightBlue = 9; LightGreen = 10; LightCyan = 11;
- LightRed = 12; LightMagenta = 13; Yellow = 14;
- White = 15; MaxColors = 256;
-
- GetMaxX = 319; GetMaxY = 199;
-
- InitDone : BOOLEAN = FALSE;
- GraphResult : INTEGER = 0;
- DisplayColor : BYTE = 15;
- BackGrndColor: BYTE = 00;
- LastMode : BYTE = $03;
-
- VAR
- i, j : WORD;
- Regs : Registers;
- (* Im Modus 13h ist der Bildschirm nicht in Bitplanes aufgeteilt *)
- (* sondern direkt als ARRAY[0..199,0..319] adressierbar: *)
- Screen : ARRAY[0..GetMaxY, 0..GetMaxX] OF BYTE ABSOLUTE $A000:0;
- GraphMode: INTEGER;
-
- FUNCTION GetBkColor: BYTE;
- BEGIN
- GetBkColor := BackGrndColor;
- END;
-
- PROCEDURE SetBkColor(col: BYTE);
- BEGIN
- BackGrndColor := col;
- Regs.AH := $0B;
- Regs.BH := $00;
- Regs.BL := col;
- Intr($10, Regs);
- END;
-
- PROCEDURE ClearDevice;
- BEGIN
- Regs.AH := $06;
- Regs.AL := $00;
- Regs.BH := BackGrndColor;
- Regs.CL := 0;
- Regs.CH := 0;
- Regs.DL := 39;
- Regs.DH := 24;
- Intr($10,Regs);
- END;
-
- PROCEDURE SetGraphMode(VAR Mode: INTEGER);
- BEGIN
- IF NOT InitDone THEN BEGIN
- LastMode := Mem[$40:$49];
- Regs.AH := $00;
- Regs.AL := Lo(Mode);
- Intr($10, Regs);
- IF Mem[$40:$49] <> Mode THEN
- BEGIN
- GraphResult := -1;
- Mode := -1;
- END ELSE InitDone := TRUE;
- END;
- END;
-
- PROCEDURE OutTextXY(x, y: BYTE; s: STRING);
- BEGIN
- Regs.AX := $1300;
- Regs.BH := 0;
- Regs.BL := DisplayColor;
- Regs.DH := y - 1;
- Regs.DL := x - 1;
- Regs.CX := Ord(s[0]);
- Regs.ES := Seg(s);
- Regs.BP := Ofs(s[1]);
- Intr($10, Regs);
- END;
-
- PROCEDURE PutPixel(x, y: INTEGER; Color: BYTE);
- BEGIN
- Screen[y, x] := Color;
- END;
-
- PROCEDURE RestoreCrtMode;
- BEGIN
- Regs.AH := 0;
- Regs.AL := LastMode;
- Intr($10, Regs);
- InitDone := FALSE;
- END;
-
- PROCEDURE Rectangle(x1, y1, x2, y2: INTEGER);
- VAR
- i: INTEGER;
- BEGIN
- FOR i := x1 TO x2 DO Screen[y1, i] := DisplayColor;
- FOR i := y1 TO y2 DO Screen[i, x1] := DisplayColor;
- FOR i := x1 TO x2 DO Screen[y2, i] := DisplayColor;
- FOR i := y1 TO y2 DO Screen[i, x2] := DisplayColor;
- END;
-
- PROCEDURE Line(x1, y1, x2, y2: INTEGER);
- VAR
- dx, dy, ex, ey: Integer;
-
- PROCEDURE Swap(VAR i, j: INTEGER);
- VAR
- t: Integer;
- BEGIN
- t := i;
- i := j;
- j := t;
- END;
-
- BEGIN
- IF x1 > x2 THEN
- BEGIN
- Swap(x1, x2);
- Swap(y1, y2);
- END;
- ex := x1 - x2;
- ey := -Abs(y2 - y1);
- dx := (-ex) SHL 1;
- dy := (-ey) SHL 1;
- IF y1 <= y2 THEN
- BEGIN
- IF dx >= dy THEN FOR x1 := x1 TO x2 DO
- BEGIN
- PutPixel(x1, y1, DisplayColor);
- Inc(ex, dy);
- IF ex > 0 THEN
- BEGIN
- Dec(ex, dx);
- Inc(y1);
- END;
- END
- ELSE FOR y1 := y1 TO y2 DO
- BEGIN
- PutPixel(x1, y1, DisplayColor);
- Inc(ey, dx);
- IF ey > 0 THEN
- BEGIN
- Dec(ey, dy);
- Inc(x1);
- END;
- END;
- END
- ELSE
- BEGIN
- IF dx >= dy THEN
- BEGIN
- FOR x1 := x1 TO x2 DO
- BEGIN
- PutPixel(x1, y1, DisplayColor);
- Inc(ex, dy);
- IF ex > 0 THEN
- BEGIN
- Dec(ex, dx);
- Dec(y1);
- END;
- END;
- END
- ELSE FOR y1 := y1 DOWNTO y2 DO
- BEGIN
- PutPixel(x1, y1, DisplayColor);
- Inc(ey, dx);
- IF ey > 0 THEN
- BEGIN
- Dec(ey,dy);
- Inc(x1);
- END;
- END;
- END;
- END;
-
- PROCEDURE EllipseAndCircle(xm, ym: INTEGER; xr, yr: INTEGER);
- VAR
- x, y : INTEGER;
- dx, dy,
- ySub, xAdd,
- r : LONGINT;
- BEGIN
- IF (xr = 0) OR (yr = 0) THEN Exit;
- dx := LONGINT(xr * 2) * LONGINT(xr);
- dy := LONGINT(yr * 2) * LONGINT(yr);
- ySub := 0;
- xAdd := LONGINT(xr) * dy;
- r := xAdd DIV 2;
- x := xr;
- y := 0;
- REPEAT
- PutPixel(xm + x, ym + y, DisplayColor);
- PutPixel(xm + x, ym - y, DisplayColor);
- PutPixel(xm - x, ym - y, DisplayColor);
- PutPixel(xm - x, ym + y, DisplayColor);
- IF r >= 0 THEN
- BEGIN
- Inc(y);
- Inc(ySub,dx);
- Dec(r,ySub);
- END;
- IF r < 0 THEN
- BEGIN
- Dec(x);
- Dec(xAdd, dy);
- Inc(r, xAdd);
- END;
- UNTIL x < 0;
- END;
-
- PROCEDURE Circle(x, y, r: INTEGER);
- BEGIN
- EllipseAndCircle(x, y, Round(r * 5 / 4), r);
- { Die magische Zahl 5 / 4 gleicht die Aspect-Ratio aus }
- END;
-
- PROCEDURE Ellipse(x, y, rx, ry: INTEGER);
- BEGIN
- EllipseAndCircle(x, y, Round(rx * 5 / 4), ry);
- { Die magische Zahl 5 / 4 gleicht die Aspect-Ratio aus }
- END;
-
- PROCEDURE CloseGraph;
- BEGIN
- RestoreCrtMode;
- END;
-
- PROCEDURE grError(i: INTEGER);
- VAR
- ErrMsg: STRING;
- BEGIN
- CASE
- i OF
- 0: ErrMsg := 'Kein Fehler';
- -1: ErrMsg := 'Grafik konnte nicht initialisiert werden';
- ELSE ErrMsg := 'Allgemeiner Grafikkfehler';
- END;
- Write('Grafikfehler: ', ErrMsg);
- Halt(Abs(i));
- END;
-
- FUNCTION GetColor: BYTE;
- BEGIN
- GetColor := DisplayColor;
- END;
-
- PROCEDURE SetColor(Color: BYTE);
- BEGIN
- DisplayColor := Color;
- END;
-
- BEGIN
- GraphMode := $13;
- SetGraphMode(GraphMode);
- IF GraphResult < 0 THEN grError(GraphResult);
- Line(0, GetMaxY DIV 2, GetMaxX, GetMaxY DIV 2);
- Line(GetMaxX DIV 2, 0, GetMaxX DIV 2, GetMaxY);
- SetColor(Yellow);
- Line(0, 0, GetMaxX, GetMaxY);
- Line(GetMaxX, 0, 0, GetMaxY);
- Delay(1000);
- SetColor(LightMagenta);
- SetColor(64);
- SetBkColor(Blue);
- Rectangle(0, 0, GetMaxX, GetMaxY);
- Delay(1000);
- REPEAT
- FOR i := 0 TO 100 DO BEGIN
- SetColor(127 - i);
- Delay(10);
- Rectangle(i, i, GetMaxX - i, GetMaxY - i);
- END;
- SetColor(White);
- OutTextXY(15, 10, ' Modus 13h ');
- SetColor(Black);
- FOR i := 0 TO 100 DO BEGIN
- SetColor(i + 15);
- Delay(10);
- Circle(GetMaxX DIV 2, GetMaxY DIV 2, i);
- END;
- FOR i := 200 DOWNTO 0 DO BEGIN
- SetColor(i + 15);
- Delay(10);
- Ellipse(GetMaxX DIV 2, GetMaxY DIV 2, i DIV 4, i DIV 2);
- Ellipse(GetMaxX DIV 2, GetMaxY DIV 2, i DIV 2, i DIV 4);
- END;
- SetColor(Black);
- Line(0, GetMaxY DIV 2, GetMaxX, GetMaxY DIV 2);
- Line(GetMaxX DIV 2, 0, GetMaxX DIV 2, GetMaxY);
- UNTIL KeyPressed;
- CloseGraph;
- END.
-
- (*===================================================================*)
-