# CARDboard Illustrative Aid to Computation

CARDIAC (CARDboard Illustrative Aid to Computation) es una herramienta de aprendizaje desarrollada por David Hagelbarger y Saul Fingerman en 1968 en los Bell Labs para enseñar a estudiantes de secundario cómo funcionan las computadoras. Consta de un manual de instrucciones y una "computadora" hecha de cartón.
La computadora "opera" mediante el uso de un lápiz y tarjetas de cartón. Las operaciones aritméticas las hace la persona que la opera. Utiliza numeración en base 10 y tiene 100 celdas de memoria, las cuales pueden contener números enteros de un rango entre -999 y +999. Tiene un conjunto de 10 instrucciones que permite sumar, restar, verificar, desplazar, realizar entradas y salidas, y saltar a una dirección.

## Hardware

La "CPU” de la computadora consta de 4 paneles de cartón con celdas y flechas que indican el flujo de operación, de modo que la verdadera CPU (que es el cerebro del usuario) se mueva de la manera correcta. Incluye también una bandera (+/-) que es afectada por el resultado en el acumulador.
La memoria consta de la otra mitad de la cartulina. Hay 100 celdas: la número 0 es “ROM” y siempre contiene un número "1"; las celdas 1 a 98 son “RAM” y están disponibles para almacenar instrucciones y datos; finalmente, la celda 99 puede ser descrita como “EEPROM”.
Las celdas de memoria pueden contener números decimales con signo en el rango de -999 a +999. Los números en las celdas se escriben con un lápiz y se eliminan con una goma de borrar. Un “bicho” ("bug" en el original) actúa como contador de programa, se coloca en un agujero junto a la celda de memoria actual.

## Programación

CARDIAC tiene un lenguaje de máquina con 10 instrucciones. Cada instrucción está formada por tres dígitos decimales (se ignora el signo) con la formaOAA. El primer dígito es el código de operación(O); el segundo y tercer dígitos son una dirección (AA) que direcciona del acumulador a la memoria absoluta, de la memoria absoluta al acumulador, de la entrada a la memoria absoluta, o de la memoria absoluta a la salida.
Nunca se desarrollaron lenguajes de programación de alto nivel para CARDIAC ya que va en contra de uno de los propósitos del dispositivo: introducir conceptos de programación en lenguaje ensamblador.
Los programas son ensamblados a mano y escritos con lápiz en las celdas de memoria.

## Conjunto de instrucciones

Conjunto de instrucciones de CARDIAC :
| Opcode | Mnemotécnico | Instrucción | Descripción |
| 0 | INP | Entrada | Tomar un número de la tarjeta de entrada ("INPut") y colocarlo en la celda de memoria especificada. |
| 1 | CLA | Borrar y sumar | Borrar ("CLear") el acumulador y sumar ("Add") el contenido de la celda de memoria al acumulador. |
| 2 | ADD | Sumar | Sumar ("ADD") el contenido de una celda de memoria al acumulador. |
| 3 | TAC | Verificar los contenidos del acumulador | Realiza una verificación ("Test") de los contenidos del ACumulador; si es menos, salta a la celda de memoria especificada. |
| 4 | SFT | Desplazamiento | Desplaza ("ShiFT") el acumulador x veces a la izquierda y luego z veces a la derecha, donde x es el dígito superior de la dirección y z es el inferior. |
| 5 | OUT | Salida | Tomar un número de la celda de memoria especificada y escribirlo en la tarjeta de salida ("OUTput"). |
| 6 | STO | Almacenar | Copiar ("STOre") los contenidos del acumulador en la celda de memoria especificada. |
| 7 | SUB | Resta | Restar ("SUBstract") los contenidos de la celda de memoria especificada a los del acumulador. |
| 8 | JMP | Salto | Saltar ("JuMP") a la celda de memoria especificada. El número de celda actual está escrito en la celda 99. Esto permite un nivel de subrutinas, ya que la dirección de retorno estará en la celda 99 (con un '8' como prefijo). |
| 9 | HRS | Detención y reinicialización | Mover el contador de programa ("bug") a la celda especificada y detener la ejecución del programa ("Halt and ReSet"). |

## Operación

Los programas se ejecutan moviendo primero las tres tarjetas de modo que el número en el registro de instrucción sea igual al número en la cela de memoria donde está el "bug". Entonces el "bug" debe moverse a la siguiente celda de memoria. El usuario entonces sigue una flecha que le dirá qué hacer luego. Este proceso se repite durante toda la ejecución de programa.

## Grupo de usuarios

Existe un grupo de usuarios de CARDIAC en Facebook.