{$G+}
unit Draw10H;
{Используестся для быстрого рисования НОРМАЛЬНЫХ объектов (фреймов)}
INTERFACE
VAR
 CurPage : byte Absolute $40:$62;
 VmemLen : word Absolute $40:$4c;
CONST
 PlaneMaskingPort = $03CE;
 SelectPlanePort  = $03C4;
  Procedure DrawSprite12H(xpos,ypos,xsize,ysize:word;Page:byte;BitPlane : pointer);
   {Рисуется спрайт, лежащий по адр. BitPlane размером xsize x ysize, только
    кратны 8. Никаких проверок нет. Спрайт - 4 битовые плоскости B G R A}
IMPLEMENTATION
{-----------------------------------------}
Procedure DrawSprite12H;assembler;
var
 Beg  : pointer;
 cool : word;
asm
push ds
 mov ax, word ptr BitPlane+2
 mov cool, ax

 xor ax, ax
 mov al, page
 push 40h
 pop es
 mov bx, es:[4ch]
 mul bx
 shr ax, 4
 mov bx, 0A000h
 add bx, ax

 mov ax, ypos  {Calculate ypos}
 push ax
 shl ax, 2
 add bx, ax    {y*(640/8)/16 = y*5 - segment}
 pop cx
 add bx, cx

 shr xpos, 3
 shr xsize, 3
 mov ax, xpos {Calcualte xpos}

 mov word ptr Beg, ax
 mov word ptr Beg+2, bx

 mov ax, 0005h  {Set GDC Register for writing}
 mov dx, 03CEh
 out dx, ax
 INC DX
 xor ax, ax
 out dx, ax

 mov bx, 1
 mov si, word ptr BitPlane
@1:
 mov dx, 03C4h  {Индекс синхронизатора}
 mov al, 2
 out dx, al  {Режим выбора слоя}
 inc dx
 mov al, bl  {Выбор текущего слоя}
 out dx, al
 shl bl, 1   {Выбор нового слоя}

 les di, Beg
 mov cx, ysize
@2:
 push cx
 mov cx, xsize
 push ds
 mov ds, cool
 repe movsb
 pop ds
 add di, 80
 sub di, xsize
 pop cx
loop @2

 cmp bl, 0010000b
jne @1

 mov dx, 3C4H
 mov ax, 02
 out dx, al
 inc dx
 mov al, 0Fh {Select default plane}
 out dx, al

 pop ds
end;{DrawSprite12H}
{-----------------------------------------}
end.