Пример процедур цветной печати на графический экран с разрешением 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 или на спринтер форуме.