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


тема: new_print64+font_1k



от: Mihail Zharov
кому: All
дата: 02 Feb 2001

Привет, All!

Вот.
Может пригодиться для экономии памяти.

Фонт на 1к меньше... и быстро/мало:
односимвольная печать - 530 тактов/61 байт
двухсимвольная печать - 311 тактов/56 байт


╒═══< Begin file: pr64_1k.asm >═══════════

;односимвольная печать (C) 2000 JAM
;***************************************
;ПЕЧАТЬ СИМВОЛА [a] В ЭКРАH (de)
;***************************************
; IN: a - номер символа для печати
; de - адрес в экране для печати
; cy - позиция в знакоместе

PR64_A

ld h,FONT/256 ;ст.адрес фонта
ld l,a ;мл.адрес фонта
ld b,4 ;счетчик для djnz
jr c,PR64R_A ;правая печать?

;PR64L_A
;печать в левую часть знакоместа
; - обработка левых 4-х битов из фонта
ld a,(hl) ;байт из фонта
and %11110000
ld c,a
ld a,(de) ;байт из экрана
and %00001111
or c
ld (de),a ;байт в экран
inc d
; - обработка правых 4-х битов из фонта
ld a,(hl) ;байт из фонта
and %00001111
rrca : rrca
rrca : rrca
ld c,a
ld a,(de) ;байт из экрана
and %00001111
or c
ld (de),a ;байт в экран
inc d
inc h ;след.байт фонта
djnz PR64L_A ;4 цикла
ret

PR64R_A
;печать в правую часть знакоместа
; - обработка левых 4-х битов из фонта
ld a,(hl) ;байт из фонта
and %11110000
rrca : rrca
rrca : rrca
ld c,a
ld a,(de) ;байт из экрана
and %11110000
or c
ld (de),a ;байт в экран
inc d
; - обработка правых 4-х битов из фонта
ld a,(hl) ;байт из фонта
and %00001111
ld c,a
ld a,(de) ;байт из экрана
and %11110000
or c
ld (de),a ;байт в экран
inc d
inc h
djnz PR64R_A
ret

;27+503=530() тактов - выполняется только
; один из потоков...
;7+27*2=61 байт - оба потока.


;==============================================================


;_двухсимвольная_ печать (C) 2001 JAM
;*****************************************
;ПЕЧАТЬ СИМВОЛОВ [e] И [c] В ЭКРАH (hl)
;*****************************************
;IN: hl - адрес в экране для печати
; e - первый/левый символ для печати
; c - второй/правый символ для печати

PR64_EC

ld d,FONT/256 ;de-font
ld b,d ;bc-font
;-0
ld a,(bc) ;in fnt
ld (hl),a ;out scr
ld a,(de) ;in fnt
rrca : rrca : rrca : rrca
rrd ;)))
inc h : ld (hl),a ;out scr
inc h : inc d : inc b ;init
;-1
ld a,(bc)
ld (hl),a
ld a,(de)
rrca : rrca : rrca : rrca
rrd
inc h : ld (hl),a
inc h : inc d : inc b
;-2
ld a,(bc)
ld (hl),a
ld a,(de)
rrca : rrca : rrca : rrca
rrd
inc h : ld (hl),a
inc h : inc d : inc b
;-3
ld a,(bc)
ld (hl),a
ld a,(de)
rrca : rrca : rrca : rrca
rrd
inc h : ld (hl),a
; inc h : inc d : inc b
;-4
ret

;11+78*3+66=311 тактов на _два_ символа
;3+14*3+11=56 байт


;==============================================================


;пример расчета адреса в экране
;для п/п PR64_A -> CY - L/R печать.
;***************************************
;РАСЧЕТ АДРЕСА ПО КООРДИHАТАМ ЗHАКОМЕСТ.
;***************************************
; IN: de - XY-координаты (0-63/0-23)
;OUT: de - адрес в экране 1-го байта
; !!! cy - позиция в знакоместе экрана

srl d ;/2->CY=0/1 - L/R
push af ;сохранили A и CY
ld a,e ;a=Y-координата
and %00000111 ;ном.строки в 1/3
rrca:rrca:rrca
add a,d
ld d,a
ld a,e
and %00011000 ;в какой 1/3 экрана
add a,#40 ;ст.б.адреса
ld e,d ;e=мл.б.адреса
ld d,a ;d=ст.б.адреса
pop af ;востановили A и CY
ret
;****************************************

╘═══< End file: pr64_1k.asm >═════════════

Коммент:
- в односимвольной печаталке все банально, я возможно "изобрел
велосипед" ;) А вот двухсимвольная печаталка думаю оригинальна.
Изврат еще тот... ;)))
- можно на основе двухсимвольной, переписать односимвольную.
(второй символ брать прямо с экрана как матрицу из фонта... ;)
- фонт в памяти конечно по ровному адресу(кратно 256 байтам)
- формат фонта: берем обычный(no fast) фонт 2к для 64-x,
складываем до 1к - убираем каждые 4 _бита_(%0000).
Потом раскидываем байты символа через 256 байт - делаем
фаст-фонт. Полученный фонт и используем для этих п/п печати.

Вот фонт, который я использовал:

╒═══< Begin file: fnt64/2f.fnt >══════════

section 1 of 1 of file fnt64/2f.fnt

begin 644 fnt64/2f.fnt
M``8&"0('`@`/!@8'`@('"00!`@4'!P`"`@(``````````@```@4$`@($````
M```!!P("!P0'`P<"`@```````@("!@,&!P<"!0 M!P<$!P(``@`$``$``P`$`@$````````````"`````````P(&```#!P8'!@<'
M!@4E!0$%!0('!@('!0(%!04%!0P%!`8*`P`````&``````(````````*6M8B
M(B)5``!550!552(`(B(`(@`B(E55`%4`50!5(E4``%4B``!5(B(`_P#,,_`
M```````````````````````$`0,B```````#96$```"?^?G)R<&D)"0-%55
M5VEG-W)5W4<` M`A('0E%7559$549&5% M1@8#1417925E-30T M4E555U=&5D87W55A-&5A$R5W855551-7525U!5K6(B(N50`.754/754N`"(B
M`"(`(B-550==#U4/72]5#P!5(P,`52B`/`S#/_925R52=555555<151&&M
M-7`G(20R(B!:!P<`(E4G!@``G_G_=W=W_P``8$HB(E69=G,G5557`" M`/;_(@`@`%=Q)%H`1")R<@)P!B15(B05<1%5(E4Q``)"!Q(@='551%5$1'55
M(A5E1%55561U914B555W)2(D1"$1````=55$561$4U4B$65$=5555E-$(2)5
M57 M)%5T)R%W=V55=75550I:UB+B+M7U+AU5'1_P+N(P/(R/(C54=%#PU%#PT/
M`_U<",C=54OX#+__PS`&1%(C%W)54Q=W=E965QW35P("4E(B9P!5=W!J8`
M`&```/:69B(B)V"?EI:D M4"`D`&!`<'!P(!!@("`@8"`D$`!`(#!08#!@<$`@4'`@4'!04"!`<5`@(#`@
M(%`@<'`0<``/`'!@,#`P0!90<%)0,%!0($010&`0,"`@4&!P,"!@`'!0<'!`
M^7!P8%!04%!04"!00"`@("!0<1!P<6!@8&"@4#!@8#`@,'!@4%!04%!0(%`%
M6M8B(B)552)5554````B```B(@`B(E4`50!550!5```B50``(E55(@`B___,
B,P!`("!@(%!Q$'!Q8&!@8*!0<'`D(2)@(*`````@``````
`
end
sum -r/size 3244/1439 section
sum -r/size 61938/1024 entire input file

╘═══< End file: fnt64/2f.fnt >════════════

Как мнение Алл'а - полезный код? ;-)

Можно ли для этого формата фонта еще
быстрее без _существенного_ увеличения
в обьеме?
К примеру в односимвольной печаталке можно
раскрыть циклы и некоторые константы
использовать в освободившемся регистре,
но... скорость мало возрастет по сравнению
с обьемом в байтах.
Хочется мало и в меру быстро ;)


Счастливо. Михаил.




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

Похожие статьи:
Обзорчик - Обзор игровых программ: Moontorc, Klademiner, Dragonia, Choe Lee fut Kung Fu warrior, King Valley, Return to Home 4, Doom mania.
Лаборатория - О подключении внешних устройств к ZX-Spectrum.
Допрос - Himik's ZxZ берет интвервью по телефону у ASC - Andrew Strikes Code.
Anigdot №44 - Продаю и собираю на заказ телефоны с АОНом!
Misc - НЛП: Работа со стеpеотипами.

В этот день...   29 марта