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.