procedure sort(l,r:integer);
var i,j,x,y:integer;
begin
i:=l; j:=r; x:=polyz[(l+r) div 2];
repeat
while polyz[i]<x do inc(i); while x<polyz[j] do dec(j);
if i<=j then begin y:=polyz[i]; polyz[i]:=polyz[j]; polyz[j]:=y;
y:=pind[i]; pind[i]:=pind[j]; pind[j]:=y; inc(i); dec(j); end;
until i>j; if l<j then sort(l,j); if i<r then sort(i,r);
end;
begin sort(lo,hi); end;
function sinus(i:byte):integer; begin sinus:=stab[i]; end;
function cosinus(i:byte):integer; begin cosinus:=stab[(i+192) mod 255]; end;
procedure rotate_cube;
const xst=2; yst=3; zst=-4;
var
xp,yp,z:array[0..11] of integer;
x,y,i,j,k:integer;
n,Key,phix,phiy,phiz:byte;
begin
phix:=0; phiy:=0; phiz:=40; fillchar(xp,sizeof(xp),0);
fillchar(yp,sizeof(yp),0); Frame := 0; St := Time;
repeat
flip(pageseg,virseg);
for n:=0 to pointnum do begin
i:=(cosinus(phiy)*points[n,0]-sinus(phiy)*points[n,2]) div divd;
j:=(cosinus(phiz)*points[n,1]-sinus(phiz)*i) div divd;
k:=(cosinus(phiy)*points[n,2]+sinus(phiy)*points[n,0]) div divd;
x:=(cosinus(phiz)*i+sinus(phiz)*points[n,1]) div divd;
y:=(cosinus(phix)*j+sinus(phix)*k) div divd;
z[n]:=(cosinus(phix)*k-sinus(phix)*j) div divd+cosinus(phix) div 3;
xp[n]:=160+sinus(phix) div 2+(-x*dist) div (z[n]-dist);
yp[n]:=100+(-y*dist) div (z[n]-dist);
end;
for n:=0 to planenum do begin
polyz[n]:=(z[planes[n,0]]+z[planes[n,2]]) div 2; pind[n]:=n; end;
quicksort(0,planenum);
for n:=0 to planenum do
texture4poly(xp[planes[pind[n],0]],yp[planes[pind[n],0]],
xp[planes[pind[n],1]],yp[planes[pind[n],1]],
xp[planes[pind[n],2]],yp[planes[pind[n],2]],
xp[planes[pind[n],3]],yp[planes[pind[n],3]],16);
inc(phix,xst); inc(phiy,yst); inc(phiz,zst); flip(virseg,vidseg);
inc(frame);
delay(15);
until keypressed; Et:=time; end;
var i,j:word;
{$Q-}
begin
asm mov ax,13h; int 10h; end;
getmem(virscr,64000);
virseg:=seg(virscr^);
getmem(page,64000);
pageseg:=seg(page^);
for i:=0 to 255 do stab[i]:=round(sin(i*pi/128)*divd);
for i:=1 to 104 do setpal(150+i,0,20+i div 4,30+i div 5);
for i:=0 to 319 do for j:=0 to 199 do mem[pageseg:j*320+i]:=151+(i*i+j*j) mod 104;
rotate_cube;
freemem(page,64000);
freemem(virscr,64000);
textmode(lastmode);
Writeln(Frame*18.2/(Et-St):5:2, ' fps');
end.