|
@@ -0,0 +1,232 @@
|
|
|
|
+{ Source provided for Free Pascal Bug Report 1066 }
|
|
|
|
+{ Submitted by "Fernando Oscar Schmitt" on 2000-07-24 }
|
|
|
|
+{ e-mail: [email protected] }
|
|
|
|
+
|
|
|
|
+var
|
|
|
|
+ somevar:longint;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+procedure putpixel(x,y,color:longint);assembler;inline;
|
|
|
|
+asm
|
|
|
|
+mov edi,x
|
|
|
|
+mov eax,y
|
|
|
|
+cmp edi,0
|
|
|
|
+jl @@putpixelend
|
|
|
|
+cmp eax,0
|
|
|
|
+jl @@putpixelend
|
|
|
|
+cmp edi,1023
|
|
|
|
+jg @@putpixelend
|
|
|
|
+cmp eax,767
|
|
|
|
+jg @@putpixelend
|
|
|
|
+shl eax,12
|
|
|
|
+mov ebx,color
|
|
|
|
+add eax,somevar
|
|
|
|
+mov [eax+edi*4],ebx
|
|
|
|
+@@putpixelend:
|
|
|
|
+end ['eax','ebx','edi'];
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+procedure pixelrow(y,x1,x2,color:longint);assembler;inline;
|
|
|
|
+asm
|
|
|
|
+mov edi,x1
|
|
|
|
+mov ecx,x2
|
|
|
|
+mov eax,y
|
|
|
|
+cmp edi,ecx
|
|
|
|
+jle @@pixelrowdirok
|
|
|
|
+xchg edi,ecx
|
|
|
|
+@@pixelrowdirok:
|
|
|
|
+cmp eax,0
|
|
|
|
+jl @@endpixelrow
|
|
|
|
+cmp eax,767
|
|
|
|
+jg @@endpixelrow
|
|
|
|
+cmp ecx,0
|
|
|
|
+jl @@endpixelrow
|
|
|
|
+cmp edi,1023
|
|
|
|
+jg @@endpixelrow
|
|
|
|
+cmp edi,0
|
|
|
|
+jge @@pixelrowx1ok
|
|
|
|
+mov edi,0
|
|
|
|
+@@pixelrowx1ok:
|
|
|
|
+cmp ecx,1023
|
|
|
|
+jle @@pixelrowx2ok
|
|
|
|
+mov ecx,1023
|
|
|
|
+@@pixelrowx2ok:
|
|
|
|
+sub ecx,edi
|
|
|
|
+shl eax,12
|
|
|
|
+inc ecx
|
|
|
|
+add eax,somevar
|
|
|
|
+cld
|
|
|
|
+lea edi,[eax+4*edi]
|
|
|
|
+mov eax,color
|
|
|
|
+rep stosd
|
|
|
|
+@@endpixelrow:
|
|
|
|
+end ['eax','ecx','edi'];
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+function str(w:word):string;
|
|
|
|
+var tmp:string;
|
|
|
|
+begin
|
|
|
|
+system.str(w,tmp);
|
|
|
|
+str:=tmp;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function str(l:longint):string;
|
|
|
|
+var tmp:string;
|
|
|
|
+begin
|
|
|
|
+system.str(l,tmp);
|
|
|
|
+str:=tmp;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+procedure circle(x0,y0,r,color:longint);
|
|
|
|
+var x,y:longint;
|
|
|
|
+begin
|
|
|
|
+for x:=0 to trunc(r*(sqrt(2)/2))+1 do
|
|
|
|
+ begin
|
|
|
|
+ y:=round(sqrt(r*r-x*x));
|
|
|
|
+ putpixel(x0+x,y0+y,color);
|
|
|
|
+ putpixel(x0-x,y0+y,color);
|
|
|
|
+ putpixel(x0+x,y0-y,color);
|
|
|
|
+ putpixel(x0-x,y0-y,color);
|
|
|
|
+ putpixel(x0+y,y0+x,color);
|
|
|
|
+ putpixel(x0-y,y0+x,color);
|
|
|
|
+ putpixel(x0+y,y0-x,color);
|
|
|
|
+ putpixel(x0-y,y0-x,color);
|
|
|
|
+ end;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+procedure circlefill(x0,y0,r,color:longint);
|
|
|
|
+var x,y:longint;
|
|
|
|
+begin
|
|
|
|
+for x:=0 to trunc(r*(sqrt(2)/2))+1 do
|
|
|
|
+ begin
|
|
|
|
+ y:=round(sqrt(r*r-x*x));
|
|
|
|
+ pixelrow(y0+y,x0-x,x0+x,color);
|
|
|
|
+ pixelrow(y0-y,x0-x,x0+x,color);
|
|
|
|
+ pixelrow(y0+x,x0-y,x0+y,color);
|
|
|
|
+ pixelrow(y0-x,x0-y,x0+y,color);
|
|
|
|
+ end;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+begin
|
|
|
|
+
|
|
|
|
+end.
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+{----------------cut here----------------}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+var
|
|
|
|
+ somevar:longint;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+procedure wastememory(x,y,color:longint);assembler;inline;
|
|
|
|
+asm
|
|
|
|
+mov edi,x
|
|
|
|
+mov eax,y
|
|
|
|
+cmp edi,0
|
|
|
|
+jl @@wastememoryend
|
|
|
|
+cmp eax,0
|
|
|
|
+jl @@wastememoryend
|
|
|
|
+cmp edi,1023
|
|
|
|
+jg @@wastememoryend
|
|
|
|
+cmp eax,767
|
|
|
|
+jg @@wastememoryend
|
|
|
|
+shl eax,12
|
|
|
|
+mov ebx,color
|
|
|
|
+add eax,somevar
|
|
|
|
+mov [eax+edi*4],ebx
|
|
|
|
+@@wastememoryend:
|
|
|
|
+end ['eax','ebx','edi'];
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+procedure wastememory2(y,x1,x2,color:longint);assembler;inline;
|
|
|
|
+asm
|
|
|
|
+mov edi,x1
|
|
|
|
+mov ecx,x2
|
|
|
|
+mov eax,y
|
|
|
|
+cmp edi,ecx
|
|
|
|
+jle @@wastememory2dirok
|
|
|
|
+xchg edi,ecx
|
|
|
|
+@@wastememory2dirok:
|
|
|
|
+cmp eax,0
|
|
|
|
+jl @@endwastememory2
|
|
|
|
+cmp eax,767
|
|
|
|
+jg @@endwastememory2
|
|
|
|
+cmp ecx,0
|
|
|
|
+jl @@endwastememory2
|
|
|
|
+cmp edi,1023
|
|
|
|
+jg @@endwastememory2
|
|
|
|
+cmp edi,0
|
|
|
|
+jge @@wastememory2x1ok
|
|
|
|
+mov edi,0
|
|
|
|
+@@wastememory2x1ok:
|
|
|
|
+cmp ecx,1023
|
|
|
|
+jle @@wastememory2x2ok
|
|
|
|
+mov ecx,1023
|
|
|
|
+@@wastememory2x2ok:
|
|
|
|
+sub ecx,edi
|
|
|
|
+shl eax,12
|
|
|
|
+inc ecx
|
|
|
|
+add eax,somevar
|
|
|
|
+cld
|
|
|
|
+lea edi,[eax+4*edi]
|
|
|
|
+mov eax,color
|
|
|
|
+rep stosd
|
|
|
|
+@@endwastememory2:
|
|
|
|
+end ['eax','ecx','edi'];
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+function str(w:word):string;
|
|
|
|
+var tmp:string;
|
|
|
|
+begin
|
|
|
|
+system.str(w,tmp);
|
|
|
|
+str:=tmp;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function str(l:longint):string;
|
|
|
|
+var tmp:string;
|
|
|
|
+begin
|
|
|
|
+system.str(l,tmp);
|
|
|
|
+str:=tmp;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+procedure testcompiler(x0,y0,r,color:longint);
|
|
|
|
+var x,y:longint;
|
|
|
|
+begin
|
|
|
|
+for x:=0 to trunc(r*(sqrt(2)/2))+1 do
|
|
|
|
+ begin
|
|
|
|
+ y:=round(sqrt(r*r-x*x));
|
|
|
|
+ wastememory(x0+x,y0+y,color);
|
|
|
|
+ wastememory(x0-x,y0+y,color);
|
|
|
|
+ wastememory(x0+x,y0-y,color);
|
|
|
|
+ wastememory(x0-x,y0-y,color);
|
|
|
|
+ wastememory(x0+y,y0+x,color);
|
|
|
|
+ wastememory(x0-y,y0+x,color);
|
|
|
|
+ wastememory(x0+y,y0-x,color);
|
|
|
|
+ wastememory(x0-y,y0-x,color);
|
|
|
|
+ end;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+procedure testcompiler2(x0,y0,r,color:longint);
|
|
|
|
+var x,y:longint;
|
|
|
|
+begin
|
|
|
|
+for x:=0 to trunc(r*(sqrt(2)/2))+1 do
|
|
|
|
+ begin
|
|
|
|
+ y:=round(sqrt(r*r-x*x));
|
|
|
|
+ wastememory2(y0+y,x0-x,x0+x,color);
|
|
|
|
+ wastememory2(y0-y,x0-x,x0+x,color);
|
|
|
|
+ wastememory2(y0+x,x0-y,x0+y,color);
|
|
|
|
+ wastememory2(y0-x,x0-y,x0+y,color);
|
|
|
|
+ end;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+begin
|
|
|
|
+
|
|
|
|
+end.
|
|
|
|
+
|