(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"