Como ya se ha dicho, el C64 se llama así precisamente porque es capaz de gestionar 64K de memoria. Efectivamente, esto es así, ya que el C64 tiene un bus de direcciones de 16 bits. Por tanto, dado que cada línea del bus puede tomar 2 valores (0 o 1), eso nos da 2^16 o 65.536 direcciones o, lo que es lo mismo, desde la dirección 0 ($0000 en hexadecimal) hasta la dirección 65.535 ($ffff en hexadecimal).
Para programar con el C64, y especialmente en ensamblador, es fundamental conocer bien ese mapa de memoria ya que, como veremos más adelante, el 90% de la programación básicamente consiste en leer y/o escribir valores en memoria.
64K de memoria puede parecer algo sencillo de manejar, pero la realidad es algo más compleja, ya que:
- Muchas de esas 64K posiciones de memoria tienen propósitos específicos. Pueden ser registros del chip de vídeo (VIC), registros del chip de sonido (SID), registros para entrada/salida, etc. Y lo primero para poder usarlas es conocerlas y saber dónde están. Por ejemplo, para manejar sprites hay que conocer los registros del VIC dedicados a este propósito.
- Dentro del mismo espacio de memoria (esas 65.536 posiciones) hay zonas de memoria RAM, de lectura y escritura, y zonas memoria ROM, de sólo lectura. Por ejemplo, están en ROM el intérprete de BASIC, el mapa de caracteres estándar, y las rutinas del Kernal.
- Es más, hay zonas donde la ROM y la RAM se solapan (comparten direcciones), y hay que saber qué hacer para leer o escribir de una o de otra. De hecho, se suele decir que el C64 aplica un modelo de “RAM bajo ROM”.
- El microprocesador 6510 es básicamente igual que el 6502, con el mismo juego de instrucciones, pero con flexibilidad para manejar distintos mapas de memoria. Es decir, en el C64 es posible configurar diferentes mapas de memoria, por ejemplo, desactivando determinadas zonas de ROM cuando no son necesarias.
El mapa de memoria clásico al arrancar el C64, si no se configura ninguna otra opción, es como sigue:
En este mapa de memoria se pueden observar:
- $0002-$00ff: La página cero.
- $0100-$01ff: La pila (página uno).
- $0200-$9fff: 40K de RAM. En esta zona se incluyen casi 1K de RAM de pantalla ($0400-$07e7) y 38K para programas en BASIC ($0801-$9fff; estos son los famosísimos “38.911 BASIC BYTES FREE”).
- $a000-$bfff: El intérprete de BASIC (ROM).
- $c000-$cfff: 4K de RAM, donde con mucha frecuencia se ha ubicado la programación en ensamblador.
- $d000-$dfff: Los chips de vídeo (VIC), sonido (SID), RAM de color (para la pantalla), y dispositivos de entrada/salida.
- $e000-$ffff: Las rutinas del Kernal (ROM).
Lo cual nos da pie a comentar el concepto de “página”. Una página es un segmento de 256 posiciones de memoria consecutivas. Pero no pueden ser arbitrarias, tienen que ir desde una posición $xx00 hasta una posición $xxff. Por ejemplo, la página cero va de la $0000 hasta la $00ff, y la pila/página uno desde la $0100 hasta la $01ff. Dicho de otro modo, los 64K de memoria del C64 se organizan en 256 páginas (desde la página $00 hasta la $ff) de 256 bytes cada una (desde el byte $00 hasta el $ff).
La página cero es especial porque sus posiciones se pueden especificar con sólo un byte, el byte menos significativo, dando por hecho que el byte más significativo es $00. Además, el micro requiere menos ciclos de reloj para acceder a esas posiciones. Tanto es así que hay un modo de direccionamiento específico para esta página, que se llama direccionamiento de página cero. Más adelante se revisarán el concepto y los tipos de modos de direccionamiento; baste adelantar ahora que son las formas de acceder a la memoria.
Y la página uno también es especial, porque en ella se guarda la pila, es decir, la secuencia de llamadas a subrutinas o, con más precisión, las direcciones en las que seguir ejecutando el programa cuando terminen esas subrutinas.
En el fondo, todas las zonas de memoria son “especiales”, porque cada zona tiene su uso. Quitando quizás las zonas de 40K+4K de RAM, que tienen un propósito más general (almacenar datos y programas de usuario), todo lo demás tiene unos u otros usos específicos. Por eso es importante conocer el mapa, sus zonas, y sus usos.
Y siempre sin olvidar que el C64 admite configurar diferentes mapas de memoria. El comentado en detalle aquí es el mapa de uso más general. Esta configuración de mapas se realiza la modificando los valores de las posiciones $0000 y $0001.
Programa de ejemplo: Prog05