home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1989-09-07 | 7.5 KB | 330 lines |
- (* --------------------------------------------------- *)
- (* MCGA.MOD *)
- (* (C) 1989 TOOLBOX *)
- (* Dieses Modul liefert die Grundlage für die Pro- *)
- (* grammierung des Modus 13h (MCGA) der VGA-Karte *)
- (* Implementation in TopSpeed Modula-2 *)
- (* --------------------------------------------------- *)
- IMPLEMENTATION MODULE MCGA;
-
- FROM SYSTEM IMPORT BYTE, Registers, Seg, Ofs;
- IMPORT Lib, Str, FIO;
-
- TYPE
- ByteP = POINTER TO BYTE;
-
- (* Setzen eines Punktes in der Farbe color *)
- PROCEDURE plot(x, y, color : CARDINAL);
- BEGIN
- [0A000H:(y*320+x) ByteP]^ := BYTE(color);
- END plot;
-
- (* Alternatives Plot mit Bios Funktion *)
- (*
- PROCEDURE plot(x, y, color : CARDINAL);
- VAR
- R : Registers;
- BEGIN
- WITH R DO
- AH := 12;
- CX := x;
- DX := y;
- END;
- Lib.Intr(R, 10H);
- END plot;
- *)
-
- (* Ermittelt die Farbe des Punktes auf x, y *)
- PROCEDURE getdotcolor (x, y : CARDINAL) : CARDINAL;
- BEGIN
- RETURN CARDINAL([0A000H:(y*320+x) ByteP]^ )
- END getdotcolor;
-
- (* Alternatives getdotcolor mit BIOS-Aufruf *)
- (*
- PROCEDURE getdotcolor(x, y : CARDINAL) : CARDINAL;
- VAR
- R : Registers;
- BEGIN
- WITH R DO
- AH := 14;
- CX := x;
- DX := y;
- END;
- Lib.Intr(R, 10H);
- RETURN CARDINAL(R.AL)
- END getdotcolor;
- *)
-
- (* Setzt MCGA-Modus mit 320*200 Punkte x 256 Farben *)
- PROCEDURE initgraphic;
- VAR
- R : Registers;
- BEGIN
- WITH R DO
- AH := 0;
- AL := 13H;
- END;
- Lib.Intr(R, 10H);
- END initgraphic;
-
- PROCEDURE exitgraphic;
- VAR
- R : Registers;
- BEGIN
- WITH R DO
- AH := 0;
- AL := 3;
- END;
- Lib.Intr(R, 10H);
- END exitgraphic;
-
- (* Schreibt einen String an Cursorposition *)
- PROCEDURE print(line : ARRAY OF CHAR; color : CARDINAL);
- VAR i : CARDINAL;
- R : Registers;
- BEGIN
- FOR i := 0 TO Str.Length(line)-1 DO
- WITH R DO
- AH := 14;
- AL := SHORTCARD(line[i]);
- BL := SHORTCARD(color);
- END;
- Lib.Intr(R, 10H);
- END;
- END print;
-
- (* Setzt den Cursor auf x, y *)
- PROCEDURE setcursor(x, y : CARDINAL);
- VAR
- R : Registers;
- BEGIN
- WITH R DO
- AH := 2;
- BH := 0;
- DH := SHORTCARD(y);
- DL := SHORTCARD(x);
- END;
- Lib.Intr(R, 10H)
- END setcursor;
-
- (* Liest x-Position des Cursors *)
- PROCEDURE cursorx() : CARDINAL;
- VAR
- R : Registers;
- BEGIN
- WITH R DO
- AH := 3;
- BH := 0
- END;
- Lib.Intr(R, 10H);
- RETURN CARDINAL(R.DL);
- END cursorx;
-
- (* Liest y-Position des Cursors *)
- PROCEDURE cursory() : CARDINAL;
- VAR
- R : Registers;
- BEGIN
- WITH R DO
- AH := 3;
- BH := 0
- END;
- Lib.Intr(R, 10H);
- RETURN CARDINAL(R.DH)
- END cursory;
-
- (* Bildschirm mit Farbe color löschen *)
- PROCEDURE clearscreen(color : CARDINAL);
- BEGIN
- Lib.Fill([0A000H:0000], 64000, SHORTCARD(color));
- END clearscreen;
-
- (* Farbige Box zeichnen *)
- PROCEDURE colorbox(x1, y1, x2, y2, color : CARDINAL);
- VAR
- i, d : CARDINAL;
- BEGIN
- d := x2 - x1;
- FOR i := 1 TO y2 DO
- Lib.Fill([0A000H:i*320+x1], d, SHORTCARD(color));
- END;
- END colorbox;
-
- VAR
- Scr[0A000H:0000] : ARRAY[0..63999] OF BYTE;
-
- (* Sichert den Bildschirm in die Datei "filename" *)
- PROCEDURE mcgasave(filename : ARRAY OF CHAR);
- VAR
- f : FIO.File;
- BEGIN
- f := FIO.Create(filename);
- FIO.WrBin(f, Scr, SIZE(Scr));
- FIO.Close(f)
- END mcgasave;
-
- (* Lädt einen gesicherten Bildschirm *)
- PROCEDURE mcgaload(filename : ARRAY OF CHAR);
- VAR
- f : FIO.File;
- res : CARDINAL;
- BEGIN
- f := FIO.Open(filename);
- res := FIO.RdBin(f, Scr, SIZE(Scr));
- FIO.Close(f)
- END mcgaload;
-
- PROCEDURE line(x1, y1, x2, y2, color : CARDINAL);
- VAR
- deltax, deltay, abweichung,
- zaehler, x, y, temp : INTEGER;
- BEGIN
- abweichung := 0;
- deltax := x2 - x1;
- deltay := y2 - y1;
- IF deltay < 0 THEN
- temp := x1; x1 := x2; x2 := temp;
- temp := y1; y1 := y2; y2 := temp;
- deltax := -deltax;
- deltay := -deltay;
- END;
- plot(x1, y1, color);
- x := x1;
- y := y1;
- IF deltax >= 0 THEN
- IF deltax < deltay THEN
- FOR zaehler := 1 TO deltay-1 DO
- IF abweichung < 0 THEN
- x := x + 1;
- y := y + 1;
- plot(x, y, color);
- abweichung := abweichung + deltay - deltax;
- ELSE
- y := y + 1;
- plot(x, y, color);
- abweichung := abweichung + deltay - deltax;
- END;
- END;
- ELSE
- FOR zaehler := 1 TO deltax-1 DO
- IF abweichung <= 0 THEN
- x := x + 1;
- plot(x, y, color);
- abweichung := abweichung + deltay;
- ELSE
- x := x + 1;
- y := y + 1;
- plot(x, y, color);
- abweichung := abweichung + deltay - deltax;
- END;
- END;
- END;
- ELSE
- IF ABS(deltax) >= deltay THEN
- FOR zaehler := 1 TO ABS(deltax)-1 DO
- IF abweichung <= 0 THEN
- x := x - 1;
- plot(x, y, color);
- abweichung := abweichung + deltay;
- ELSE
- x := x - 1;
- y := y + 1;
- plot(x, y, color);
- abweichung := abweichung + deltax + deltay;
- END;
- END;
- ELSE
- FOR zaehler := 1 TO deltay-1 DO
- IF abweichung < 0 THEN
- x := x - 1;
- y := y + 1;
- plot(x, y, color);
- abweichung := abweichung + deltax + deltay;
- ELSE
- y := y + 1;
- plot(x, y, color);
- abweichung := abweichung + deltay;
- END;
- END;
- END;
- END;
- plot(x2, y2, color);
- END line ;
-
- PROCEDURE box(x1, y1, x2, y2, color : CARDINAL);
- BEGIN
- line(x1, y1, x2, y1, color);
- line(x1, y2, x2, y2, color);
- line(x1, y1, x1, y2, color);
- line(x2, y1, x2, y2, color);
- END box;
-
- PROCEDURE setcolor(nr, red, green, blue : CARDINAL);
- VAR
- R : Registers;
- BEGIN
- WITH R DO
- AH := 10H;
- AL := 10H;
- BX := nr;
- DH := SHORTCARD(red);
- CH := SHORTCARD(green);
- CL := SHORTCARD(blue);
- END;
- Lib.Intr(R, 10H);
- END setcolor;
-
- PROCEDURE readcolor(nr : CARDINAL; VAR red, green, blue : CARDINAL);
- VAR
- R : Registers;
- BEGIN
- WITH R DO
- AH := 10H;
- AL := 15H;
- BX := nr;
- END;
- Lib.Intr(R, 10H);
- WITH R DO
- red := CARDINAL(DH);
- green := CARDINAL(CH);
- blue := CARDINAL(CL);
- END;
- END readcolor;
-
- PROCEDURE setcolorblock(StartNr : CARDINAL;
- CRegBuf : ColorRegBuffer;
- Nr : CARDINAL);
- VAR
- R : Registers;
- BEGIN
- WITH R DO
- AH := 10H;
- AL := 12H;
- BX := StartNr;
- ES := Seg(CRegBuf);
- DX := Ofs(CRegBuf);
- CX := Nr;
- END;
- Lib.Intr(R, 10H);
- END setcolorblock;
-
- PROCEDURE readcolorblock(StartNr : CARDINAL;
- VAR CRegBuf : ColorRegBuffer;
- Nr : CARDINAL);
- VAR
- R : Registers;
- BEGIN
- WITH R DO
- AH := 10H;
- AL := 17H;
- BX := StartNr;
- ES := Seg(CRegBuf);
- DX := Ofs(CRegBuf);
- CX := Nr;
- END;
- Lib.Intr(R, 10H);
- END readcolorblock;
-
- END MCGA.