ZXNet эхоконференция «code.zx»


тема: Процедура цветной печати 8х4



от: Dmitry Grigoryev
кому: All
дата: 26 Mar 1999
Привет, All!

Вот, может, кому пригодится... Откопал в исходниках. Интересен (на мой
взгляд ;) алгоритм отслеживания адреса атрибутов, не знаю, применял ли кто
похожий... Можно еще и оптимизировать :)


══════════╡ImportBegin DISNAME0.TXT╞════════════════════════════════

prpage LD (adrtxt+1),HL
CALL clear ; вызов очистки экрана
LD D,#58
EXX
LD DE,#4000
adrtxt LD HL,0
prpage1 PUSH DE
color LD C,0 ; здесь текущий цветовой атрибут
INC HL
CALL prline ; вызов печати строки
POP DE
LD A,E
ADD A,#20
LD E,A
JR NC,prpage1
EXX
INC D
EXX
LD A,D
ADD A,#08
LD D,A
CP #58 ; если экран будет выводиться не до конца, здесь
JR NZ,prpage1 ; придеться применить более гнилой ограничитель
RET

prline XOR A
EX AF,AF' ; ставим флаг фазы (нужно для процедур окраски)
LD A,(HL) ; берем код символа
INC HL
CP #21 ; если код меньше 21, то переход на обработку
JP C,esc ; управляющих кодов
PUSH HL
PUSH DE
LD L,A ; первая фаза фонта по адресу #9000 в формате экрана
LD H,#90 ; а ты говоришь "вычисление адреса фонта" ;))
; LD B,#F0 ; специально оставлю операции маскирования
EX DE,HL
BEGIN 7 ; это масмовский операнд, поймешь, думаю
LD A,(DE)
; AND B
LD (HL),A
INC H
INC D
END
LD A,(DE)
; AND B
LD (HL),A

EXX ; ставим цвет...
LD A,D
EXX
LD H,A
LD (HL),C ; вот и все! а ты "rra,rra,rra,rra,rra..." ;)

POP DE
POP HL

prline2 EX AF,AF' ; флаг фазы (а здесь А не может равняться 0)
LD A,(HL) ; берем код символа
INC HL
CP #21 ; если код меньше 21, то переход на обработку
JP C,esc ; управляющих кодов
PUSH HL
PUSH DE
LD L,A
LD H,#98 ; адрес второй фазы фонта по адресу #9800
; LD B,#0F
BEGIN 7
LD A,(DE)
; AND B
OR (HL)
LD (HL),A
INC H
INC D
END
LD A,(DE)
; AND B
OR (HL)
LD (HL),A

EXX
LD A,D
EXX
LD H,A
LD (HL),C
POP DE
POP HL
INC E
JP prline

; как видишь, убрав маскирование, мы сэкономили 39 тактов на символ!
; чем с запасом компенсировали затраты на окраску.

esc CP #20
JP Z,space
CP #0D
RET Z
CP #10
JR Z,paper
CP #11
JR Z,ink
CP #09
JP Z,tab
LD A,#02
OUT (#FE),A
JR $ ; ;~(

paper LD A,(color+1)
AND #B8
OR (HL)
INC HL
LD (color+1),A
EX AF,AF'
OR A
JP Z,prline
JP prline2

ink LD A,(HL)
INC HL
ADD A,A
ADD A,A
ADD A,A
LD B,A
LD A,(color+1)
AND #C7
OR B
LD (color+1),A
EX AF,AF'
OR A
JP Z,prline
JP prline2

space EX AF,AF' ; вот это сработало? Только что под пивом
OR A ; набил ;)
LD A,1
JP Z, prline2
INC E
JP prline

tab LD A,E
AND #FC
ADD A,#04
LD E,A
JP prline

══════════╡ImportEnd DISNAME0.TXT╞════════════════════════════════

С уважением, Дмитрий (OLDMAN). 500:095/100.1@ZXNet
oldman@i-connect.ru




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

Похожие статьи:
События - анонс и правила предстоящего Фестиваля компьютерного творчества Hardwave Demoshow2002.
Байка - История реальная, поскольку произошла при моем непосредственном участии.
Вступление - Смелу пришли очередные номера московского журнала ZX-РЕВЮ за 1997г.

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