1

не буду приводить расчёты (потому что глупец). но кажется (я практически уверен что это факт) единственный способ это раскрытие циклов - абстрактно говоря. потому что мы тупо расписываем множество ветвлений, предполагая что можно заранее посчитать ветку поведения (скажем). у меня просто вопрос, так все делают: раскрывают на 16кб варианты отрисовки 8x8 спрайта со всеми смещениями. но если грубо посчитать в уме, не получается чтобы даже 8*8 вариантов помещалось в 16кб. а ведь ещё есть специфика экрана, с его тремя областями. вопрос в том: как это обычно делают?

2 (изменено: lenin1st, 15.09.2022 08:46:50)

1323

3

лобовое решение: вывод на экран по линиям.
обходное решение - вывод "змейкой"

Ненависть- это подарок
защеканец gpv хорошо сосёт.

4 (изменено: lenin1st, 15.09.2022 15:00:36)

да это понятно всё. хотя что значит змейкой я не понял. я про то что есть алгоритм вывода в любую точку экрана, так. а если раскрыть циклы и знать первую точку (соответственно), можно очень навыигрывать сократив циклы. естественно все так делают, просто интересно насколько жёстко и что именно раскрывают. потому что так-то 64 варианта только начала спрайта есть, а ещё специфика экрана.

5

если выводить по линиям, то выходит побайтное копирование данных на экран, например (HL)->(DE). Нарисовав линию спрайта, нужно перейти вниз, по экрану, например

nbde    INC D:LD A,D:AND 7:RET NZ
        LD A,E:ADD A,#20:LD E,A:RET C
        LD A,D:SUB 8:LD D,A:RET

Казалось бы, удобнее  запомнить DE и сделать так

push de
;копирование линии
pop de
call nbde;переход на линию экрана

Трюк в том, что первая линия копируется, без сохранения регистра DE, а следующая линия копируется обратно
т.е. в первой линии будет
ld a,(hl)
ld (de),a
inc hl
inc e

а во второй

ld a,(hl)
ld (de),a
inc hl
dec e

Понятно, что нужно подготовить спрайт, чтобы шел другой порядок байтов.

Ненависть- это подарок
защеканец gpv хорошо сосёт.

6 (изменено: lenin1st, 15.09.2022 17:02:14)

щас пока не понял (уже накидался). но самое быстрое, как я понял, это заполнять экран через стек - это не наш путь, просто хотелось упомянуть. прочитаю завтра - осмыслю.

7

стек можно использовать, НО:
-число размер спрайта четное
-положение на экране одно и тоже
-нужно уместиться в 1 фрейм между прерываниями, иначе данные засрутся.

пример:

 ld (backsp+1),sp;сохранить стек
 ld sp, sprite ; стек указывает на данные спрайта
;развернутый цикл
 pop hl
 ld ($4000),hl
 pop hl
 ld ($4002),hl
 ... продолжить копирование одной линии
;вторая линия
 pop hl
 ld ($4100),hl
 pop hl
 ld ($4102),hl

backsp: ld sp,0;восстановить значение стека

можно по-другому, но с ограничениями.Например
pop bc
ld (hl),c
inc l
ld (hl),b
inc l

Ненависть- это подарок
защеканец gpv хорошо сосёт.