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.