ZXNet эхоконференция «code.zx»
тема: PIX >addr speedUP
от: Знахарь
кому: All
дата: 08 May 2006
Hello, All
Есть процедурка
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
Только желательно с конкр. примерами и замерами.
от: Знахарь
кому: All
дата: 08 May 2006
Hello, key-jee
Ага. Ясно, но дело не в ex de,hl а в как бы работе только с 1 рег-ом т.е. на
входе в de -> манипуляции с тем же de и результат в том же de.
Таблица... гм... а как тогда это всё будет выглядеть в целом и сколько
прироста даст ?
от: Иван Петухов
кому: All
дата: 08 May 2006
Hello, Знахарь
Можно создать табличку на 2 сектора, где хранятся адреса всех крайних точек, а
затем пользоваться такой нехитрой процедуркой:
┌─- code ───
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;
└──; code ───
Hа практике не проверял, что 'сходу' придумалось то и написал, но вроде должно
работать. вообще-то процедуру можно с'оптимизировать на 4 такта и 1 байт, если
входные параметры будут не вида H = y, L = x (как обычно принято на спеке), а
наоборот, то есть H = x, а L = y.
Hу а если нужно работать с de, то ex de,hl в начале и в конце процедуры.
от: Иван Петухов
кому: All
дата: 08 May 2006
Hello, Знахарь
> Ага. Ясно, но дело не в ex de,hl а в как бы работе только с 1 рег-ом
> т.е. на входе в de -> манипуляции с тем же de и результат в том же
> de.
Я не понял в чём проблема. :smile;
EX; DE,HL можно поставить первой командой в процедуре, а затем ещё перед RET на
выходе тогда и hl не попортится (хотя и поюзается)..
Прирост скорости примерно 20 тактов на один вызов..
генератор таблицы примитивен, можно даже твоей процедурой воспользоваться
:smile;
Да; и у elfh вариант неплохой, только hl портит и табличка занимает килобай
памяти (4 сектора) А если ещё и точку рисовать не надо (а только координаты
узнать), то рутина шустрее ещё на 14 тактов, но нужно будет ещё и генератор
таблиц перемухлевать.. :wink;
Вообще-то; и вправду хорошая процедура.
от: Wladimir Bulchukey
кому: All
дата: 09 May 2006
Hello, key-jee
http://zx.pk.ru/showthread.php?t=2823
Похожая тема.
от: Знахарь
кому: All
дата: 11 May 2006
Hello, Wlodek
Эээххх... Т.е. со старых добрых времен "точки за 73 такта" ничего не
изменилось / ускорилось ?
от: Doctor Max
кому: All
дата: 02 Jun 2006
Hello, Знахарь
Hу почему же, в те же старые добрые я использовал вот такую процедуру:
┌─- CODE ───
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
└── CODE ───
Итого 69 тактов.
Если адрес таблицы держать в регистре E, то первая строка заменяется на: LD H,E
и получаем ускорение на 3 такта
от: TomCaT
кому: All
дата: 02 Jun 2006
Hello, key-jee
key> EX DE,HL можно поставить первой командой в процедуре, а затем ещё
key> перед RET на выходе тогда и hl не попортится (хотя и поюзается)..
key> Прирост скорости примерно 20 тактов на один вызов..
Hе совсем, после LD H, A ; H
Идет LD A, D
Что будет работой с одним регистром, хоть с D, хоть с H, в случае если одну
пару не изменять.
Вот -- таблица !
|