Punteros de sprites

En la entrada anterior hemos visto que un sprite se define con 64 bytes. La forma de obtener esos bytes es agrupando de 8 en 8, de izquierda a derecha y de arriba abajo, los bits/pixels de la matriz de 504 pixels, más un byte extra para alinear a 64.

¿Y ahora qué hacemos con esos 64 bytes? ¿Dónde los ubicamos en la memoria? ¿Cómo le indicamos al VIC dónde encontrarlos? La respuesta a estas preguntas es mediante los “punteros de sprites”.

Los “punteros de sprites” son 8 posiciones de memoria, una por sprite, que le indican al VIC dónde encontrar la definición de los sprites (sus 64 bytes). Pero, si una posición de memoria en el C64 se especifica mediante 16 bits (o 2 bytes), ¿cómo es posible usar sólo un byte para indicar dónde empieza la definición de un sprite?

La respuesta es que tiene truco. El VIC es capaz de direccionar 16 KB de memoria (no 64 KB, que es lo que puede direccionar el 6510). Y si dividimos 16 KB (16.384 bytes) en bloques de 64 bytes, salen 256 bloques. Y cada uno de esos 256 bloques se puede identificar con un solo byte, porque con un byte se pueden codificar 256 valores.

Por tanto:

  • La definición de los sprites la tenemos que ubicar en el banco de 16 KB direccionados por el VIC, que en el mapa de memoria estándar del C64 es el banco que va desde la posición $0000 hasta la $3fff (el banco más bajo de los 4 bancos de 16 KB).
  • La definición de los sprites no la podemos ubicar en cualquier posición dentro de esos 16 KB. Cada sprite tiene que empezar en una posición que sea múltiplo de 64.
  • El puntero al sprite sale de tomar la primera posición de la definición y dividirla por 64. Esta división tiene que dar un resultado entre 0 y 255 y, por tanto, puede almacenarse en un byte (el puntero al sprite).

Estos conceptos se describen gráficamente en la siguiente imagen:

Punteros sprites

Por tanto, si los 64 bytes de nuestra pulga los colocamos en $3f80, que es múltiplo de 64, su puntero tendría que valer 254.

Y nos queda una última cuestión: ¿dónde se almacena el puntero? Es decir, ¿dónde se almacena ese valor 254? La respuesta es que los punteros de los sprites se almacenan en los últimos 8 bytes (hay 8 sprites) del 1 KB correspondiente a la RAM de pantalla. Es decir, en el mapa de memoria estándar, en el que la RAM de pantalla ocupa las páginas 4, 5, 6 y 7, los punteros a los sprites se almacenan en las posiciones $07f8 – $07ff.

Por tanto, si queremos que el primer sprite (sprite 0) sea la pulga, en la posición $07f8 deberemos almacenar el valor 254, y en el bloque $3f80 – $3fbf deberemos almacenar los 64 bytes que definen la pulga.

5 comentarios en «Punteros de sprites»

  1. Buenas noches, como va? Tengo una duda respecto a la memoria de sprites. Aqui se indica que dicha memoria va desde $0000 a $3fff pero de $0100 a $01ff no esta la pila? He intentado cargar un sprite en la posicion $0000 el mismo se muestra mal, incluso ha llegado a corromper el funcionamiento del Basic. Desde ya muchas gracias, saludos.

    Me gusta

    1. Hola, Carlos.

      Los punteros a los 8 sprites están en las posiciones $07f8 – $07ff. Esto en la configuración de memoria normal, porque el C64 admite diferentes configuraciones de memoria y el VIC también (puede apuntar a uno de cuatro bancos de 16 KB).

      Cada una de esas 8 posiciones puede tomar los valores 0 a 255. Pero eso no te da una dirección del C64. Para tener la dirección tienes que multiplicar ese valor 0 – 255 por 64. Por tanto, el rango de posiciones donde ubicar los sprites es (insisto, en la configuración de memoria normal):

      – 0 * 64 = 0 = $0000
      – 255 * 64 = 16.320 = $3fc0

      Y siempre empezando en una posición múltiplo de 64. Es decir, no puedes definir el sprite a caballo entre dos bloques.

      Lógicamente, en el rango de direcciones $0000 – $3fc0 (realmente $0000 – $3fff, porque el bloque 255 empieza en $3fc0 pero termina en $3fff) hay varias zonas en principio resevadas:

      – La página 0.
      – La página 1 (pila).
      – Las páginas 2 y 3 (que usan el BASIC y el Kernal).
      – La RAM de pantalla.
      – La zona de almacenamiento de programas BASIC.
      – …

      Pero también hay zonas libres. Todo esto lo puedes ver en la entrada:

      El mapa de memoria del Commodore 64

      Además, el BASIC se puede deshabilitar, y el Kernal también. Esto lo puedes ver aquí:

      Otros mapas de memoria avanzados

      En definitiva, hay muchas opciones. Quizás demasiadas, jaja.

      El programador tiene qué diseñar qué configuración de memoria va a usar, tanto para el C64 en general como para el VIC, cómo va a ser el mapa de memoria de su programa, dónde va a ubicar los recursos como los sprites y la música, etc. Y si una ubicación no tiene sentido o no es cómoda, pues a por otra…

      Si estás utilizando el mapa de memoria estándar, que es lo normal, un buen sitio para ubicar tus sprites es en los últimos bloques, es decir, hacia el final del rango $0000 – $3fff. Aquí tienes un ejemplo que ubica el sprite en $3f80:

      Posicionamiento y movimiento de sprites

      Espero que te ayude…
      HVSW.

      Me gusta

      1. Buenas tardes, muchas gracias por tu respuesta. Esto quiere decir que de $0000 a $3ffff en realidad podemos usar solo el segmento que está en ram que sería de $0200 (dónde empieza la ram) a $3fff, correcto?

        Desde ya muchas gracias.
        Saludos.

        Me gusta

  2. Hola de nuevo.

    Si vas a usar el mapa de memoria estándar, mi sugerencia es que guardes los sprites en los últimos bloques, de $3fff para abajo, porque de ese modo minimizas los problemas de interferencia con otros usos de la memoria.

    Un saludo,
    HVSW.

    Me gusta

Deja un comentario