1) El famoso scroll del MSX. Según he podido leer hay diversas técnicas, pero la única que he llegado a entender es aquella en la que se tiene dos sets de tiles para el escenario, siendo el segundo set el mismo que el primero, pero 4 pixeles subido. De tal modo que alternando entre un set y otro se consigue un efecto mas suave. Esto es así? Aun no he podido probar el programa en la maquina real, no supondrá esta técnica una penalización de velocidad? o el volcado a los bancos de tiles a la VRAM son lo suficientemente rápidos para llevar a cabo esta técnica?
Asumo que hablas de MSX1, ya que MSX2 o superior tienen "scroll" (sí, entrecomillado) por hardware.
Hay muchas formas de hacer el scroll en MSX1 y dependen, en gran medida, de qué quieres mover, en qué screen y en qué dirección. Lo que tú comentas sirve para hacer un scroll vertical de 4 pixels en 4 pixels, en lugar de un scroll carácter a carácter (que sería de 8 en
.
El volcado a VRAM será más rápido cuanto menos tengas que volcar. Pero podría darte para volcar prácticamente toda la pantalla.
<publi>Si quieres ver esta técnica llevada al extremo (scroll pixel a pixel), échale un vistazo a mi juego QBIQS
</publi>
2) Como he dicho en la anterior pregunta, aun no he podido probrar el programa en el ordenador real. Esto es porque el cartucho MegaFlash SCC+ es muy caro y aun no me he decidido a comprarlo. Ello me ha llevado a preguntarme si no es posible meter el juego en otros formatos que no sean rom, pero aunque he buscado mucho, no he encontrado ningún sitio que indique como compilar para disquete o cassete. Como se hace?
La ventaja del formato ROM es que todo es mucho más natural. Si tu ROM no tiene más de 48K lineales puedes cargarla a través de disquete con el excelentísimo programa ODO.
3) Según me ha parecido entender, no se puede tener tiles con el atributo de tamaño normal mezclados con tiles con el atributo de tamaño doble, a no ser que se haga algún truco con las interrupciones. Esto es así?
Si cambias "tile" por "sprite", sí, es así.
4) El tema de las interrupciones. Es algo que he leído muchas veces pero no llego a entender el concepto de un modo claro.
El siguiente ejemplo expuesto, es posible con las interrupciones?
a) Pongo los tiles en la mitad de la pantalla arriba
b) Pongo 32 sprites en la primera mitad de arriba de la pantalla
c) Interrupción
d) Pongo los tiles en la mitad de la pantalla abajo
e) Pongo 32 sprites en la parte inferior de la pantalla
f) Como resultado se ven 64 sprites en la pantalla, superando el limite por hardware de 32 sprites al mismo tiempo
Es esta suposición correcta?
No en MSX1, ya que el VDP no puede generar interrupciones que no sean de vblank. La única forma sería sacrificar dos sprites y ponerlos superpuestos a mitad de pantalla. Entonces se tendría que hacer un bucle que estuviera comprobando el bit de colisión de sprites y, en el momento en el que se detecte la colisión, cambiar la tabla de atributos de sprites. De esa forma tendrías unos 30 sprites para la parte superior y 32 para la inferior: 62 sprites.
Y ojo, el volcado a VRAM es lo más crítico, porque es lo que más tarda y lo más dependiente de si el VDP está pintando o no. Lo ideal es realizar este volcado durante el vblank (que es el tiempo entre que salta la interrupción de vblank, al pintar la última línea visible de pantalla, y se comienza el dibujado de la primera línea del siguiente frame). A ese tiempo le tienes que descontar lo que emplee la BIOS si es que la utilizas, claro está.
Por lo tanto, lo ideal es volcar TODO a VRAM en ese tiempo. Ten en cuenta que te va a dar escasamente para actualizar los tiles de toda la pantalla, por lo que lo primordial es el diseño: tener muy claro qué hay que actualizar y sólo actualizar eso.
En caso afirmativo, alguien puede ponerme un pequeño ejemplo? En caso negativo, alguien podría explicarme lo de las interrupciones de tal modo que hasta un niño de 5 años entendiera?
Cuando se termina de pintar la última línea visible, y antes de pintar la primera línea con el color de borde de la parte inferior, el VDP genera una interrupción llamada vblank. Si el procesamiento de las interrupciones está activado, en ese momento se produce un salto a una dirección de memoria que va a depender del modo de interrupción en el que el Z80 esté en ese momento. Lo normal es que esté en modo IM1, así que se salta a #0038.
Esa rutina se ejecuta, por tanto, cada vez que se termina de dibujar la pantalla: unas 50 veces por segundo en PAL y 60 en NTSC. Es la forma básica de controlar el tiempo en MSX y sincronizar las acciones pertinentes. Cuando se termina la rutina de interrupción, se vuelve al punto donde se había interrumpido (jejeje) la ejecución, la cual sigue.
A grandes rasgos eso es una interrupción. El VDP de los MSX2 y superiores pueden generar otros tipos de interrupción. Otros cacharros pueden generar otro tipo de interrupciones. TODAS ELLAS van a provocar un salto a la misma dirección (#0038 en modo IM1), por lo que si tuvieras que tratar varios tipos de interrupciones, la rutina de #0038 debe comprobar cuál se ha producido. Eso lo hace bastante bien la BIOS, que proporciona unos ganchos en la parte superior de la RAM donde puedes poner un salto a tu rutina de tratamiento de interrupciones.
Hay manera de superar la limitacion de 4 sprites por linea con esta técnica?
No sin parpadeos.
5) El tema de la música. He visto algunas librerías para reproducir música. Me gustaría entender como funciona mas o menos.
Según me ha parecido entender, la forma mas básica de reproducir música seria con un array de sonidos pasándolos por una función que va leyendo los datos dinamicamente y durante toda la ejecución del programa, para ir emitiendo los sonidos uno a uno y en orden cronológico. Esto es correcto?
Lo primero es saber qué chip quieres usar. Para cada chip hay diferentes programas que permiten hacer música y/o efectos de sonido. Luego sería utilizar el reproductor adecuado, incluir en el código el fichero de música (en el formato que te grabe el programa) y seguir las instrucciones de uso del reproductor.
Por ejemplo, el vortex tracker graba un fichero .pt3, tú lo metes en el código como un binario y el reproductor que hay para asMSX tiene una serie de rutinas que te permiten inicializar la música y luego generar los valores que hay que volcar en los registros de sonido. Yo lo que hago normalmente es seguir este patrón:
esperar interrupción vblank
volcar datos a VRAM (siempre lo más crítico)
volcar datos a registros de sonido
leer mandos
calcular cambios en la visualización para el siguiente frame
generar datos de sonido para el siguiente frame
esperar interrupción vblank...
6) Guardado de datos. Es posible guardar records? Como se hace? Es posible hacerlo independientemente de si el programa se compila como .cas, .dsk o .rom?
Siempre es posible, pero depende de dónde lo quieras guardar:
- ¿En la propia ROM? Necesitas que sea FLASH y hacer las rutinas de guardado.
- ¿En el cassete? Pues necesitas las rutinas de lectura y grabación de/al cassette.
- ¿En el disco? Tres cuartos de lo mismo, aparte de tener que meterte con el S.O.
Como ves tus preguntas suscitan más preguntas, pero sigue así