Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помощь с вставками на ассемблере

48K
16 июня 2009 года
JusttRy
5 / / 16.06.2009
Разбираю алгоритм линзы и не совсем понятно, что описывают строки на ассемблере, просьба, кто его знает помочь с комментариями...
Вот сам алгоритм :
Код:
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.

Заранее спасибо...
14
16 июня 2009 года
Phodopus
3.3K / / 19.06.2008
Цитата:

Procedure Move(Var A,B; Count: Word);


копирует четное количество байт из буфера A в буфер B. Не ахти как правильно написана.

48K
16 июня 2009 года
JusttRy
5 / / 16.06.2009
Спасибо...впринципе качество написание программы особо не растраивает, т.к главное, что алгоритм рабочий...
А не подскажите значение операций в цикле repeat?
14
16 июня 2009 года
Phodopus
3.3K / / 19.06.2008
Чет там с видеопамятью походу.. лень разбираться :)
349
16 июня 2009 года
Phantom-84
656 / / 27.10.2005
В Паскале есть встроенная функция Move, предназначенная для тех же целей.

Если программа рабочая, откомпилуй, запусти и посмотри. В подобных ситуациях ассемблерные вставки обычно делают для повышения быстродействия при формировании картинки в видеопамяти, хотя так мешать высоко- и низкоуровневый код в исходнике нежелательно.
551
16 июня 2009 года
Pavia
357 / / 22.04.2004
В основной часте два цикла i,j по строкам и столбцам соответсвенно от -r0 до r0.

Происходит табличная замена координат по Disp[i,j]. Складываются с x,y.Откуда идет выборка из буффера и копирование на экран.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог