unit Text256a;
interface

{...}

implementation
uses dos,graph,sprites;

{...}

var
   FontTable : array[0..255,0..7,0..7]of byte;
                                      {таблица шрифта}
   colorline,colorlineb:array[0..7]of byte;
             {массивы по 8 точек цветов символа и фона}
   LenLine  : longint;            {длина строки буфера}
   Color1,bkColor1 : byte;
            {номера ?стандартных? цветов текста и фона}
   Color2,bkColor2 : byte;
      {номера цветов текста и фона в выбранной палитре}
   TextType : byte; {способ вывода (прозрачно или нет)}
   i,j,l    : longint;     {вспомогательные переменные}

procedure SetTextParm(color,bkcolor,typetext:byte);
begin
   Color1   := color;
   bkColor1 := bkcolor;
   TextType := typetext;
   Color2   := Colors[Color1];
   bkColor2 := Colors[bkColor1];
   for i := 0 to 7 do colorline[i] := Color2;
   for i := 0 to 7 do colorlineb[i] := bkColor2;
end;

{...}

procedure putchar(x,y:longint; chr:char);
begin
   l := byte(chr);
   LenLine := GetBytesPerScanLine;
   case TextType of
      0:                { прозрачный фон }
        asm
           push edi
           push esi
           push ecx
           lea edi,colorline
           movq mm0,[edi]       {mm0-цвет}
           mov esi,scr
           add esi,x
           mov eax,y
           mul LenLine
           add esi,eax
           mov ecx,l
           lea edi,FontTable
           shl ecx,6
           add edi,ecx          {edi — маска символа}
           mov ecx,8
       @l3:                      { непрозрачный фон }
           movq mm3,[edi]
           movq mm1,[esi]        {mm1-фон}
           movq mm4,mm3
           add edi,8
           pand mm3,mm0


           pandn mm4,mm1
           por mm3,mm4
           movq [esi],mm3
           add esi,LenLine
           dec ecx
           jnz @l3
           pop ecx
           pop esi
           pop edi
           emms
        end;
      1:
        asm
           push edi
           push esi
           push ecx
           lea edi,colorline
           movq mm0,[edi]       {mm0-цвет}
           lea edi,colorlineb
           movq mm1,[edi]       {mm1-фон}
           mov esi,scr
           add esi,x
           mov eax,y
           mul LenLine
           add esi,eax
           mov ecx,l
           lea edi,FontTable
           shl ecx,6
           add edi,ecx
           mov ecx,8
       @l3:
           movq mm3,[edi]
           movq mm4,mm3
           add edi,8
           pand mm3,mm0
           pandn mm4,mm1
           por mm3,mm4
           movq [esi],mm3
           add esi,LenLine
           dec ecx
           jnz @l3
           pop ecx
           pop esi
           pop edi
           emms
        end;
   end;
end;

var r : registers;

begin  {инициализация — получаем адрес таблицы шрифтов}
   r.ax := $1130;
   r.bh := 3;
   intr($10,r);
   for l := 0 to 255 do   {перебор по символам}
      for i := 0 to 7 do
         for j := 0 to 7 do
            if (mem[r.es:r.bp + i + l*8] and
                               (1 shl (7-j)) <> 0) then
               FontTable[l,i,j] := $ff
            else FontTable[l,i,j] := 0;
   SetTextParm(15,0,1);
end.