Печать строки 32-х символьным шрифтом.
Нижний байт знакогенератора должен быть
пустой.
Процедура печати символа непосредственно
интегрирована в печать строки для получе-
ния максимальной скорости. Использование
печати символа какой-либо точкой входа в
теле процедуры печати строки достаточно
затруднительно.
hl-адрес начала строки
b - длина строки =32 всегда. Прекращает
печать по достижении #0D или предельной
длины строки.
c -позиция Y.
Позиция X жестко определена =0,хотя можно
без труда при чтении адреса из таблицы
прибавить необходимый X. После такой моди-
фикации становится возможной печать оди-
ночного символа с любыми координатами, по-
лагая b=1.
Предложенное не было сделано мною, т.к.
процедура разрабатывалась исключительно
для печати с 0-й позиции по X.
PRLINE LD HL,LINE
PUSH HL
LD C,10
LD B,32
LD A,C ;инициализация
LD H,0 ;адреса.Адрес
ADD A,A ;в экране чита-
LD L,A ;ется один раз
LD DE,TABST ;для всех симво-
ADD HL,DE ;лов строки
LD E,(HL) ;<здесь возможна
INC HL ;<доработка
LD D,(HL) ;адрес (0,Y)-в BC
POP HL
SSM1 LD A,(HL) ;чтение строки
CP #0D ;выход,если конец
RET Z
PUSH DE ;в de-экранный
EXX ;адрес
POP BC
PR LD L,A ;расчет координат
LD H,0 ;символа в наборе
LD DE,FONTST-256
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,DE ;адрес символа
DEFS 6,#7E,#23,#02,#04
; LD A,(HL)
; INC HL Блок повторен RAS-1
; LD (BC),A раз
; INC B /
LD A,(HL)
LD (BC),A
EXX
INC HL ;приб. указатель
INC E ;коорд x=x+1
DJNZ SSM1
RET ;вых.,если строка
;длиннее 32 симв.
FONTST EQU 15360+256+1
;чтобы не загружать знакогенератор с
;пустым последним байтом, он формируется
;смещением указателя на 1
LINE DEFM ' PROBE OF 32 SYMBOLS PRIN
TING. ' ;пробная строка
;таблица для скроллингов и печати
TABST DEFB #00,#40,#20,#40,#40,#40,#60,
#40,#80,#40,#A0,#40,#C0,#40,
#E0,#40
DEFB #00,#48,#20,#48,#40,#48,#60,
#48,#80,#48,#A0,#48,#C0,#48,
#E0,#48
DEFB #00,#50,#20,#50,#40,#50,#60,
#50,#80,#50,#A0,#50,#C0,#50,
#E0,#50
TABEN EQU $-1
Печать 64 символа в строке нисколько не
более сложна, чем печать 32 символа. Быст-
рота печати сильно зависит от того, как
хранится знакогенератор. Хуже всего дело
обстоит при использовании шрифта типа
"TASM", где в одном знакоместе хранится 2
символа. например:
12 34 56 78 90 ... AB CD EF ....
В наиболее неудачном случае приходится ро-
тировать байт 4 раза и накладывать маску
(зависит от способа ротации).
Более быстрым является дублирование:
11 22 33 44 55 66 77 88 99 00 ...
В этом случае знакогенератор менее компак-
тен, хотя и не превосходит размерами 32-х
символьный. Печать сводится к определению
типа накладываемой маски, т. е. фактически
это 32-х симв. печать с затиранием одного
или другого полубайта. Какой именно зати-
рать, определяется из четности X-координа-
ты нециклическим сдвигом в флаг C. В ре-
гистре остается координата для 32-х сим-
вольной печати. Это намного более удобно
по алгоритму, чем для знакогенеранора типа
"TASM". Вариант с таким модернизированным
фонтом один из самых оптимальных в приме-
нении, но не по скорости.
Наиболее скоростным является способ печати
с применением 2-х фонтов. От вышеприведен-
ного этот метод отличает только отсутствие
необходимости накладывать на байты символа
маску, т.к. там все и без того уже чисто.
Т.е. процедура печати 64 символа в строке
может быть сведена к обычной печати
32-сомвола, но с переставлением указателя
на фонт или применения двух идентичных
процедур с разными указателями и выбор од-
ной из процедур по мере надобности.
Эту процедуру я и прилагаю в формате
TASM 3.0. Приводить эту программу в тексте
нет необходимости, так как она ничем осо-
бенно не отличается от печати 32-симв.
Вообще говоря, к этому тексту я постараюсь
приложить все исходники с надеждой, что по
дороге они не потеряются.