PDA

Просмотр полной версии : PIX >addr speedUP



Знахарь
08.05.2006, 11:54
Есть процедурка

PIX_ADDR DE,HL (call pix_addr)
- YXpix DE > $адр HL, А - bit offset



LD A,E ;B DE YX
AND A ;B HL $addr
RRA
SCF
RRA
AND A
RRA
XOR E
AND #F8
XOR E
LD H,A ;H
LD A,D
RLCA
RLCA
RLCA
XOR E
AND #C7
XOR E
RLCA
RLCA
LD L,A
LD A,D
AND 7
RET


Короче, всё как обычно.

А вот теперь предложения по ускорению и/или использованию только 1 рег. т.е. в данном примере
- YXpix DE > $адр HL
а надо чтоб
- YXpix DE > $адр DE

Только желательно с конкр. примерами и замерами.

key-jee
08.05.2006, 13:40
Можно создать табличку на 2 сектора, где хранятся адреса всех крайних точек, а затем пользоваться такой нехитрой процедуркой:

ld a,l
and 7
ld (end-1),a ; save offset
xor l
rrca
rrca
rrca
ld l,h
ld h,table
or (hl)
inc h
ld h,(hl)
ld l,a
ld a,0 ; restore offset
end:
На практике не проверял, что 'сходу' придумалось то и написал, но вроде должно работать. вообще-то процедуру можно с'оптимизировать на 4 такта и 1 байт, если входные параметры будут не вида H = y, L = x (как обычно принято на спеке), а наоборот, то есть H = x, а L = y.
Ну а если нужно работать с de, то ex de,hl в начале и в конце процедуры.

Знахарь
08.05.2006, 14:00
Ага. Ясно, но дело не в ex de,hl а в как бы работе только с 1 рег-ом т.е. на входе в de -> манипуляции с тем же de и результат в том же de.

Таблица... гм... а как тогда это всё будет выглядеть в целом и сколько прироста даст ?

elfh
08.05.2006, 16:05
Этой процедурой мы давно пользуемся. Сначала генеришь таблицу:

PTABFIL
LD HL,PTABLE+#100
LD DE,#E0F8
LD BC,#FF80
PTF1 INC B
LD A,B
SRL A
SCF
RRA
SRL A
XOR B
AND E
XOR B
; OR #C0
LD (HL),A
DEC H
LD A,B
RLCA
RLCA
AND D
LD (HL),A
INC H
INC L
LD A,B
CP #BF
JR NZ,PTF1
PTF2 XOR A
LD (HL),A
DEC H
LD (HL),A
INC H
INC L
JR NZ,PTF2
INC H
PTF3 LD A,L
AND E
RRCA
RRCA
RRCA
LD (HL),A
INC H
LD (HL),C
DEC H
RRC C
INC L
JR NZ,PTF3
RET

Потом используешь:

XPLOT
LD H,'PTABLE ;7
LD L,D ;4
LD A,(HL) ;7
INC H ;4
LD D,(HL) ;7
INC H ;4
LD L,E ;4
ADD A,(HL) ;7
LD E,A ;4
INC H ;4
LD A,(DE) ;7
OR (HL) ;7
LD (DE),A ;7=73!!!
RET

key-jee
08.05.2006, 19:38
Ага. Ясно, но дело не в ex de,hl а в как бы работе только с 1 рег-ом т.е. на входе в de -> манипуляции с тем же de и результат в том же de.
Я не понял в чём проблема. :smile:
EX DE,HL можно поставить первой командой в процедуре, а затем ещё перед RET на выходе тогда и hl не попортится (хотя и поюзается)..
Прирост скорости примерно 20 тактов на один вызов..
генератор таблицы примитивен, можно даже твоей процедурой воспользоваться :smile:

Да и у elfh вариант неплохой, только hl портит и табличка занимает килобай памяти (4 сектора) А если ещё и точку рисовать не надо (а только координаты узнать), то рутина шустрее ещё на 14 тактов, но нужно будет ещё и генератор таблиц перемухлевать.. :wink:

Вообще-то и вправду хорошая процедура.

Wlodek
09.05.2006, 04:54
http://zx.pk.ru/showthread.php?t=2823
Похожая тема.

Знахарь
11.05.2006, 09:55
Эээххх... Т.е. со старых добрых времен "точки за 73 такта" ничего не изменилось / ускорилось ?

Doctor Max
02.06.2006, 12:35
Ну почему же, в те же старые добрые я использовал вот такую процедуру:

LD H,#80 ;7
LD A,(HL) ;7
INC H ;4
LD B,(HL) ;7
INC H ;4
LD L,C ;4
OR (HL) ;7
LD C,A ;4
INC H ;4
LD A,(BC) ;7
OR (HL) ;7
LD (BC),A ;7

Итого 69 тактов.
Если адрес таблицы держать в регистре E, то первая строка заменяется на: LD H,E и получаем ускорение на 3 такта

TomCaT
02.06.2006, 15:55
EX DE,HL можно поставить первой командой в процедуре, а затем ещё перед RET на выходе тогда и hl не попортится (хотя и поюзается)..
Прирост скорости примерно 20 тактов на один вызов..

Не совсем, после LD H, A ; H
Идет LD A, D

Что будет работой с одним регистром, хоть с D, хоть с H, в случае если одну пару не изменять.

Вот -- таблица !

alone
17.06.2006, 22:06
Ну почему же, в те же старые добрые я использовал вот такую процедуру:

LD H,#80 ;7
LD A,(HL) ;7
INC H ;4
LD B,(HL) ;7
INC H ;4
LD L,C ;4
OR (HL) ;7
LD C,A ;4
INC H ;4
LD A,(BC) ;7
OR (HL) ;7
LD (BC),A ;7

Итого 69 тактов.
Если адрес таблицы держать в регистре E, то первая строка заменяется на: LD H,E и получаем ускорение на 3 такта
ZX-Guide#1:
<Точка Старых>: по координатам,заданным
в регистрах L=y, E=x, в произвольном месте
экрана(и даже за экран)за 58(!)тактов ста-
вится точка.Регистр C равен старшему байту
адреса таблиц('TABLE), регистр D=C+2.
LD H,C
LD A,(DE);x/8┐
INC D ├даёт младший байт
OR (HL);L(y) ┘
INC H
LD H,(HL);H(y)
LD L,A
LD A,(DE);byte(x)
(X)OR (HL);метод постановки точки
LD (HL),A
Если вместо последних 2 команд вставить
AND (HL),то это будет функция POINT. Чтобы
процедура работала многократно, в конце её
поставьте DEC D. Таблицы генерируются сле-
дующей программой:
LD HL,TABLE+256
LD DE,#4000
GEN0 LD (HL),D ┐
DEC H │
LD (HL),E │
INC H │
DOWN DE │1-я
LD A,D ├ и
SUB 88 │2-я
JR NZ,$+3 │
LD D,A │
INC L │
JR NZ,GEN0 ┘
INC H
LD A,128
GEN1 LD (HL),E ┐
INC H │
LD (HL),A │
DEC H │3-я
RRCA ├ и
JR NC,$+3 │4-я
INC E │
INC L │
JR NZ,GEN1 ┘