Deja Vu #09
13 ноября 1999

Coding - быстрай печать 64 символов в строке.

(C) Морозов Илья/Death Moroz
__________________________________________


             Всем привет  !!!

   Сегодня  "поговорим" о  быстром  выводе
строки  с 64 символами. Весь секрет  ниже-
приведенного метода в паре  таблиц, допол-
нительном фонте  и  нестандартной  печати:
символы выводятся  сразу по 2 (в одно зна-
коместо), что вместе со стековым скроллин-
гом дает потрясяющие результаты.

;(C) All work in Xas by D.M0R0Zz


font2         EQU    #6000 ;адрес 2-ого фонта(создается ниже)
t2            EQU    font2+2048 ;адреса таблиц
t1            EQU    t2+512 ;с адресами символов

              ORG    t1+512 ;грузим базовый фонт(должен быть
font1         EQU    $ ;сдвинут вверх(выводятся только 6 байт)
              LCODE  "F4.1"
              ORG    font1+2048 ;начало программы
              ENT
              CALL   creat ;создаем все, что надо...
              LD     de,text ;в DE адрес текста
              CALL   print ;печать...
oprs          CALL   8020; при нажатии "ЗАБОЙ" - выход...
              JR     c,oprs
              RET


print         LD     hl,#4000 ;откуда начинаем печать
              LD     (t_poz+1),hl
              LD     a,0 ;номер этой линии
              LD     (n_lin+1),a
              DI
              LD     (sp_+1),sp ;сохранились
              LD     hl,p1 ;начальные установки
              LD     bc,#2120


p1            LD     a,(DE) ;взяли код символа
              INC    de ;увеличили
              CP     b ;если этот код > 32 (пробел),
              JP     nc,p1_1 ;то переходим на печать
              CP     c ;если это НЕ пробел,
              JP     nz,p1_3 ;то идем на p1_3
              EXX
              LD     de,32*8+font1 ;в DE' адрес пробела
              EXX
              JP     p2 ;переход на 2-ую половинку знакоместа

p1_3          CP     #0d ;признак конца линии ?
              JP     z,n_lin ;если да, то ползем на след.
              CP     3 ;конец текста ?
              JP     z,sp_ ;если да, то на выход

p1_1          EXX    ;берем адрес символа из таблицы
              LD     l,A ;и запоминаем его в DE'
              LD     h,t1'&h ;взят старший байт
              LD     e,(HL)
              INC    h
              LD     d,(HL)
              EXX


p2            LD     a,(DE) ;взяли следующго символа
              INC    de
              CP     b ;если > 32, то печать
              JP     nc,p2_2
              CP     c
              JP     nz,p2_3
              EXX    ;в SP адрес пробела во 2-ом фонте
              LD     sp,32*8+font2
              JP     t_poz
p2_3          CP     #0d ;если конец строки, то переход на
              JP     z,n_lin_ ;печать 1-ой половинки
              CP     3
              JP     z,sp_


p2_2          EXX    ;берем адрес в фонте
              LD     l,A
              LD     h,t2'&h
              LD     a,(HL)
              INC    h
              LD     h,(HL)
              LD     l,A
              LD     sp,HL ;пихаем в SP

t_poz         LD     bc,ш4000 ;адрес в экране
              !ASSM  2 ;повторяем кусок до !cont 2 раза
;(заменить на 3, если нужно выводить символы полностью)
              POP    hl ;взяли 2 байта из 2-ого фонта
              LD     a,(DE) ;и один из первого...
              OR     l ;слили
              LD     (bc),A ;напечатали
              INC    е ;перешли ко 2-ому байту 1-ого фонта
              INC    b ;и на линию вниз
              LD     a,(DE)
              OR     h
              LD     (bc),A
              INC    b
              INC    e
              !CONT
              POP    hl ;допечатали остатки
              LD     a,(DE)
              OR     l
              LD     (bc),A
              INC    b
              INC    e
              LD     a,(DE)
              OR     h
              LD     (bc),A


              LD     hl,t_poz+1 ;увеличили позицию
              INC    (hl)
              EXX
              JP     (hl) ;повторяем
n_lin_        EXX    ;вывод только 1-ой половинки знакоместа
              LD     l,E
              LD     h,D
              LD     sp,HL
              LD     hl,(t_poz+1)
              !ASSM  2
              POP    de
              LD     (hl),E
              INC    h
              LD     (hl),D
              INC    h
              !CONT
              POP    de
              LD     (hl),E
              INC    h
              LD     (hl),D
              EXX


n_lin         LD     a,0 ;переход на след.линию
              CP     23 ;или выход, если конец экрана
              JP     z,sp_
n_lin1        EXX
              LD     l,A
              INC    a
              LD     (n_lin+1),a
              LD     b,A
              AND    #18
              ADD    a,#40
              LD     h,A
              LD     a,B
              AND    7
              RRCA
              RRCA
              RRCA
              LD     l,A
              LD     (t_poz+1),hl
              LD     bc,t1
              EXX
              JP     (hl)
sp_           LD     sp,0 ;выход
              EI
              RET


creat
              LD     bc,2048 ;создание 2-ого, заранее
              LD     de,font1 ;сдвинутого фонта
              LD     hl,font2
cr2           LD     a,(DE)
              RRCA
              RRCA
              RRCA
              RRCA
              LD     (hl),A
              INC    de
              INC    hl
              DEC    bc
              LD     a,B
              OR     c
              JR     nz,cr2


              LD     b,0 ;создание таблиц
              LD     de,8
              LD     hl,font1
              LD     ix,t1
              LD     iy,t2
              EXX
              LD     hl,font2
              LD     de,8
              EXX
cr1           LD     (ix),l ;для быстрого доступа, 1-ая часть
              INC    hx ;хранит младюий, а 2-ая часть таблицы
              LD     (ix),h ;старший байт адреса
              DEC    hx
              INC    ix
              ADD    hl,DE
              EXX
              LD     (iy),l
              INC    hy
              LD     (iy),h
              DEC    hy
              INC    iy
              ADD    hl,DE
              EXX
              DJNZ   cr1
              RET
              ORG    $
text          EQU    $ ;грузим текст
              LCODE  "TEXT"





Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Семь и 1/2 - Анекдоты.
Юмор - Цитата недели. Анекдот.
Разное - Zx-Net. Поиск.

В этот день...   17 октября