Важная информация

User Tag List

Показано с 1 по 10 из 10

Тема: PIX >addr speedUP

  1. #1
    Activist
    Регистрация
    23.03.2005
    Адрес
    г. Чернигов, Украина
    Сообщений
    477
    Спасибо Благодарностей отдано 
    15
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Arrow 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. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Master Аватар для key-jee
    Регистрация
    16.01.2005
    Адрес
    Пермь
    Сообщений
    514
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Lightbulb

    Можно создать табличку на 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 в начале и в конце процедуры.

  4. #3
    Activist
    Регистрация
    23.03.2005
    Адрес
    г. Чернигов, Украина
    Сообщений
    477
    Спасибо Благодарностей отдано 
    15
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

  5. #4
    Activist
    Регистрация
    23.01.2005
    Сообщений
    235
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию процедура точки by veka/cpu (mod. by xplrdg98/cpu)

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

    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

  6. #5
    Master Аватар для key-jee
    Регистрация
    16.01.2005
    Адрес
    Пермь
    Сообщений
    514
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

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

  7. #6
    Guru
    Регистрация
    15.01.2005
    Адрес
    USSR
    Сообщений
    2,038
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  8. #7
    Activist
    Регистрация
    23.03.2005
    Адрес
    г. Чернигов, Украина
    Сообщений
    477
    Спасибо Благодарностей отдано 
    15
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  9. #8
    Member
    Регистрация
    21.03.2005
    Адрес
    Старый Оскол
    Сообщений
    194
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну почему же, в те же старые добрые я использовал вот такую процедуру:
    Код:
    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 такта
    WBR, Doctor Max^GLOBAL Corp.
    [www.globalcorp.org.ru]

  10. #9
    Veteran Аватар для TomCaT
    Регистрация
    25.06.2005
    Адрес
    Одесса
    Сообщений
    1,794
    Спасибо Благодарностей отдано 
    54
    Спасибо Благодарностей получено 
    46
    Поблагодарили
    22 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от key-jee
    EX DE,HL можно поставить первой командой в процедуре, а затем ещё перед RET на выходе тогда и hl не попортится (хотя и поюзается)..
    Прирост скорости примерно 20 тактов на один вызов..
    Не совсем, после LD H, A ; H
    Идет LD A, D

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

    Вот -- таблица !
    Помни. Только на компьютере можно семь раз Cut, а один - Format. В реале все иначе. (c)
    Власть людей сильнее, чем люди у власти.
    Чем меньше мы смотрим на мир, тем больше задумываемся о нем. (c)

    Скрытый текст

    Can you help Robin in his quest for the silver arrow? (c) Odin "Robin of the Wood"
    Мы все немного режем по дереву, а потом собираем корабли в бутылках.
    Is it the same old story you are going to tell me
    or is it the old story telling me and you we are the same?
    http://www.sky.od.ua/~ptsk
    [свернуть]


  11. #10
    Guru
    Регистрация
    03.01.2006
    Адрес
    Рязань
    Сообщений
    2,935
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Doctor Max
    Ну почему же, в те же старые добрые я использовал вот такую процедуру:
    Код:
    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 ┘

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •