Перейти к содержимому

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 устроен как в текстовом режиме: старший полубайт — фон, младший — цвет символов. Шрифт пропорциональный, так что курсорной сетки нет — координаты задаются в пикселях.

В режиме #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 пикселей. Отсюда и скорость.