¡Feliz Año Nuevo!
En este enero de 2025 se cumplen 50 años exactos de una portada que cambió el transcurso de la Historia, y no exageramos, pues fue la semilla que dio origen a la revolución informática tal y como la conocemos desde entonces. Nos referimos, como no puede ser de otra forma, a la portada de la revista Popular Electronics de enero de 1975, cuyo elemento central era el ordenador Altair 8800. Esta portada la vieron tanto Paul Allen y Bill Gates, que fundarían Micro-Soft (con guion) cuatro meses después, como Steve Jobs y Steve Wozniak, que harían lo propio con Apple un año más tarde. Un segundo artículo, publicado en febrero de 1975, daba una pincelada sobre cómo se programaba el Altair.
La empresa MITS (Micro Instrumentation and Telemetry Systems), no confundir con MIPS, se fundaría unos años antes por Ed Roberts y Forrest Mims. Inicialmente se dedicaba a productos de cohetería, ya que creaba detectores de telemetría. Luego empezó a construir calculadoras electrónicas, en pleno apogeo por aquella época. Una guerra de precios exacerbada les llevó casi a la ruina a pesar del éxito de sus calculadoras. Así fue cómo desembarcaron en el ámbito de la informática personal.
Hay que imaginarse cómo era la década de los 70 en cuanto a la Informática se refiere. No existían los ordenadores personales. Había grandes ordenadores en el ámbito científico, gubernamental y militar, pero el resto de los mortales no tenían acceso a estas máquinas. Parafraseando a un personaje de la película Piratas de Silicon Valley (Martyn Burke, 1999), que narra los comienzos de Apple y de Microsoft, «¿para qué va a querer la gente normal querer ordenadores?».
Aquí es donde llega la idea genial de Ed Roberts. Se le ocurrió crear un ordenador barato que pudiera interesar a entusiastas de la electrónica, hasta el punto de que lo vendería en formato kit, es decir, en una bolsita te daban todos los materiales, pero te lo tenías que montar (y soldar) por tu cuenta. Esto redujo enormemente los precios, en concreto, hasta los 439 $. ¿Cuánto suponía esta cantidad en 1975? Pues seguía siendo una enorme cantidad, hasta medio sueldo en muchos casos, y sin embargo esto no impidió que fuera un éxito.
¿Para qué va a querer la gente normal querer ordenadores?
(Piratas de Silicon Valley, Martyn Burke, 1999)
Como suele suceder a menudo, el Altair 8800 no fue el primer ordenador en kit anunciado en una revista de electrónica. En julio de 1974 ya se había publicado un artículo sobre el Mark-8 en la revista Radio Electronics, si bien no tuvo una gran acogida. Ni siquiera había sido el primer intento de llevar los ordenadores hacia un público más general, aunque todavía en el ámbito educativo, como sí ocurrió con el Kenbak-1 de 1971. Sin embargo, fue el Altair 8800 el que alcanzó la gloria y aceleró todo lo que vino después.
La revolución tecnológica que posibilitó el Altair se había producido cuatro años antes. En noviembre de 1971 la empresa Intel presentó al mundo el primer microprocesador de la historia, el Intel 4004. Hasta entonces, los ordenadores se construían con componentes discretos, transistores, resistencias, condensadores. Existían ya circuitos integrados o chips, pero no fue hasta esa fecha que lograron fabricar el primer chip que incluía por completo todo lo necesario para «gobernar» al resto del computador, algo así como el anillo único de El Señor de los Anillos. Nos referimos al procesador o unidad central de proceso. Ese primer chip 4004 era muy limitado (las palabras eran de 4 bits) y tuvo su aplicación en el ámbito de las calculadoras. Al año siguiente llegó el 8008, y en 1974, el 8080 («ochenta ochenta»). Fue este el procesador elegido para el Altair.
El Intel 8080 ya empezaba a apuntar maneras en cuanto a su potencia de cálculo. Se trataba de un procesador preparado para trabajar con palabras de 8 bits (o bytes), si bien podía manejar direcciones de memoria de 16 bits, con lo que en teoría podría direccionar hasta 64 kB (una cantidad inmensa para aquella época). La frecuencia de reloj, que va marcando el ritmo al que se iban ejecutando las instrucciones, podía alcanzar los 2 MHz (un megahercio representa un millón de oscilaciones por segundo). El procesador se ofrecía en un empaquetado de doble hilera de 40 pines.
Hay que pensar que el Altair se ofrecía «tal cual», sin la logística necesaria para un uso adecuado y sencillo. No disponía de teclado, ni mucho menos ratón. Tampoco tenía monitor ni podía conectarse a un televisor. Simplemente constaba de una serie de lucecitas led, 36 en total, y unos interruptores de palanca en el panel frontal. A través de los interruptores, debían introducirse los programas en código máquina, es decir, expresados en binario. Los resultados se visualizaban mediante los ledes que, encendidos o apagados, mostraban el valor de cada byte.
Aunque se podía ampliar, el Altair venía equipado inicialmente con la friolera de 256 bytes de memoria. Un byte sirve para almacenar cada una de las letras, números, espacios o signos de un texto, con lo que se necesitarían 256 para memorizar este párrafo.
La programación en código máquina no está al alcance de cualquiera. El ordenador acepta una secuencia de ceros y unos en un orden determinado para indicarle qué es lo que debe realizar, si debe leer dos números almacenados en la memoria y sumarlos y mostrar el resultado en los ledes, o bien, si se prefiere realizar cualquier otra operación que se desee. El código binario es el lenguaje nativo del computador, porque lo comprende inmediatamente, pero se encuentra muy alejado de la manera que tenemos los humanos de pensar y trabajar. Por eso nos resulta tan complicado. Para aligerar un poco la programación, a determinadas secuencias de ceros y unos se les pone un alias o «mnemotécnico» (llamado así porque se trata de una palabra más fácil de recordar que una ristra de bits).
Aunque se podía ampliar, el Altair venía equipado inicialmente con la friolera de 256 bytes de memoria. Un byte sirve para almacenar cada una de las letras, números, espacios o signos de un texto, con lo que se necesitarían 256 para memorizar este párrafo.
Un computador puede considerarse que está formado por varios bloques o unidades funcionales, que cumplen un cometido muy específico. La memoria es el almacén de información, que sirve para albergar tanto los programas (secuencias de instrucciones) como los datos que manipularán dichos programas. La memoria puede imaginarse como un cine de butacas numeradas. Cada byte (conjunto de 8 bits) tiene una dirección única, al igual que tu entrada de cine te dice si va al patio de butacas, lado derecho, fila 7 y butaca 10. El procesador, que es la parte más importante, dispone de una sección para realizar los cálculos, la llamada unidad aritmético-lógica (o ALU, por sus siglas en inglés), más otra sección llamada unidad de control, que es quien coordina a los demás componentes del computador y les dice lo que tienen que hacer y en qué preciso instante lo deben hacer. Puesto que el ordenador debe poder comunicarse con el exterior para extraer o introducir información, tiene un bloque especializado en las operaciones de entrada-salida. Para terminar, todos los elementos están conectados mediante un bus, que es como una autopista de múltiples carriles por los que se van enviando los datos entre los diferentes componentes del computador.
En el caso concreto del Intel 8080, todas las operaciones aritméticas necesitan trabajar con un elemento primordial de la ALU llamado acumulador. Seguro que has manejado un acumulador en tu vida sin darte cuenta. Por ejemplo, enciende una calculadora, da igual que sea la del móvil, la del ordenador, o una «de verdad». Escribe 1 y pulsa el signo más repetidamente. Automáticamente en la pantalla aparecerá un 2. Si sigues pulsando el más, saldrá un 3 y un 4, y así sucesivamente. Cada suma necesita dos números. En este caso, uno de los números es el resultado de la suma anterior. Ese es el acumulador. En el 8080, el acumulador es tan importante que simbólicamente se le llama A. Se trata de un registro especial para albergar un dato de 8 bits que es siempre uno de los operandos de una operación aritmética y también es donde se guarda el resultado de la operación.
El 8080 dispone de otros registros, llamados B, C, D, E, H y L, todos de 8 bits también, si bien pueden operar en parejas para albergar datos de 16 bits (el B con el C, el D con el E, y el H con el L). Estos registros complementan al acumulador A en sus tareas para realizar los cálculos aritméticos.
Otro registro especial de gran importancia es el llamado contador de programa (o PC por sus siglas en inglés). Se trata de un registro de 16 bits que contiene no un dato, sino una dirección de memoria (recordemos que todas las direcciones de memoria del 8080 son de 16 bits, aunque el Altair solo pueda acceder por defecto a las primeras 256 posiciones). En concreto, el programa que queremos ejecutar se encuentra almacenado a partir de la dirección de memoria 0. El programa se organiza en pequeñas instrucciones o comandos, que le dicen al ordenador lo que tienen que hacer. El PC va anotando en cada instante la dirección de la siguiente instrucción que tiene que ejecutar, algo así como el apuntador que va recordando las frases a los actores de una obra de teatro.
Veamos paso a paso un sencillo programa para el Altair 8800. Puede comprobarse con este espléndido simulador que hemos encontrado por Internet. Supongamos que disponemos de dos números almacenados en nuestra memoria y que queremos sumarlos y ver el resultado. Por ejemplo, tenemos el número 1 almacenado en la dirección de memoria 16 y el número 2 en la dirección siguiente, la 17. En la dirección 18 escribiremos la suma.
Para poder realizar esta operación, escribiremos un sencillo programa. Para que nos resulte más fácil de entender, daremos primero la versión en ensamblador, es decir, utilizando mnemotécnicos y valores numéricos en base 10, pero luego explicaremos cómo se convierte a binario para programar el Altair.
La primera instrucción consiste en leer de la memoria el primero de los operandos, que, como hemos dicho, se encuentra en la dirección 16, y llevarlo o «cargarlo» en el acumulador. El mnemotécnico de esta operación es LDA (load accumulator) y va seguido de la dirección que queremos leer, es decir:
LDA 16
Cuando se haya ejecutado esta instrucción, el acumulador A valdrá 1, pues este es el valor almacenado en la dirección 16 de la memoria.
Necesitamos leer el segundo operando para poder realizar la suma, con lo que tendremos que mover el 1 a un lugar seguro donde no nos estorbe. Por eso, la segunda instrucción consiste en mover (más bien, copiar) el valor del acumulador A en el registro auxiliar B. El mnemotécnico es MOV (move) y va seguido del registro al que llevamos el dato, en este caso B, separado por una coma del registro del que tomamos el dato, en este caso A. Por tanto:
MOV B,A
Tras ejecutar esta instrucción, tanto el registro B como el A contendrán el valor 1. La operación de copiar el valor de A en B no modifica el valor de A.
Repetimos de nuevo la operación de carga, es decir, leer un valor de la memoria para escribirlo en el acumulador. En esta ocasión, toca leer la dirección de memoria 17, que es donde tenemos almacenado el número 2.
LDA 17
Tras esta operación, el acumulador A contendrá el valor 2, mientras que el registro B sigue valiendo 1. Ya tenemos los dos operandos que queremos sumar. Lo que nos queda ahora es activar la operación de sumar, para lo cual usaremos el mnemotécnico ADD. El acumulador se sobreentiende que es uno de los sumandos, así como el lugar donde almacenaremos el resultado. Solo nos falta indicar cuál será el segundo sumando, en este caso, el registro B.
ADD B
Con esta operación, hemos hecho que el acumulador contenga un 3, que es el resultado de la suma 1+2. Ahora vamos a almacenar este resultado en la dirección de memoria 18, que es la que teníamos reservada a tal efecto. La operación de escribir en memoria se denomina STA (store accumulator), que va seguida de la dirección 18.
STA 18
El efecto que produce esta instrucción es que el valor del acumulador, que contiene el 3, se deposita en la dirección de memoria 18. Las direcciones 16 y 17, que contenían el 1 y el 2, no se ven afectadas por esta operación. Este almacenamiento no enciende ni apaga ningún led, pero luego podremos comprobar el contenido de esta posición de memoria, como diremos después.
Para terminar, podemos pedirle al procesador que se paralice y no intente seguir ejecutando instrucciones. Para ello usamos la instrucción HLT (halt).
HLT
El conjunto de todas estas instrucciones forman el programa que realiza la suma de dos números. Sin embargo, el procesador necesita que le proporcionemos toda esta información mascadita y en formato binario, o de lo contrario no entenderá ni papa. Debemos consultar por ejemplo la tarjeta de referencia del procesador 8080 para conocer las equivalencias entre los mnemotécnicos de ensamblador y el código máquina. Las instrucciones se codifican en binario con varios bytes, según el mnemotécnico y los operandos, en concreto entre 1 y 3 bytes.
Comencemos con LDA 16. Al mnemotécnico LDA le corresponde el byte $3A (escrito en notación hexadecimal), también expresable como 00 111 010 en binario. Este byte lo almacenaremos en la posición de memoria 0. A continuación, debemos expresar la dirección 16 con 2 bytes, donde colocaremos en la dirección de memoria 1 el byte de la derecha, el menos significativo, y en la dirección 2 el de la izquierda, el más significativo. Por tanto, en la dirección 1 tendremos $10 o 00 010 000 y en la dirección 2 estará $00 o 00 000 000.
La segunda instrucción era MOV B,A. En este caso, solo nos hace falta un único byte, ya que está reservado el valor hexadecimal $47 o binario 01 000 111 para codificar la instrucción MOV con los operandos B,A. Este byte estará almacenado en la dirección de memoria 3.
La tercera instrucción es una nueva carga, LDA 17. El código de LDA ya lo conocemos, $3A o 00 111 010. Este byte estará en la dirección de memoria 4. A continuación, la dirección 17 se codifica una vez más como 2 bytes, primero el de la derecha y luego el de la izquierda. En la dirección 5 tendremos $11 o 00 010 001, y en la dirección 6 tendremos $00 o 00 000 000.
La siguiente instrucción es ADD B. Al mnemotécnico ADD le corresponde el código $80 o 10 000 000 cuando el sumando es el registro B. Por eso, de nuevo tenemos una instrucción de un único byte. Estará almacenado en la dirección de memoria 7.
A continuación, tenemos STA 18. El mnemotécnico STA se codifica con el byte $32 o 00 110 010, que estará en la dirección de memoria 8. Después, y una vez más, se codifica el valor 18 con 2 bytes, que serán $12 o 00 010 010 (dirección 9) y $00 o 00 000 000 (dirección 10).
Para terminar, la instrucción HLT tiene el código $76 o 01 110 110. Esto finaliza la parte de la memoria que contiene el programa.
No podemos olvidarnos de los datos. En la dirección de memoria 16 debemos tener el byte $01 o 00 000 001, mientras que en la posición 17 tendremos el byte $02 o 00 000 010. Estos son los dos valores que suma el programa.
En resumen, queremos cargar el siguiente programa en la memoria del Altair:
Dirección de memoria | Contenido de la dirección de memoria (en hexadecimal) | Contenido de la dirección de memoria (en binario) |
0 | $3A | 00 111 010 |
1 | $10 | 00 010 000 |
2 | $00 | 00 000 000 |
3 | $47 | 01 000 111 |
4 | $3A | 00 111 010 |
5 | $11 | 00 010 001 |
6 | $00 | 00 000 000 |
7 | $80 | 10 000 000 |
8 | $32 | 00 110 010 |
9 | $12 | 00 010 010 |
10 | $00 | 00 000 000 |
11 | $76 | 01 110 110 |
… | … | … |
16 | $01 | 00 000 001 |
17 | $02 | 00 000 010 |
Bien, ya solo nos queda introducir estos valores binarios en el Altair, pero no tiene teclado. ¿Cómo lo haremos? Pues accionando adecuadamente los diferentes interruptores de palanca que encontraremos en su panel frontal.
En primer lugar, se enciende el Altair con el interruptor más a la izquierda (donde pone OFF/ON). A continuación, se realiza un reseteo accionando el interruptor RESET.
Vemos que el Altair está equipado en su zona central con 16 interruptores, numerados desde el 15 al 0. Comprobemos que están todos los interruptores en su posición inferior (significa 0). Si pulsamos el interruptor EXAMINE, estaremos consultando el contenido de la dirección de memoria 0, es decir, hemos establecido el valor del registro PC para que apunte a la dirección 0. Los ledes marcados de A15 hasta A0 (la A viene de address, dirección) estarán todos apagados, ya que el valor 0 se escribe en binario con 16 ceros. Por otro lado, algunos de los ledes marcados de D7 a D0 estarán encendidos y otros estarán apagados. Estos ledes muestran el byte almacenado en la dirección de memoria. Esto se debe a que el contenido de la memoria es aleatorio hasta que no se le da un valor concreto.
Manipulemos ahora los interruptores 7 a 0 para escribir el primer byte del programa, que ya sabemos que debe valer 00 111 010. Esto significa que los interruptores 5, 4, 3 y 1 estarán apuntando hacia arriba para indicar un 1, mientras que los demás estarán apuntando hacia abajo para indicar un 0. Si a continuación pulsamos el interruptor DEPOSIT, habremos escrito este byte (correspondiente al mnemotécnico LDA) en la dirección de memoria 0.
De esta forma se podría ir realizando la escritura del programa: primero marcando la dirección para examinarla y luego escribiendo el byte para depositarlo. Para acelerar el proceso, puesto que el programa se compone de instrucciones que se almacenan en posiciones consecutivas de memoria, podemos ahora manipular los interruptores para escribir el siguiente byte (00 010 000). Para ello, bajamos todos los interruptores, excepto el número 4, que se queda apuntando hacia arriba. Pulsaremos ahora el interruptor DEPOSIT NEXT. Esto lo que hace es escribir este byte a continuación del anterior, es decir, en la dirección de memoria 1. Con mucho cuidado, iremos escribiendo el programa byte a byte y activando el interruptor DEPOSIT NEXT.
Para terminar, una vez introducida el byte correspondiente a la instrucción HLT (01 110 110), nos queda por introducir los dos datos. Manipulando los interruptores para seleccionar la dirección 16 (todos los interruptores están apuntando hacia abajo excepto el número 4), pulsamos en este caso EXAMINE. Se enciende en este caso el led A4 y los ledes de datos D7 a D0 podrán estar encendidos o apagados. Bajamos el interruptor 4 y subimos el interruptor 0. Pulsamos DEPOSIT. Habremos escrito 00 000 001 en la posición de memoria 16. Seguidamente, bajamos el interruptor 0 y subimos el 1. Pulsamos DEPOSIT NEXT. Ahora tenemos el valor 00 000 010 en la posición de memoria 17.
Fácil, ¿verdad?
Si no nos hemos equivocado al activar o desactivar los interruptores, habremos introducido adecuadamente nuestro programa. Nos bastará ahora con activar el interruptor RUN. Puesto que el Altair se ejecuta siguiendo el tictac de un reloj interno que suena 2 millones de veces por segundo, tan pronto hayamos pulsado RUN, ya se habrá ejecutado el programa. Así que podemos parar el ordenador accionando el interruptor STOP.
Para comprobar que la suma se ha realizado, escribimos la dirección de memoria 18. Recordemos que todos los interruptores deben estar desactivados excepto el 4 y el 1. Si pulsamos EXAMINE, en los ledes de datos debería verse el valor 3, que en binario se expresa como 00 000 011, es decir, los ledes D1 y D0 estarán encendidos y los demás apagados.
¿Y cómo un ordenador que tenías que soldar por piezas en tu casa y que no tenía teclado ni pantalla pudo triunfar? ¡Si parecía no estar predestinado para ello! Como ya hemos explicado, hemos tenido que aprender un poco de la arquitectura interna del procesador para poder hacer un programa de lo más tonto, pero que para nada es evidente. Programar ordenadores directamente en código máquina es un infierno y hacerlo en ensamblador solo alivia un poco la tarea. ¿Qué se nos está escapando?
Programar ordenadores directamente en código máquina es un infierno y hacerlo en ensamblador solo alivia un poco la tarea. ¿Qué se nos está escapando?
Pues aquí es donde entran Bill Gates y Paul Allen. Cuando contemplaron la portada de Popular Electronics se dieron cuenta al instante de que el negocio de la Informática estaba en el software, los programas, no en crear ordenadores. Y supusieron que esta maquinita de lucecitas y palanquitas necesitaría un lenguaje más amigable para poder comunicarse con los humanos. Y aquí es donde idearon el Altair Basic. El Basic era un lenguaje de programación interpretado que se había inventado una década atrás en la Universidad de Dartmouth por John G. Kemeny y Thomas E. Kurtz. Fue creado para permitir que cualquier estudiante, no solo de áreas como las matemáticas o la ingeniería, pudieran escribir sus propios programas. Las primeras versiones de Basic se usaron en sistemas de tiempo compartido y, más adelante, para algún minicomputador, pero la primera para un microordenador fue la del Altair 8800.
Gates y Allen, como grandes vendedores de humo, llamaron a Ed Roberts para ofrecerle su versión de Basic para el Altair. En realidad, no tenían nada. El propio Allen terminó la programación in extremis en el avión que le llevó a su reunión en la sede de MITS. Pero por suerte para ellos, todo salió sobre ruedas, y este fue el primer gran producto de la nueva Micro-Soft. La versión más reducida de Basic ocupaba 4 kB (de ahí que pasara a llamarse Basic 4K), si bien luego se hicieron las versiones de 8K y 12K, entre otras. El precio del Basic 4K rondaba los 150 $. Recordemos que el kit del Altair se vendía a 439 $. Bill Gates ya apuntaba maneras y sería el despegue de su empresa, pero eso ya es otra historia.
¿Cuál fue el destino del Altair 8800? Básicamente, MITS murió de éxito. Fue tal la cantidad de pedidos que recibieron, que no pudieron hacer frente a la demanda. Afortunadamente, gracias al bus S-100, elegido para su estructura interna, y convertido en todo un estándar de facto, surgieron numerosos fabricantes de componentes y tarjetas de expansión compatibles con el Altair sin tener que soportar las largas listas de espera de MITS. Así surgió el concepto de industria. En 1977 MITS fue vendida a la empresa Pertec. El propio Ed Roberts se retiró del mundo de la Informática y se acabó convirtiendo en médico rural.
A finales de 1975, salió al mercado el primer ordenador clónico de la historia, como no podía ser de otra forma, del Altair. Se trataba del Imsai 8080, muy conocido por la película Juegos de Guerra (1983). El Imsai fue un rediseño total respecto del Altair, pero seguía funcionando a base de pulsadores y lucecitas led. Incluso la carcasa exterior era de un azul similar al del Altair. Ya hablaremos en otro artículo sobre este ordenador.