406
Ensamblador / Re:Dudas en Ensamblador
« en: Julio 18, 2015, 01:50:07 »
Si no te quieres complicar la vida con las coordenadas, y puedes sacrificar un poco de suavidad en el movimiento, podrias usar en los sprites coordenadas de pixel doble, ya que por lo general los juegos suelen usar el modo multicolor de 160 puntos.
Lo que tendrias que hacer es guardar las coordenadas X de cada sprite en una posicion de memoria, y periodicamente actualizar eso en los registros del VIC, previamente multiplicando por 2 estas coordenadas. Para esto, usas la instruccion ASL, que corre a la izquierda los bits del parametro, en este caso la "variable" donde guardas la coordenada X del sprite. Esta instruccion, a diferencia de ROL, coloca automaticamente un 0 en el bit 0 (ROL coloca ahi el valor de carry), y el bit 7 que se pierde se copia a carry, por lo que despues deberias colocar el valor de carry en el bit mas significativo de la coordenada X en el registro correspondiente del VIC para ese sprite.
De esta manera al mover el sprite incrementarias 1 pixel, pero al actualizar a traves de esa rutina se incrementarian 2, internamente tu manejarias coordenadas de 0 a 159, pero en la pantalla manejarias de 0 a 319, avanzando de a 2 puntos.
Solo tendrias que tener en cuenta que para leer las coordenadas X desde el VIC deberias dividir por 2 si quieres obtenerlas tambien en un rango de 0 a 159, esto lo harias con la instruccion ROR, que rota el parametro hacia la derecha, colocando en el bit 7 el valor de carry, y el bit 0 perdido en carry, por lo que primero deberias leer el bit mas significativo de la coordenada X de ese sprite desde el VIC, y colocar este valor en carry, luego usar ROR con el registro de coordenada X de ese sprite (para dividirlo por 2 incorporando carry en el bit 7), y en carry te quedaria el bit 0 que ya no te importa.
Lo que tendrias que hacer es guardar las coordenadas X de cada sprite en una posicion de memoria, y periodicamente actualizar eso en los registros del VIC, previamente multiplicando por 2 estas coordenadas. Para esto, usas la instruccion ASL, que corre a la izquierda los bits del parametro, en este caso la "variable" donde guardas la coordenada X del sprite. Esta instruccion, a diferencia de ROL, coloca automaticamente un 0 en el bit 0 (ROL coloca ahi el valor de carry), y el bit 7 que se pierde se copia a carry, por lo que despues deberias colocar el valor de carry en el bit mas significativo de la coordenada X en el registro correspondiente del VIC para ese sprite.
De esta manera al mover el sprite incrementarias 1 pixel, pero al actualizar a traves de esa rutina se incrementarian 2, internamente tu manejarias coordenadas de 0 a 159, pero en la pantalla manejarias de 0 a 319, avanzando de a 2 puntos.
Solo tendrias que tener en cuenta que para leer las coordenadas X desde el VIC deberias dividir por 2 si quieres obtenerlas tambien en un rango de 0 a 159, esto lo harias con la instruccion ROR, que rota el parametro hacia la derecha, colocando en el bit 7 el valor de carry, y el bit 0 perdido en carry, por lo que primero deberias leer el bit mas significativo de la coordenada X de ese sprite desde el VIC, y colocar este valor en carry, luego usar ROR con el registro de coordenada X de ese sprite (para dividirlo por 2 incorporando carry en el bit 7), y en carry te quedaria el bit 0 que ya no te importa.