# IBM System/3

El IBM System/3 (introducido en 1969 y discontinuado en 1985) fue un computador económico de IBM para tareas de oficina orientado a clientes nuevos o a organizaciones que aún mantenían computadoras de la Serie IBM 1400 o máquinas de contabilidad. Fue el primer miembro de la familia que IBM llamó "línea de rango medio". A estos computadores se los conoció como minicomputadores, y actualmente servidores.

## Descripción

Implementaba un nuevo formato de tarjeta perforada que era más chica y almacenaba 96 caracteres. En lugar de las perforaciones rectangulares clásicas de las tarjetas IBM, la nueva tarjeta tenía pequeños agujeros de 1 mm de diámetro, más parecidos a los que poseía la cinta perforada. Los datos eran almacenados en formato BCD de seis bits, con columnas de 32 caracteres cada una, u ocho bits en formato EBCDIC, con dos perforaciones extra ubicadas al final de las columnas.
Las tarjetas tenían lugar para 128 caracteres impresos en 4 columnas de 32 caracteres cada una. La IBM System/370, con un lector de tarjetas apropiado, podía también procesar las nuevas tarjetas.
Muchas unidades del System/3 modelo 10 original fueron enviadas solo con E/S de tarjeta perforada (lectura, perforación y ordenamiento) y una impresora. Había dos modelos de lector de tarjetas. El más común era conocido como MFCU ("multifunction card unit", unidad multifunción de tarjetas), y leía, perforaba y ordenaba las nuevas tarjetas de 96 columnas. El segundo modelo, menos común, era el MFCM ("multifunction card machine", máquina de tarjetas multifunción), y realizaba las mismas operaciones, pero solo con las tarjetas más comunes de 80 columnas. La MFCM era provista para grandes compañías que ya tenían equipos para tarjetas de 80 columnas. La impresora nativa era la 5203 que puede verse en la fotografía; dicha impresora era de carro de caracteres con 33 martillos móviles que se colocaban en 4 posiciones contiguas. Había 3 modelos de diferentes velocidades: 100ppm, 200ppm y 300ppm. Las impresoras disponibles eran varios modelos de impresora de línea IBM 1403, la cual había sido originalmente construida para el computador IBM 1401. En sistemas que solo tenían lectora de tarjetas, el compilador RPG/II se ejecutaba en dos fases. La primera fase iniciaba leyendo desde una tolva de entrada del MFCU, y el programa fuente se leía luego del compilador. Un reporte intermedio se perforaba en tarjetas, las cuales eran leídas en la segunda fase de compilación. En este momento se perforaba en tarjetas el programa ejecutable. Este programa podía entonces iniciarse ("IPL", por "Initial Program Load", programa de carga inicial) para realizar el proceso deseado. Este procedimiento podía requerir más de una hora para un programa de tamaño apreciable.
Para el almacenamiento de masa, el System/3 tenía un disco duro de un solo plato, del tamaño aproximado de una pizza; en principio, cada plato almacenaba 2,5 MB de datos. La configuración estándar para almacenamiento era de uno o dos discos fijos, cada uno en una unidad separada, los que normalmente contenían el sistema operativo y los programas del usuario. Adicionalmente, cada disco fijo podía tener incorporado un cartucho de disco removible; estos típicamente contenían archivos de datos asociados a varias aplicaciones, por ejemplo una lista de clientes, y los usuarios tenían varios de ellos. De esa manera, un sistema de gama baja podía soportar 10 MB de almacenamiento (dos fijos y dos removibles), pero esto era muy caro y no era común.
El almacenamiento fuera de línea estaba disponible con la compra de unidades de cinta externa que podían leer y escribir en las cintas IBM estándar.
La impresión era normalmente por la impresora de línea o por una impresora de matriz de puntos. Una máquina de escribir selectric era a menudo usada como consola.
El System/3 venía en forma estándar con un compilador RPG/II, y usaba un lenguaje de control de tareas simple llamado OCL, el cual era parecido superficialmente al famoso (o infame) Job Control Language.
El System/3 y los modelos que lo siguieron (System/32, System/34, System/36 y System/38, luego el AS/400 e iSeries) son generalmente denominados minicomputadoras, o en la terminología de IBM "sistemas de rango medio" ("midrange systems"), en contraste a los grandes mainframes de IBM.

## Juego de Instrucciones

Una de las cosas más interesantes del System/3 era su juego de instrucciones. Estaban optimizadas para dos aspectos clave de este producto: memoria principal limitada, y el lenguaje de programación RPG.
El S/3 original (modelos 10 y los posteriores 6, 8 y 12) tenían 29 instrucciones, todas ocupaban entre 3 y 6 bytes (24 a 48 bits). Los primeros 4 bits proveían un montón de información: "1111" significaba que esta era una instrucción sin operandos, es decir, un comando. ej. Iniciar I/O (el operador E/S se definía cargando previamente los registros de E/S). "11xx" y "xx11" indicaban una instrucción de 1 operando, como una bifurcación. Si xx era 00 el operando era direccionado por la dirección de 16 bits completa. Si xx=01 o 10 indicaba que debía usarse una dirección con desplazamiento, usando el registro índice 1 o 2 respectivamente. La dirección base se había cargado previamente en uno de los dos registros y la instrucción contenía el desplazamiento de hasta 256 bytes (8 bits de direccionamiento).
Otros patrones para el primer medio byte indicaban instrucciones de dos operandos. "0000" indicaba que ambos operandos eran direccionados por dirección de 16 bits directa. "0100": el operando 1 usa el registro 1 como su base; el operando 2 usa direccionamiento directo. "0110": el operando 1 usa el registro 1 como su base, el operando 2 usa el registro 2. Y así sucesivamente.
Los restantes 4 bits del primer byte definen con más precisión las instrucciones. Esta estructura significaba que existía la capacidad de tener hasta 64 operaciones en total: 16 comandos (aunque nunca hubo más de cinco en toda la gama de productos); 16 instrucciones de 1 operando comenzando con 11xx; 16 instrucciones de 1 operando comenzando con xx11; 16 instrucciones de 2 operandos.
Además de los dos registros índice ya mencionados (referidos como 1 y 2, o 01 y 10 en binario) había otros registros. "Registro 4" (0100) era el registro de dirección de instrucción ("Instruction Address Register, IAR) el cual apuntaba a la dirección en curso.
"Registro 8" (1000) era el registro de dirección de rellamada ("Address Recall Register", ARR), establecido para determinadas instrucciones. Entre ellas, el salto condicional (mnemónico "BC") la cual era usado para apuntar al byte inmediato posterior a la instrucción del bifurcación. Para la gente de los mainframes de IBM esto significaba que el salto del S/3 podía conectarse a un BALR ("branch and link register", registro de salto y enlace) condicional. Era muy usado para salar a una subrutina y regresar luego de procesarla. Finalmente, el "Registro 16" (00010000) era el registro de estado del programa, que contenía cosas como el resultado de una instrucción de comparación.
Nótese que los registros eran para direccionamiento y estado del programa; no para aritmética.
Entre las 29 instrucciones se proveían instrucciones aritméticas de suma/resta binarias y decimales. Multiplicación y división no se proveían por hardware, y debían manejarse mediante rutinas de software. No existía aritmética de coma flotante. Esto continuó incluso en los modelos posteriores, y más sofisticados, System/34 y System/36.
Todo esto era más complicado incluso con el System/3 modelo 15, y los System/34 y 36. Aunque todavía se manejaba la memoria por medio de direccionamiento de 16 bits, estos sistemas podían soportar 64k de memoria principal (hasta 512K, y teóricamente más), usando traducción de direcciones para cambiar de una página de 64K a otra. En los Registros de Traducción de Direcciones ("Address Translation Registers", ATR) se indicaba la página de memoria a usar, y su contenido se concatenaba con la dirección de 16 bits del programa para producir la dirección real. Estos "ATRs" estaban solo disponibles para el sistema operativo.
Como acotación al margen, el S/3 modelo 10 original (y el posterior modelo 12) tenían una forma primitiva de multiprogramación llamada Función de Doble Programa ("Dual Program Feature"). Esto no daba más direccionamiento de la memoria, pero daba dos juegos de registros e instrucciones, los cuales podían cambiar de un "nivel de programa" al otro. Las instrucciones de E/S también fueron modificadas para intercambiar cuando una E/S se iniciaba. Era posible manipular los registros de direccionamiento de las instrucciones desde el otro nivel de programa, por lo que se podía jugarle malas pasadas a la máquina. ¡¡Todo inofensivamente divertido!!
Hasta ahora, solo se explicó el primer byte. El siguiente byte ("Q") era normalmente un calificador, como especificar el número de bytes trasladados en un movimiento de caracteres, o la condición de prueba para una bifurcación. Un par de instrucciones usaban este byte para un operador inmediato de 1 byte. El byte restante era para operadores de desplazamiento o de direccionamiento, o para detalles de algunos comandos.
Acá tenemos un ejemplo para mostrar todo esto trabajando: un comando simple, Salto Condicional (Conditional Jump), un tipo especial de bifurcación condicional (solo avance, hasta 256 bytes), adecuado para saltos cortos dentro del mismo bloque de memoria: Byte de código de Op.= F2 (es en hexadecimal, Hex F es 1111 en binario, Hex 2 (0010) define el op); byte Q= 00000001 especifica que "saltaremos" si el registro de condición tiene el bit de "igual" en 1 (encendido); Operando= 00011000: si la condición es verdadera, saltamos hacia adelante 24 bytes.
Como se ha indicado anteriormente, este conjunto de instrucciones se ha optimizado para dos aspectos de la familia del Systema/3. El primero fue la poca cantidad de memoria disponible; el segundo era el lenguaje de programación RPG. Los que saben algo acerca de los primeros RPG, sabrán acerca de los indicadores-interruptores binarios utilizados para el programa de control de flujo. Más de 100 de estos estaban disponibles y eran bien usados (al menos en los tiempos más recientes). Mediante el formato de instrucciones explicado más arriba, muchas de las operaciones indicadas a los indicadores podían caber en solo 3 bytes. Por ejemplo... una línea de RPG podía testear un indicador pora "On": 3 bytes para un op. "Test Bits On"; luego 3 bytes para un Salto, como se explicó antes, muy útiles para el compilador RPG. Ahorrar el byte impar aquí y por allá era bueno cuando solo se tenían 64K para trabajar. Y, por el S/3 en sí mismo, que incluía el sistema operativo (el cual aumentó a cerca de 20K en el modelo 10 con la introducción del "Communication Control Program", CCP).

## Legado

El System/32 monousuario era un procesador con palabras de 16 bits muy diferente. Emulaba el juego de instrucciones del System/3 por software (que era más bien lento). e Los posteriores IBM System/34 y IBM System/36 heredaron en parte la arquitectura del System/32. Tenían dos procesadores: un Porcesador de Control de Almacenamiento (Control Storage Processor, CSP), similar al del System/32, el cual manejaba la mayoría de las operaciones de entrada/salida y sepervisión, y un Procesador de Almacenamiento Principal (Main Storage Processor, MSP), una re-implementación del procesador del System/3 modelo 15, usado para correr las aplicaciones de System/3. Por lo tanto, los sistemas pueden ser considerados como System/32 con el añadido "de emulación de hardware" del Systema/3. A pesar de que el IBM System/38 y su sucesor, el AS/400 y la iSeries llenaron el mismo nicho del mercado, usaban una arquitectura radicalmente diferente, basada en el fallido proyecto IBM Future Systems.

## Peculiaridades

El System/3 no tenía forma de detener un proceso una vez que se iniciaba. Por ejemplo, si una compilación fallaba por un error en alguna de las primeras páginas, tenía que esperar a que se terminara de imprimir el listado de compilación entero, a veces muy voluminoso. Un truco aprendido por los programadores era quitar el papel de la impresora; esto causaba que la máquina se detuviera y se mostraba en la consola un código de error P3. En ese momento, se podía introducir el código FF para cancelar el programa.
El System/3 no tenía dispositivos de señales acústicas, y a menos que el operador estuviera en la consola y mirando el estado de las luces, no se enteraba del estado de los eventos.

## Cronología

* 1969 - IBM 5410, o System/3 Modelo 10
* 1970 - IBM 5406, o System/3 Modelo 6
* 1973 - IBM 5415, o System/3 Modelo 15
* 1974 - IBM 5408, o System/3 Modelo 8
* 1975 - IBM 5412, o System/3 Modelo 12
La Consola de Operador (Operator Console Facility, OCF) del System/3 consistía en una máquina de escribir IBM Selectric para usar como interfaz con el ordenador, o una terminal IBM 3270. Con una OCF, había la posibilidad de 'cancelar' un proceso o tarea que se estuviera ejecutando, incluyendo cualquiera de las dos particiones (P1 o P2). El sistema podía correr solo dos programas simultáneamente.