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

AFNT640 — вывод текста в 640×256

AFNT640.DLL — библиотека быстрого вывода текста в режиме 640×256, 16 цветов. Внутри — классический упакованный шрифт Антона Енина и рендер через аппаратный акселератор Sprinter; исторические точки входа ANTONFNT сохранены, так что старый код продолжает работать. Для режима 320×256 существует парная библиотека AFNT320 с тем же интерфейсом.

Общие правила загрузки 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 "afnt640.inc"
ld hl,dll_name ; "AFNT640.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,16 ; x в пикселях (0..639)
ld iy,12 ; y в пикселях
ld a,#1F ; фон 1 (синий), текст 15 (белый)
ld b,3 ; aprint
call LIBMAN.l_call
text: db "Hello, Sprinter!",0

Атрибут цвета в A устроен как в текстовом режиме: старший полубайт — фон, младший — цвет символов (оба 0..15). Шрифт пропорциональный, координаты — в пикселях.

У экрана два буфера, и функция 5 задаёт цель вывода:

  • BUF0 / BUF1 — конкретный физический буфер;
  • FRONT / BACK — «видимый сейчас» и «скрытый сейчас»: библиотека один раз на вызов читает регистр RGMOD и сама решает, какой буфер физический.

FRONT/BACK — естественный выбор при двойной буферизации: печать всегда уходит в скрытый буфер, и текст не мигает. Без явного выбора цели поведение прежнее, совместимое: aprint печатает в BUF0. Чтобы палитра стояла в обоих буферах, вызовите set_target(BUF0) + fnstyle, затем set_target(BUF1) + fnstyle.

Ошибочный селектор возвращает A=#10 (AFNT640_ERR_ARGUMENT) и не меняет предыдущую цель.

Рисуя, библиотека временно подключает страницу видеопамяти в окно CPU — по умолчанию WIN1. Если DLL сама загружена в WIN1, печать будет возвращать ошибку, пока функцией 4 не выбрано другое окно. Запрос, накрывающий окно с DLL или текущим стеком, отклоняется, прежняя настройка сохраняется. После каждого вызова библиотека восстанавливает подключённую страницу и состояние прерываний.

font.bin — оригинальный формат Антона Енина: таблица ширин символов, таблица смещений и поколоночные растры глифов переменной ширины. Текст рисуется акселератором по формуле фон XOR (маска AND (цвет XOR фон)) — на чёрном фоне проход по фону вообще пропускается. Очистка экрана — 320 вертикальных аппаратных заливок, по одной на колонку байтов. Если строка и видеопамять находятся в разных окнах CPU, страница видео подключается один раз на всю строку — это заметно быстрее, чем по символу за раз.