Releyendo el libro “The machine language book of the Commodore 64” de Lothar Englisch he recordado algunas cosas de interés:
Hoy en día solemos trabajar con ensambladores cruzados (cross assemblers), es decir, programas que se ejecutan en Windows, Linux o Mac y que generan código máquina para el C64. Hay varios ejemplos: CBM prg Studio, Kick Assembler, ACME Cross-Assembler, etc.
En los 80, lógicamente, también se trabajaba con ensambladores, desensambladores y simuladores, pero, a diferencia de lo que hacemos hoy en día, aquellos programas se ejecutaban en C64 y generaban código máquina también para C64. Algunos estaban programados en BASIC (como los del libro “The machine language book of the Commodore 64”) y otros en código máquina. Algunos eran ensambladores, desensambladores o simuladores puros, y otros tenían mezcla de varias funciones. Y, entre ellos, uno de los que más me gustaba era Machine Lightning, aunque nunca llegué a dominarlo ni de lejos.
Y luego había un tipo especial de programas que se llamaban “monitores” o “monitores de código máquina”. Su función es un poco difícil de explicar porque, como digo, estos programas normalmente mezclaban varias funciones:
- Ensamblador: Un ensamblador es un programa que permite escribir programas en ensamblador y ensamblarlos, es decir, generar el código máquina. Esta es su función principal, pero luego hay otras funciones accesorias: grabar y cargar código ensamblador (fuente), grabar y cargar código máquina (objeto), etc. Sería el equivalente a un compilador en un lenguaje de alto nivel.
- Desensamblador: Un desensamblador es un programa que recibe un rango de posiciones de memoria, lee el código máquina ahí almacenado, y genera el código ensamblador. Sería el equivalente a un decompilador en un lenguaje de alto nivel.
- Simulador: Un simulador es un programa que recibe un programa en código máquina y simula su ejecución, viendo el efecto que la ejecución tendría sobre los registros del microprocesador y/o la memoria. La ejecución puede ser simulada o real, instrucción a instrucción o varias instrucciones de golpe, etc. Permite cambiar el contenido de los registros y/o posiciones de memoria, etc. El equivalente en un lenguaje de alto nivel sería un depurador.
- Monitor: Un monitor es parecido a un simulador / depurador. También recibe un programa en código máquina y permite su ejecución (en este caso real, no simulada), así como ver el estado del microprocesador y la memoria, y cambiarlos. La principal diferencia, además de que la ejecución es real y no simulada, es que utiliza interrupciones por software. Es decir, utiliza la instrucción BRK a modo de punto de ruptura. Cuando esta instrucción se encuentra en el programa a ejecutar (normalmente introducida artificialmente con el objeto de depurar), se produce una interrupción, y pasa a ejecutarse el monitor. Esto permite al usuario / programador revisar el estado del microprocesador y la memoria, cambiar su estado, cargar o grabar programas, desensamblar zonas de memoria, rellenar zonas de memoria con valores, etc.
Uno de los monitores más conocidos en su día era Supermon64 de Jim Butterfield:
VICE actualmente también tiene su propio monitor (accesible con ALT + M):
Finalmente, el cartucho Final Cartridge y el ensamblador Machine Lightning también tenían su monitor. Machine Lightning, además, incluía programas para diseño de gráficos, así como librerías de rutinas en código máquina para el manejo de los mismos:
¿No es increíble la cantidad de herramientas que había y lo potentes que eran?