Programando como si fuera 1982. Parte II – El Procesador
En la Parte I cubrimos el panorama: la época, la máquina, el contexto. Ahora es el momento de bajar un nivel y entender cómo funciona realmente el procesador. Dónde viven los datos, cómo se leen las instrucciones y qué ocurre cada fracción de segundo mientras un programa se ejecuta.
Registros: el espacio de trabajo del procesador
Cuando escribes algo como x = 5 + 3 en cualquier lenguaje moderno, el procesador necesita coger el 5 de algún sitio, coger el 3 de algún sitio, sumarlos y guardar el resultado. Ese “algún sitio” son los registros.
Un registro es un espacio de almacenamiento que vive dentro del propio procesador. La RAM es un almacén enorme en el exterior. El procesador tiene que hacer un viaje hasta allá para buscar cualquier cosa. Un registro es el bolsillo del procesador: diminuto, pero instantáneo.
Toda operación aritmética o lógica ocurre dentro de los registros. La RAM es simplemente donde guardas las cosas cuando no las estás usando activamente.
El MOS 6510 del Commodore 64 tenía exactamente tres registros de uso general:
A, el Acumulador. El registro principal. Prácticamente toda operación pasa por él: sumas, restas, operaciones lógicas, lectura y escritura en memoria. El nombre viene de acumular resultados. Si el 6510 fuera una cocina, el A sería la tabla de cortar. Todo pasa por allí en algún momento.
X e Y, los Registros de Índice. Funcionan como contadores y punteros de posición. El nombre viene de índice, como el índice de un array. ¿La i de un bucle for en Python? Ese era exactamente el papel del X o del Y en assembly. Los usabas para recorrer listas, navegar por la memoria, contar iteraciones.
Tres registros es muy poco, y era intencionado. En 1975, cuando se diseñó el 6502, cada registro costaba transistores, y los transistores costaban dinero y espacio físico en el chip. La mentalidad de ingeniería de la época era hacer más con menos. En la práctica, esto significaba que el programador tenía que planificar con cuidado qué registro iba a contener qué dato, y guardar temporalmente valores en la RAM siempre que los tres estuvieran ocupados. Era como programar con solo tres variables disponibles en cualquier momento.
El ciclo de ejecución: cómo lee un programa el procesador
Aquí hay algo que cambia para siempre la forma en que ves un programa: para el procesador, no existe distinción entre código y dato. Todo en memoria son bytes. Lo que hace que un byte sea una instrucción es simplemente el hecho de que el procesador esté apuntando a él en el momento adecuado.
El procesador funciona en un ciclo eterno y muy simple:
1. Lee el byte en la dirección a la que apunta el PC
2. Interpreta ese byte como una instrucción
3. Ejecuta la instrucción
4. Avanza el PC
5. Repite
El PC aquí es el Program Counter, un registro especial que no almacena datos del programa sino la dirección de la siguiente instrucción a ejecutar. Su único trabajo es decirle al procesador dónde está en el mapa de memoria. Es el cursor de ejecución.
Este ciclo nunca se detiene. Mientras el C64 esté encendido, el 6510 está repitiendo este bucle millones de veces por segundo, leyendo un byte, ejecutando, avanzando, leyendo el siguiente. Sin scheduler, sin sistema operativo gestionando nada de esto. Solo el procesador funcionando en piloto automático, sin pausa.
Cuando un programa se colgaba en el C64, lo que solía ocurrir es que el PC acababa apuntando a una dirección con datos aleatorios, y el procesador intentaba interpretar esos bytes como instrucciones válidas. El resultado era impredecible: a veces la pantalla se congelaba, a veces aparecía basura, a veces el ordenador se reiniciaba. No había red de seguridad. Ninguna en absoluto.
Registros especiales
Además del A, X e Y, el 6510 tenía tres registros más que no almacenan datos del programa sino que controlan el funcionamiento del propio procesador:
El PC (Program Counter) ya lo hemos visto: apunta a la siguiente instrucción.
El SP (Stack Pointer) apunta a la cima de la pila, una región especial de memoria usada para guardar las direcciones de retorno cuando el programa llama a una subrutina. Cuando saltas a una rutina y vuelves, el SP es lo que recuerda dónde estabas antes de la llamada.
El SR (Status Register) es diferente de todos los demás: en lugar de almacenar un número, guarda 8 bits independientes llamados flags, cada uno con un significado específico. Un flag se activa cuando el resultado de una operación es cero. Otro cuando el resultado es negativo. Otro cuando una suma desbordó el límite de un byte. Estos flags son la base de cada decisión que toma un programa: los if, los bucles, las comparaciones. Profundizaremos en esto en la Parte IV.
Registros de uso general: A X Y
Registros de control: PC SP SR
En el próximo post salimos del procesador y miramos lo que lo rodea: la RAM, cómo está organizada en direcciones, qué es realmente el hexadecimal y por qué ciertas regiones de la memoria valían su peso en oro.