Я бы сделал или небольшие спрайты, или масштабируемые в 2 или 4 раза спрайты.
Если основная программа на Бейсике, то ИМХО заморачиваться с ldi и push-pop смысла нет - всё равно по сравнению с Бейсиком никто и не заметит разницу.

А вот процедура вывода произвольного спрайта (познакоместное):

Код:
; подпрограмма вывода спрайта
; входные параметры: HL=адрес спрайта, DE=координаты знакоместа для вывода на экране (D-вертик., E-гориз.)

PUTSPR		LD	A,(HL)
		AND	A
		RET	Z				; выход, если пустой спрайт
		LD	B,A
PUTS1		PUSH	BC				; B = количество знакомест в спрайте

		INC	HL
		LD	A,(HL)
		ADD	A,D
		LD	B,A
		INC	HL
		LD	A,(HL)
		ADD	A,E
		LD	C,A
		INC	HL
		PUSH	DE				; DE = координаты спрайта на экране
		EX	DE,HL				; DE = адрес нахождения в спрайте, HL = свободно
		PUSH	BC				; BC = реальные координаты спрайта на экране

                LD	A,B				; расчет адреса атрибутов знакоместа в HL
                RRCA
                RRCA
                RRCA
                LD	L,A
                AND	31
                OR	88
                LD	H,A
                LD	A,L
                AND	252
                OR	C
                LD	L,A

                POP     BC                              ; BC = реальные координаты спрайта на экране
		LD      A,(DE)                          ; читаем байт атрибутов знакоместа в спрайте
                LD      (HL),A                          ; заносим атрибуты знакоместа на экран
		INC	DE

                LD      A,B				; расчет адреса первого байта знакоместа в HL
                LD      H,A
                RRCA
                RRCA
                RRCA
                AND	A,224
		ADD	A,C
                LD	L,A
                LD	A,H
                AND	24
                OR	64
                LD	H,A				; HL = адрес вывода знакоместа на экране, DE = адрес изображения в спрайте

		; вывод знакоместа (8 строк)


		LD	A,(DE)
		LD	(HL),A				; вывели байт спрайта
		INC     DE
                INC     H

		LD	A,(DE)
		LD	(HL),A				; вывели байт спрайта
		INC     DE
                INC     H

		LD	A,(DE)
		LD	(HL),A				; вывели байт спрайта
		INC     DE
                INC     H

		LD	A,(DE)
		LD	(HL),A				; вывели байт спрайта
		INC     DE
                INC     H

		LD	A,(DE)
		LD	(HL),A				; вывели байт спрайта
		INC     DE
                INC     H

		LD	A,(DE)
		LD	(HL),A				; вывели байт спрайта
		INC     DE
                INC     H

		LD	A,(DE)
		LD	(HL),A				; вывели байт спрайта
		INC     DE
                INC     H

		LD	A,(DE)
		LD	(HL),A				; вывели байт спрайта

		EX	DE,HL				; HL = адрес нахождения в спрайте

		POP	DE				; HL = адрес нахождения в спрайте, DE = координаты спрайта на экране
		POP	BC				; B = цикл по количеству знакомест в спрайте
		DJNZ	PUTS1
		RET



SPRITE1                                      ; метка-адрес спрайта
DEFB 24                                      ; количество знакомест
DEFB 1,5,1,  0,7,125,0,15,12,8,8             ; знакоместо 1: вертик.координата, гориз.координата, байт атрибутов, 8 байт изображения
DEFB 1,6,1, 0,0,0,0,255,255,13,0             ; знакоместо 2
...                                          ; остальные 22 знакоместа