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). Шрифт пропорциональный, координаты —
в пикселях.
Выбор буфера: BUF0/BUF1 и FRONT/BACK
Заголовок раздела «Выбор буфера: BUF0/BUF1 и FRONT/BACK»У экрана два буфера, и функция 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, страница видео подключается один
раз на всю строку — это заметно быстрее, чем по символу за раз.