Ну т.е. общая скорость та же, что и во втором твоём решении.
Спасибо за напоминание, что у нас свободен DE! Но таблица не нужна совсем:
ld de,-8*256+32
add hl,de
bit 0,h : jr nz,.newthird
; 10+11+8+7 = 36t
Вариант без таблиц, но с разбросанными по памяти одиночными байтами, 55 тактов:

    ld b,c
    add hl,bc
    ld b,h
    ld a,(bc)
    ld h,a


Вариант с байтами, собранными рядом в мини-табличку, 57 тактов:

    ld de,$XX20
    add hl,de
    exd
    ld l,d
    ld h,(hl)

(регистр c здесь освободился под счётчик и -4 такта префикса учтены в сумме)
Ачо размер? Умеренный, как по мне, плюс еще и генерить очень быстро, где-то даже динамически будет выгодно. Развороту djnz перпендикулярно и не мешает, наоборот — даже чуть проще и быстрее станет после него.
Ты конечно знатный извращенец. Действительно, с таблицами такого размера спрайты на полэкрана для тебя и правда фантастичны. На каждом ряде знакомест вместо 67 тактов у тебя выходит 4+11+7+7+8+10 = 47 тактов. 24*20т = 480т (на самом деле, меньше, из-за обработки хвоста). Я бы не стал так делать. Разворот DJNZ даст намного больше скорости и займёт намного меньше памяти.

Но я рад любым идеям, потому что, как ты знаешь сам, приходит день и всё это обязательно пригождается, м.б. в каком-то другом виде.
А если так? ;)

        ...

_main1: inc h
_main2: ...
        djnz _main1
        ld b,c        ; c = $20
        add hl,bc
        ld h,(hl)     ; таблицы кусками по 256 байт @ ... $6700, $6800, $6F00, $7000, $7700 ...
        ld b,8
        dec xl        ; счётчик символьных строк вместо занятого c
        jp nz,_main2
        exa           ; zf сохранён на повторный приход сюда
        ld b,a        ; длина хвоста и флаги после and7 при первом входе
        jp nz,_main2  ; если ненулевой хвост и не повторно сюда попали

_end:   ld sp,0
        ret        


Это адаптация из опытов по быстрой отрисовке отрезка (где sp вместо bc применяется) — где-то рядом уже как-то упоминал. Хотя для реальных небольших спрайтов (а не фантастичных на полэкрана) разница по скорости незаметна. Более весомая выгода подобных таблиц на практике — бесплатный вертикальный wrap или clip (перенаправлением в ПЗУ) для окна из 1-3 сегментов.
  • avatar VBI
  • 0
Однозначно круто!
Ты у нас сейчас главный мультиколорщик, давай, делись!
Следующий шаг — постоянный по тактам down_hl без таблиц :)
Кроме того, RST7 предложил ещё один подход к реализации DOWN_HL, разбивающий счётчик строк в спрайте на два и в итоге ускоряющий DOWN_HL ещё в 2 раза. Это решение показано в только что добавленном приложении к статье.
Нам повезло получить комментарий по этому поводу от RST7:

«Я думаю, что регистр С надо использовать не для сохранения старшего байта, а в качестве счетчика до перехода на .nextchar. Т.е. в .nextchar будет

LD C,0xF8

a в основном цикле

INC H
INC C
JR Z,.nextchar

Ну и преинит

LD A,H
OR 0xF8
LD C,A

Оно, конечно, ухудшит вариант nextchar на 18 тактов, т.е. суммарно 21*18=378 тактов, но зато 168*7=1176 тактов выиграет на основном переходе.»
  • avatar sq
  • 0
Как же мы скучали!)
Не прошло и ста лет, как я обнаружил, что исходники демо выложены на GitHub:
github.com/restorer/zxspectrum-lo-fi-motion-2020
Большое спасибо автору! Надеюсь это поможет другим невнимательным читателям вроде меня!
  • avatar aa-dav
  • 0
Вот с чего я окончательно прифигел — так это с того, что на 2:01:00 Джон Ромеро играет в Marsmare: Alienation: youtu.be/tGlK9wnPvJw
:D
  • avatar frog
  • -1
Демосцена на картинке выглядит ещё хуже, чем Covid19. А Dihalt-2021 как из морга :))
  • avatar nyuk
  • 0
Чет я протупил. Проблема с hypr.ru все-таки на стороне retroscene.org должна решаться. Вроде решил.
  • avatar nyuk
  • 0
Понял в чем проблема. На hypr.ru самоподписанный сертификат. И ресурсы оттуда реджектятся.
Я просто перед этим разрешил этот сертификат, поэтому ничего и не заметил.
  • avatar nodeus
  • 0
Обновил в личном кабинете, стало ок.
  • avatar nodeus
  • 0

Аватар потерялся.
  • avatar Vinnny
  • 2
зафиксирую ссылку на предоставленные игры, а то найти её почти нереально :)