lunes, 18 de abril de 2011

Desnudando a un ZX81


El Sinclair ZX81 fue lanzado en 1981 y fue uno de los primeros ordenadores personales accesibles para gran público. Muchos de los que comenzaron a utilizarlos siguen hoy en día enganchados a la informática y es en gran medida culpa de esta pequeña maravilla.

A tan sólo 3.5 Mhz y con la escalofriante cantidad de memoria de 1 kB (1024 bytes) pensareis que poco se podría hacer, pero los programadores de antes estaban hechos de otra pasta y podían meter en esa memoria juegos tan pintorescos como juegos de naves o juegos de ajedrez utilizando tan sólo caracteres ASCII e implementando la lógica con un par de puñados de bytes.


Chess Game

Space Invaders

Por suerte he podido conseguir uno de estos equipos y debido a mi manía de ver como funcionan las cosas os voy a detallar su interior y algunas de sus curiosidades.

ZX81 de la época
Lo primero que llama la atención es su tamaño y poco peso. No pasa desapercibido además su teclado de membrana que es posiblemente la parte más frágil del dispositivo ya que si se usa mucho, estas membranas se rompen y era necesario cambiar el teclado entero. Vendían kits para el teclado por si esto tranquiliza a alguien ;-).

Detalle del teclado de membrana
En su lateral se observan varios conectores correspondientes a la salida de televisión y una salida rudimentaria de audio para grabar en cinta. Dispone de la entrada de micrófono donde conectar una unidad de cintas para cargar los juegos y la entrada de 9V para la alimentación.

Conectores laterales

En la parte posterior dispone de un bus de expansión para colocar algunos pack de expansión como mayor memoria, impresora, etc....
Bus de expansión trasero


Sólo 4 tornillos nos separan de la intimidad de este equipo. Siendo oseados y despojando al equipo de su carcasa exterior podemos ver algo que en principio nos llama bastante la atención.

Detalle de la placa de circuitos

Por un lado la forma de serigrafía de las pistas no parece demasiado normalizada pero bueno, estamos hablando de una placa que tiene dibujado la fecha de 1980.


Como puede verse, el número de microchips puede contarse exactamente con los dedos de una mano.

Detalle de la placa
Abajo a la derecha, puede verse el conversor a señal RF para la sintonización en un televisor por medio de la entrada de la antena analógica y arriba a la izquierda el conector de plástico que trae la señal del teclado de membranas.
Detalle del conector del teclado

Disipador de calor para el regulador de tensión
Nada de ruidosos ventiladores para refrigerar el micro o grandes fuentes de alimentación. El sistema de regulación de alimentación comandado por un L7805CV dispone de una placa para la disipación del calor y así se soluciona el problema de temperatura debido al trabajo del componente.

Array Lógico Programable (ULA)
La ULA (uncommitted logic array) cariñosamente nombrada es un chip de lógica programable que se ha reprogramado para las necesidades propias de este equipo y permite a los diseñadores guardar la lógica deseada en un sólo chip que de otras maneras necesitaría varios.

Detalle de los módulos de memoria de 1kb

El MCM21L14P30 es un módulo de memoría de 4x1024 bits. Se utilizan dos para poder disponer de 1kB.

1kB -> 1024 bytes -> 8192 bits = 2 módulos de 4x1024 bits

Vemos que este ordenador disponía solamente de 1kB de memoria aunque podía ser extendido por medio de su puerto trasero con un pack de 16 kB.

ROM de 8kb

Le llega el turno a la ROM D2364C donde se almacena el interprete de BASIC que es un chip de sólo lectura de 8 kB y finalmente y en el centro se descubre una CPU que para mi sorpresa no es un Z80 de Zilog sino que se trata de una versión totalmente compatible desarrollada por NEC.

Microprocesador compatible Z80 de NEC




Y con sólo estos componentes, el pequeño dispositivo de Sir Clive Sinclair se convirtió en uno de los iconos y equipos que cambiaron el curso de la informática y permitieron que esta entrase en las familias y comenzase así una revolución del que algunos todavía seguimos enganchados.

Aunque las comparaciones son odiosas, a veces nos ayudan a darnos cuenta de lo rápido que avanza la tecnología y de como, pronto todo lo que nos rodea, pasará de nuevo a ser tan antiguo como nuestro querido ZX81.
ZX81 vs. iPhone


Los herederos de ENIAC




Las arquitecturas actuales de los procesadores se suelen clasificar en dos: CISC (Complex Instruction Set Computing) y RISC (Reduced Instruction Set Computing).

Aunque ambas se basan en concepciones diferentes de como debe organizarse el hardware dentro del procesador y como es el modelo de programación, tienen algo en común: el juego de instrucciones de ambas familias gira en torno a los registros disponibles que ofrece la arquitectura al programador y en base a la cual se articula la programación.

En la imagen de la derecha apreciamos para las arquitecturas mas conocidas el número de registros y el tipo. De media, los programadores tenemos accesibles unos 16 a 32 registros de proposito general.

Tal vez desde un punto de vista humano, es algo natural la forma de organizar la arquitectura de un procesador en torno a los registros. Los cálculos intermedios se realizan ayudándose de estos registros y cual pequeña hoja de papel, los programadores los usamos para evitar la penalización innata que tiene el acceso a la memoria principal.

Aunque organizar la arquitectura en torno a estos registros facilita la programación, desde un punto de vista de hardware el banco de registros representa todo un reto arquitectónico. Además, se crean dependencias de datos entre instrucciones que o bien a través de código o a través de hardware añadido es necesario controlar.

Existen alternativas a la programación con registros que ayudan a simplificar el hardware, la programación y el diseño de compiladores.


Sobre el año 1963, Borrough's Corporation lanzó al mercado la B5000. Sería la primera de una serie de máquinas que la firma iría lanzando comercialmente a lo largo de la década de los sesenta. Como las demás máquinas de la época, la B5000 ocupaba toda una sala, encerraba bajo su chasis transistores de segunda generación pero algo la diferenciaba de sus contemporáneas. La CPU de la B5000 no tenía registros sino que empleaba una estructura de datos conocida por pila.


La pila es una estructura de datos que sólo permite el acceso al último dato insertado en ella. Las únicas operaciones que la estructura permite son la de apilar un dato (push) o la de sacar el último dato apilado (pop). De esta forma, los operandos de cada instrucción no son indicados al procesador de forma explícita como sucede en los demás procesadores CISC/RISC. En su lugar, la máquina sabe que los operadores necesarios para llevar a cabo la instrucción están en la pila y en función de la instrucción ejecutada, el procesador tomará el número de elementos necesarios de la pila.

El juego de instrucciones de la B5000 explotaba al máximo el uso de la pila. Había operaciones implícitas para extraer los elementos necesarios de una instrucción. Por ejemplo, si queremos sumar 15 y 42, la máquina tomaba de la pila los operandos necesarios para la suma, realizaba la operación y volvía a colocar el resultado en la pila. El uso implícito de la pila hacía que las instrucciones de la B5000 se pudieran empaquetar de 12 en 12 bits.

El desarrollo de la B5000 también tuvo en consideración el diseño de software con lenguajes de alto nivel (ALGOL) y no el ensamblador. La máquina disponía de dos modos de operación, la de ejecución de programas de usuario y un modo privilegiado denominado "control". También diferenciaba entre la ejecución del programa principal de la ejecución de las subrutinas que componían a este (ideal para programas en ALGOL).

Muchas de las características de la B5000 son generales a la familia de máquinas basadas en pila. Desde un punto de vista más formal, las máquinas basadas en pilas se categorizan en razón a tres criterios:
  1. Número de pilas (S=simple, M=multiple)
  2. Tamaño de la pila (S=small, L=large)
  3. Número de operadores de la instrucción (0,1,2)
Nuestra B5000 se categoriza como una máquina SS0 (1 única pila, tamaño de pila pequeño, 0 operadores por instrucción). Todas las máquinas de pila con 0 operadores son denominadas "máquinas de pila pura". Cada categoría tiene sus propias características:
  • Las máquinas SS0, aunque sencillas desde un punto de vista de hardware, tienen un claro cuello de botella en la única pila disponible. El diseño de este tipo de arquitecturas debían prestar especial cuidado con la pila. Por ejemplo, la B5000 tenía dos registros no accesibles al programador (llamados A y B) que contenían los dos primeros elementos de la pila. Esto acelera mucho las operaciones con la pila posibilitando las operaciones en un único ciclo de reloj.
  • Los diseños MS0 y ML0 pueden ser consideradas extensiones de la SS0 pero tienen el atractivo añadido a su simplicidad que carecen de muchos de los problemas de rendimiento que sufren las SS0. El tener varias pilas posibilita de una forma casi directa la programación con varios hilos de ejecución.
  • Los diseños SS1 y SL1 intentan conservar la esencia de las SS0 pero sacrifican la simplicidad de la pila por una combinación de pila más registros auxiliares en un intento de evitar que la pila se convierta en un cuello de botella.
  • Los diseños de pila con 2 operadores no se consideran máquinas basadas en pila. Los procesadores de la familia x86 serían un ejemplo de este tipo de máquinas (concretamente SL2) : el registro SP (stack pointer) de los x86 habilita a esta familia a operar como una máquina de pila pero su funcionamiento no sería "puro" sino una emulación de una máquina SS0. En general, los procesadores CISC/RISC serían típicamente máquinas SL2/ML2. Un ejemplo de máquina ML2 serían los procesadores 680x0 (disponen de 8 registros que pueden ser usados como pilas).
Junto al de la simplicidad de diseño, otro aspecto interesante que comparten las máquinas basadas en pila es su extrema eficiencia minimizando el tamaño de los programas. Las máquinas RISC pueden llegar a necesitar el doble de bits para codificar el mismo programa que una máquina CISC pero es que una máquina CISC puede necesitar entre 3 y 8 veces lo que una máquina basada en pila.

Os recomiendo la lectura de Stack Computers: the new wave de Philip J. Koopman, Jr.