    Пример процедур цветной печати на графический экран с разрешением 640x256x16 цветов.
	        Такая процедура использовалась во Flex Navigator v1.xx.
			Написан под Estex v1.xx и выше.

Описание файлов:
	main.z80  - инициализирующий файл
	print.z80 - процедура печати


Описание формата шрифта:
  в шрифте используется 256 символов, высотой 8 точек и различной длиной.

  +000 [256] - длина символа по x (для каждого символа) (в байтах)
  +256 [256] - младший байт смешения на образ символа (для каждого символа)
  +512 [256] - старший байт смешения на образ символа (для каждого символа)
  +768 ...   - образы символов (от 0 до 255 символа)
	       образы храняться в виде вертикальных линий точек по 8 байт, по 4 бита на точку.
	       кол-во линий (в байтах) определяется из размера по х
               цвет background = 0x00
	       цвет foreground = 0x0F

	       например образ символа А:
		длина символа по x = 4 (байта)
	        00 00 00 00
	        00 FF FF 00
	        0F 00 00 F0
	        0F 00 00 F0
	        0F FF FF F0
	        0F 00 00 F0
	        0F 00 00 F0
	        00 00 00 00

		в образе символа он будет лежать так:

		00 00 0F 0F 0F 0F 0F 00  00 FF 00 00 FF 00 00 00  00 FF 00 00 FF 00 00 00  00 00 F0 F0 F0 F0 F0 00
		


 Описание алгоритма:
  Самая главная проблема цветной печати это быстрое преоброзование точки фона/символа в нужный цвет.
Здесь показано, как я вышел из этого "нелегкого" положения ;) Если кто-нибудь придумает более быстрый
вариант, то я буду рад его увидеть :)

  Печать на экран осуществляется вертикальными линиями с испольэованием акселератора сразу по 8 байт.
Для замешивания цветов нам требуется 2 буфера (цвет background и foreground) размером в 8 байт, т.к.
замешивать будем сразу по 1 вертикальной линии. Эти 2 буфера инициализируются заново при каждой смене
цвета функцией PreparePrintColors (это делается автоматически, вам не нужно об этом заботиться!).
Печатаем функцией TextOut.

	операция | - поразрядное логическое ИЛИ (на Z80 CPU команда or)
	операция ^ - поразрядное исключение ИЛИ (на Z80 CPU команда xor)

Функция PreparePrintColors:
	1. инициализируем ForegroundBuffer
		ForegroundBuffer = цвет Foreground ^ 0xFF
	2. инициализируем BackgroundBuffer
		BackgroundBuffer = цвет Background ^ ForegroundBuffer

Функция TextOut (входные параметры см. в исходнике):
	непосредственно печать образа:
	Screen = (линия_образа | BackgroundBuffer) ^ ForegroundBuffer

Рассмотрим это на уровне точки:
	цвет печати допустим Background = 0, Foreground = 1

	получаем ForegroundBuffer = 1 ^ 0xFF получаем 0xFE
	получаем BackgroundBuffer = 0 ^ 0xFE получаем 0xFE

	для цвета background из образа (=0x00)
	Screen = (0x00 | 0xFE) ^ 0xFE получаем 0x00

	для цвета foreground из образа (=0xFF)
	Screen = (0xFF | 0xFE) ^ 0xFE получаем 0x01

можно всё это проделать для любого из цветов...

Этот алгоритм работает медленнее при печати очень маленьких строк, из-за большой инициализации, а также из-за
частой смены цвета (хотя я во Flex Navigato'e его часто не менял, только по надобности). ;)

27 june 2002
Anton Enin (C) Copyright 2002 R-lab
если есть вопросы e-mail: r-lab@mail.ru или на спринтер форуме.
