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


тема: печаталка одного символа при 64-х в строке.



от: Oleg Grigoriev
кому: All
дата: 10 Feb 1999

Hi, All!
В целях повышения общеполезного траффика кидаю сабж. Инте-
ресно, сможет ли кто ее существенно ускорить. :)
Таблицы на 128 кил не приветствуются. :)
В а - символ, в de - координаты.

=== cut ===
LD H,FONT_64[
LD L,A
SRL D
LD C,#0F
JR NC,$+#06
LD C,#F0
SET 3,H

LD A,E
AND #18
OR #40
LD B,A
LD A,E
AND #07
RRCA
RRCA
RRCA
ADD A,D
LD E,A
LD D,B

LD A,(DE)
AND C
OR (HL)
LD (DE),A
INC H
INC D

LD A,(DE)
AND C
OR (HL)
LD (DE),A
INC H
INC D

LD A,(DE)
AND C
OR (HL)
LD (DE),A
INC H
INC D

LD A,(DE)
AND C
OR (HL)
LD (DE),A
INC H
INC D

LD A,(DE)
AND C
OR (HL)
LD (DE),A
INC H
INC D

LD A,(DE)
AND C
OR (HL)
LD (DE),A
INC H
INC D

LD A,(DE)
AND C
OR (HL)
LD (DE),A
INC H
INC D

LD A,(DE)
AND C
OR (HL)
LD (DE),A

RET
=== cut ===

Фонт имеет размер 4 кила и лежит по очень красивому адресу
(3 младших полубайта равны нулю). Естественно при печати на
чистый экран печаталка преобразуется в ld a,(de):or (hl):ld
(de),a. А при печати парами в ld a,(bc):or (hl):ld (de),a.
Мне интересно другое: а возможно ли принципиальное ускоре-
ние? :) Помоему нет. :)

WBR, Oleg.

np: Mundanus Imperium'97 "Ode To The Nightsky"

от: Dmitry Lomov
кому: Oleg Grigoriev
дата: 11 Feb 1999


Hi, Oleg!

OG> В целях повышения общеполезного траффика кидаю сабж. Инте-
OG> ресно, сможет ли кто ее существенно ускорить. :)

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

насос фонта можно стеком делать, будет немного быстрее (на 2
такта/байт).

типа

POP HL
LD A,(DE):AND C:OR L:LD (DE),A:INC D
LD A,(DE):AND C:OR H:LD (DE),A:INC D

неблагодарное это дело - оптимизировать такое :)

OG> Мне интересно другое: а возможно ли принципиальное ускоре-
OG> ние? :) Помоему нет. :)

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


Всего хорошего.
Дмитрий.

..LD..X-TRADE..

от: Ivan Mak
кому: Oleg Grigoriev
дата: 12 Feb 1999

Приветствую Вас, Oleg!

В день Oleg Grigoriev написали All:

OG> В целях повышения общеполезного траффика кидаю сабж. Инте-
OG> ресно, сможет ли кто ее существенно ускорить. :)
[скип code]
OG> Мне интересно другое: а возможно ли принципиальное ускоре-
OG> ние? :) Помоему нет. :)

А ты не пpобовал печатать командами RRD и RLD?

А пpи печати стpок по одному символу в конце печатаемой стpоки впечатывать
пpобел, если стpока заканчивалась нечетным символом.
Так, кстати, знакогенеpатоp 2К нужен всего...

И еще один момент. В HL лучше деpжать сpазу адpес знакоместа и в пpоцессе
печати увеличивать его на единичку после каждых двух символов. А pассчет адpеса
делать пpи установке позиции печати. Тогда все pассчетные RRCA, AND/OR
исчезнут. Если нужно узнать позицию печати, делается обpатное пpеобpазование.
Так быстpее, потому что функции установки позиции и считывания позиции
вызываются значительно pеже функций печати.

Два последовательных символа надо печатать 'как бы' на одном месте.
Позиция печати должна быть с четного места, длина печатаемой стpоки тоже должна
быть четной.
Пpи нечетных ситуациях нужна спецобpаботка...

;HL - позиция печати - ПРЯМОЙ АДРЕС В ЭКРАHЕ!
;A - символ
;AF' - флаг четного/нечетного знакоместа, для четного A=0, для нечетного A=1,
;флаг высчитывается пpогpаммой установки позиции печати.

PRINT_SYM
LD D,ZG_ADRESS/256
LD E,A
LD C,H

LD A,(DE) ───┐ 8 pаз..
RLD │
INC D │
INC H │
.... │
LD A,(DE) │
RLD │

──┘
LD H,C
EX AF,AF'
XOR 1
JR NZ,NO_INC_L
INC L
JR NZ,LL2
LD A,H
ADD A,8
LD H,A
CP #60
JR NZ,LL2
LD H,#40
LL2 XOR A NO_INC_L
EX AF,AF'
RET

Вай! Протосы атакуют моих зерлингов! Пора сматываться. Ivan.

- Разводись схемка, больша и маленька..

от: Dmitry Grigoryev
кому: Oleg Grigoriev
дата: 14 Feb 1999
Привет, Oleg!

Сpеда 10 Февpаля 1999 19:20, Oleg Grigoriev (500:812/10.13) wrote to All:

OG> LD H,FONT_64[
OG> LD L,A
OG> SRL D
OG> LD C,#0F
OG> JR NC,$+#06
OG> LD C,#F0
OG> SET 3,H

38-48 тактов

ld l,a
srl d
jr nc,$+9
ld h,font_64[+8
ld c,#f0
jp $+7
ld h,font_64[
ld c,#0f
38-43

OG> LD A,E
OG> AND #18
OG> OR #40
OG> LD B,A
OG> LD A,E
OG> AND #07
OG> RRCA
OG> RRCA
OG> RRCA
OG> ADD A,D
OG> LD E,A
OG> LD D,B

57
Здесь, все таки, лучше таблицу адресов верт. координат в 24*2=48 байт:

ld b,tab[
sla e
ld c,e
ld a,(bc)
add a,d
inc c
ld e,a
ld a,(bc)
ld d,a
49 tacts
(можно, наверняка, и быстрее, но думать лень ;)

Итого - 10.5 тактов на символ уже вылизали ;)

OG> LD A,(DE)
OG> AND C
OG> OR (HL)
OG> LD (DE),A
OG> INC H
OG> INC D

OG> Фонт имеет размер 4 кила и лежит по очень красивому адресу
OG> (3 младших полубайта равны нулю).

Ты забыл добавить, что фонт в формате экрана и разбит на две фазы. Вот первая
фича - это действительно красивый ход! Впервые, кстати, примененный в
Онлайне ;)

OG> Естественно при печати на чистый экран печаталка преобразуется в
OG> ld a,(de):or (hl):ld (de),a.

Угу. А зачем печатать на грязном? 56 тактов на символ на дороге не валяются ;)

OG> А при печати парами в ld a,(bc):or (hl):ld (de),a.

Как это "парами"?

OG> Мне интересно другое: а возможно ли принципиальное ускоре-
OG> ние? :) Помоему нет. :)

Hикогда так не говори :) Хотя, теперь вот пусть попробуют ;) Вообще, всегда
можно ввести некоторые ограничения (но задачу необходимо рассматривать более
обще - типа "печать страницы") - отказаться от координат, ни в коем случае не
печатать пробел,
ввести несколько табуляций, отказаться от псевдографики и выводить 6-7 строк из
восьми и т.п. Цветная печать свои особенности имеет - можно, например, стирать
строку атрибутами... Hеплох освободить хоть один регистр, хотя бы на процедуру
печати
строки, под константы. Про альтернативные забывать не стоит...

OG> WBR, Oleg.

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

от: Dmitry Grigoryev
кому: Ivan Mak
дата: 16 Feb 1999
Привет, Ivan!

Пятница 12 Февpаля 1999 02:47, Ivan Mak (2:5030/529.24) wrote to Oleg
Grigoriev:

IM> А ты не пpобовал печатать командами RRD и RLD?

А ты ldir'ом не пробывал? Тоже интересно ;)

IM> А пpи печати стpок по одному символу в конце печатаемой стpоки
IM> впечатывать пpобел, если стpока заканчивалась нечетным символом. Так,
IM> кстати, знакогенеpатоp 2К нужен всего...

Угу. Только текст увеличится на примерно половину количества строк. Или
проверку в процедуру вставить придется. Да и просто печать каждой строки с
нечетным кол-вом символов неоправдано увеличится. Я уж молчу о том, что при
нормальном способе вывода
быстрее не печатать пробел, а пересчитывать адрес экрана несколькими командами.

IM> И еще один момент. В HL лучше деpжать сpазу адpес знакоместа и в

Понимаешь, Иван... Ежу понятно, что лучше... Hо условия задачи были следующие:
печать символа 8x4 в _произвольной_ позиции экрана, заданой _координатами_...

IM> PRINT_SYM
IM> LD D,ZG_ADRESS/256
IM> LD E,A
IM> LD C,H

IM> LD A,(DE) ───┐ 8 pаз..
IM> RLD │
IM> INC D │
IM> INC H │
IM> .... │
IM> LD A,(DE) │
IM> RLD │
IM> │
IM> ──┘

Hевооруженным взглядом видно, что ld a,(de);rld = 25 tacts, ld a,(de); and c;
or (hl); ld (de), a = 25 tacts (или 21 при печати на пустую строку, что
делается всегда в реальном приложении). Где выигрыш?

IM> LD H,C
IM> EX AF,AF'
IM> XOR 1

IM> JR NZ,NO_INC_L
IM> INC L
IM> JR NZ,LL2
IM> LD A,H
IM> ADD A,8
IM> LD H,A
IM> CP #60

#58? А эта "батва" вообще ни к чему - нормальные люди строку спецсимволом
заканчивают, а не заполняют экран до упора, да еще с переходом на верхнюю
строку ;)

IM> JR NZ,LL2
IM> LD H,#40
IM> LL2 XOR A NO_INC_L
IM> EX AF,AF'
IM> RET

Ок. Парами, так парами (в Онлайне и СПФ я тоже парами печатал ;) Менять
условия, так менять...
hl - адрес экрана
de - адрес текста

* печать строки на пустом месте *

print_left:
ld b,font_left/256
ld a,(de)
inc de
cp #21
jr c,controls
ld c,a
begin 7
ld a,(bc)
ld (hl),a
inc b
inc h
end
ld a,(bc)
ld (hl),a

print_right:
ld b,font_right/256
ld a,(de)
inc de
cp #21
jr c,controls
ld c,a
begin 7
ld a,(bc)
or (hl)
ld (hl),a
inc b
inc h
end
ld a,(bc)
or (hl)
ld (hl),a
inc l
jp print_left
controls:
cp #20
jr nz,tab
ld a,b
cp font_left
jr z,print_right
inc l
jp print_left
tab:
cp #09
ret nz
ld a,l
and #03
add a,#04
ld l,a
jp print_left

Hу а дальше сам-сам ;) Делай быстрее с RLD ;)

IM> Вай! Протосы атакуют моих зерлингов! Пора сматываться. Ivan.

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

от: Oleg Grigoriev
кому: Dmitry Grigoryev
дата: 22 Feb 1999

Пусть враги твои, Dmitry, умрут без сыновей!

14-02-99 в 14:23:42 Dmitry Grigoryev ═> Oleg Grigoriev:

[мой код]

DG> ld l,a
DG> srl d
DG> jr nc,$+9
DG> ld h,font_64[+8
DG> ld c,#f0
DG> jp $+7
DG> ld h,font_64[
DG> ld c,#0f
DG> 38-43

[мой код]

DG> 57
DG> Здесь, все таки, лучше таблицу адресов верт. координат в 24*2=48 байт:

DG> ld b,tab[
DG> sla e
DG> ld c,e
DG> ld a,(bc)
DG> add a,d
DG> inc c
DG> ld e,a
DG> ld a,(bc)
DG> ld d,a
DG> 49 tacts

Хе-хе... Регистр C занят под маску...

EX DE,HL ;4
LD A,H ;4
LD H,TABL[ ;7 /8
SLA L ;8
OR (HL) ;7 /8
INC L ;4
LD H,(HL) ;7 /8
LD L,A ;4
EX DE,HL ;4
;49[52]

Вот теперь 49.

DG> (можно, наверняка, и быстрее, но думать лень ;)

DG> Итого - 10.5 тактов на символ уже вылизали ;)

Угу... :)

OG>> Фонт имеет размер 4 кила и лежит по очень красивому адресу
OG>> (3 младших полубайта равны нулю).

DG> Ты забыл добавить, что фонт в формате экрана и разбит на две фазы.

Гм... Мне казалось, что это из кода понятно. Впрочем, там
все из кода понятно. :)

DG> Вот первая
DG> фича - это действительно красивый ход!

Вторая тоже ничего. :) Кстати, сам придумал и, помнится,
долго ругался когда прочитал об этом в какой-то газете. Давно
это было... :)

DG> Впервые, кстати, примененный в
DG> Онлайне ;)

Быть может... Хотя мне казалось, что zxword появился нес-
колько раньше. :)

OG>> Естественно при печати на чистый экран печаталка преобразуется в
OG>> ld a,(de):or (hl):ld (de),a.

DG> Угу. А зачем печатать на грязном? 56 тактов на символ на дороге не
DG> валяются ;)

В новой печаталке чуть больше.

OG>> А при печати парами в ld a,(bc):or (hl):ld (de),a.

DG> Как это "парами"?

По два символа за раз.
Приблизительно так:
LD B,FONT_64[
LD H,FONT_64[+#08
LD C,(IX+#00)
LD L,(IX+#01)
...
LD A,(BC):OR (HL):LD (DE),A
INC B,H,D
...

OG>> Мне интересно другое: а возможно ли принципиальное ускоре-
OG>> ние? :) Помоему нет. :)

DG> Hикогда так не говори :)

Хе-хе... Там смайл стоял. Как раз для того, чтобы кого-ни-
будь спровоцировать. :)

DG> Хотя, теперь вот пусть попробуют ;)

Чуть ниже.

DG> Вообще, всегда можно
DG> ввести некоторые ограничения (но задачу необходимо рассматривать более
DG> обще - типа "печать страницы") - отказаться от координат, ни в коем случае
DG> не печатать пробел,

Да, естественно. Hо в данном случае задача ставилась именно
как печать одного символа.

DG> ввести несколько табуляций, отказаться от псевдографики и выводить 6-7
DG> строк из восьми и т.п.

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

;Процедура печати одного символа по маске при 64-х в строке.
;IN: [DE] - COORDS
; [A] - CHAR
;
LD L,A ;4
SRL D ;8
JR NC,$+#09 ;7 /8 |12
LD H,FONT_64[+#08 ;7 /8
LD C,#F0 ;7 /8
JP $+#07 ;10
LD H,FONT_64[ ;7 /8
LD C,#0F ;7 /8
;38[40]/43[46]
EX DE,HL ;4
LD A,H ;4
LD H,TABL[ ;7 /8
SLA L ;8
OR (HL) ;7 /8
INC L ;4
LD H,(HL) ;7 /8
LD L,A ;4
EX DE,HL ;4
;49[52]
;87[92]/92[98]
LD A,(DE) ;7 /8
AND C ;7 /8
OR (HL) ;7 /8
LD (DE),A ;7 /8
INC H ;4
INC D ;4
;36[40]
LD A,(DE) ;7 /8
AND C ;7 /8
OR (HL) ;7 /8
LD (DE),A ;7 /8
INC H ;4
INC D ;4
;36[40]
LD A,(DE) ;7 /8
AND C ;7 /8
OR (HL) ;7 /8
LD (DE),A ;7 /8
INC H ;4
INC D ;4
;36[40]
LD A,(DE) ;7 /8
AND C ;7 /8
OR (HL) ;7 /8
LD (DE),A ;7 /8
INC H ;4
INC D ;4
;36[40]
LD A,(DE) ;7 /8
AND C ;7 /8
OR (HL) ;7 /8
LD (DE),A ;7 /8
INC H ;4
INC D ;4
;36[40]
LD A,(DE) ;7 /8
AND C ;7 /8
OR (HL) ;7 /8
LD (DE),A ;7 /8
INC H ;4
INC D ;4
;36[40]
LD A,(DE) ;7 /8
AND C ;7 /8
OR (HL) ;7 /8
LD (DE),A ;7 /8
INC H ;4
INC D ;4
;36[40]
LD A,(DE) ;7 /8
AND C ;7 /8
OR (HL) ;7 /8
LD (DE),A ;7 /8
;28[32]
RET ;10
;377[414]/382[420]

;Процедура печати одного символа при 64-х в строке.
;IN: [DE] - COORDS
; [A] - CHAR
;
LD L,A ;4
SRL D ;8
LD H,FONT_64[ ;7 /8
JR NC,$+#04 ;7 /8|12
LD H,FONT_64[+#08 ;7 /8
;31[32]/33[36]
EX DE,HL ;4
LD A,H ;4
LD H,TABL[ ;7 /8
SLA L ;8
OR (HL) ;7 /8
INC L ;4
LD H,(HL) ;7 /8
LD L,A ;4
;45[48]
;76[80]/78[84]
LD A,(DE) ;7 /8
OR (HL) ;7 /8
LD (HL),A ;7 /8
INC H ;4
INC D ;4
;29[32]
LD A,(DE) ;7 /8
OR (HL) ;7 /8
LD (HL),A ;7 /8
INC H ;4
INC D ;4
;29[32]
LD A,(DE) ;7 /8
OR (HL) ;7 /8
LD (HL),A ;7 /8
INC H ;4
INC D ;4
;29[32]
LD A,(DE) ;7 /8

OR (HL) ;7 /8
LD (HL),A ;7 /8
INC H ;4
INC D ;4
;29[32]
LD A,(DE) ;7 /8
OR (HL) ;7 /8
LD (HL),A ;7 /8
INC H ;4
INC D ;4
;29[32]
LD A,(DE) ;7 /8
OR (HL) ;7 /8
LD (HL),A ;7 /8
INC H ;4
INC D ;4
;29[32]
LD A,(DE) ;7 /8
OR (HL) ;7 /8
LD (HL),A ;7 /8
INC H ;4
INC D ;4
;29[32]
LD A,(DE) ;7 /8
OR (HL) ;7 /8
LD (HL),A ;7 /8
;21[24]
RET ;10
;310[338]/312[342]

WBR, Oleg.




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

Похожие статьи:
Imagination - Сумерки богов (по оригинальному замыслу Игоря Богданова).
Четыре килобайта - Коллекция оригинальных высказываний (ориджинов).
Да будет так - Компьютерная новелла по игре LASER SQUAD.

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