zst, как я понимаю, такую команду как "нарисовать спрайт" видеокарта выполняет долго, значит однозначно нужна будет очередь команд, скорее всего из обращений к шине Z80. Если отслеживать обращения к шине, то видеокарта без проблем может строить у себя копию памяти Z80, значит для загрузки данных тормозные ldir не нужны, достаточно просто указать, что данные с таких-то адресов мы хотим загрузить в палитру или текстуру. Если для Z80 переключались страницы, то предварительно можно считать нужный блок данных командами POP, потратив всего по 5 тактов на байт, и у видеокарты снова будет корректная копия нужного нам участка памяти Z80. Если координаты спрайтов лежат в памяти Z80, то перемещение можно сделать просто записью новых координат и вызовом команды "нарисовать несколько спрайтов".
Можно пойти еще дальше, сделав списки команд и их аргументов, в списке для каждого байта указывается адрес откуда его брать, это может быть ссылка на константу(например для кода команды), ссылка на ячейку видеокарты или памяти Z80, или даже ссылка на какой либо байт из последних операций на шине Z80. Последняя возможность позволит вычисляемые аргументы просто заталкивать в стек или ячейки памяти в том порядке, как удобно программе, список всё переставит как нужно, и использовать A, HL и прямую адресацию для этого будет уже совсем не обязательно. Ну а далее видеокарте выдаётся команда выполнить список номер N, видеокарта собирает все байты команды и выполняет. Еще полезная возможность будет выполнять команду из памяти Z80, то есть где-то лежит команда со всеми аргументами, а мы видеокарте просто сообщаем её адрес, после чего можно подправить некоторые аргументы и выполнить снова.