размеры спрайта какие? все спрайты разных размеров или одинаковых?
если не очень большие и одинаковые, то можно (читать нужно) раздекрянчить смещая по X и создать несколько процедур вывода (кстати выводя "змейкой" особо не ускоришь).
допустим есть max размер по X в знакоместах будет 4, то создаёшь следующие процедуры для вывода
X <= (-4*8) : нафуй
X > (-4*8) && X < (-3*8) : proc_m1
.....
X>=0 && X<255 : proc_normal
...
X>255 && X<(255+8) : proc_p1
вот.
оч. быстро 
но не оптимально по памяти.
------
или так: есть 3 процедуры, спрайты покрянчены
1) спрайт залазит влево
2) спрайт полностью на экране
3) спрайт залазит вправо
если спрайт на экране, то всё очевидно.
допустим, спрайт залазит вправо.
если вывод 2х строк такой:
Код:
line_1:
ld a,(bc)
inc с
ld d,a
dup max_width-1
ld a,(de)
and (hl)
inc hl
or (hl)
inc hl
ld (de),a
inc e
edup
ld a,(de)
and (hl)
inc hl
or (hl)
inc hl
ld (de),a
ret
line_2:
ld a,(bc)
inc с
ld d,a
ld a,<mod_this_value>
add a,l
ld l,a
dup max_width-1
ld a,(de)
and (hl)
inc hl
or (hl)
inc hl
ld (de),a
dec e
edup
ld a,(de)
and (hl)
inc hl
or (hl)
inc hl
ld (de),a
ret
то можно просчитать где поставить нужный ret (чтоб лишнего не выводить), замодифицировать line_1 и line_2 для этих целей, так же пропишем <mod_this_value>
обрежем по Y и далее
Код:
; b - кол-во 2x линий для вывода
; hl' - указывает на нужное место спрайта
; e' - колонка в экране
; c' - номер линии в экране
; b' - адрес таблички адресов
ld hl,retaddr
push hl
ld hl,line_2
ld de,line_1
lp0:
push hl
push de
djnz lp0
ret
retaddr:
....
! код работать не будет !
тут есть проёб с тем что выводится "змейкой"- тогда не получится так просто доставать адреса из таблички.
лучше без змейки. и из таблички надо доставать не только старшую часть адреса (в данном случае D) но и младшую (E) и добавлять к ней смещение
в общем идея думаю ясна.