{$I386_INTEL}
USES GO32;
VAR VideoBuffer : pointer;
PROCEDURE Pixel(destiny : pointer; x,y : longint; color : byte);
BEGIN
if (x<0) or (x>319) or (y<0) or (y>199) then exit;
ASM
mov edi,destiny
add edi,x { In unserem Videobuffer um x-Bytes weiter }
mov eax,320
imul y { Und um y*320 Bytes weiter }
add edi,eax
mov al,color
mov [edi],al { Pixel setzen }
END ['EDI', 'EAX', 'EDX'];
END;
PROCEDURE InitVGAMode(mode : word);
Var regs : trealregs;
BEGIN
regs.ax:=mode;
Realintr($10,regs);
END;
PROCEDURE Line(destiny : pointer; x1,y1,x2,y2 : longint; col : byte);
Var dx,dy,sx,sy,k : longint;
BEGIN
sx:=1;
sy:=1;
dx:=x2-x1; { X-Steigung }
if dx<0 then begin { Wenn negativ, dann nich X erh”hen sondern erniedrigen (mit SX) }
dx:=-dx;
sx:=-1;
end;
dy:=y2-y1; { Y-Steigung }
if dy<0 then begin { s.o }
dy:=-dy;
sy:=-1;
end;
k:=-(dx shr 1); { dx shr 1 = dx div 2 }
pixel(destiny,x1,y1,col); { 1.Pixel setzen }
while (x1<>x2) or (y1<>y2) do { Schleife von x1 nach x2 / y1 nach y2 }
if (k>=0) and (y1<>y2) then begin { K”nnen noch Pixel in x-Richtung gesetzt werden? }
inc(y1,sy); { Nope! Also y erh”hen/erniedrigen }
dec(k,dx);
pixel(destiny,x1,y1,col);
end
else begin
inc(x1,sx); { Yup! Also x erh”hen/erniedrigen }
inc(k,dy);
pixel(destiny,x1,y1,col);
end;
END;
PROCEDURE Circle(destiny : pointer; x0,y0,radius : longint; col : byte);
Var x,y,p : longint;
BEGIN
x:=0;
y:=-radius;
p:=y shl 1+3; { y shl 1 = y*2 }
while x<=-y do begin
pixel(destiny,x0+x,y0+y,col); { Die angesprochenen Spiegelungen }
pixel(destiny,x0-x,y0+y,col);
pixel(destiny,x0+x,y0-y,col);
pixel(destiny,x0-x,y0-y,col);
pixel(destiny,x0+y,y0+x,col);
pixel(destiny,x0-y,y0+x,col);
pixel(destiny,x0+y,y0-x,col);
pixel(destiny,x0-y,y0-x,col);
if p>=0 then begin
inc(y);
inc(p,(x+y)shl 2+6); { obiges 3 bzw. 6 dienen zur Sch”nheits-Korrektur }
end else inc(p,x shl 2+6); { keine Ahnung wie Bresenham gerade auf diese Zahlen kam }
inc(x);
end;
END;
BEGIN
getmem(videobuffer,64000);
initvgamode($13); { 320x200,256 }
line(videobuffer,-30,100,160,2,1); { LINIE IN BUFFER SETZEN }
circle(videobuffer,160,100,50,2); { KREIS MIT RADIUS 50 / FARBE 2 }
dosmemput($a000,0,videobuffer^,64000); { BUFFER AN $a000:0 KOPIEREN }
readln;
initvgamode($3); { TEXTMODUS }
freemem(videobuffer,64000);
END.