Scroll horizontal y vertical

El scroll es una característica gráfica muy interesante. Permite mover la información que se muestra en pantalla suavemente, pixel a pixel. El movimiento puede ser hacia arriba, hacia abajo, hacia la derecha o hacia la izquierda.

Todos hemos visto el efecto del scroll en juegos. La idea es simular el movimiento del personaje, que en realidad está fijo, moviendo el contenido del resto de la pantalla. También es muy parecido a lo que ocurre en una aplicación de PC cuando usamos la barra de scroll porque un documento ocupa más que la ventana.

La pantalla del C64 en principio tiene 25 filas por 40 columnas. Sin embargo, tienes dos modos, el modo de 38 columnas y el de 24 filas, que guardan mucha relación con el scroll. Para verlo más claramente vamos a fijarnos en el scroll horizontal, y más concretamente la situación en que la información nueva entra por la izquierda y la vieja sale por la derecha.

Para que este scroll de izquierda a derecha sea suave, la información nueva que entra por la izquierda tiene que estar lista, digamos pintada, aunque sin verse, en el extremo izquierdo de la pantalla. De este modo, cuando la pantalla se desplaza un pixel hacia la izquierda, cuyo efecto visual equivale a que entra un pixel nuevo por la izquierda, hay información lista para ser mostrada.

Pues bien, este “tener información lista pero que no se ve” se consigue con el modo 38 columnas cuando el scroll es horizontal, y con el modo 24 filas cuando el scroll es vertical. La pantalla sigue teniendo 40 columnas y 25 filas, pero hay dos columnas (la de la izquierda y la de la derecha) que no se ven, o una fila (la de arriba o la de abajo) que no se ve.

Scroll.PNG

El modo 38 columnas se activa poniendo a 0 el bit 3 del registro $d016, que también se utiliza para el modo carácter multicolor y el modo bitmap multicolor. Y el modo 24 líneas sea activa poniendo a 0 el bit 3 del registro $d011, que también se utiliza para el modo bitmap estándar y el modo bitmap multicolor.

Una vez que tenemos la pantalla en el modo 38 columnas (o 24 filas en el caso de scroll vertical), hay que desplazar la pantalla hacia la izquierda. Esto se consigue actuando sobre el registro $d016, concretamente sobre sus bits 0, 1 y 2. Con tres bits podemos establecer 8 valores, desde el 0 hasta el 7, que representan los 8 pixels que se puede mover la pantalla a derecha o izquierda.

En nuestro caso, como queremos hacer scroll de izquierda a derecha (visualmente la información entra por la izquierda y sale por la derecha), lo cual equivale a desplazar la pantalla hacia la izquierda, empezaremos con el valor %000 y lo iremos subiendo hasta el valor %111.

Si el scroll fuera de derecha a izquierda, es decir, desplazar la pantalla hacia la derecha, lo haríamos el revés, empezaríamos en %111 y lo bajaríamos hasta %000.

Llegará un momento en que el scroll alcance su tope, es decir, %111 al hacer scroll de izquierda a derecha. En ese momento, lo que hay que hacer es copiar toda la pantalla desplazada un carácter hacia la derecha, volver a poner el scroll en %000, y alimentar datos nuevos en la columna 1 (oculta).

Scrollx.gif

Análogamente, si el scroll fuera de derecha a izquierda, al alcanzar el tope de %000, habría que copiar toda la pantalla desplazada un carácter hacia la izquierda, volver a poner el scroll en %111, y alimentar datos nuevos en la columna 40 (oculta).

El scroll vertical sigue los mismos principios que el scroll horizontal, pero hay alguna pequeña diferencia. En vez de dos columnas ocultas (modo de 38 columnas) sólo tenemos una fila oculta (modo de 24 filas). Y en vez de desplazar la pantalla con el registro $d016 (bits 0, 1 y 2) lo hacemos con el registro $d011 (bits 0, 1 y 2). Cuando el desplazamiento vale %000 la fila oculta es la primera, y es ahí donde se deben alimentar los datos nuevos. Cuando el desplazamiento vale %111 la fila oculta es la última.


Programa de ejemplo: Prog46

2 comentarios en “Scroll horizontal y vertical”

  1. A medida que uno va leyendo el libro… le apetece ejecutar mas ejemplos. Aunque soy un desordenado. 🙂

    Una pregunta, que igual es debido a que tengo una versión antigua del CBM Studio. (Tengo la 2.6.0)

    Cuando compilo el ejemplo Prog46, las instrucciones de comparación cmp #’A’ y carga acumulador lda #’A’ (por citar algunas de las 8 sentencias), me reporta error de variable no definida.

    Para que me ejecute el ejemplo, tengo que quitar la almohadilla, cuando se supone que la almohadilla es para definir que es INMEDIATO.

    Si quito la almohadilla cmp ‘A’, me compila como C9 41, que es inmediato. Lo mismo con el lda ‘A’, que me lo compila como A9 41.

    Quiero decir… LDA #’A’, se supone que es la sintaxis correcta. (Inmediato con ASCII)

    Pero… me he encontrado este problema en mi versión del CBM Studio versión 2.6

    ¿Me confirmas que soy yo el de los problemas? 🙂

    Si es así… me cambio de versión pero YA!

    Un saludo

    Me gusta

    1. Hola, Jeff.

      Casi seguro que tiene que ver con el ensamblador que utilizas, su versión, o su configuración.

      Cuando uno hace LDA $17, $17 puede ser una dirección de página cero, el LSB de una dirección $XX17, o el valor literal $17 (modo inmediato). Por eso, para distinguir entre una dirección y un valor, se utiliza el #, utilizándose este último en el caso de tratarse de un valor (modo inmediato).

      Sin embargo, cuando uno hace LDA ‘A’ o LDA “A” no debería haber lugar para confusión o ambigüedad. En este caso, tiene que tratarse de un valor (un código de pantalla un carácter PETSCII). Por ello, el ensamblador perfectamente podría interpretar que se está usando o se quiere usar el modo inmediato, incluso sin exigir el #.

      Sin embargo, diferentes ensambladores reaccionan de modo diferente ante esta situación:

      – Los hay laxos, que interpretan por igual (modo inmediato) tanto LDA ‘A’ como LDA #’A’.
      – Los hay estrictos, que te fuerzan a usar LDA #’A’ aunque en este caso no pueda haber ambigüedad.
      – Los hay configurables, y que aceptan un modo de funcionamiento u otro según cómo se configuren.

      Revisa a ver cómo se comporta tu ensamblador. Puedes hacer varias cosas:

      – Cambiar su configuración, si es que es posible.
      – O adaptar un poco el código fuente. Tampoco pasa nada por hacerlo.
      – O cambiarte a la versión de CBM prg Studio que he usado yo (3.13).

      Un saludo.

      Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s