Esta rutina según mis pruebas es un 30% más rápida que la de Tom&Jerry. Mochilote, ¿puedes hacer tu la misma prueba que hiciste con las otras dos rutinas? Yo he probado este código frente al de T&J sin el cálculo previo que hace para escribir en linea_además. La nueva me da una tasa &11D y la de T&J &174. He dibujado 100 veces un sprite de 10*40 en ambos casos y el número es la diferencia de HL entre la primera y la segunda ejecución de TIME_PLEASE (rutina del firm. que dice el tiempo transcurrido desde el reset del CPC)
Luego he modificado una tontería en la de T&J:
Cambio el siguiente código:
LD A,C
loop_ancho_2
LDI
DEC A
JR NZ,loop_ancho_2
por:
ld b,0 ;1
loop_ancho_2zz
LDIR
y la rutina da una tasa de &115. Con lo cual, por ahora es la más rápida. Tengo que hacer las pruebas usando la pila para ver si se mejora esta tasa.
Importante: Esta rutina requiere indicar un par de parámetros calculados previamente, los veréis en el código. Lo más rápido sería tener una tabla (son función del ancho del sprite) y de este modo se gana bastante velocidad, lo mismo para la de T&J, si se escribe el valor en (ademas_linea+1) sin calcularlo, se gana algo de tiempo (aunque pequeño comparado con el de los bucles)
Código: Seleccionar todo
imp_sp_normalxs ; dibujar en pantalla el sprite
; Entradas bc-> Alto Ancho
; de-> origen
; hl-> destino
; Se alteran hl, bc, de, af
loop_alto_2xs
push bc ;3
ld b,0 ;1
loop_ancho_2xs
ldir ;5
ex de,hl ;1
ld a,h ;1
cp &f7 ;2
jp m,menor ;3
ld bc,&C846 ;3 COMPLEMENTO A 2 DE (&37B0+ANCHO) PRECALCULADO O DE UNA TABLA
ADD hl,bc ;3
ex de,hl ;1
pop BC ;3
djnz loop_alto_2xs ;3
ret
menor
LD BC,&07F6 ;3 (&0800-ANCHO)&07F6 PRECALCULADO O DE UNA TABLA
ADD HL,BC ;3
ex de,hl ;1
pop BC ;3
djnz loop_alto_2xs ;3
ret
Codigo T&J
Código: Seleccionar todo
imp_sprite
loop_alto_2
push bc
ld b,0 ;1
;loop_ancho_2
LDIR
ex de,hl ;voy a operar con la linea de pantalla DE, así que cambio a HL
ademas_linea ;siguiente línea
LD BC,&07f6
ADD HL,BC
jp nc,sig_linea_2 ;si no desborda va a la siguiente linea
ld bc,&c050
add HL,BC
sig_linea_2
ex de,hl ;recupero HL y DE en su sitio
pop BC
djnz loop_alto_2
ret