¡Veo que cada vez más gente se vuelca al lado oscuro!
Respecto a la velocidad del volcado, yo no consideraría únicamente eso. También tienes que tener en cuenta el tiempo que te roba la interrupción de la BIOS cada uno de esos frames. Si quieres rascarle un buen pico, este hilo de Sapphire no tiene desperdicio:
http://www.msxgamesbox.com/karoshi/index.php?topic=212.0Y respecto al volcado a VRAM yo haría varias consideraciones :
- Los consumos en ciclos son :
OUT (N),A ----- 12T
OUT (C),A ----- 14T
OUTI ---------- 18T
OTIR ---------- 18T/23T
Así pues, el
OUT (N),A es la instrucción de volcado más rápida que hay, el
OUTI la supera gracias a que incluye un par de operaciones sobre los registros del Z80. El
OTIR es bestialmente más potente que los anteriores, hay que tener en cuenta que si ponemos 600 OUTIs seguidos tendremos un consumo extra de 2T por cada OUTI, 600x2=1200T contra los 2T extras que consumirá el OTIR (¡se te olvidaron los ciclos de espera M1 Wyz
!). Una pena que definitivamente no se pueda usar en los MSX de primera generación, ahora que ¿os imaginas lo potente que es en un TR?; pues de hecho es (mucho) más rápido que usar el VDP
Respecto a cual usar; pues dependerá de lo que se quiera volcar y de su geometría en pantalla. ¿Te acuerdas aquel comentario de Sapphire hablando de la "multitarea"?, si por ejemplo, se trata de un volcado en el que el ancho no es de 32 bytes (si hablamos de NAMTBL) y por tanto te ves obligado a sumar una cantidad al puntero a la VRAM, puedes hacerlo de manera que esta operación sea el propio retardo, vamos que procura no usar NOPs, que eso es desperdiciar el Z80
.
- Está claro que el VDP de los
MSX1 no soporta un flujo continuo de datos,
necesita forzosamente alguna pausa entre OUTs . Esa es la razón de porque no funciona el OTIR en los MSX1; bueno, para ser precisos si que funciona; pero cuantos más datos le hagamos volcar el riesgo de que se nos vaya a la porra se incrementa. Lo mejor es usarlo para transferencias mínimas.
- La pausa que tenemos que dejar es lo que levanta más discusiones. Históricamente se hablaba de 8T, recientemente
dvik en un hilo de MRC comentaba que se necesitan 16T (en ningún caso estoy contanto los ciclos empleados por el propio OUT), la BIOS deja 40T y yo empíricamente he llegado a dejar lo mínimo, 5T y ha funcionado.
- Hay muchos modelos de MSX1, no se cual se puede considerar el más lento. Personalmente, el HB-75P lo tengo considerado como equipo lento, únicamente porque fue de los primeros en llegar a España, la pregunta es ¿cuales son los primeros modelos MSX1 que aparecieron en el mercado?. Ya se que probablemente esos modelos incorporaran memorias lentas en sus primeras series y que luego se actualizará su hardware; pero es por tener alguna referencia. Con esa información se podría tratar de averiguar, a base de testeos, cual es el mínimo retardo necesario para que funcione en el 99,99% de los aparatos.
En el "Caverns of Titan" yo tengo las siguientes estructuras:
.LOOP: out ($98),a
nop
djnz .LOOP
Funciona en todos los equipos que he probado. Si le quitas el NOP se va al carajo. Lo podeis comprobar en el texto parpadeante de la pantalla inicial del juego.
outi
nop
E indefinidamente repites las anteriores instrucciones. Funciona bien para todo lo que lo he usado : caracteres animados sobre todo (cascadas, puerta, rayos, etc.).
.LOOP: outi
jp nz,.LOOP
Idem que el anterior. Lo uso en la rutina de impresión de carácteres.
El OTIR sólo lo uso en la rutina de BiFi de cambio de paleta, que como son pocos bytes no pasa nada.
Bueno, ya está bien, que me duele muuuuucho la cabeza y empiezo a no tener claro lo que he escrito
P.D.: ¿Lo de los 3,5Kb era broma, no, Robsy?