El IBM 1130 Computing System, presentado en 1965, [3] fue el ordenador más económico de IBM en ese momento. Se trataba de una máquina binaria de 16 bits que se comercializó en mercados técnicos sensibles a los precios y con uso intensivo de la computación, como la educación y la ingeniería, y sucedió al IBM 1620 decimal en ese segmento de mercado. Las instalaciones típicas incluían una unidad de disco de 1 megabyte que almacenaba el sistema operativo, los compiladores y los programas objeto, con el código fuente del programa generado y mantenido en tarjetas perforadas . Fortran era el lenguaje de programación más común utilizado, pero había varios otros disponibles, incluido APL .
El 1130 también se utilizó como un front-end inteligente para conectar una unidad de visualización gráfica IBM 2250 , o como estación de trabajo de entrada de trabajos remota (RJE), conectada a un mainframe System/360 .
Se ha estimado que la producción total del 1130 fue de 10.000 unidades. [4] El 1130 ocupa un lugar en la historia de la informática porque (y sus clones no IBM) proporcionó a muchas personas su primera interacción directa con una computadora. Su relación precio-rendimiento era buena e incluía notablemente un almacenamiento en disco extraíble y económico , con software confiable y fácil de usar que podía estar en varios lenguajes de alto nivel . El bajo precio (desde alrededor de $32.000 o $41.000 con unidad de disco) [3] y el conjunto de características bien equilibradas permitieron el desarrollo interactivo de programas de "tienda abierta" .
El IBM 1130 utiliza el mismo encapsulado electrónico, llamado Solid Logic Technology (SLT), que se utilizó en System/360 . Tiene una arquitectura binaria de 16 bits , al igual que las minicomputadoras posteriores como la PDP-11 y la Data General Nova .
El espacio de direcciones es de 15 bits, lo que limita el 1130 a 32.768 palabras de 16 bits ( 65.536 bytes ) de memoria. El 1130 utiliza memoria de núcleo magnético , que el procesador direcciona en límites de palabras, utilizando modos de direccionamiento directo, indirecto e indexado.
IBM implementó cinco modelos de la unidad central de procesamiento 1131, el componente de procesamiento principal del IBM 1130. Los modelos 1 a 5 describen el tiempo de ciclo de la memoria central, así como la capacidad del modelo para tener almacenamiento en disco. Una letra de la A a la D adjunta al número de modelo indica la cantidad de memoria central instalada.
La unidad central de procesamiento IBM 1131 pesa aproximadamente 760/1050 lb (345/477 kg). [5]
El modelo 4 era un producto de menor precio con un tiempo de ciclo de 5,9 μs. Algunos compradores de mejoras de rendimiento observaron que el ajuste en campo para lograr la mejora era sorprendentemente trivial.
La impresora IBM 1132 depende del procesador 1130 en lugar de la lógica interna para determinar cuándo activar las ruedas de impresión a medida que giran. Las impresoras para el Modelo 4 funcionan más lentamente, pero el procesador más lento aún no puede seguirle el ritmo. El manual de hardware revela que cuando el Modelo 4 estaba dando servicio a las dos interrupciones de nivel más alto (la interrupción de la columna del lector de tarjetas de nivel 0 o la interrupción de la impresora de nivel 1), funcionó con el tiempo de ciclo más rápido de 3,6 μs. Algunos usuarios del Modelo 4 escribirían un controlador de impresora falso que no descartara la interrupción de la impresora, para beneficiarse de la mayor velocidad del procesador. Sin embargo, las interrupciones de nivel inferior se desactivan durante este intervalo, incluso la interrupción de fin de tarjeta (nivel 4) del lector de tarjetas 1442.
El IBM 1800 , anunciado en noviembre de 1964, [6] es un predecesor del IBM 1130 para aplicaciones de control de procesos . Utiliza hardware en lugar de memoria central para los tres registros de índice y presenta dos instrucciones adicionales (CMP y DCM) más capacidades de interrupción y E/S adicionales . Es un sucesor del IBM 1710 , como el IBM 1130 es un sucesor del IBM 1620 .
El IBM 1500 es un sistema educativo multiusuario basado en un IBM 1130 o un IBM 1800. Puede conectarse a hasta 32 estaciones de trabajo de estudiantes, cada una con una variedad de capacidades audiovisuales .
Aparte de estos, IBM no produjo ningún sistema sucesor compatible con el 1130. El IBM System/7 es un sistema de control de procesos y de tiempo real, y el IBM Series/1 es un miniordenador de 16 bits de propósito general; ambos tienen arquitecturas diferentes del 1130 y entre sí.
Para maximizar la velocidad y conservar espacio, el sistema operativo y los compiladores están escritos completamente en lenguaje ensamblador y emplean técnicas que hoy en día son raras, incluida la mezcla de código y datos, así como código automodificable .
Gran parte de la programación de usuario se realiza en Fortran . El compilador Fortran 1130 puede ejecutarse en una máquina con solo 4096 palabras de núcleo, aunque el programa compilado podría no caber en una máquina de ese tipo. En este compilador de múltiples pasadas , cada "fase" procesa todo el programa fuente y lo lleva un paso más hacia el código de máquina. Por ejemplo, la primera fase lee las declaraciones fuente en la memoria, descarta las líneas de comentarios, elimina los espacios excepto en los literales de texto, concatena las líneas de continuación e identifica las etiquetas. El compilador está disponible en una versión residente en disco, así como en cinta de papel perforada de ocho canales o tarjetas perforadas.
El sistema operativo más utilizado para el 1130 es el Disk Monitor System Version 2 (DM2) introducido en 1967. DM2 es un sistema orientado a lotes de una sola tarea . Requiere un sistema con al menos 4 KB de memoria central y una unidad de disco 2310 integrada para la residencia del sistema. El Supervisor es pequeño para los estándares modernos, y contiene diversos detalles del sistema, como rutinas de interrupción de primer nivel, llamadas Subrutinas de Nivel de Interrupción , además del controlador de disco y rutinas para cargar el intérprete de comandos de control de trabajo y el controlador del lector de tarjetas. Los controladores de dispositivo para otros dispositivos de E/S requeridos por un trabajo se incorporan como parte de la carga de ese trabajo, que también podría incluir el reemplazo del controlador de disco básico por un controlador más avanzado. Durante la ejecución de un trabajo, solo un monitor residente , llamado Supervisor Esqueleto , reside en la memoria. Este supervisor requiere sólo 1020 bytes, por lo que la primera memoria disponible de una tarea comienza con la dirección /01FE ( hexadecimal ) o la palabra 510. Cuando el trabajo finaliza o se aborta, el supervisor carga el Analizador de registros de control de monitor ( MCRA ) para leer el control del trabajo para el siguiente. Mientras el trabajo se está ejecutando, el Supervisor está inactivo. Aparte de los controladores de dispositivos y el procesamiento de interrupciones, todo el tiempo de CPU se dedica por completo a las actividades del trabajo. Otros programas distribuidos como parte del sistema operativo son una utilidad de volcado de memoria , DUMP , y el Programa de utilidad de discos , DUP .
Estaba disponible un sistema de programación de cinta de papel/tarjeta para dar soporte a sistemas sin disco.
Existe una jerarquía de controladores de dispositivos: aquellos cuyos nombres terminan en Z son para Fortran, como DISKZ, mientras que los programadores de ensamblador podrían usar DISK0, y DISK1 era incluso más rápido en la lectura de múltiples sectores de disco. Pero DISKZ comienza su direccionamiento de sectores con el primer sector no utilizado disponible, mientras que los demás comienzan con el sector cero del disco, lo que hace posible que un programador no familiarizado con la organización de discos sobrescriba inadvertidamente el cargador de arranque.
Otros lenguajes de programación disponibles en el 1130 incluyen
Incluso existe un compilador ALGOL en francés , en el que, por ejemplo, " Debut ...Fin;
" sustituye a " Begin ... End;
". Todos sus mensajes están en francés, por lo que el objetivo es una "buena compilación".
La Eastern Michigan University desarrolló un compilador Fortran IV para el 1130, conocido como Fortran-EMU, como alternativa al compilador Fortran IV (subconjunto) proporcionado por IBM. Agrega muchas características de Fortran IV que no son compatibles con el compilador de IBM, incluido el tipo de datos LOGICAL, nombres de variables de seis letras y diagnósticos mejorados. El compilador Fortran-EMU se distribuyó como una baraja de tarjetas perforadas en un formato de archivo de imagen de disco con toda el área restante del sistema eliminada, para evitar copiar otros módulos que normalmente residirían en el mismo disco, como el ensamblador o los compiladores.
La Universidad Estatal de Oklahoma desarrolló un compilador ALGOL 68 , escrito en ANSI Fortran 1966. [13] [14] [15]
En la Universidad de Michigan se desarrolló un intérprete FOCAL .
IBM también distribuyó una gran biblioteca de programas, tanto compatibles con IBM (Tipo I y II) como no compatibles (Tipo III y IV).
Dado que el 1130 estaba orientado principalmente al mercado científico, predominaron los programas científicos y de ingeniería:
El 1130 también ocupó un nicho como máquina de procesamiento de datos para organizaciones más pequeñas:
También existe software para propósitos especiales:
El funcionamiento por lotes del 1130 está dirigido por registros de control en el flujo de entrada principal (lector de tarjetas o cinta de papel). Hay dos tipos de registros de control: registros de control de monitorización y registros de control de supervisión. [19]
Los registros de control del monitor se identifican //␢
seguidos de un "código de pseudooperación" en las columnas 4 a 7. "␢" representa un solo espacio en blanco.
El JOB
registro puede tener una "T" en la columna 8 para indicar que cualquier archivo agregado al Área de usuario por este trabajo debe eliminarse al final. Las columnas 11 a 15 pueden contener una etiqueta de cartucho; el sistema verifica que el cartucho especificado esté montado antes de continuar.
El XEQ
registro puede contener el nombre del programa que se va a ejecutar en las columnas 8 a 12. Si se omite, se ejecutará el programa que se encuentre actualmente en el almacenamiento de trabajo. Si la columna 14 contiene "L" y el programa está en formato de sistema de disco (no en imagen de núcleo), el generador de carga de núcleo imprimirá un mapa de núcleo. Si esta instrucción va seguida de LOCAL
NOCAL
, o FILES
Registros de control de supervisor, las columnas 16 y 17 contienen el recuento de estos registros. La columna 19 indica opcionalmente qué rutina de controlador de disco se va a vincular. "0", "1" o "N" solicita DISK1, DISK2 o DISKN; cualquier otro carácter, incluido el espacio en blanco, solicita DISKZ, la rutina de disco FORTRAN.
Los registros de control del supervisor comienzan con un "*" en la columna 1, seguido inmediatamente por la pseudooperación del comando en la columna 2. Son LOCAL
, NOCAL
y FILES
para el generador de carga principal. Los registros de control de DUP tienen un formato similar. Estos registros controlan la vinculación del programa, ya sea para la // XEQ
declaración o el *STORECI
comando de DUP.
Los recuerdos perdurables de la IBM 1130 pueden haber sido el resultado de su necesidad de una intervención humana continua. Normalmente estaba ocupada ejecutando "trabajos" especificados por una baraja de tarjetas perforadas . El operador humano cargaba los trabajos en el lector de tarjetas y los separaba en trabajos para devolverlos, quizás junto con la salida impresa, al remitente. El operador también tenía que vigilar la 1130 para detectar evidencias de un mal funcionamiento o un trabajo estancado e intervenir presionando la INT REQtecla en el teclado para saltar al inicio del siguiente trabajo. [20]
El inicio de un trabajo se marcaba con una tarjeta perforada que comenzaba con // JOB
. Cualquier tarjeta que comenzara con //
era un comando para el Supervisor y no podía usarse como programa de usuario o datos. Otros comandos incluían // DUP
ejecutar el Programa de Utilidad de Discos (para eliminar archivos o agregar el archivo en el área temporal a la colección de archivos) y // XEQ
ejecutar un programa con nombre desde el disco. Si un programa de usuario intentaba leer una tarjeta de comando, la rutina estándar del lector de tarjetas indicaba el fin de la entrada al programa y guardaba el contenido de esa tarjeta para el Supervisor.
A diferencia del IBM 360, donde se puede seleccionar un dispositivo de arranque desde la consola del sistema, un IBM 1130 solo se puede "arrancar" (IPL: carga inicial del programa) desde un dispositivo externo: un lector de tarjetas o un lector de cinta de papel. [21] [22]
El procedimiento de arranque lee una tarjeta del lector de tarjetas. La tarjeta de arranque contiene un código binario [23] para leer el contenido del sector cero de la unidad de disco, que a su vez maneja la interrupción de "operación completa" de la unidad de disco y realiza lecturas de disco adicionales para preparar el 1130 para el primer trabajo de tarjeta perforada. Todo el proceso tarda aproximadamente un segundo en completarse.
Cuando se inicia el IBM 1130, el Supervisor todavía está en la memoria y probablemente intacto, ya que la memoria central conserva su estado sin energía. Si el operador concluye que un programa de usuario se ha estancado, el Supervisor puede detectar una pulsación de tecla para abortar el programa y pasar a la siguiente tarjeta //. El Supervisor no está protegido contra modificaciones por un trabajo mal escrito, un caso que podría requerir que el operador reiniciara el 1130. Tampoco había protección contra escritura en el disco. Si se modifica la copia del software del sistema en el disco, se puede restaurar volviéndola a cargar desde aproximadamente 4000 tarjetas perforadas con código binario (aproximadamente dos cajas).
La unidad de disco IBM 2310 almacena sectores de 320 palabras (640 bytes) más una dirección de sector de una palabra. Un cilindro consta de dos pistas en las superficies superior e inferior del 2315, o de un plato en el paquete de discos 1316 utilizado en el 2311. Cada cilindro de disco contiene ocho sectores. El monitor divide lógicamente un sector en dieciséis bloques de disco de 20 palabras (40 bytes) cada uno. El bloque de disco es la unidad de asignación de archivos.
El sistema distingue entre cartuchos de sistema , que contienen el monitor y las utilidades junto con los datos del usuario, y cartuchos que no son de sistema , que contienen únicamente los datos del usuario. Todos los cartuchos contienen información sobre el cilindro 0, incluida la tabla de cilindros defectuosos, la identificación del cartucho y un programa de arranque ( código de arranque ). En los cartuchos que no son de sistema, el arranque simplemente imprime un mensaje de error y espera si se intenta arrancar desde este cartucho. En un cartucho de sistema, este es el programa de arranque en frío , seguido de un área de comunicaciones y el monitor residente en los sectores uno y dos. Los sectores del tres al cinco contienen la Tabla de equivalencia de ubicación del sistema (SLET), un directorio de todas las fases de todos los programas de monitor. Otra información de control completa la primera pista.
El área del sistema está presente en los cartuchos del sistema. Contiene el programa Disk Monitor y, opcionalmente, el compilador FORTRAN, el ensamblador y un búfer de imagen de núcleo utilizado para vincular programas reubicables. También contiene los directorios de archivos de usuario: tabla de equivalencia de ubicación fija (FLET) y tabla de equivalencia de ubicación (LET).
Después del área del sistema, el cartucho contiene hasta tres subdivisiones lógicas: el área fija , el área del usuario y el almacenamiento de trabajo . Tanto el área fija como el área del usuario almacenan programas y datos no temporales. El tamaño del área fija está definido por DUP y almacena datos y programas solo en formato de imagen de núcleo. No se vuelve a empaquetar cuando se eliminan archivos. El área del usuario almacena datos y programas en cualquier formato. El límite entre el área del usuario y el almacenamiento de trabajo "flota": el área del usuario se expande a medida que se agregan archivos y se contrae a medida que se vuelve a empaquetar para recuperar espacio de los archivos eliminados. Si es necesario modificar un archivo, el proceso habitual es usar // DUP
comandos para eliminarlo, lo que mueve los archivos posteriores para cerrar el espacio y luego le da ese nombre al archivo temporal como la nueva versión del archivo. Por lo tanto, los archivos que rara vez se modifican migran hacia el inicio del disco a medida que se agregan nuevos archivos o nuevas versiones, y los archivos modificados con frecuencia se almacenan hacia el final del disco.
El almacenamiento de trabajo comienza después del último archivo en el área de usuario y ocupa todo el espacio restante en el cartucho. Puede contener un archivo temporal creado por el sistema o el usuario, como la salida de un compilador o un programa de aplicación. Este archivo está sujeto a una posible eliminación al final del trabajo actual, a menos que se guarde en el área fija o en el área de usuario.
Todos los archivos de disco son bloques de disco contiguos, por lo que no hay fragmentación . Un programa puede usar y modificar archivos con nombre, pero no puede expandirlos más allá de su tamaño original. Un programa que crea más de un archivo debe tener todos menos uno asignados previamente por un DUP.
Como el espacio en disco es limitado, los archivos fuente de los programas se guardan normalmente como barajas de cartas. Los usuarios que tengan mayores requisitos pueden tener un disco propio que contenga el sistema operativo, pero sólo sus archivos, y tendrían que reemplazar el disco del sistema "pool" por el suyo y reiniciar el sistema cuando se deban ejecutar sus programas. Un sistema con una segunda unidad de disco que se pueda dedicar por completo al código y los datos de un usuario proporciona cierto alivio.
Un paquete de discos o cartucho se inicializa para su uso en el 1130 mediante la rutina de inicialización de paquetes de discos (DIPR). Esta rutina escanea el disco y escribe direcciones de sectores en todos los cilindros, marca los sectores defectuosos y escribe una identificación de cartucho en el cilindro cero. DIPR es un programa independiente , que se carga desde tarjetas o cintas de papel y acepta la identificación del cartucho desde la consola del sistema. [19]
El programa de utilidad de discos (DUP) proporciona comandos para transferir programas, subrutinas y datos. Se invoca mediante la // DUP
tarjeta de control de trabajos, seguida de una o más tarjetas de control: [24]
Otros comandos, principalmente para uso del administrador del sistema, definen o expanden el Área fija, eliminan el compilador y/o ensamblador FORTRAN del sistema y restauran las direcciones de sector correctas al almacenamiento de trabajo si se han modificado.
Los operandos deben colocarse en columnas fijas. El código del dispositivo de origen va en las columnas 13 y 14, el dispositivo de destino en las columnas 17 y 18. Estos códigos de dispositivo son:
Opcionalmente, se puede codificar un nombre de programa en las columnas 21 a 25, y un campo de conteo en las columnas 27 a 30. La interpretación de estos campos depende de la función DUP solicitada.
Los programas se pueden convertir a un formato de carga más rápida con el comando STORECI , que invoca a Core Image Builder (el equivalente de DM2 al Linkage Editor de 360). Alternativamente, un programa puede pasar por este proceso cada vez que se lo va a ejecutar, y para programas que se usan con poca frecuencia, esto es preferible para conservar espacio en disco.
La siguiente tarjeta de control le indica a DUP que tome el contenido actual del almacenamiento de trabajo y lo mueva al área de usuario, llamándolo PROGM. DUP conoce el tamaño del archivo en el almacenamiento de trabajo. El tamaño del área de usuario aumentará según el tamaño del archivo y el tamaño del almacenamiento de trabajo disminuirá en consecuencia.
La memoria de disco se utiliza para almacenar el sistema operativo, el código objeto y los datos, pero el código fuente se guarda en tarjetas perforadas.
El modelo básico 1130 venía con una unidad de disco accionada por bobina móvil IBM 2310 , llamada "Ramkit", de la División de Productos Generales de IBM en San José. [7] : 497 Sus cartuchos de un solo plato IBM 2315 del tamaño de una caja de pizza tienen capacidad para 512.000 palabras o 1.024.000 bytes (menos que los 1,44 MB de un disquete de disco duro de 3,5" o incluso los 1,2 MB de un disquete de disco duro de 5,25" ). La velocidad de transferencia es de 35.000 palabras por segundo (70 KB/seg) utilizando el robo de ciclos . [25]
La máquina de escribir de consola IBM 1053 utiliza un mecanismo IBM Selectric , lo que significa que se puede cambiar el tipo de letra o el conjunto de caracteres reemplazando un elemento de tipo hueco del tamaño de una pelota de golf. Hay un elemento de tipo especial disponible para APL , un potente lenguaje de programación orientado a matrices que utiliza una notación simbólica especial. Una fila de 16 interruptores de palanca en la máquina de escribir de consola se puede probar individualmente desde dentro de los programas, utilizando la declaración especial Fortran , por ejemplo.IF (SENSE SWITCH i)
Otros periféricos disponibles incluyen:
Para simplificar el diseño de los dispositivos periféricos, estos dependen del procesador. El lector de tarjetas no tiene búferes de memoria, sino que le da a la CPU una interrupción de nivel cero (prioridad más alta) después de que se haya leído cada columna individual de la tarjeta. Si la CPU no responde y almacena los doce bits de datos antes de que otra interrupción de este tipo indique que se ha leído la siguiente columna, se perderán los datos. De manera similar, la impresora 1132 depende del software del 1130. Cuando una letra como A
entra en posición, la CPU tiene que analizar una línea de texto almacenada en búfer y ensamblar una matriz de bits que indicará al 1132 qué posiciones de impresión deben imprimirse con A
. Si la CPU no puede responder antes de que el A
gire fuera de posición, la velocidad de impresión podría degradarse gravemente.
Otros periféricos aceptan texto en un código específico del dispositivo que sea conveniente para su hardware. La CPU debe traducirlo hacia o desde el código EBCDIC en el que procesa el texto.
Las instrucciones tienen formatos cortos (de una palabra) y largos (de dos palabras). La mayoría de las instrucciones computacionales, de carga y de almacenamiento hacen referencia a un registro (normalmente ACC) y a una ubicación de memoria. La ubicación de memoria se identifica, en el formato corto, mediante un desplazamiento con signo de 8 bits desde la dirección actual o uno de los registros de índice; o en el formato largo, mediante una dirección completa de 15 bits, que se puede indexar y especificar la indirección. La memoria se direcciona en unidades de palabras.
El 1130 admite únicamente datos binarios de precisión simple y doble de forma nativa (16 y 32 bits) almacenados en formato big-endian . Se admiten datos decimales y de punto flotante de precisión estándar y extendida (32 y 48 bits) mediante el uso de subrutinas.
Las transferencias condicionales se basan en (a) el contenido actual del acumulador o (b) los indicadores de acarreo y desbordamiento establecidos por una operación anterior. Las transferencias pueden ser por omisión (que supone que la siguiente instrucción es corta) o por bifurcación. Se produce una omisión si alguna de las pruebas especificadas es verdadera. Se produce una bifurcación si ninguna de las pruebas especificadas es verdadera.
Registros principales:IAR = Registro de dirección de instrucciónACC = AcumuladorEXT = Registro de extensiónXRx = Registros de índice: x = 1,2,3 Implementado como palabras de memoria 1,2,3, no como registros de hardware.Pruebas de condición:Acumulador Z cero- Acumulador negativo+ Acumulador positivoE Acumulador parejoC Indicador de transporte apagadoO Indicador de desbordamiento apagadoConjunto de instrucciones 1130 Mnemónicos:LD = Cargar ACC STO = Almacenar ACCLDD = Carga doble (ACC y EXT) STD = Almacenar doble (ACC y EXT)LDX = Índice de carga STX = Índice de tiendaLDS = Estado de carga STS = Estado de la tiendaA = Agregar ACC AD = Agregar dobleS = Restar ACC SD = Restar DobleM = Multiplicar D = DividirY = Booleano Y O = Booleano OXOR = OR exclusivo booleanoSLA = Desplazamiento a la izquierda ACC SLT = Desplazamiento a la izquierda ACC y EXTSLCA = Desplazamiento a la izquierda y conteo ACC SLC = Desplazamiento a la izquierda y conteo ACC y EXTSRA = Desplazamiento a la derecha ACC SRT = Desplazamiento a la derecha ACC y EXTRTE = Girar a la derecha ACC y EXTBSC = Ramificar o saltar según condición (dependiente del modificador) es decir, BP BNP BN BNN BZ BNZ BC BO BODBOSC - Ramificar o saltar condicionalmente (alternativa para BSC con el bit 9 establecido) Sale del nivel de interrupción actual.BSI = IAR de sucursal y tiendaMDX = Modificar índice y omitir (Incrementar IAR en uno si un signo cambia o se convierte en cero)WAIT = Detener NOP = Sin operación (alternativa para SLA 0)XIO = Ejecutar E/S1800 Mnemónicos de instrucción adicional:CMP = Comparar ACC DCM = Comparar dos veces ACC y EXTMnemónicos equivalentesEl ensamblador de discos introdujo varios mnemónicos equivalentes a los existentes.instrucciones destinadas a aclarar la intención del programador:SKP - Saltar bajo condición, equivalente a un BSC cortoB - Sucursal incondicional, equivalente a BSC sin condiciones especificadasBP - Acumulador de rama positivo, equivalente a BSC que especifica la condición '+'BNP - Acumulador de sucursal no positivoBN - Acumulador de rama negativoBNN - Acumulador de rama no negativoBZ - Acumulador de rama ceroBNZ - Acumulador de sucursales no ceroBC - Sucursal en CarryBO - Rama en caso de desbordamientoBOD - Acumulador de rama imparMDM - Modificar memoria, equivalente a MDX de formato largo no indexadoXCH - Acumulador de Cambio y Extensión, equivalente a RTE 16Formato de instrucción corta (una palabra de 16 bits): 1Bits 0...45678......5 OP---FTTDisp----OP es OperaciónF es formato 0 = CortoTT es etiquetaDisp es desplazamientoFormato de instrucción larga (dos palabras de 16 bits): 1 1Bits 0...456789.....50..............5 OP---FTTIMod----Dirección---------OP es OperaciónF es formato 1 = LargoTT es etiquetaI es bit indirectoMod es modificadorCálculo de dirección efectiva (EA): F = 0 | F = 1, yo = 0 | F = 1, yo = 1 Direccionamiento directo| Direccionamiento directo| Direccionamiento indirecto-------------------------------------------------- -----------------TT = 00 | EA = Displ + IAR | EA = Agregar | EA = C/AñadirTT = 01 | EA = Mostrar + XR1 | EA = Agregar + XR1 | EA = C/Agregar + XR1TT = 10 | EA = Desplegar + XR2 | EA = Sumar + XR2 | EA = C/Sumar + XR2TT = 11 | EA = Desplegar + XR3 | EA = Sumar + XR3 | EA = C/Sumar + XR3-------------------------------------------------- ----------------- Disp = Contenido del campo de desplazamiento Agregar = Contenido del campo de dirección de la instrucción C = Contenido de la ubicación especificada por Agregar o Agregar + XR
Las direcciones más bajas de la memoria central tienen usos dictados por el hardware o por convención:
El 1130 no tiene soporte de hardware para una pila . La mayoría de los subprogramas se llaman con la instrucción BSI (Branch and Store IAR). Esto deposita el valor de IAR (la dirección de retorno) en la dirección de destino y transfiere el control a destino+1. Los subprogramas regresan a donde fueron llamados en esa ocasión utilizando una bifurcación indirecta a través de esa primera palabra del subprograma. Colocar la dirección de retorno en línea era una técnica común de las computadoras en ese momento, como la Hewlett-Packard HP 2100 , [30] la DEC PDP-8 , [31] y la Scientific Data Systems SDS 920. [ 32]
Entonces, un subprograma llamado SIMPL podría organizarse de la siguiente manera (los comentarios siguen al operando de instrucción):
SIMPL: DC *-* Este es el punto de entrada, inicialmente lleno con un cero. (lo que sea que haga la rutina) BI SIMPL Retorno por sucursal Indirecta , a la dirección que se encuentra en la ubicación SIMPL. END SIMPL Indica al ensamblador que la fuente de la rutina SIMPLE está completa.
El subprograma se llamaría de la siguiente manera:
BSI L SIMPL Llame a SIMPL. L (Largo) es necesario si SIMPL está a más de -128 o +127 palabras de distancia.
Normalmente se utilizaría el pseudo-código de operación CALL.
Como se muestra, el punto de entrada de un subprograma es DC *-*
, una pseudo operación de ensamblador que se utiliza para definir una constante (que ocupa una palabra de almacenamiento) con el valor especificado por la expresión. El * representa la dirección actual del ensamblado y, por lo tanto, *-* da como resultado cero. Escribir esto en lugar de 0 proporciona una nota visual distintiva de que se colocará allí un valor significativo (la dirección de retorno) en el momento de la ejecución. El punto de entrada no necesita ser la primera palabra del subprograma. De hecho, la palabra anterior puede ser el comienzo de una instrucción de bifurcación directa de dos palabras cuyo campo de dirección está en SIMPL. Entonces, los retornos se pueden efectuar mediante bifurcaciones de una palabra allí:B SIMPL-1
Cuando se llama a SIMPL, la instrucción BSI reemplaza *-*
con el valor actual de IAR, que es la dirección inmediatamente después de la instrucción BSI. Después de que SIMPL hace lo que está escrito para hacer, B I SIMPL
no se bifurca a SIMPL, sino indirectamente a través de él, continuando así la ejecución con la instrucción que sigue a la instrucción BSI que llamó a SIMPL.
Sin medidas adicionales para proteger la dirección de retorno, la recursión es imposible: si SIMPL se llama a sí mismo, o llamó a un subprograma que lo llamó, su dirección de retorno original se sobrescribe. La reentrada es problemática por la misma razón: una rutina de servicio de interrupción debe abstenerse de llamar a cualquier subprograma que podría haber sido el código que fue interrumpido.
El llamador de SIMPL puede pasarle parámetros, que pueden ser valores o direcciones de valores. Los parámetros pueden codificarse en línea (inmediatamente después de la instrucción BSI) o pueden colocarse en los registros de índice XR1 y XR2. Si los parámetros se colocan en línea, SIMPL modifica su propia dirección de retorno de modo que su rama indirecta final retorna más allá de los parámetros.
Las funciones enteras de un solo entero esperan el parámetro en el acumulador y devuelven su resultado allí. Las funciones de punto flotante emplean el acumulador de punto flotante (un área de dos palabras reservada por la biblioteca de punto flotante, tres palabras para precisión extendida), y así sucesivamente.
La convención de codificar 0 como el valor inicial en el punto de entrada significa que si un error de programación lleva a que SIMPL regrese antes de la primera vez que se llamó, la ejecución saltaría a la ubicación de memoria 0. Como se mencionó anteriormente, es habitual que la ubicación 0 contenga una rama a la ubicación 0. El 1130 quedaría atascado en la ubicación 0 y las luces IAR en la consola estarían completamente oscuras, lo que dejaría en claro que el programa había fallado.
En el caso de los subprogramas que se llamarían muchas veces (por ejemplo, los subprogramas para aritmética de punto flotante ), es importante reducir el tamaño de cada llamada a una palabra. Estas "rutinas de biblioteca" utilizan el protocolo LIBF. Es más complejo que el protocolo CALL descrito en la sección anterior, pero LIBF oculta la complejidad al escritor del programa en lenguaje ensamblador.
Las rutinas de la biblioteca se direccionan a través del registro de índice XR3. (Los subprogramas de Fortran utilizan el registro de índice XR1 para las direcciones de los parámetros y la dirección de retorno, pero el registro XR2 no se utiliza). XR3 apunta a una secuencia de vectores de transferencia de tres palabras de modo que la primera entrada esté a -128 palabras del valor de XR3. El programador llama a la rutina de la biblioteca utilizando la LIBF
pseudooperación, que ensambla no una instrucción de bifurcación directa BSI
a la rutina sino una instrucción de bifurcación indexada de una palabra ( ) cuyo desplazamiento (-128, -125, etc.) identifica el inicio del vector de transferencia de la rutina.BSI 3 disp
El cargador de enlaces prepara el vector de transferencia cuando ensambla el programa. Una entrada de vector de transferencia a una función de biblioteca denominada SIMPL tiene la siguiente forma:
DC *-* Una palabra en la que BSI almacena la dirección de retorno. BL SIMPL Rama al inicio de la función de biblioteca.
La forma en que SIMPL sabía dónde estaba su dirección de retorno era que, si SIMPL se declaraba una rutina LIBF, el cargador de enlaces modificaría el código de SIMPL, colocando la dirección de la entrada del vector de transferencia de SIMPL en SIMPL+2. Las rutinas LIBF, a diferencia de los subprogramas CALL, no comienzan con una directiva DC para almacenar la dirección de retorno (está en el vector de transferencia) sino con el código real, como sigue:
SIMPL STX 1 RCVR1+1 Guarde el valor XR1 de la persona que llama en una ubicación cercana. LDX I1 *-* El cargador de enlace cambia la palabra de dirección para apuntar al vector de transferencia.
La ubicación de la dirección del vector de transferencia de SIMPL en SIMPL+2 deja espacio para una instrucción de una palabra para guardar el registro de índice elegido, en este caso XR1. Luego, la instrucción LDX indirecta apunta a XR1 no al vector de transferencia, sino a través de él a la dirección de retorno, o a cualquier parámetro almacenado en línea después de la BSI. SIMPL hace entonces lo que se le había escrito para hacer, obteniendo acceso a cualquier parámetro en línea a través de XR1 (en cuyo caso debe incrementar XR1 para la dirección de retorno), y retorna de la siguiente manera:
STX 1 RETN+1 Almacene XR1 para prepararlo para usarlo como dirección de devolución.RCVR1 LDX L1 *-* La primera instrucción de SIMPL modificó esta dirección. Ahora,* restaurar el valor original de XR1.RETN BL *-* Esta instrucción fue modificada hace dos instrucciones; regresar.
Supongamos que una llamada de estilo LIBF a SIMPL se encuentra en la dirección 100. Entonces, la dirección de retorno sería 101, porque es una instrucción de una sola palabra. XR3 apunta al grupo de vectores de transferencia. Si el vector de transferencia para SIMPL comenzara en la dirección 2000, entonces la BSI se ensamblaría con un de modo que XR3+disp = 2000. Al ejecutar la BSI, se almacena 101 en la ubicación 2000 y se salta a la ubicación 2001. En 2001 hay un salto largo de dos palabras al punto de entrada de SIMPL, que el cargador de enlaces podría haber colocado en la dirección 300.BSI 3 disp
disp
El salto largo transfiere el control a SIMPL. Después de que la instrucción en 300 almacena XR1, la instrucción en 301 es , y el cargador de enlace ha colocado 2000 en la ubicación 302. Esto no carga 2000 en XR1; es una instrucción indirecta y carga el contenido de 2000, que es 101, la dirección de retorno para esa llamada a SIMPL.LDX I1 2000
En la secuencia de retorno que se muestra arriba, cuando el control llega a RETN, la instrucción existe B L 101
, que retorna al llamador. (Si hay uno o más parámetros en línea en 101, SIMPL incrementaría XR1 para apuntar a 102 o más allá, y este sería el destino de la B
instrucción).
Si SIMPL tomó parámetros codificados en línea después de la instrucción BSI, SIMPL obtiene acceso a ellos con direccionamiento indexado de XR1. El primero se puede obtener con LD 1 0
, el segundo con LD 1 1
, y así sucesivamente. Si el segundo parámetro es la dirección del parámetro real, entonces obtiene su valor. Antes de regresar, SIMPL incrementa XR1 más allá de los n parámetros con una instrucción como para colocar el valor correcto en RETN+1.LD I1 1
MDX 1 n
Una rutina LIBF que se niegue a restaurar el valor original de XR1 podría omitir los pasos anteriores y regresar con un simple salto de n parámetros en línea. Sin embargo, una rutina de este tipo no puede ser llamada por otras rutinas LIBF porque interrumpe el uso de XR1 por parte del llamador para acceder a sus propios parámetros y dirección de retorno.B 1 n
La complejidad de LIBF ahorra memoria para los subprogramas que se llaman con frecuencia.: [33] : p.24 El enlace LIBF requiere una palabra por invocación, más tres palabras para la entrada del vector de transferencia y código adicional en la rutina misma, mientras que el enlace CALL requiere dos palabras por invocación porque la mayoría de las CALL serán a una dirección más allá del alcance de -128 a +127 palabras del código de operación de una palabra.
El registro XR3 debe apuntar a las entradas del vector de transferencia para las rutinas de la biblioteca en lugar de una tabla de despacho de solo sus direcciones, porque esto último requeriría que las rutinas LIBF se llamen con una instrucción BSI indirecta. Estas instrucciones tienen dos palabras de longitud, por lo que un diseño de este tipo anularía el ahorro de tamaño de código de LIBF. El límite de ocho bits para el campo disp del código de instrucción de una palabra limita el uso de rutinas LIBF a no más de 85 entradas distintas.
Las secciones anteriores muestran que el código y los datos están entremezclados. En la programación 1130 es habitual modificar los campos de dirección de las instrucciones y, de hecho, modificar instrucciones enteras.
El compilador Fortran produce código automodificable al generar código para cualquier subprograma (subrutina o función) que tenga parámetros. El compilador crea una tabla de cada ubicación donde el subprograma hace referencia a uno de sus parámetros y compila como primera instrucción en el cuerpo del subprograma una llamada a un subprograma llamado SUBIN que utiliza la tabla para modificar el campo de dirección de cada referencia a un parámetro para que sea la dirección real del parámetro durante la invocación actual. SUBIN realiza estos parches cada vez que se llama al subprograma.
Cuando un programa Fortran llama a un subprograma, las direcciones de los parámetros aparecen en línea después de la llamada. Por ejemplo, la instrucción Fortran CALL SIMPL(X) podría compilarse en:
BSI L SIMPLE DC X La dirección de X, en la que SIMPL va a operar
Dentro del subprograma, se puede acceder a los parámetros mediante direccionamiento indexado indirecto como se muestra arriba en Variaciones, por lo que, dado que XR1 se ha preparado adecuadamente, se podría cargar un parámetro entero en el acumulador con una instrucción como esta:
LD I1 0 Carga el valor del primer parámetro (desplazamiento 0) en el acumulador
En cambio, el compilador utilizó el direccionamiento directo. Cuando se ejecuta SUBIN, obtiene la dirección de X y modifica el campo de dirección de la instrucción para que se convierta en:
LD LX Carga el valor de X en el acumulador
Las ventajas de SUBIN son las siguientes:
Las desventajas de SUBIN son el tiempo que requiere su ejecución y la memoria necesaria para la tabla de referencias. El tamaño de esta tabla es la suma de 5, el número de parámetros y el número de referencias; si esta suma supera los 511, la compilación fallará. En el caso de subprogramas con muchas referencias a un parámetro, el autor del subprograma puede copiar el parámetro en una variable local.
En aquella época, la modificación de instrucciones completas era una técnica común. Por ejemplo, aunque el 1130 tiene una instrucción OR, la sintaxis de Fortran no ofrece ninguna forma de escribirla. Se puede definir una función entera IOR, lo que permite que la instrucción OR lógica forme parte de una expresión Fortran como:
M = 3 * IOR ( I , J ) + 5
El compilador de Fortran coloca las direcciones de I y J en línea y espera el resultado en el acumulador. El uso de IOR(I,J) en una expresión de Fortran compila las siguientes cuatro palabras:
BSI L IOR Salto de dos palabras al inicio de la función IOR. Parámetro en línea de una palabra de DC IA: La dirección de I. Parámetro en línea de una palabra DC JA: La dirección de J.
De hecho, la función IOR del ensamblador no calcula I ni J en absoluto. En cambio, reemplaza las cuatro palabras anteriores por las siguientes:
LD LI Cargar acumulador con I (instrucción de dos palabras) OR LJ OR acumulador con J (instrucción de dos palabras)
Después de realizar esa transformación, no vuelve más allá del final del bloque de cuatro palabras (que acababa de modificar), sino que se bifurca a la dirección exacta desde la que se lo había llamado originalmente. La instrucción BSI ya no está allí; lo que sí hay ahora son las dos instrucciones que acaba de escribir. Combinan los dos números enteros con la instrucción OR en lenguaje de máquina y dejan el resultado en el acumulador, como se requiere.
La llamada a IOR y la transformación del bloque de cuatro palabras se realizan como máximo una vez por ejecución del programa. Si se vuelve a ejecutar la línea Fortran ilustrada anteriormente, se ejecuta más rápido que la primera vez. Se podrían idear funciones similares para otras operaciones útiles.
Una función que se automodifica, como lo hace IOR, no se puede utilizar en un subprograma Fortran sobre ninguno de los parámetros de ese subprograma (aunque podría utilizarse para combinar variables locales) porque es incompatible con el subprograma SUBIN analizado anteriormente. La transformación de IOR de su secuencia de llamada de cuatro palabras, que se muestra arriba, mueve la ubicación de la dirección de la variable I. En llamadas posteriores al subprograma Fortran, la tabla de referencias a los parámetros estaría equivocada y SUBIN parchearía la palabra incorrecta, en este caso colocando la nueva dirección de I sobre el código de la operación OR.
1130 FORTRAN ofrece dos formatos de punto flotante: un formato de "precisión estándar" de 32 bits y un formato de "precisión extendida" de 40 bits.
El formato de precisión estándar contiene un mantra de complemento a dos de 24 bits, mientras que la precisión extendida utiliza un mantra de complemento a dos de 32 bits . Este formato hace un uso completo de las operaciones de números enteros de 32 bits de la CPU. El formato extendido ocupa tres palabras de 16 bits, con los ocho bits de orden superior de la primera palabra sin usar. La característica en ambos formatos es un campo de 8 bits que contiene la potencia de dos sesgada por 128. Las operaciones aritméticas de punto flotante se realizan mediante software. [34]
La *EXTENDED PRECISION
tarjeta de opción del compilador le indica al compilador FORTRAN que utilice 40 bits en lugar de 32 bits para todos los datos de punto flotante, no hay ninguna disposición para mezclar formatos.
Los datos que se van a manipular y las instrucciones que los manipulan deben residir juntos en la memoria central. La cantidad de memoria instalada (de 4.096 a 32.768 palabras) es una limitación clave. Fortran ofrece varias técnicas para escribir programas grandes a pesar de esta limitación.
Fortran permite que cualquier subprograma se designe como "LOCAL" (carga al llamar). Cada subprograma LOCAL es una superposición ; es parte del programa ejecutable residente en el disco, pero solo se carga en la memoria central (si no está ya allí) durante el tiempo en que se llama. Por lo tanto, por ejemplo, seis subprogramas LOCAL requerirían solo la misma cantidad de memoria central que el más grande, en lugar de la cantidad total para los seis. Sin embargo, ninguno de los seis puede invocar a otro, ya sea directamente o a través de subprogramas intermediarios.
Un programa Fortran completo puede pasar el control a una fase posterior, saliendo al Supervisor con una instrucción para cargar la fase siguiente en la memoria central. Un programa grande puede dividirse en tres partes, compiladas por separado, llamadas PART1, PART2 y PART3. La ejecución se inicia en // XEQ PART1
un punto adecuado, PART1 ejecutará la instrucción Fortran CALL LINK(PART2)
y así sucesivamente. El nombre del programa sucesor en CALL no puede ser variable, pero la lógica del programa puede determinar si el control se transfiere a otra fase y qué CALL LINK
instrucción se ejecuta. Como se mencionó anteriormente, el compilador Fortran en sí se escribió de esta manera, con cada fase de compilación lograda por un programa separado.
Los programas, como los de Fortran, residen en direcciones de memoria de núcleo bajo (justo encima del Supervisor). Fortran asigna espacio en las direcciones más altas para cualquier variable y matriz declarada COMÚN. Si una fase posterior del programa contiene una declaración COMÚN correspondiente, entonces la información en esta área común se puede compartir entre fases. Las fases podrían omitir la declaración COMÚN sin problema, siempre que esas fases no fueran tan grandes como para que su código de programa invadiera el área común. El almacenamiento COMÚN no solo comparte datos entre fases; las variables COMÚN de memoria inferior se pueden usar para pasar datos entre un programa principal y subprogramas dentro de una sola fase, aunque los datos se podrían perder al pasar a la siguiente fase.
Los ejemplos se pueden ejecutar en el emulador IBM 1130 disponible en IBM 1130.org.
La siguiente lista muestra una baraja de cartas que compila y ejecuta un programa ensamblador que enumera una baraja de cartas en la impresora de línea.
// TRABAJO // ASM *LISTA * LCARD.ASM - ENUMERAR UNA BARAJA DE CARTAS EN UNA IMPRESORA DE LÍNEAS * * PROGRAM * NUEVA PAGINA EN IMPRESORA *LEER UNA TARJETA * CONVERTIR FORMATO * IMPRIMIR UNA LÍNEA EN LA IMPRESORA * IR A * INICIO LIBF PRNT1 IR A NUEVA PÁGINA EN 1132 IMPRESORA DC/3100 CANAL 1-PAGINA NUEVA * LECTURA DE TARJETA LIBF NEXTC 0 DESDE EL LECTOR DE TARJETAS 1442 CONTROL DC/1000 PARA LEER TIENDA DC CBUFF 80 COLUMNAS TARJETA CINP LIBF0 CC 0 B CINP LOOP HASTA QUE SE LEA LA TARJETA * TARJETA CONVERTIDORA LIBF ZIPCO A IMPRESORA DC/1100 DESEMPAQUETADO, EMBALADO BÚFER DE ENTRADA DC CBUFF+1 BÚFER DE SALIDA DC PBUFF+1 Cantidad de caracteres DC 80 Llame a HLEBC HOLLERITH para EBCDIC * LIBF PRNT1 IMPRIMIR 80 CARACTERES CÓDIGO DE CONTROL DC/2000 PARA IMPRIMIR BÚFER DE IMPRESIÓN DC PBUFF ERROR DE IMPRESIÓN DE DC PERR POUT LIBF PRNT1 COMPROBACIÓN DE IMPRESIÓN COMPLETA CC 0 B POUT LOOP HASTA COMPLETAR * B SIGUIENTE LEER SIGUIENTE TARJETA * * DATOS * CBUFF DC 80 80 COLUMNAS POR TARJETA BSS80 * PBUFF DC 40 40 PALABRAS 80 CARACTERES BSS 40 * PERRO DC 0 BI PERR ESTO VUELVE A LA * MANEJADOR DE ERRORES DE IMPRESORA * LO CUAL TERMINARÁ EL PROGRAMA * FIN INICIO PROGRAMA PUNTO DE ENTRADA // XEQ DATOS DE PRUEBA 1 HOLA MUNDO DATOS DE PRUEBA 2
En este trabajo, el ensamblador deja el resultado de su ensamblaje en el área temporal del disco del sistema y el comando XEQ ejecuta el contenido del área temporal. El aspecto extraño END START
tiene dos significados: fin de la fuente del ensamblador y el nombre del punto de entrada de la rutina, que tiene la etiqueta START.
El código fuente del ensamblador comienza con la columna 21 de la tarjeta, no con la columna uno. En sistemas sin unidad de disco, el ensamblador perforaba el código al principio de la tarjeta que acababa de leer (el lector de tarjetas era en realidad un lector-perforador, con la estación de perforación después de la estación de lectura) y luego leía la siguiente tarjeta. Para manejar las bifurcaciones hacia adelante y similares, el segundo paso del ensamblador implicaba literalmente un segundo paso de las tarjetas a través del lector/perforador. Si se necesitaban cambios en el código fuente, el programador duplicaba las tarjetas para obtener una baraja con las columnas 1 a 20 en blanco, lista para la siguiente ejecución a través del ensamblador.
Por convención, los buffers están precedidos por un recuento de palabras. DC
(Define Constant) ensambla una palabra de recuento y el siguiente BSS
(Block Started by Symbol) reserva la cantidad de palabras requerida para el buffer. El buffer de tarjeta requiere 80 palabras, una para cada columna de tarjeta. El controlador CARD0 lee cada columna de tarjeta literalmente, utilizando 12 de los 16 bits en la palabra del buffer, con un bit activado para cada orificio perforado en la fila correspondiente para esa columna. El patrón de perforaciones describe típicamente un carácter de texto utilizando el código Hollerith . El teclado de la consola también proporciona entrada al programa en el código Hollerith, el único caso de dos dispositivos que utilizan la misma codificación de caracteres.
La rutina de impresora, sin embargo, trabaja con texto en EBCDIC de 8 bits con dos caracteres por palabra, requiriendo un buffer de 40 palabras. El programa utiliza la rutina de biblioteca ZIPCO para realizar la conversión. A pesar de las apariencias, la instrucción CALL HLEBC
no se ejecuta porque HLEBC no es una subrutina sino una tabla de conversión de Hollerith a EBCDIC suministrada por IBM. La instrucción CALL proporciona la dirección de la tabla a ZIPCO y asegura que el cargador de enlace incluya la tabla en el programa, por lo que es el quinto parámetro de ZIPCO, aunque ocupa dos palabras de almacenamiento: la palabra de código de operación BSI para CALL no se utiliza y, por lo tanto, generalmente se desperdicia, pero la segunda palabra de la expansión de CALL HLEBC
es la dirección de la tabla HLEBC que necesita ZIPCO. Después de la conversión, el programa envía la salida convertida, ahora en el buffer PBUFF, a la impresora a través del controlador PRNT1. Nuevamente, el programa se repite hasta que el controlador de impresora informa que se completó, luego el programa lee la siguiente tarjeta.
Este ejemplo no contiene ningún código para decidir cuándo detenerse. Un programa más completo comprobaría si hay tarjetas que comiencen con //
, lo que indica el inicio del siguiente trabajo. Para detener el lector de tarjetas lo antes posible, un programa podría comprobar el código Hollerith de /
antes incluso de convertir la tarjeta a EBCDIC.
La llamada a CARD0 para leer una tarjeta inicia esa operación y vuelve inmediatamente al llamador, que podría continuar con otra actividad. Sin embargo, el programa de ejemplo no intenta superponer la entrada y la salida mediante búferes a pesar de que tiene dos áreas de trabajo separadas; simplemente vuelve a CIMP para realizar una nueva prueba. Después de que CARD0 haya detectado la interrupción de operación completa del lector de tarjetas, vuelve una palabra más adelante, saltándose así el salto de regreso a CIMP y abandonando el bucle.
Las rutinas de ejemplo no hacen funcionar los dispositivos de E/S a máxima velocidad. Cabe destacar que el lector de tarjetas, sólo unos pocos milisegundos después de informar que ha terminado de leer una tarjeta, comenzará su secuencia de parada, tras lo cual un nuevo comando de lectura tendrá que esperar para iniciar otro ciclo de lectura. El lector IBM 1442 podía leer 400 tarjetas por minuto a máxima velocidad, pero un pequeño titubeo en los comandos de lectura reduciría a la mitad su rendimiento o incluso más. Un programa Fortran no podía completar ni siquiera el procesamiento de entrada más simple a tiempo, y por lo tanto no podía leer tarjetas a máxima velocidad. Un DO
bucle Fortran común para leer tarjetas hacía que el motor se detuviera y arrancara con tanta frecuencia que aceleraba el desgaste. Con el almacenamiento en búfer, el control del lector de tarjetas podía superponerse con el procesamiento, y el lector podía funcionar a máxima velocidad a través de grandes plataformas de datos, pero la memoria para el programa más complejo y para los búferes a menudo era escasa.
Incluso con ensamblador y doble buffer, un programa para listar una baraja de cartas del lector IBM 2501 (1.000 cartas/minuto) en la impresora de línea no podía mantener el ritmo, ya que la traducción de los patrones de agujeros de las cartas a EBCDIC para la impresora, como lo hacía EBPRT, era demasiado lenta; en su lugar, se necesitaban los más complejos ZIPCO y HLEBC, como en el ejemplo.
La siguiente imagen muestra una sesión APL \1130 simple . Esta sesión se realizó a través del simulador 1130 disponible en IBM 1130.org.
La sesión anterior muestra un inicio de sesión, la suma de los números enteros del 1 al 100, la generación de una tabla de suma para los números enteros del 1 al 5 y un cierre de sesión.
En el mismo año de la introducción del 1130, Digital Equipment Corporation presentó el PDP-8 de 12 bits, más pequeño, más barato y de mejores ventas , reconocido como el primer miniordenador exitoso.
... Golpeé las puertas de la oficina local de ventas de IBM hasta que un vendedor se apiadó de mí. Después de charlar un rato, me entregó un manual de Fortran. Estoy seguro de que me lo dio pensando: "Nunca más volveré a saber de este chico". Regresé la semana siguiente diciendo: "Esto es realmente genial. He leído todo el documento y he escrito un pequeño programa. ¿Dónde puedo encontrar un ordenador?". El tipo, para mi deleite, me consiguió tiempo para programar en un IBM 1130 los fines de semana y a altas horas de la noche. Esa fue mi primera experiencia en programación y debo agradecer a ese vendedor anónimo de IBM por haber lanzado mi carrera. Gracias, IBM.
El sistema era un ordenador IBM 1130, una máquina del tamaño de un escritorio con 8 KB de memoria principal, una unidad de disco de 512 KB, un lector de cinta de papel Teletype CX y perforador de cinta de papel BRPE, y una fotocomposita Photon 713. La tarea fue mi primera experiencia en la gestión de una base de datos de documentos legibles por máquina: aprendí a enrollar la cinta de papel perforada con cuidado para poder guardarla ordenadamente en papeleras cilíndricas.
Mientras tanto, aunque yo no lo sabía, se estaban plantando las raíces del marcado generalizado. Históricamente, los manuscritos electrónicos contenían códigos de control o macros que hacían que el documento se formateara de una manera particular ("codificación específica"). En contraste, la codificación genérica, que comenzó a fines de la década de 1960, utiliza etiquetas descriptivas (por ejemplo, "encabezado", en lugar de "formato-17").
De un estimado de 10.000 sistemas producidos, se sabe que en 2024 existirán los siguientes:
Las especulaciones sobre por qué al producto se le dio el número 1130 se centraron en las siguientes posibilidades:
Otros han especulado que la existencia del IBM 1130 explica por qué nunca apareció ninguna computadora designada "11/30" en la familia de máquinas PDP-11 . [54]
{{cite web}}
: Falta o está vacío |title=
( ayuda ){{cite web}}
: Falta o está vacío |title=
( ayuda )