Uses CRT;
Const vx0 = 3;
vy0 = 2;
v0 = vx0;
r0 = 50;
r02 = (r0-v0)*(r0-v0);
d = r02 * 10 div 10;
Type ScreenType = Array[0..199,0..319] of Byte;
DispType = Array[-r0..r0,-r0..r0] of Integer;
Var
Screen : ScreenType Absolute $a000:$0000;
Buffer1, Buffer2 : ^ScreenType;
Disp : ^DispType;
x,y,vx,vy,r2,c : LongInt;
Procedure Move(Var A,B; Count: Word);
assembler;
asm
push ds
mov cx, Count
les di, B
lds si, A
shr cx, 1
jz @zero
rep movsw
@zero: pop ds
end;
BEGIN
asm
mov ax, $13
int $10
end;
New(Buffer1);
New(Buffer2);
New(Disp);
FillChar(Screen, SizeOf(Screen), 18);
y:=0;
repeat
For x:=0 to 319 do Screen[y,x]:=4;
Inc(y,10);
until y>199;
x:=0;
repeat
For y:=0 to 199 do Screen[y,x]:=4;
Inc(x,10);
until x>319;
Move(Screen, Buffer1^, SizeOf(Screen));
Move(Buffer1^,Screen,64000);
For y:=-r0 to r0 do
For x:=-r0 to r0 do
begin
r2:=x*x+y*y;
if r2>r02 then Disp^[y,x] := y*320+x
else
Disp^[y,x]:=(y*(r2+d)div(r02+d))*320+(x*(r2+d)div(r02+d));
end;
x:=r0;
y:=r0;
vx:=vx0;
vy:=vy0;
repeat
asm
mov ax, Integer(y)
mov bx, 320
imul bx
add ax, Integer(x)
mov di, ax
mov dx, -r0*320-r0
les si, Disp
mov ch, 2*r0+1
@next_dy: mov cl, 2*r0+1
@next_dx:
mov es, Word(Disp+2)
mov bx, es:[si]
mov es, Word(Buffer1+2)
mov al, es:[di+bx]
mov bx, Seg(Screen)
mov es, bx
mov bx, dx
mov es:[di+bx], al
add si, 2
inc dx
dec cl
jnz @next_dx
add dx, 320-(2*r0+1)
dec ch
jnz @next_dy
end;
if ((x+vx)>=r0)and ((x+vx)<=319-r0)then Inc(x, vx)
else vx:=-vx;
if ((y+vy)>=r0)and ((y+vy)<=199-r0)then Inc(y,vy)
else vy:=-vy;
Delay(2450);
until Port[$60]=$01;
Dispose(Buffer1);
Dispose(Buffer2);
Dispose(Disp);
asm
mov ax, $03
int $10
end;
END.
Помощь с вставками на ассемблере
Разбираю алгоритм линзы и не совсем понятно, что описывают строки на ассемблере, просьба, кто его знает помочь с комментариями...
Цитата:
Procedure Move(Var A,B; Count: Word);
копирует четное количество байт из буфера A в буфер B. Не ахти как правильно написана.
А не подскажите значение операций в цикле repeat?
Чет там с видеопамятью походу.. лень разбираться :)
Если программа рабочая, откомпилуй, запусти и посмотри. В подобных ситуациях ассемблерные вставки обычно делают для повышения быстродействия при формировании картинки в видеопамяти, хотя так мешать высоко- и низкоуровневый код в исходнике нежелательно.
Происходит табличная замена координат по Disp[i,j]. Складываются с x,y.Откуда идет выборка из буффера и копирование на экран.