Hola. A alguien se le ocurre una rutina más rápida para copiar datos de la
RAM a la VRAM en bloques de 8 bytes en un MSX1 (TMS9918 o asÃ)???
Os pongo mi rutinilla, a ver si le encontráis las cosquillas:
; Parametros:
; HL: dirección de origen (RAM)
; DE: dirección de destino (VRAM)
; B: número de bloques de 8 bytes a copiar
RAM2VRAM:
ld a,e
di
out (99h),a
ld a,d
or a,40h
out (99h),a
ei
ld c,98h
LOOP:
ld d,b
outi
outi
outi
outi
outi
outi
outi
outi
ld b,d
djnz LOOP
ret
Bastante fácil, no? Necesito el máximo de velocidad, pero con cierta
flexibilidad. La idea es usar esta rutina cuando se produzca la interrupción
de retrazado (V-blank), es decir, por ejemplo, justo después de un HALT.
El bucle principal tarda 4x2+16x8+13x1=149 T-states en copiar un bloque de 8
bytes y reiniciar el bloque.
La ventana de v-blank es de 4300 microsegundos (a 60 Hz). Entonces, si mis
cálculos no son erróneos, y suponiendo 60 Hz de refresco y un reloj de 3,58
MHz, el número máximo de bloques de 8 bytes que puede copiar es 103.
Redondeando para ser precavidos, digamos que 100. Eso sólo son 100x8=800
bytes de datos copiados desde VRAM a RAM.
Alguna otra idea? Esto basta para copiar una pantalla entera (en realidad,
sólo la tabla de nombres) en los modos gráficos I y II (es decir, screen 1 y
screen 2). Se aceptan sugerencias...
Perdón por el tostón técnico para los no iniciados...
Un saludo y gracias,
Edu R.
_________________________________________________________________
Dale rienda suelta a tu tiempo libre. Encuentra mil ideas para exprimir tu
ocio con MSN Entretenimiento. http://entretenimiento.msn.es/