AFNT320 — вывод текста в 320×256
AFNT320.DLL — маленькая библиотека для быстрого вывода текста в режиме
#81 (320×256, 256 цветов). Шрифт вшит прямо в DLL, а рисует его аппаратный
акселератор Sprinter, поэтому строка появляется на экране быстрее, чем при
попиксельном выводе процессором. Это версия библиотеки
AFNT640 для режима 320×256: интерфейс у них одинаковый.
Общие правила загрузки DLL — в обзоре библиотек.
Функции
Заголовок раздела «Функции»| № | Регистры | Что делает |
|---|---|---|
| 0 | — | инициализация (вызывается libman при загрузке) |
| 1 | — | освобождение (вызывается libman при выгрузке) |
| 2 | A |
fnstyle: установить EGA-палитру и очистить выбранный экран |
| 3 | DE, IX, IY, A |
aprint: напечатать ASCIIZ-строку из DE в точке (IX,IY); A = фон·16 + цвет текста |
| 4 | E |
выбрать окно CPU (0..3) для подключения видеопамяти |
| 5 | E |
выбрать буфер-цель: 0=BUF0, 1=BUF1, 2=FRONT, 3=BACK |
include "afnt320.inc"
ld hl,dll_name ; "AFNT320.DLL",0 ld a,3 ; DLL — в окно WIN3 call LIBMAN.l_load jp c,load_error ld (handle),hl
; палитра + очистка экрана ld hl,(handle) ld a,0 ; цвет очистки ld b,2 ; fnstyle call LIBMAN.l_call
; напечатать строку ld hl,(handle) ld de,text ; ASCIIZ-строка ld ix,8 ; x в пикселях ld iy,12 ; y в пикселях ld a,#1F ; фон 1 (синий), текст 15 (белый) ld b,3 ; aprint call LIBMAN.l_call
text: db "Hello, Sprinter!",0Разбор: функция 2 загружает стандартную EGA-палитру и очищает экран — её
достаточно вызвать один раз после загрузки. Функция 3 печатает строку;
атрибут цвета в A устроен как в текстовом режиме: старший полубайт — фон,
младший — цвет символов. Шрифт пропорциональный, так что курсорной сетки
нет — координаты задаются в пикселях.
Выбор буфера: BUF0/BUF1 и FRONT/BACK
Заголовок раздела «Выбор буфера: BUF0/BUF1 и FRONT/BACK»В режиме #81 у Sprinter два экранных буфера. Функция 5 задаёт, куда печатать:
BUF0/BUF1— конкретный физический буфер;FRONT/BACK— «видимый сейчас» и «скрытый сейчас»: библиотека один раз на вызов читает регистрRGMODи сама выбирает физический буфер.
Режим FRONT/BACK удобен при двойной буферизации: печатаете в BACK, потом
переключаете буферы — текст никогда не мигает на видимом экране. Без явного
выбора цели библиотека ведёт себя как старые версии: печатает в BUF0.
Чтобы палитра была установлена в обоих буферах, вызовите пару
set_target(BUF0) + fnstyle, затем set_target(BUF1) + fnstyle.
Ошибочный селектор возвращает A=#10 (AFNT320_ERR_ARGUMENT) и не меняет
предыдущую цель.
Окно видеопамяти
Заголовок раздела «Окно видеопамяти»Для рисования библиотека временно подключает страницу видеопамяти в одно из окон CPU — по умолчанию WIN1. Если ваша программа сама занимает WIN1 (или DLL загружена туда), выберите другое окно функцией 4. Запрос, который накрыл бы окно с самой DLL или текущим стеком, отклоняется с ошибкой — прежняя настройка при этом сохраняется. После каждого вызова библиотека восстанавливает подключённую страницу и состояние прерываний.
Как это работает внутри
Заголовок раздела «Как это работает внутри»Шрифт хранится в DLL в «ускорительном» формате: при сборке инструмент переупаковывает обычный растровый шрифт в поколоночные маски, которые акселератор Sprinter переносит в видеопамять целыми вертикальными колонками. Пустые колонки заливаются одной операцией, занятые — комбинируются из масок цвета текста и фона; на чёрном фоне лишний проход вообще пропускается. Очистка экрана — тоже акселератором: 320 вертикальных заливок вместо цикла по 80 000 пикселей. Отсюда и скорость.