home *** CD-ROM | disk | FTP | other *** search
- unit mcga;
- interface
-
- USES Graph,Dos,Crt;
-
- const maxx=64;
- maxy=64;
- maxpage=12;
- cr=#13#10;
-
- TYPE ShapeDaten=Array[1..maxx,1..maxy,1..maxpage] of Byte;
- st80=String[40];
- LineBuffer=^OneLine;
- OneLine=RECORD
- Next:LineBuffer;
- Data:Array[0..319] of Byte
- END;
- Buttontype=(Left,Right,None,Midd);
-
- const mcgam =$13;
- vgalo =$2d;
- vgamed=$2e;
- vgahi =$2e;
- vgamax=$30;
- apa =$0d; {320*200 Grafik mit 8 Seiten}
- text =$03;
- mono =$03;
-
- var x,y,n : Integer;
- VgaColor,r,g,b: Byte;
- regs : Registers;
- Shapes : ShapeDaten;
- f : file of word;
- Meldung : st80;
- page : byte; {Bezieht sich auf Shapedatenfelder}
- col,gpage : byte; {In 256 Farbmodi nur Hintergrundfarbe}
- txt : string;
- ch : char;
- lastx,lasty : Word;
- Buffer,Merker : LineBuffer;
- Button : Buttontype;{aktuelle Maustaste}
- a : POINTER;
- bytesperrow : integer;
-
- procedure ClearScreen;
- procedure screenorigin(x,y:word);
- procedure printpixelat(color:byte;column,row:word);
- function getpixelat(Column,Row:word):byte;
- procedure line(x1,y1,x2,y2:word;col:byte);
- procedure setcrsr(x,y:integer);
- procedure outtextxy(x,y:integer;text:st80;color:byte);
- procedure ClrShapes;
- procedure savescreen(x1,y1,x2,y2:word;Name:String);
- procedure LoadScreen(xn,yn:integer;Name:String);
- procedure Save(dateiname:string);
- procedure Load(dateiname:string);
- procedure Screen_into_Buffer;
- procedure Buffer_into_Screen;
- procedure SetMode(mode:byte);
- function GetMode:byte;
- procedure PrintPalette;
- procedure SetIndividualPalette(Reg,r,g,b:byte);
- procedure Raute(x1,y1,x2,y2:integer;col:byte);
- procedure Ellipse(mx,my,a,b:Integer;col:Byte);
- procedure MoveScreen(x1,y1,x2,y2,xd,yd:integer;move:boolean);
- procedure Copyin(x1,y1:Integer;var Feld:Shapedaten;Page:ShortInt);
- procedure Copyout(x1,y1:Integer;var Feld:Shapedaten;Page:ShortInt);
- procedure ShiftLeft(var feld:Shapedaten;Page:ShortInt);
- procedure ShiftRight(var feld:Shapedaten;Page:ShortInt);
- procedure ShiftUp(var feld:Shapedaten;Page:ShortInt);
- procedure ShiftDown(var feld:Shapedaten;Page:ShortInt);
- procedure Copy (var feld:Shapedaten; Source,Dest:ShortInt);
- procedure ShapeSave(feld:Shapedaten;Start,SEnd:byte;Name:String);
- procedure ShapeLoad(var feld:Shapedaten;Name:String);
- procedure Box(x1,y1,x2,y2:integer;col:Byte);
- procedure GetMousePos (var x,y:Integer;var Button:ButtonType);
- procedure SetMousePos (x,y:Integer);
- procedure GraphMouse;
- procedure HideMouse;
- procedure ShowMouse;
-
-
- IMPLEMENTATION
- {$l d:\object\mcgatool}
- {$l d:\object\screen}
- {$f+}
- procedure ClearScreen;external;
- procedure printpixelat(color:byte;column,row:word);external;
- function getpixelat(Column,Row:word):byte;external;
- procedure line(x1,y1,x2,y2:word;col:byte);external;
- procedure screenorigin(x,y:word);external;
- {$f-}
-
- procedure data;
- begin
- inline($ff / $f3 / {Beginn der UND- Verknüpfung}
- $ff / $f3 /
- $ff / $ff /
- $ff / $ff /
- $ff / $ff /
- $ff / $ff /
- $ff / $ff /
- $ff / $ff /
- $ff / $ff /
- $ff / $ff /
- $ff / $ff /
- $ff / $ff /
- $ff / $ff /
- $ff / $ff /
- $ff / $ff /
- $ff / $ff /
- $00 / $00 / {Beginn der R- Verknüpfung}
- $00 / $00 /
- $00 / $00 /
- $00 / $00 /
- $00 / $00 /
- $00 / $00 /
- $00 / $00 /
- $00 / $00 /
- $00 / $00 /
- $00 / $00 /
- $00 / $00 /
- $00 / $00 /
- $00 / $00 /
- $00 / $00 /
- $00 / $00 /
- $00 / $00 )
- end;
- procedure graphmouse;
- begin
- with regs do begin
- ax:=0;
- intr($33,regs);
- if ah=0 then begin
- setmode(mono);
- writeln('Es ist ein nicht behebbarer Fehler aufgetreten.',#13#10,
- 'Es ist kein Maustreiber installiert.');
- readln;
- halt
- end;
-
- ax:=$7;
- cx:=1;
- dx:=639;
- intr($33,regs);
-
- ax:=$8;
- cx:=1;
- dx:=199;
- intr($33,regs);
-
- ax:=$9;
- bx:=3;
- cx:=0;
- es:=seg(mcga.data);
- dx:=ofs(mcga.data)+10;
- intr($33,regs)
- end;
- showmouse
- end;
-
- procedure GetMousePos (var x,y:Integer;var Button:ButtonType);
- var mousekey:ShortInt;
- begin
- button:=none;
-
- regs.ax:=3;
- intr($33,regs);
- x:=regs.cx;
- y:=regs.dx;
-
- mousekey:=regs.bx;
-
- if (mousekey and 1)=1 then button:=left;
- if (mousekey and 2)=2 then button:=right;
- if (mousekey and 4)=4 then button:=midd
- end;
-
- procedure SetMousePos (x,y:Integer);
- begin
- regs.ax:=4;
- regs.dx:=y;
- regs.cx:=x;
- intr($33,regs)
- end;
-
- procedure hidemouse;
- begin
- with regs do begin
- ax:=$2;
- intr($33,regs)
- end
- end;
-
- procedure showmouse;
- begin
- with regs do begin
- ax:=$1;
- intr($33,regs)
- end
- end;
-
- procedure setcrsr(x,y:integer);
- var regs:registers;
- begin
- if (x>79) or (y>24) then exit;
- regs.ah:=$02;
- regs.bh:=gpage;
- regs.dh:=y;
- regs.dl:=x;
- intr($10,regs)
- end;
-
- procedure outtextxy(x,y:integer;text:st80;color:byte);
- var n:shortint;
- a,b:integer;
-
- {Schreibt einen Text im aktuellen Grafikmodus an eine Position}
-
- begin
- for n:=1 to length(text) do begin
- setcrsr(x,y);
- with regs do begin
- al:=ord(text[n]);
- bh:=gpage;
- bl:=color;
- cx:=$1;
- ah:=$9;
- intr($10,regs);
- inc(x);
- end
- end
- end;
-
- PROCEDURE ClrShapes;
- {Loescht das Shapedatenfeld}
- VAR x,y,z : ShortInt;
- BEGIN
- FOR x:=1 TO 64 DO
- FOR y:=1 TO 64 DO
- FOR z:=1 TO 12 DO Shapes[x,y,z]:=0
- END;
- procedure Screen_into_Buffer;
- begin
- getmem(a,$ffff);
- move(mem[$a000:0000],a^,$ffff);
- end;
-
- procedure Buffer_into_Screen;
- begin
- move(a^,mem[$a000:$0000],$ffff);
- freemem(a,$ffff)
- end;
-
- procedure savescreen(x1,y1,x2,y2:word;Name:String);
- var x,y,n:word;
- m:byte;
- data,temp:word;
- {Speichern eines beliebigen Bildschirmbereichs
- Dateiformat:
- WORDS 0-4 Koordinaten des Bereichs.
- Der REST jeweils 1 WORD = 2 Farbpixel}
-
- begin
- assign(f,name);
- rewrite(f);
- write(f,x1,y1,x2,y2); {Koordinaten merken}
- for x:=x1 to x2 do
- for y:=y1 to y2 do begin
- data:=getpixelat(x,y);
- data:=data shl 8;
- temp:=getpixelat(x,y+1);
- data:=data or temp;
- write(f,data);
- inc(y);
- if y>y2 then y:=y2
- end;
- close(f)
- end;
-
- procedure LoadScreen(xn,yn:integer;Name:String);
- var x,y,x1,y1,x2,y2,n :word;
- data :word;
- {Laden eines Bildausschnitts an eine Position}
- begin
- assign(f,name);
- reset(f);
- read(f,x1,y1,x2,y2); {Koordinaten merken}
-
- for x:=x1 to x2 do
- for y:=y1 to y2 do begin
- read(f,data);
- printpixelat(data,x,y+1);
- data:=data shr 8;
- printpixelat(data,x,y);
- inc(y);
- if y>y2 then y:=y2
- end;
- close(f)
- end;
-
- Procedure Save(dateiname:string);
- {VIDEO RAM Modus 13h sichern}
- var f:file;
- BEGIN
- Assign(f,dateiname);
- Rewrite(f,1);
- BlockWrite(f,mem[$a000:0],$fa00);
- Close(f);
- END;
-
- Procedure Load(dateiname:string);
- {VIDEO RAM Modus 13h mit Dateiinhalt fuellen}
- var f:file;
- BEGIN
- assign(f,dateiname);
- Reset(f,1);
- BlockRead(f,mem[$a000:0],$fa00);
- Close(f);
- END;
-
- Procedure SetMode(mode:byte);
- Begin
- regs.ah:=0;
- regs.al:=mode;
- intr($10,regs)
- End;
-
- function getmode:byte;
- begin
- regs.ah:=$f;
- intr($10,regs);
- getmode:=regs.al
- end;
-
- procedure printpalette;
- var x,y : integer;
- col : byte;
-
- PROCEDURE colorrec(colnum:Byte);
- var x1,y1:integer;
- begin
- FOR x1:=75+x*10 to 84+x*10 do
- FOR y1:=1+y*10 to 10+y*10 do
- printpixelat(colnum,x1,y1)
- END;
-
- BEGIN
- col:=0;
- for x:=0 to 19 do
- for y:=0 to 9 do begin
- colorrec(col);
- inc(col)
- end
- end;
-
-
- Procedure SetIndividualPalette(Reg,r,g,b:byte);
- BEGIN
- regs.ah:=$10;
- regs.al:=$10;
- regs.dh:=r;
- regs.ch:=g;
- regs.cl:=b;
- regs.bx:=reg;
- intr($10,regs)
- END;
-
-
-
- procedure box(x1,y1,x2,y2:integer;col:Byte);
- begin
- line(x1,y1,x2,y1,col);
- line(x1,y1,x1,y2,col);
- line(x2,y1,x2,y2,col);
- line(x1,y2,x2,y2,col);
- end;
-
- procedure raute(x1,y1,x2,y2:integer;col:byte);
- begin
- line(x1,y1,x2,y2,col);
- line(x1,y1,x2,y1+y1-y2,col);
- line(x2+x2-x1,y1,x2,y2,col);
- line(x2+x2-x1,y1,x2,y1+y1-y2,col)
- end;
-
-
- Procedure Ellipse(mx,my,a,b:Integer;col:Byte);
- var x,y : integer;
- qr1,qr2,dx,dy,da:Real;
- begin
-
- x:=0;
- y:=b;
- qr1:=2*a*a; qr2:=2*b*b;
- dx:=1;dy:=qr1*b-1;
- da:=int(dy/2);
- repeat
- printpixelat(col,mx+x,my+y);
- printpixelat(col,mx+x,my-y);
- printpixelat(col,mx-x,my+y);
- printpixelat(col,mx-x,my-y);
- if da >= 0 then
- begin
- da:=da-dx-1;
- dx:=dx+qr2;
- x:=succ(x);
- end
- else
- begin
- da:=da+dy-1;
- dy:=dy-qr1;
- y:=pred(y);
- end;
- until y<0;
- end;
-
- procedure movescreen(x1,y1,x2,y2,xd,yd:integer;move:boolean);
- var x,y:integer;
- data:byte;
- begin
- x:=0;
- y:=0;
- box(x1,y1,x2,y2,0);
- for y:=y1 to y2 do
- for x:=x1 to x2 do begin
- data:=getpixelat(x,y);
- if move then printpixelat(0,x,y);
- printpixelat(data,xd+x-x1,yd+y-y1)
- end
- end;
-
- procedure copyin(x1,y1:Integer;var Feld:Shapedaten;Page:ShortInt);
- var x,y :integer;
- begin
- for x:=1 to maxx do
- for y:=1 to maxy do FELD[x,y,page]:=GetPixelAt(x1+x,y+y1)
- end;
-
- procedure copyout(x1,y1:Integer;var Feld:Shapedaten;Page:ShortInt);
- var x,y :integer;
- begin
- for x:=1 to maxx do
- for y:=1 to maxy do printpixelat(feld[x,y,page],x+x1,y+y1)
- end;
-
- procedure shiftleft(var feld:Shapedaten;Page:ShortInt);
- var x,y:Integer;
- buffer:array[1..64]of byte;
- begin
- for y:=1 to maxy do buffer[y]:=feld[1,y,page];
- for x:=1 to maxx do
- for y:=1 to maxy do feld[x,y,page]:=feld[x+1,y,page];
- for y:=1 to maxy do feld[maxx,y,page]:=buffer[y]
- end;
-
- procedure shiftright(var feld:Shapedaten;Page:ShortInt);
- var x,y:Integer;
- buffer:array[1..64]of byte;
- begin
- for y:=1 to maxy do buffer[y]:=feld[maxx,y,page];
- for x:=maxx downto 1 do
- for y:=maxy downto 1 do feld[x,y,page]:=feld[x-1,y,page];
- for y:=1 to maxy do feld[1,y,page]:=buffer[y]
- end;
-
- procedure shiftup(var feld:Shapedaten;Page:ShortInt);
- var x,y:Integer;
- buffer:array[1..64]of byte;
- begin
- for x:=1 to maxx do buffer[x]:=feld[x,1,page];
- for x:=1 to maxx do
- for y:=1 to maxy do feld[x,y,page]:=feld[x,y+1,page];
- for x:=1 to maxx do feld[x,maxy,page]:=buffer[x]
- end;
-
- procedure shiftdown(var feld:Shapedaten;Page:ShortInt);
- var x,y:Integer;
- buffer:array[1..64]of byte;
- begin
- for x:=1 to maxx do buffer[x]:=feld[x,maxy,page];
- for x:=maxx downto 1 do
- for y:=maxy downto 1 do feld[x,y,page]:=feld[x,y-1,page];
- for x:=1 to maxx do feld[x,1,page]:=buffer[x]
- end;
-
- procedure copy (var feld:Shapedaten; Source,Dest:ShortInt);
- var x,y:Integer;
- begin
- for x:=1 to maxx do
- for y:=1 to maxy do feld[x,y,dest]:=feld[x,y,source]
- end;
-
- procedure Shapesave(feld:Shapedaten;Start,SEnd:byte;Name:String);
- var x,y,z : Integer;
- f : file of byte;
- begin
- assign(f,name);
- rewrite(f);
-
- write(f,start,send);
-
- for x:=1 to maxx do
- for y:=1 to maxy do
- for z:=Start to sEnd do write(f,feld[x,y,z]);
-
- close(f)
- end;
- procedure Shapeload(var feld:Shapedaten;Name:String);
- var x,y,z : Integer;
- f : file of byte;
- start, send : byte;
- begin
- assign(f,name);
- rewrite(f);
- read(f,start,send);
- for x:=1 to maxx do
- for y:=1 to maxy do
- for z:=Start to sEnd do read(f,feld[x,y,z]);
- close(f)
- end;
- BEGIN
- bytesperrow:=80
- END.
-
-
-
-