Просмотр полной версии : PIX >addr speedUP
Есть процедурка
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
Только желательно с конкр. примерами и замерами.
Можно создать табличку на 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 в начале и в конце процедуры.
Ага. Ясно, но дело не в ex de,hl а в как бы работе только с 1 рег-ом т.е. на входе в de -> манипуляции с тем же de и результат в том же de.
Таблица... гм... а как тогда это всё будет выглядеть в целом и сколько прироста даст ?
Этой процедурой мы давно пользуемся. Сначала генеришь таблицу:
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
Ага. Ясно, но дело не в ex de,hl а в как бы работе только с 1 рег-ом т.е. на входе в de -> манипуляции с тем же de и результат в том же de.
Я не понял в чём проблема. :smile:
EX DE,HL можно поставить первой командой в процедуре, а затем ещё перед RET на выходе тогда и hl не попортится (хотя и поюзается)..
Прирост скорости примерно 20 тактов на один вызов..
генератор таблицы примитивен, можно даже твоей процедурой воспользоваться :smile:
Да и у elfh вариант неплохой, только hl портит и табличка занимает килобай памяти (4 сектора) А если ещё и точку рисовать не надо (а только координаты узнать), то рутина шустрее ещё на 14 тактов, но нужно будет ещё и генератор таблиц перемухлевать.. :wink:
Вообще-то и вправду хорошая процедура.
http://zx.pk.ru/showthread.php?t=2823
Похожая тема.
Эээххх... Т.е. со старых добрых времен "точки за 73 такта" ничего не изменилось / ускорилось ?
Doctor Max
02.06.2006, 14: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 такта
EX DE,HL можно поставить первой командой в процедуре, а затем ещё перед RET на выходе тогда и hl не попортится (хотя и поюзается)..
Прирост скорости примерно 20 тактов на один вызов..
Не совсем, после LD H, A ; H
Идет LD A, D
Что будет работой с одним регистром, хоть с D, хоть с H, в случае если одну пару не изменять.
Вот -- таблица !
Ну почему же, в те же старые добрые я использовал вот такую процедуру:
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 ┘
Powered by vBulletin® Version 4.2.5 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot