unit Text256;
interface

procedure SetTextParm(color,bkcolor,typetext:byte);
                 { установка параметров вывода текста }
{       color    - цвет текста                        }
{       bkcolor  - цвет фона                          }
{       typetext = 0 - прозрачный фон                 }
{       typetext = 1 - непрозрачный фон               }
procedure GetTextParm(var color,bkcolor,typetext:byte);
                          { запрос текущих параметров }

procedure PutText(x,y:longint; txt:string);
 {вывод текста по координатам x,y (верхний левый угол)}
procedure PutChar(x,y:longint; chr:char);
{вывод символа по координатам x,y (верхний левый угол)}

implementation
uses dos,graph;
const
   Colors : array[0..15]of byte = (  0,  2, 20, 22,
      160,162,172,182,109,111,125,127,237,239,253,255);
                   {цвета,соответствующие номерам 0-15}
var
   FontTable : array[0..255,0..7]of byte;
                                       {таблица шрифта}
   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];
end;
procedure GetTextParm(var color,bkcolor,typetext:byte);
begin
   color    := Color1;
   bkcolor  := bkColor1;
   typetext := TextType;
end;

procedure PutText(x,y:longint; txt:string);
begin
   if(byte(txt[0])>0)then
      for i := 1 to byte(txt[0]) do
         putchar(x+8*(i-1),y,txt[i]);
end;

procedure putchar(x,y:longint; chr:char);
var l,j : longint;
begin
   case TextType of
      0: for l := 0 to 7 do          { прозрачный фон }
            for j := 0 to 7 do
               if (FontTable[byte(chr),l] and
                     (1 shl (7-j)) <> 0) then
                  putpixel(x+j,y+l,Color2);
      1: for l := 0 to 7 do        { непрозрачный фон }
            for j := 0 to 7 do
               if (FontTable[byte(chr),l] and
                     (1 shl (7-j)) <> 0) then
                  putpixel(x+j,y+l,Color2)
               else putpixel(x+j,y+l,bkColor2);
   end;
end;

var r : registers;

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