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.