unit sprites;
interface
{...}
implementation

var
   IsBuffer : boolean;  {признак существования буфера}
   IsBackBuffer : boolean;       {признак буфера фона}
   BackBuffer : ^ScreenType;       {адрес буфера фона}

procedure PutSprite(Sprite:SpriteType); 
                              {вывод спрайта на экран}
var
   sou,dest : pointer;
begin
   sou  := @(Sprite.Img^[Sprite.phase,0,0]);
   dest := @(Scr^[Sprite.Y,Sprite.X]);
   asm
        push  ds
        les   di,dest
        lds   si,sou
        mov   dx,Ysize  { dx - переменная цикла по Y }
        mov   ah,TransparentColor
   @l1: mov   cx,Xsize  { cx - переменная цикла по X }
   @l2: lodsb             {                          }
        cmp   al,ah       {    проверка,             }
        jz    @l3         {      если                }
        stosb             {    во входном            }
        loop  @l2         {     массиве              }
        jmp near ptr @l4  { число = TransparentColor, }
   @l3: inc   di          {  то на экран             }
        loop  @l2         {  не отображается         }
   @l4: add   di, 320-Xsize {следующая строка экрана }
        dec   dx
        jnz   @l1
        pop   ds
    end;
end;
{...}

procedure ScreenBufferToScreen;
begin                    {отображение буфера на экран}
   if IsBuffer then
      asm
         push ds
         mov es,SegA000
         xor di,di    {обнуляем смещение приемника}
         lds si,scr
         mov cx,16000
         db $66
            rep movsw
         pop ds
      end;{}
end;
{...}

procedure BackBufferToScreen;
begin                    {отображение буфера на экран}
   

if IsBackBuffer then
      asm
         push ds
         les di,scr
         lds si,BackBuffer
         mov cx,16000
         db $66
            rep movsw
         pop ds
      end;
end;

begin
   scr := ptr(SegA000,0);
   IsBuffer := FALSE;
   IsBackBuffer := FALSE;
end.
409