User Tag List

Показано с 121 по 130 из 501

Тема: Тема для всяких глупых вопросов

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #10

    Регистрация
    03.07.2021
    Адрес
    г. Кировск
    Сообщений
    922
    Спасибо Благодарностей отдано 
    87
    Спасибо Благодарностей получено 
    211
    Поблагодарили
    156 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от izzx Посмотреть сообщение
    push hl ; теперь на строку ниже
    ld hl,80-6 ;ширина строки минус ширина спрайта
    add hl,de ;перешли на след. строку
    ex de,hl
    pop hl ;восстановили hl

    Есть способы побыстрее?

    Давно спрашивали, но ответа не было... пускай будет))
    Условимся, что машина без циклов wait. Считаем такты в исходном примере: 11+10+11+4+10 = 46, длина 7 байт.
    Без использования стека как хранилища/приемника данных вариантов немного. Первый, без каких-либо опций со стеком:

    ld hl ,from
    ld de ,to
    ld bc ,80-ширина спрайта ; b=0, c=смещение
    ld a,с ; аккум хранит смещение, задается один раз перед выводом спрайта

    ldi ldi ldi сколько надо

    ------ сама процедура перевода строки:

    ld c,a ; восстанавливаем регистр
    ex de, hl
    add hl, bc
    ex de, hl

    ------ все, дальше опять пошло ldi ldi ldi

    Итого: 4+4+11+4 = 23 такта, 4 байта. Используем аккум, зато в 2 раза ускоряем процедуру.
    Если код вывода свернут в цикл, счетчик можно организовать в половинке IX либо в альт. регистре

    Второй способ нестандартный, используем регистр SP как константу:

    ld (savesp+1), sp ; сохраняем стек
    ld sp, смещение ; (80-ширина) грузим смещение в SP и больше его не трогаем
    ; задаем hl и de. аккумулятор не задействуется

    ldi ldi ldi сколько надо

    ------ сама процедура перевода строки:

    ex de, hl
    add hl, sp
    ex de, hl

    ------ все, дальше опять пошло ldi ldi ldi

    savesp ld sp, 0 ; восстанавливаем sp, конец вывода

    Итого 19 тактов, 3 байта. Разница с первым вариантом минимальна, но все зависит от конкретных условий применения.
    Сразу видно ограничение: можно юзать только при запрещенных прерываниях, поскольку sp будет указывать в ПЗУ.
    Однако можно красиво обойти его при одном условии: строки спрайта хранятся наоборот, от нижних к верхним, и выводятся так же.
    В таком случае смещение задается отрицательное, т.к. нужно вернуться "назад" по экранным адресам, зато регистр sp будет указывать
    на самый верх ОЗУ (#FFXX), который можно спокойно затереть (скажем, верхние 256 байт памяти резервируем и не трогаем).
    Сама процедура аналогична предыдущей, можно юзать при разрешенных прерываниях.

    Эти 2 пользователя(ей) поблагодарили reddie за это полезное сообщение:

    izzx(09.07.2021), Oleg N. Cher(09.07.2021)

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

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

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

Похожие темы

  1. Ответов: 42
    Последнее: 05.05.2021, 17:01
  2. Общая тема для моих вопросов (ассемблер и zx spectrum)
    от moronizzz в разделе Для начинающих
    Ответов: 17
    Последнее: 23.08.2016, 18:13
  3. тема для мобильного....
    от rasmer в разделе Музыка
    Ответов: 0
    Последнее: 18.01.2008, 20:25

Метки этой темы

Ваши права

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