Hola amigos,
El juego "TibuRon" ya es jugable de principio a fin. Estoy a la espera de jojo073 para llevar a cabo los últimos retoques/añadidos.
He querido hacer un experimento:
- cargar las pantallas al final de la RAM y luego copiar los datos sobre el área de pantalla al vuelo sin que el usuario lo note (256x156)
lo cual equivale a 32 bytes por linea y 156 líneas (casi 5k).
Para ello he utilizado una técnica que en los foros de CoCo3 se llama StackBlast, básicamente utilizando los dos punteros del stack
(el de sistema S y el de usuario U) para mover de golpe OCHO bytes (registros A,B,CC,DP de 8 bits y los registros X,Y de 16) en cada instrucción.
Ello comporta un montón de problemas ya que al mangonear la página directa DP en cada lectura, si se produce una interrupción
y la rutina del sistema requiere apuntar a la página cero, seguro que casca todo.
Además a cada lectura se modifica también el registro CC por lo que bloquear las interrupciones mediante este registro fracasa, hay que buscar alternativas ... Por ejemplo, bloquear los IRQs a nivel hardware!
Asumiendo que podemos leer en una instrucción 8 bytes y en la siguiente grabarlos, adaptando uno de los punteros para ir en secuencia,
en cuatro veces se copia una fila de pantalla (8x4=32 bytes). El tema es que esto requiere emplear 132 ciclos de reloj que para 156 lineas
a copiar resulta en 20.592 ciclos.
Si conseguimos detectar el final de cuadro, podemos trabajar a escondidas del VDG durante 120 lineas o sea 6.840 ciclos, todo lo que
se haga luego ya será con el VDG actualizando la pantalla pisándonos los talones!
Problema:
- En el tiempo que usa el VDG para llegar a la primera linea de pantalla, es decir en las 120 lineas, disponemos de 6.840 ciclos que
a razón de 132 para copiar cada línea, nos habrá permitido llegar hasta la 52 solamente.
Nos quedan todavía 104 lineas por actualizar lo cual ya pinta muy mal. Imaginemos que hacemos 50 líneas mas (50x132) son 6.600 ciclos,
mientras tanto la VDG habrá redibujado (6.600/57) 115 líneas, es decir ya nos habrá pillado y rebasado.
Nosotros estaremos por la 52+50 o sea la linea 102. Derrota absoluta = parpadeo!
Existe una solución (o mas), ¿Alguien puede aportar alguna idea al respecto?
En un próximo mensaje explicaré la solución que me dió Stewart Orchard del grupo World of the Dragon, con quien colaboré al hacer
la conversión de la ROM del cartucho Orchestra-90 de CoCo para Dragon. Un gran experto en Dragón (hard y soft)
A ver quien se anima!
saludos
pere