Почта - Печать строки 32-х символьным шрифтом.

Odyssey Magazine #02
 Печать строки 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-симв.

Вообще говоря, к этому тексту я постараюсь
приложить все исходники с надеждой, что по
дороге они не потеряются.