RC 2.x

ZXNet эхоконференция «real.speccy»

От Mihail Zharov Кому All 16.01.2002


Привет, Pawel!

Пятница, 04 Января 2002, в 00:10:23,
Pawel Kislyak -> Mihail Zharov.

MZ>> Покажи плиз односимвольную и строчную печаталку.
MZ>> Ставлю 3евро на более жестокую оптимизацию... ;)))
PK> Вперед!

Ох. ;)
Сорри, за тормозной ответ. Время.
Извини, я и сейчас на скорую руку.

MZ>> Как по байтам, так и по тактам.
MZ>> (лень лазать, но панели к примеру тормозно выводятся ;)
PK> Поскольку RC начиная с версии 2.0 был полностью переведен
PK> на 42-х символьный фонт, была добавлена быстрая печаталка
PK> выводящая сразу по 4 символа за один раз, также осталась
PK> процедура из RC 1.x позволяющая печатать с любого пиксела
PK> по горизонтали. Эти две процедуры объединены и позволяют
PK> печатать с любого пиксела по горизонтали (желательно
PK> четного).

Да, так выгоднее.

PK> Привожу исходник (его оптимизацией кстати уже занимался
PK> Alone coder,
PK> быстрая печаталка изначально не мной писалась, моя только
PK> PRSYMX ;).

Я правильно понял, что в строчной печаталке только по чистому
месту?

PK> Итак процедура WRITEX - печать строки, PRSYMX - печать
PK> одного символа.

Для односимвольной печаталки:
У тебя сделано одним настраиваевым потоком - ты выиграл в
байтах, но проиграл в скорости.
Подобный "ход" хорош, если у тебя еще отдельно и стринговая
печаталка есть... иначе тормозно.

Для строчной печаталки:
В свое время я перебрал много разных подходов, ака алгоритмов,
печати. Самый скоростной оказался, ака эргономичный - печать
справа на лево(иноходом;), волной по четыре символа пиксельными
линиями ;)
В коде я так и не разродился. Время.
Последнее, что есть на данный момент - это прямая печать
пиксельными линиями.
Вот основной цикл:

╒══════════════════< Begin file: pr_lin .C >══════════════════і

;***************************************
;ПЕЧАТЬ СТРОКИ, 42 СИМВОЛА ИЗ БУФЕРА
; - пиксельными линиями
;***************************************
; in: hl - адрес начала строки в экране
; de - buff/256-42
; b - font/256
;---------------------------------------

PR42_LIN ld (hl),%00000000
jr PR42_L2
;-------------------
PR42_L6
;6-66/13
ld a,(de): ld c,a: ld a,(bc)
rlca: rlca: ld c,a
and #00000011: or (hl)
ld (hl),a: inc l
ld (hl),c: inc e
;4-84/15
ld a,(de): ld c,a: ld a,(bc)
ld c,(hl): inc l
ld (hl),a: ld a,c
and %11110000: rld
dec l: ld (hl),a: inc l,e
PR42_L2
;2-48/9
ld a,(de): ld c,a: ld a,(bc)
rrca: rrca: or (hl)
ld (hl),a: inc l,e
;0-29/5
ld a,(de): ld c,a: ld a,(bc)
ld (hl),a: inc e
;-227/42
jr nz,PR42_L6
; ...
;конец печати одной пиксельной линии
ld a,l: and #E0: ld l,a
ld e,256-42: inc b,h
ld a,h: and #07 ;8 линия?
jr nz,PR42_LIN
; ...
;конец печати символьной строки
;---------------------------------------
;2+0+6+4 = 227/42
;t=22+48+29+(65+84+48+29+12)*10+7=2486
;

╘══════════════════< End file: pr_lin .C >════════════════════╛

t=(2486+?)*8=
b=42+?=

Имхо, меньше... ;)

[delete]


Приятных коNNектов, Pawel.

... ┌─[ZX]─>─[Scorpion]─┬─[SMUC]─>─[MIDI]─>─[PROSCO]─>─[GMX]──┐