# PDP-10

El PDP-10 fue un computador fabricado por Digital Equipment Corporation (DEC) desde finales de los años 1960 en adelante. El nombre significa "Programmed Data Processor model 10" (Procesador de Datos Programados modelo 10). Fue la máquina que hizo común el tiempo compartido. Es de mucha importancia en el folklore hacker debido a su adopción en los años 1970 por muchas instalaciones de computación universitarias y laboratorios de investigación, los más notables fueron el AI Lab del MIT, el SAIL de la Universidad de Stanford, y la Universidad Carnegie Mellon.
La arquitectura del PDP-10 era una versión casi idéntica de la arquitectura anterior del PDP-6, compartiendo la misma longitud de palabra de 36 bits y extendiendo levemente el conjunto de instrucciones (pero con una implementación de hardware mejorada). Algunos aspectos del conjunto de instrucciones son únicos, lo más notable fueron las instrucciones de "byte", que operaron en campos de bits de tamaño arbitrario (en aquella época el byte no era necesariamente de ocho bits).

## Modelos y evolución técnica

El procesador original del PDP-10 fue el KA10, introducido en 1968. Usaba transistores discretos empaquetados con la tecnología Flip-Chip de DEC, con alambrado en la parte trasera por medio de un proceso de fabricación semiautomatizado. En 1973, el KA10 fue substituido por el KI10, que usaba circuitos SSI TTL. A este se le unió, en 1975, el KL10 de alto desempeño (posteriormente el KL20), que fue construido con ECL, estaba microprogramado, y tenía memoria caché. Un modelo más pequeño y menos costoso, el KS10, fue introducido en 1978, usando componentes bit-slice TTL y Am2901 e incluyendo el Unibus del PDP-11 para conectar los periféricos.
En 1983, el desarrollo de un sucesor por el KL10 (Proyecto Júpiter) fue cancelada. Esta fue la primera señal para la cancelación de la línea de productos entera.

### KA10

El KA10 tenía una máxima capacidad de memoria principal (tanto virtual como física) de 256 Kwords (equivalente a 1152 KB). Tal y como venía suministrado por DEC, no incluía hardware de paginación; manejo de la memoria que consiste en dos conjuntos de protección y relocalización, llamados los registros de "base and bounds". Esto permitía, a cada mitad del espacio de dirección de usuario, ser limitado a una sección prefijada del sistema de la memoria central, designada por la base de la dirección física y el tamaño. Esto permitió el modelo, usado posteriormente por Unix, de un segmento de código compartible de solo lectura (normalmente el segmento alto), separado de un segmento de datos/pila de lectura/escritura (normalmente el segmento bajo). Algunas máquinas KA10, ej. primero en el MIT, y más adelante en el BBN, fueron modificadas para agregar soporte para la paginación, así como más memoria física.

### KI10

El KI10 y procesadores posteriores ofrecieron manejo de memoria paginada, y también soportaron un más grande espacio de dirección física de 4 Mwords.

### KL10 y KL20

Los modelos originales del KL10 (1070, 1080, etc.) usaron el bus de memoria original del PDP-10, con módulos de memoria externos. Módulo, en este contexto significa un gabinete, las dimensiones aproximadamente (An. x Al. x Pr.) 80 x 200 x 80 cm con una capacidad de 32 a 256 kWords de memoria de núcleos magnéticos (la imagen en el lado derecho muestra seis de estos gabinetes). Los procesadores usados en el DECSystem-20 (2040, 2050, 2060, 2065), comúnmente pero incorrectamente llamado "KL20", usaban la memoria interna montada en el mismo gabinete que el CPU. Los modelos 10xx también tenían un empaquetado diferente; vinieron en los originales gabinetes altos del PDP-10, en vez de los cortos usados posteriormente para el DECSYSTEM-20. Las diferencias entre los modelos 10xx y 20xx eran más cosméticas que reales; algunos sistemas 10xx tenían la memoria interna y la I/O al "estilo 20", y algunos sistemas 20xx tenían la memoria externa y el bus de I/O al "estilo 10". En particular, todos los sistemas de ARPAnet TOPS-20 tenían un bus de I/O porque la interfaz AN20 IMP fue un dispositivo de I/O. Ambos podían correr el microcódigo del TOPS-10 o el TOPS-20 y por lo tanto el sistema operativo correspondiente.

### MASSbus

La arquitectura de I/O de las máquinas 20xx de la serie KL fue basada en un nuevo diseño de bus de la DEC, llamado el MASSbus. Mientras muchos atribuyeron el éxito del PDP-11 a la decisión de la DEC en hacer una arquitectura abierta del Unibus del PDP-11. Con el KL, DEC se revirtió a la filosofía anterior, haciendo el MASSbus tanto único como propietario. Consecuentemente, no hubo fabricantes de periféricos del mercado de accesorios, que hicieran dispositivos para el MASSbus, y DEC decidió valorar sus propios dispositivos de MASSbus, notablemente la unidad de disco RP06, en un precio substancialmente alto sobre comparables dispositivos compatibles con IBM. CompuServe, diseñó su propio controlador de disco alternativo que podía operar en el MASSbus pero se conectaba con subsistemas de discos IBM estilo 3330.

### Modelo B

Más adelante, la versión del "Modelo B" de los procesadores 2060 eliminaron la limitación de los 256 Kword en el espacio de dirección virtual, permitiendo el uso de hasta 32 "secciones" de hasta 256 Kwords cada una, junto con substanciales cambios al conjunto de instrucciones. Los procesadores KL10 "Modelo A" y "Modelo B" pueden ser considerados como diferentes CPUs. El primer sistema operativo que tomó ventajas de las capacidades del Modelo B fue el TOPS-20 release 3, y el direccionamiento extendido del modo usuario fue ofrecido en el TOPS-20 release 4. Las versiones del TOPS-20 después del release 4.1 solo corrían en el Modelo B.

### KS10

El diseño KS10 fue lisiado para ser un Modelo A, aunque estaban presentes la mayoría de las rutas de datos necesarias para soportar la arquitectura del Modelo B cuando estaba presente. Sin duda, esto intentaba segmentar el mercado, pero acortó grandemente la tiempo de vida del KS10.

### Mejora MCA25

La mejora final al KL10 fue la actualización MCA25 de un 2060 a un 2065, que dio algunos incrementos de desempeño para programas que corrían en secciones múltiples.

## Arquitectura del conjunto de instrucciones

Desde el primer PDP-6 hasta el KL-10 Modelo A, la arquitectura del conjunto de instrucciones del modo-usuario en gran parte fue la misma. Esta sección cubre esa arquitectura.

### Direccionamiento

El PDP-10 tenía palabras de 36 bits y direcciones de palabras de 18 bits. En el modo supervisor, las direcciones de instrucción corresponden directamente a la memoria física. En el modo de usuario, las direcciones son traducidas a memoria física. Los primeros modelos dieron una memoria "alta" y una "baja" a un proceso de usuario: las direcciones con el bit 0 en el tope usaron un registro base, y las direcciones más altas usaron otro. Cada segmento era contiguo. Las arquitecturas posteriores tuvieron acceso a memoria paginada, permitiendo espacios de direcciones no contiguos.

### Registros

Había 16 registros de uso general, de 36 bits cada uno. Los registros también se podían direccionar como posiciones de memoria 0-15. Con excepción del registro 0, la mitad derecha de estos registros podría ser usada para indexación. Algunas instrucciones operaban en pares de registros.
Había también un registro de condición que almacenaba bits adicionales de los resultados de operaciones aritméticas (ej. desbordamiento) al que solo podían acceder algunas instrucciones.

### Modo supervisor

Había dos modos operacionales, el modo supervisor y el modo de usuario. Además de la diferencia, descrita arriba, en la manera de referenciar la memoria, los programas del modo supervisor podían ejecutar operaciones de entrada/salida.
La comunicación del modo usuario con el modo supervisor era hecha con Unimplemented User Operations (UUOs) (Operaciones de Usuario No-Implementadas): las instrucciones que no estaban definidas por el hardware eran atrapadas por el supervisor. Este mecanismo también era usado para emular operaciones que no tenían implementación por hardware en los modelos más baratos.

### Tipos de datos

Los principales tipos de datos que eran directamente soportados por la arquitectura, eran la aritmética entera de 36 bits de complemento a dos (incluyendo operaciones bitwise), punto flotante de 36 bits, y medias palabras. El punto flotante extendido de 72 bits era soportado por medio instrucciones especiales diseñadas para ser usadas en secuencias de multi-instrucciones. Los pointers de byte eran soportados por instrucciones especiales. Una palabra consistiendo de un medio "contador" y medio "pointer" soportaba regiones limitadas de memoria, notablemente las pilas.

### Conjunto de instrucciones

El conjunto de instrucciones es muy simétrico. Cada instrucción consiste de 36 bits, repartidos de la siguiente manera:
* un opcode de 9 bits,
* un código de registro de 4 bits, y,
* un campo de direccionamiento efectivo de 23 bits, que a su vez consiste en:
** un bit de indirección,
** un código de registro de 4 bits, y,
** un desplazamiento (offset) de 18 bits.
La ejecución de la instrucción comienza calculando la dirección efectiva. Se agrega el contenido del registro dado (si no es cero) al offset, entonces si el bit indirecto es 1, se lee la palabra en la dirección calculada y se repite el cálculo del direccionamiento efectivo (posiblemente indefinidamente, pero de hecho terminará con un trap después de 32 iteraciones). La dirección efectiva resultante puede ser usada por la instrucción que trae el contenido de la memoria, o simplemente como una constante. Así, por ejemplo, MOVEI A,3(C) suma 3 a los 18 bits más bajos del registro C y pone el resultado en el registro A, sin tocar la memoria.
Hay tres clases principales de instrucciones: aritméticas, lógicas, y de movimiento; salto condicional (conditional jump); salto condicional (conditional skip) (que puede tener efectos secundarios); y varias pequeñas clases.
Las operaciones de aritmética, lógica, y movimiento incluyen variantes que operan de:
* inmediato-a-registro,
* memoria-a-registro,
* registro-to-memoria, y
* registro-y-memoria-a-ambos o memoria-a-memoria.
Dado que los registros actúan como parte de la memoria, operaciones de registro-a-registro también están definidas. (No todas las variantes son útiles, aunque están bien definidas). Por ejemplo, la operación ADD tiene como variantes ADDI (sumar una constante inmediata de 18 bits a un registro), ADDM (sumar el contenido del registro a la Memoria), ADDB (sumar a Ambos (Both), es decir, sumar el contenido del registro a la memoria y también poner el resultado en el registro). Un ejemplo más elaborado es HLROM (Half Left to Right Ones to Memory) (mitad izquierda a derecha, unos a memoria), que toma la mitad izquierda del contenido del registro, y lo pone en la mitad derecha de la posición de memoria, y reemplazala mitad izquierda de la posición de memoria con unos.
Las operaciones condicionales de salto (conditional jump) examinan el contenido del registro y saltan a una localización dada dependiendo del resultado de la comparación. Por ejemplo, JUMPN A, LOC salta a LOC si A no es cero. Hay también saltos condicionales basados en el registro de condición del procesador.
Las operaciones condicionales de salto (conditional skip) comparan contenidos de registro y de memoria y, dependiendo del resultado de la comparación, saltan la siguiente instrucción (que a menudo es un salto incondicional). Un ejemplo simple es CAMN A, LOC que compara el contenido del registro A con el contenido de la localización LOC y salta la instrucción siguiente si no son iguales. Un ejemplo más elaborado es TLCE A, LOC (que significa "Test Left Complement, Skip if equal") (Prueba el complemento a dos, salta si es igual), que usando el contenido de LOC como una máscara, selecciona los bits correspondientes en la mitad izquierda del registro A. Si todos esos bits son Igual a cero, salta la siguiente instrucción; y en cualquier caso, Reemplaza esos bits por su complemento booleano.
Algunas clases de instrucción más pequeñas incluyen las instrucciones de shift/rotate y las instrucciones de llamada a procedimientos. Particularmente notables son las instrucciones de pila PUSH y POP y las correspondientes instrucciones de llamada a pila PUSHJ y POPJ. Las instrucciones de byte usan un formato especial de palabra indirecta para extraer y almacenar campos de bits de tamaño arbitrario, avanzando posiblemente el pointer a la unidad siguiente.

## Software

El sistema operativo original del PDP-10 fue llamado simplemente "Monitor", pero posteriormente fue renombrado TOPS-10, para el momento en que el sistema comenzó a ser conocido como el DECsystem-10. Las primeras versiones del Monitor y del TOPS-10 formaron la base del sistema operativo WAITS de Stanford y del CompuServe time-sharing system.
Con el tiempo, algunos operadores del PDP-10 comenzaron a correr sistemas operativos ensamblados de -components- importantes desarrollados fuera de DEC. Por ejemplo, el Scheduler principal vino de una universidad, el Disk Service de otra, etc. Los servicios de tiempo compartido comerciales como CompuServe, Online Systems, y Rapidata mantuvieron sofisticados grupos internos de programación de sistemas, de manera de poder modificar el sistema operativo como fuera necesario para sus propios negocios sin ser dependientes en la DEC u otros. De algunas maneras, este fue uno de los primeros ambientes de fuente abierta, aunque los operadores comerciales tendieron a solamente tomar código de fuentes abiertas, guardando sus propias mejoras propietarias para ellos mismos.
BBN desarrolló su propio sistema operativo alternativo, TENEX, que se convirtió bastante rápidamente en el estándar de facto en la comunidad de investigación. Posteriormente DEC portó Tenex al KL10, mejorándolo considerablemente, y lo nombró TOPS-20, formando la línea DECSYSTEM-20. El MIT también había desarrollado su propio sistema influyente, ITS (nombrado así para parodiar al sistema operativo CTSS).

## Clones

En los años 1970, los investigadores en Xerox PARC, frustrados por la denegación de la gerencia superior de la compañía para que los dejaran comprar un PDP-10 (Xerox acababa de comprar el SDS, y quería que PARC usara una máquina SDS), diseñaron y construyeron dos sistemas clones para su propio uso, que nombraron "MAXC" (pronunciado "Max", en honor de Max Palevsky, quien había vendido el SDS a Xerox). Corrían una versión modificada de TENEX.
Los intentos de terceros de vender clones del PDP-10 fueron relativamente fracasados; ver Foonly, System Concepts, y XKL.

## Cancelación e influencia

El PDP-10 fue en algún momento eclipsado por las máquinas supermini de VAX (descendientes del PDP-11) cuando la DEC reconoció que las líneas de productos PDP-10 y VAX estaban compitiendo una con la otra y decidió concentrar su esfuerzo de desarrollo de software en el VAX, más provechoso económicamente. La cancelación de la línea de productos PDP-10 fue anunciada en 1983, incluyendo la cancelación del proyecto en curso Júpiter para producir un nuevo procesador del tope de la línea para el PDP-10 (a pesar de que ese proyecto estaba en buena forma a la hora de la cancelación).
Este acontecimiento escribió la condenación del ITS y las culturas técnicas que habían producido el Jargon File original, pero por los años 1990 se había convertido en algo como una divisa de honor entre hackers antiguos haber tenido su primera experiencia en un PDP-10.
Las instrucciones de lenguaje ensamblador LDB y DPB (load/deposit byte) sobreviven como funciones en el lenguaje de programación Common Lisp. Ver la sección de "notas" en el artículo LISP - el tamaño de la palabra de 36 bits del PDP-6 y el PDP-10 influyeron por la conveniencia de programación de tener 2 pointers del LISP, cada uno con 18 bits, en una palabra.
Will Crowther creó Adventure, el prototipo del juego de aventura de computadora, para un PDP-10. Don Daglow creó al primer juego de béisbol de computadora (1971) y Dungeon (1975), el primer videojuego de rol (RPG) en un PDP-10. Walter Bright originalmente creó Empire para el PDP-10. Roy Trubshaw y Richard Bartle crearon el primer MUD en un PDP-10. Adicionalmente, Zork fue escrito en el PDP-10, e Infocom usó varios PDP-10s para el desarrollo y prueba de juegos.

## Trivia

Algo del CGI para la película de la ciencia ficción TRON, de Disney, fue renderizado en el Foonly F-1, un clon del PDP-10. Es también significativo que el PDP-10 tiene una instrucción TRON (Test Right-halfword Ones and skip if Not masked) en el opcode 666 (octal). Coincidentemente, los programadores anteriores del PDP-10 crearon los juegos de video TRON del Intellivision, que siguieron al lanzamiento de la película.
Una de las colecciones más grandes de todos los tiempos de sistemas de arquitectura DECsystem-10 ensamblados, estaba en CompuServe, que en su pico operó sobre 200 sistemas débilmente acoplados en tres centros de datos en Columbus, Ohio. CompuServe usaba estos sistemas como 'hosts', proporcionando acceso a aplicaciones comerciales así como al Servicio de Información CompuServe. Mientras que el primero de esos sistemas fueron comprados a la DEC, cuando DEC abandonó la arquitectura PDP-10 en favor del VAX, CompuServe y otros clientes del PDP-10 comenzaron a comprar las computadoras compatibles (a nivel de plugs) de Systems Concepts. En fecha enero de 2007, CompuServe continúa operando un pequeño número de máquinas con la arquitectura PDP-10 para realizar algunas funciones de facturación y encaminamiento.
Las fuentes de alimentación principales usadas en las máquinas de la serie KL eran tan ineficientes que los ingenieros de CompuServe diseñaron una fuente de alimentación de reemplazo que consumía alrededor de la mitad de energía. CompuServe ofreció licenciar el diseño de su fuente de alimentación del KL a DEC sin costo, si DEC prometía que cualquier nuevo KL comprado por CompuServe tendría instalada la fuente de alimentación más eficiente. La DEC declinó la oferta.
Otra modificación hecha al PDP-10 por los ingenieros de CompuServe fue el reemplazo, en el gabinete del procesador KI-10, de centenares de lámparas indicadoras incandescentes con módulos de lámparas led. El costo de la conversión fue compensado fácilmente por los ahorros en el consumo eléctrico, la reducción del calor, y la mano de obra requerida para reemplazar las lámparas quemadas. No había bancos similares de lámparas indicadoras en procesadores KL y KS.
Las máquinas de la clase KL no podían ser encendidas sin la asistencia de una computadora front end PDP-11/40 instalada en cada sistema. El PDP-11 era cargado (booted) desde una unidad de disco RP06 de dos puertos (o alternativamente de una unidad de Disquete de 8 " o un DECtape), y entonces los comandos se podían dar al PDP-11 para comenzar el procesador principal, que típicamente era cargado desde la misma unidad de disco RP06 que el PDP-11. El PDP-11 realizaría funciones guardián una vez que el procesador principal estaba corriendo.
El sistema de KS usaba un similar procedimiento de carga. Una CPU 8080 cargaba el microcódigo de un disco de RM03 o RP06, o una cinta magnética y entonces se iniciaba el procesador principal. El 8080 cambiaba modos después de que el sistema operativo hubiera arrancado y controlaba los puertos seriales remotos de diagnóstico de la consola.
Systems Concepts construyó un modelo de demostración de una versión de computadora portátil del PDP-10. No se sabe si todavía existe esta unidad.
En la película Operación Swordfish, Stanley, el hacker almacena el código para su gusano en un PDP-10 en un cuarto de archivo Cal Tech que había sido mantenido en línea, y en Internet, por "motivo histórico".
Este artículo parte está basado en el Jargon File, que está en el dominio público.
Ver: TOPS-10, ITS, Tenex, TOPS-20, WAITS.

## Lectura adicional

* C. Gordon Bell, Alan Kotok, Thomas N. Hastings, Richard Hill, The Evolution of the DECsystem-10, in C. Gordon Bell, J. Craig Mudge, John E. McNamara, Computer Engineering: A DEC View of Hardware Systems Design (Digital, Bedford, 1979)