Ensambladores, desensambladores, simuladores y monitores

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.

Machine Lightning

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:

Supermon

VICE actualmente también tiene su propio monitor (accesible con ALT + M):

Monitor VICE

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:

Machine Lightning 3¿No es increíble la cantidad de herramientas que había y lo potentes que eran?

Algunos libros clásicos

Os presento mis últimas adquisiciones, dos libros clásicos:

Dos libros

El primero es el libro “Mapping the Commodore 64” de Sheldon Leemon. Se trata un mapa de memoria del C64, es decir, de una descripción de la memoria del C64 posición de memoria a posición de memoria.

Es un libro muy interesante porque, como hemos comentado muchas veces, para programar el C64 no es suficiente con saber ensamblador del 6510. Además, hay que conocer bien el mapa de memoria, es decir, en qué posiciones se ubica qué. Por ejemplo, hay que conocer los registros del VIC, del SID o de los CIAs.

En principio, es un libro de referencia o consulta, pero se lee con facilidad. Las partes que puedan resultar un poco más arduas, o menos interesantes, por ejemplo, el intérprete de BASIC, se leen con menos profundidad y ya está.

El segundo es “The machine language book of the Commodore 64” de Lothar Englisch. Es la versión americana de la edición que en su día publicaron Data Becker y Ferré Moret para España:

Data Becker

Me hubiera encantado encontrar la edición española, que es la que me leí hace treinta años, pero me ha resultado imposible.

En todo caso, el contenido de ambas ediciones es el mismo, y gira en torno al ensamblador del 6510. Incluye algunos temas dedicados a un ensamblador (programa para ensamblar, no el lenguaje), un simulador (hoy lo llamaríamos depurador o debugger), un desensamblador, etc., que seguramente en su día tendrían sentido, pero que hoy en día ya no tienen mucho sentido con las modernas herramientas de que disponemos (ej. CBM prg Studio).

Por supuesto, me lo voy a leer, porque para eso me lo he comprado, y además la nostalgia me puede, pero me da la impresión de que para aprender ensamblador del 6510 seguramente esté mejor “Assembly Language Programming with the Commodore 64” de Marvin L. De Jong:

De Jong

En definitiva, libros clásicos e interesantes que se pueden coleccionar (se venden por Internet, aunque son carillos) o disfrutar en línea (ver Archive.org).