En esta página podéis encontrar un simulador del Computador Más Sencillo Posible versión 1 (SAP-1, Simple-As-Possible Computer), propuesto por Albert Paul Malvino y Jerald A. Brown en el libro «Digital Computer Electronics» (Editorial McGraw-Hill Education).
La animación ha sido creada con fines docentes y educativos con Processing y publicada en la web mediante la librería Processing.js para la asignatura de «Fundamentos de Computadores» del Grado en Ingeniería Informática de la Universidad Rey Juan Carlos. También se utiliza regularmente en actividades divulgativas como la Semana de la Ciencia y en talleres de introducción a la Arquitectura de Computadores.
Introducción:
El SAP-1 es un computador con una arquitectura basada en un bus. Contiene los siguientes elementos:
- Bus multiplexado de datos/direcciones de ancho 8 bits.
- Registros activos por flanco, de 4 u 8 bits. Los registros que pueden escribir en el bus contienen un buffer triestado interno. Los que no escriben en él no tienen dicho buffer. Los registros son:
- Contador de programa (PC, program counter).
- Registro de entrada y de dirección de memoria (input and MAR, input and memory address register).
- Registro de instrucción (IR, instruction register).
- Acumulador (A, accumulator).
- Registro B (B register).
- Registro de salida (OUT, output register).
- Memoria de acceso aleatorio (RAM, random-access memory) de lectura-escritura de tamaño 16×8 (16 posiciones de 8 bits cada una). Está unificada para albergar a la vez datos y programas.
- Unidad aritmético-lógica (ALU, arithmetic-logic unit) con dos operaciones disponibles (sumar y restar) para datos en complemento a 2 de 8 bits (desde -128 hasta +127, ambos inclusive).
- Display de ledes para visualizar datos almacenados en el registro OUT. En este simulador, mostramos directamente el valor numérico que corresponde a los ledes en base decimal.
- Unidad de control (CU, control unit), de tipo controlador-secuenciador.
Características principales del SAP-1:
- Máquina basada en acumulador, con dos registros de propósito específico (registros B y de salida).
- Repertorio de instrucciones reducido (LDA, ADD, SUB, OUT, HLT).
- Las instrucciones de ALU (ADD/SUB) realizan operaciones para 2 operandos, donde un operando (el acumulador A) es a la vez fuente y destino. El ancho de la ALU (tamaño de palabra) es 8 bits.
- Modos de direccionamiento: absoluto a memoria e implícito.
- Los datos se interpretan en complemento a 2 para permitir la resta.
- Bus de tipo multiplexado, es decir, transmite alternativamente datos o direcciones. Su ancho es 8 bits, si bien las direcciones solo son de ancho 4.
- Memoria unificada para datos y un programa (arquitectura de von Neumann), de 16 bytes. Por defecto el programa comienza en la dirección 0.
- Formato de instrucción de 8 bits (4 bits para el código de operación + 4 bits para la dirección del operando, si lo hay).
- Las instrucciones se ejecutan en varios ciclos (camino de datos multiciclo). La unidad de control puede construirse de manera cableada o microprogramada. En este segundo caso, necesitamos dos memorias ROM auxiliares.
Programa por defecto:
El simulador trae un programa precargado por defecto que es el que viene mencionado en el ejemplo 10-3 de la página 145 del libro de Malvino y Brown. Dicho programa en ensamblador es el siguiente:
LDA 9 ADD 10 ADD 11 SUB 12 OUT HLT
Cada una de las instrucciones ocupa 1 byte en memoria. La primera instrucción del programa se almacena en la dirección 0 de la memoria RAM. Todas las instrucciones del programa ocupan direcciones consecutivas, sin dejar huecos intermedios. Como este programa tiene 6 instrucciones, la última se almacena en la dirección 5. Por otra parte, en las direcciones de memoria 9, 10, 11 y 12 se encuentran almacenados los datos numéricos 16, 20, 24 y 32. El resto de direcciones se encuentran sin asignar y no se utilizan en este programa.
Las instrucciones en ensamblador del SAP-1 tienen un mnemotécnico, que es una secuencia de 3 letras que permite distinguir una instrucción de otra. Este mnemotécnico se corresponde con el código de operación (COp), que son los 4 bits más significativos de la instrucción en lenguaje máquina (binario) y que son proporcionados por el registro de instrucción (IR) a la unidad de control (CU).
Las instrucciones LDA, ADD y SUB van seguidas de un operando numérico (de 0 a 15 en ensamblador, o los 4 bits menos significativos de la instrucción en binario). Se trata de la dirección de memoria en la que se encuentra realmente el dato con el que queremos trabajar (direccionamiento absoluto a memoria). En estas instrucciones hay siempre un segundo operando implícito, es decir, que no se indica expresamente en ensamblador pero que se usa en la operación. Se trata del registro acumulador (A), que guarda el resultado de la última operación.
Las instrucciones OUT y HLT no tienen operandos en ensamblador. OUT utiliza como operandos implícitos el acumulador (A) y el registro de salida (OUT). HLT no utiliza ningún operando de ningún tipo, ya que su función es indicar al simulador que debe terminar su ejecución.
Todas las instrucciones tienen el contador de programa (PC) como operando implícito, ya que se ve incrementado en 1 unidad para que apunte a la siguiente instrucción.
¿Qué hace este programa? Muy sencillo.
- Todos los registros del SAP-1, incluido el acumulador (A), arrancan la simulación con el valor 0. La instrucción LDA 9 busca el dato que está guardado en la dirección de memoria 9 y lo escribe en A. Como en dicha dirección está el dato 16, A pasa a valer 16 (en binario 00010000).
- La instrucción ADD 10 busca el dato que está guardado en la dirección de memoria 10 (que vale 20) y se lo suma al valor contenido en A (16). El resultado (36) se vuelve a guardar en A (36 en binario es 00100100).
- La instrucción ADD 11 busca el dato que está guardado en la dirección de memoria 11 (que vale 24) y se lo suma al valor contenido en A (36). El resultado (60) se vuelve a guardar en A (60 en binario es 00111100).
- La instrucción SUB 12 busca el dato que está guardado en la dirección de memoria 12 (que vale 32) y se lo resta al valor contenido en A (60). El resultado (28) se vuelve a guardar en A (28 en binario es 00011100).
- La instrucción OUT lee el valor del acumulador y lo manda al registro OUT. Por ello, OUT pasa a valer 28 (000111000).
- Por último, la instrucción HLT para el simulador. Para volver a ejecutar el programa, o para modificarlo, hay que pulsar el botón de «Reiniciar».
Funcionamiento del simulador:
- Todas las partes interactivas aparecen marcadas de color amarillo y subrayadas y cambian de color al colocar el ratón encima de ellas. Las partes inhabilitadas se dibujan de color gris.
- Nada más cargarse la página aparece una ventana de bienvenida. Pulsar el botón «Aceptar» para que desaparezca.
- Se muestra entonces la estructura interna del SAP-1. Los únicos elementos interactivos permitidos son la memoria RAM y la barra de desplazamiento que controla la velocidad de la animación.
- Antes de nada, hay que cargar un programa en la memoria. Para ello, hacemos clic en la memoria RAM. Aparecerá una nueva pantalla con el contenido de la memoria en ese momento, que inicialmente está vacía (todos los bits valen 0). Pulsando sobre cualquiera de las 16 direcciones de memoria, se «desensambla» el contenido, es decir, se reinterpreta el valor almacenado como si fuera o bien una instrucción o bien un dato. Se nos da también la opción de modificar esa posición de memoria para escribir una instrucción o un dato. Por otro lado, también podemos cargar el programa por defecto. Si queremos restablecer la memoria y vaciar su contenido, pulsar el botón «Borrar programa». Para regresar a la pantalla principal del simulador, pulsar el botón «Volver». Nótese que hasta que no haya cargado un programa en la memoria, no podremos iniciar la simulación.
- Ya de nuevo en la pantalla principal, hay dos opciones para arrancar el simulador. Por un lado, podemos pulsar el botón de «Play» (triángulo que apunta hacia la derecha), situado en la parte inferior izquierda de la pantalla. En ese momento se pone en marcha el reloj (CLK) y comienza la ejecución del programa cargado en memoria. El programa se ejecuta del tirón. Con la simulación en marcha, el botón de «Play» se convierte en un botón de pausa. Podemos pausar la simulación y volver a arrancarla tantas veces como deseemos. Por otro lado, hay un botón de «Play 1/2 CLK», que solo está disponible cuando el simulador está en modo pausa. Al pulsar este botón, se avanza solamente medio ciclo de reloj en la ejecución del programa, con lo que es muy útil para estudiar con detalle la secuencia de pasos que van sucediendo.
- En cualquier momento y sin necesidad de pausar el simulador, se puede modificar la velocidad de ejecución del programa mediante la barra de desplazamiento de la parte inferior derecha de la pantalla. Cuanto más a la derecha esté la barra, más rápida es la ejecución.
- Si queremos volver a empezar la simulación desde el principio, pulsar el botón «Reiniciar» (dos triángulos que apuntan hacia la izquierda). Nótese que solo podemos pulsarlo cuando el simulador está en modo pausa. Reiniciar el simulador no borra el programa cargado en la memoria. Si deseamos modificarlo, podemos volver a hacer clic sobre la memoria RAM.
- Durante la ejecución de un programa, veremos en la parte superior derecha de la pantalla la palabra de control generada por la unidad de control. Estas señales se activan y desactivan en los momentos precisos para realizar la correcta ejecución de los programas.
- En el centro de la pantalla se muestra el bus de 8 bits. El color negro se reserva para el nivel bajo de tensión (0 voltios) o valor 0 lógico; el color rojo se reserva para el nivel alto de tensión (5 voltios) o valor 1 lógico; por último, el color gris se reserva para el estado de alta impedancia (desconexión o corriente eléctrica nula), que se produce cuando no hay ningún componente del computador escribiendo en el bus.
- Durante cada uno de los pasos en los que se divide la ejecución del programa, los elementos activos se muestran de color blanco y los inactivos, de color gris. Se entiende que un elemento es activo cuando está escribiendo un valor en el bus o leyendo de él, o cuando está realizando alguna operación interna.
- La ejecución del programa continúa automáticamente hasta que se alcance la instrucción HLT (parada), o bien, si se detecta un código de operación no válido. Para poder empezar otra vez, hay que pulsar el botón de «Reiniciar».