stringtranslate.com

Honeywell ARGUS

ARGUS , acrónimo de Automatic Routine Generating and Updating System (Sistema automático de generación y actualización de rutinas) , [1] fue un lenguaje ensamblador ideado a fines de la década de 1950 [2] por Honeywell para sus computadoras Honeywell 800 y 1800.

Al igual que con otros lenguajes ensambladores, cada línea de ARGUS se copiaba en una tarjeta y se relacionaba con una palabra en la memoria, excepto que un comando de ARGUS, RESERVE, podía reservar cualquier número especificado de palabras en la posición especificada. El comando RESERVE también era excepcional al no prescribir los datos iniciales en las palabras reservadas. Con unas pocas excepciones, las palabras del lenguaje de máquina se codificaban en el mismo orden que las líneas de ARGUS. [ cita requerida ]

Memoria Honeywell 800

Los Honeywell 800 y 1800 tenían una memoria principal y una memoria de control, ambas con núcleos de ferrita. La memoria principal tenía entre 4 y 16 bancos , según los requisitos del cliente. Cada banco contenía 2048 palabras de 48 bits cada una. El número real de bancos en una instalación individual tenía que ser un múltiplo de 4. [ cita requerida ]

La memoria de control tenía 256 registros de 16 bits cada uno. En teoría, la máquina podía ejecutar en cualquier momento un sistema operativo y siete programas de aplicación, cada uno con uso exclusivo de 32 registros. [ cita requerida ]

Un programa que requería más de 2048 palabras (datos e instrucciones combinados) debía dividirse en segmentos de 2048 palabras o menos. Cada segmento tendría uso exclusivo de un banco de la memoria principal. Había instrucciones especiales para pasar el control de un segmento a otro.

Disposición de los comandos ARGUS

Cada línea del comando ARGUS tenía seis campos como se detalla a continuación:

La ubicación es un nombre ARGUS opcional que se asignará a esa palabra en la memoria. Cuando se haya asignado la dirección de cada palabra en la memoria, el nombre ARGUS de la línea se vinculará con la posición de su palabra correspondiente. Otras líneas de ARGUS podrían hacer referencia a ese nombre y a sus palabras se les asignará la dirección de memoria correcta. Dentro del programa, cada nombre debe ser único.

Este campo podría comenzar con R, . En ese caso, el resto de la tarjeta solo contiene observaciones.

Este campo podría comenzar con X o X,nombre de la dirección. En ese caso, esta línea y cualquier otra línea X, se ubicarán lejos de las líneas que no estén marcadas de esa manera. En ese caso, se podrá indicar la dirección con X,+n o con el nombre de la dirección en el campo de dirección. [ cita requerida ]

Este campo podría comenzar con M,nombre de máscara. Si es así, la línea define una máscara.

Operación: El nombre ARGUS de un comando de lenguaje de máquina o un comando exclusivo de ARGUS. Esto podría ir seguido de la dirección de una máscara, si fuera necesario. Algunos comandos tenían información adicional.

Direcciones A, B y C: Se deben traducir a código de máquina (ver a continuación). Las direcciones A y B eran, por lo general, las dos palabras de entrada y la dirección C era el destino.

ID: Normalmente es un número de serie que la máquina perforadora de tarjetas imprime en la tarjeta. Se utiliza para ordenar las tarjetas que se puedan perder.

Disposición de los comandos en lenguaje de máquina

Cada comando de lenguaje de máquina utilizaba una palabra de 48 bits. Esta se dividía en 4 secciones de 12 bits cada una. Los primeros 12 bits especificaban la operación, con información auxiliar que incluía la dirección de desplazamiento de cualquier máscara para el comando. Las otras tres secciones eran las direcciones A, B y C.

Si se especifica una máscara, el resultado final del comando pasará por esa máscara antes de llegar al destino. Por ejemplo, si el bit 17 de la máscara es 1, el resultado irá al bit 17 del destino. Si el bit 17 de la máscara es 0, algo más irá al bit 17 del destino. Puede ser 0 o puede ser el bit 17 sin cambios de la palabra de entrada, según el comando.

Se permitía que cada segmento tuviera hasta 16 máscaras y debían estar en palabras consecutivas, comenzando en una dirección cuyos últimos cuatro bits fueran todos 0. Todas ellas tenían nombres de ubicación de ARGUS. Un registro especial llamado Registro de Máscaras contenía la dirección base. El campo de comando tenía 4 bits para contener la dirección de desplazamiento de la máscara nombrada.

Modos de direccionamiento de la memoria

Para la mayoría de los comandos, se utilizaban las secciones de dirección A, B y C para indicar las ubicaciones reales en la memoria. Había seis modos de direccionamiento, de los cuales dos se utilizaban raramente. Los restantes eran: directo, registro especial directo, direccionamiento indirecto e indexado.

Direccionamiento directo

La dirección de la memoria principal se especifica directamente mediante el comando. En lenguaje de máquina, uno de los 12 bits indica el modo directo, los otros 11 especifican la dirección exacta. 11 bits pueden representar los números del 0 al 2047, pero nada mayor. Sin embargo, este es el tipo de direccionamiento más eficiente. Este dilema es la razón por la que un banco tiene solo 2048 palabras y un segmento está confinado a un solo banco.

Hay dos formas de escribir esto en una línea de código ARGUS: 1. Un nombre, definido previamente en la columna de ubicación. A esto se le puede agregar un número (decimal), por ejemplo: BUFFER0+59 2. Una ubicación varias líneas (palabras) más allá de la línea actual, por ejemplo, C,2 significa la línea dos más allá de ésta.

Direccionamiento indirecto

En 12 bits se identifica el modo de direccionamiento y la dirección de un registro en la memoria de control. También se especifica un incremento entre 0 y 32. La dirección de la memoria principal está en el registro de la memoria de control. El procesador primero obtendrá la dirección de la memoria principal del registro, luego solicitará la palabra en esa dirección de la memoria principal. Finalmente, aumentará (incrementará) el valor del registro en la cantidad especificada. La dirección de 16 bits del registro contiene una dirección de banco de 0 a 31 utilizando 5 bits y una palabra en ese banco utilizando 11 bits. El incremento se recomendó solo para las direcciones A y B.

En ARGUS: N,R0,3 significa usar el registro R0 y luego aumentarlo en 3.

Registro Especial Directo

Un registro se direcciona directamente de la misma manera que una palabra en la memoria principal.

En ARGUS: Z,R0,3 significa leer o escribir en el registro R0 directamente y luego aumentarlo en 3. No se recomienda el aumento al escribir.

Direccionamiento indexado

Esto se aplica únicamente a 8 registros, llamados registros de índice. Se necesitan 3 bits para especificar el registro de índice y otros 7 para especificar un desplazamiento de 0 a 127. Por lo tanto, el desplazamiento se agrega a una dirección de memoria principal de longitud completa. Esta es una herramienta poderosa. Es útil para procesar un texto o registro de varias palabras. Los búferes de cinta generalmente se direccionan de esta manera.

En ARGUS: X0,35 o 0,35 significa utilizar el registro de índice 0, aumentar ese número en 35 (decimal) y leer o escribir en esa ubicación en la memoria principal. NO cambie el valor en X0.

Dirección inactiva

En ARGUS, el campo de dirección era un guion (-). Esto significaba que el procesador ignoraría el campo, anulando así parte de la acción habitual del comando.

Registros

Como se mencionó, el programa tenía acceso a 32 registros. 8 tenían funciones especiales, 16 registros (R0 a R15) eran de propósito general y 8 (X0 a X7) eran registros de índice. [ cita requerida ]

El direccionamiento de índice sólo era posible para registros de índice.

El direccionamiento directo e indirecto se aplicaba tanto a registros de propósito general como a registros de índice. Probablemente también funcionarían con otros registros, pero eso sería una mala práctica.

Los registros especiales fueron:

 Contador de secuencia (SC) SH (Historial de secuencia) CSC (Contador de cosecuencias) CSH (Historial de cosecuencias) MSK (Registro de mascarillas) AU1 y AU2

Fueron utilizados por el ordenador para ejecutar el programa.

En funcionamiento, el contador de secuencias siempre contenía la dirección completa del comando que se estaba ejecutando. Normalmente, los comandos se ejecutaban en orden de ubicación. El historial de secuencias contenía el último valor del contador de secuencias. Este valor debía almacenarse inmediatamente después de saltar a una subrutina. De lo contrario, sería imposible regresar. El contador de cosecuencias y el historial realizaban las mismas funciones para cualquier comando que tuviera X al comienzo de su ubicación en ARGUS.

El registro MSK contenía la ubicación completa de la primera máscara (ver a continuación).

AU1 y AU2 se utilizaban internamente en algunos comandos, especialmente TN. También podían ser utilizados por programas. Sin embargo, existía el riesgo de que una operación interna pudiera interferir, por lo que no era una buena opción.

Comandos

Cada línea ARGUS define una palabra en la memoria. En funcionamiento normal, el procesador ejecuta cada comando en el orden de dirección. Algunos comandos pueden ordenar un SALTO a otra dirección (mediante direccionamiento directo al mismo banco).

Aritmética

Los comandos WA, BA y DA, de diferentes maneras, obtienen números de las direcciones A y B, los suman y colocan el resultado en la dirección C.

Los comandos BS y DS restan el número en la dirección B del número en la dirección A, colocando el resultado en la dirección C.

WA (Word Add) trata los dos números de entrada como números binarios sin signo. Esto se utilizaba a menudo para sumar un incremento a una dirección conocida.

BA y BS (suma binaria y resta binaria) tratan los dos números de entrada como binarios con signo.

DA y DS (suma decimal y resta decimal) tratan los dos números de entrada como decimales con signo.

Los cuatro bits más a la izquierda definen el signo. Si todos son cero, el signo es positivo. De lo contrario, es negativo.

El comando DM multiplica el número de la dirección B por el número de la dirección A, colocando la mitad izquierda del resultado en la dirección C. Los dígitos inferiores restantes se dejan en el LOP, el registro de salida baja. Se pueden transferir desde allí a una dirección de memoria principal mediante el comando TX o TS. El adaptador de punto flotante admite completamente DM. En su ausencia, se requiere simulación.

Transferencia de datos y control de programas

Transferencia TX desde la dirección A a la dirección C. La dirección B DEBE estar inactiva (ver Modos de direccionamiento)

TS Transferencia de la dirección A a la dirección B y luego SALTA fuera de secuencia al comando en la dirección C. C debe ser una dirección directa. Opcionalmente, A y B pueden estar inactivas y el comando se convierte en un salto puro. Esto es lo más cercano que esta máquina llega a un comando GOTO.

MT Transferencia de la dirección A a la dirección C varias veces. La cantidad de veces se especifica como un número decimal en el campo de dirección B. Este número NO es una dirección verdadera. Se convierte a binario y se coloca en la sección de operación del comando de lenguaje de máquina. Por lo tanto, el valor no puede ser grande. [ cita requerida ] La dirección C DEBE ser indirecta con un incremento de uno o más para que cada transferencia individual opere en una palabra diferente. Este comando rara vez se usó en mi experiencia de programación de aplicaciones. Sin embargo, puede ser más útil en sistemas operativos y compiladores.

TN Transferencia de la dirección A a la dirección C. Luego, transferencia de A+1 a C+1. Continúa en total la cantidad de veces especificada en la dirección B. En cuanto a MT, este es un número decimal que termina en binario en la sección de operación del comando de máquina. [ cita requerida ] Este comando se usaba con frecuencia en aplicaciones, especialmente para “borrar” áreas de texto. Este comando usaba los registros AU1 y AU2 para administrar los incrementos de dirección.

NA Comparar las direcciones A y B. Si son iguales, continuar de forma normal. Si no son iguales, SALTAR a la dirección C. [ cita requerida ]

LA Compara las direcciones A y B. Si A (como binario sin signo) es menor o igual que B, continúa de forma normal. De lo contrario, SALTA a C. [ cita requerida ] Para un bucle con un contador, LA es más seguro que NA. Si la lógica falla, un bucle NA podría salirse de control.

PR Proceder. Este era un comando de "no hacer nada" que, sin embargo, llevaría algún tiempo. Las tres direcciones estarían inactivas. Podría usarse en un bucle para esperar a que el operador realice alguna acción antes de tal vez recordárselo.

Definición de constantes y valor inicial

Se trataba de comandos ARGUS que debían traducirse al valor inicial en binario de una dirección en memoria. El valor real iría a la dirección A y continuaría en las direcciones B y C, siempre que fuera necesario. La mayoría de estas líneas se utilizaban como constantes y tenían un código de ubicación para que los comandos activos pudieran hacer referencia a ellas.

OCT La letra o número perforado se traduce en un código octal de tres bits . Así, el 0 se convierte en 000, el 1 en 001, el 2 en 010... y el 7 en 111.

La letra o número perforado se traduce en un código hexadecimal de cuatro bits . 0 se convierte en 0000, 1 se convierte en 0001, ..... 9 se convierte en 1001. Luego, B a G indican el decimal 10 a 15, que en binario es 1010 a 1111. El código hexadecimal de Honeywell usó B a G donde IBM usó A a F.

DEC La letra o el número perforado se traduce a un código decimal de cuatro bits . Es como el hexadecimal, excepto que solo son válidos los números del 0 al 9.

ALF La letra o número perforado se traduce según el código binario propio de Honeywell para números, letras y símbolos alfanuméricos.

M,x,texto más entradas separadas de x,texto en CADA campo de dirección. Aquí, x puede ser O, H, D o A, lo que permite codificar cada sección de 12 bits de la palabra utilizando cualquiera de los métodos anteriores.

Para OCT, HEX y DEC, los 4 bits más a la izquierda se utilizan para indicar el signo del número.

Máscaras y comandos de conmutación

Una máscara era una constante con una entrada de ubicación de M,nombre de máscara. Era una buena práctica poner todas las máscaras juntas en ARGUS. En cualquier caso, ARGUS las pondría juntas en palabras consecutivas. El número máximo de máscaras era 15.

Una máscara se podía usar para modificar la acción de cualquier comando que pudiera cambiar el valor de una palabra, por ejemplo: TX,maskname aplicaría la máscara “maskname” a un comando TX. El enmascaramiento era esencial para un comando Switch Word, pero no muy valioso para otros comandos. Algunas instalaciones tenían un estándar para usarlas SÓLO para Switch Word. La dirección completa de la primera máscara se colocaría en el registro MSK y el desplazamiento de una máscara individual se colocaría en la sección de comando del comando de lenguaje de máquina para el que se especificaba. En consecuencia, un programa necesitaba y tenía solo un conjunto de máscaras y podían usarse desde cualquier segmento.

Los comandos Switch Word se usaban para mover algunos bits de la palabra a otras posiciones de bits. Había dos comandos Switch Word y eran muy similares. Switch Word y Extract tenían un comando ARGUS de: SWE,maskname, la dirección A era la fuente y la dirección C el destino. El campo de dirección B era para la cantidad de conmutación: x,n,d. x era B, D o A que representaba binario, decimal o alfanumérico, es decir, unidades de 1, 4 o 6 bits respectivamente. d era L o R para izquierda o derecha.

En funcionamiento:

La palabra se obtuvo de la dirección A. Los bits se movieron hacia la izquierda o hacia la derecha según la cantidad y el tamaño de la unidad especificados. Los bits que "se cayeron" del extremo se volvieron a colocar en el extremo opuesto. La palabra desplazada se pasó a través de la máscara bit a bit. Si el bit de la máscara era 1, entonces se copiaría el bit desplazado. De lo contrario, se pasaría un bit 0. La palabra modificada se colocó en la dirección C.

El otro comando Switch Word era Switch Word and Superimpose, SWS, con la misma sintaxis. La acción difería en la etapa de máscara. Si el bit de máscara era 0, se colocaba el bit no desplazado en lugar del desplazado en la palabra de salida. Para un bit de máscara de 1, la acción era la misma que para SWE.

Ejemplo La dirección A contiene 8 caracteres de 6 bits cada uno: ABCDEFGH La máscara ONECHAR contiene 1 en sus 6 bits más a la derecha y 0 en el resto.

El comando es: SWE,ONECHAR AA,4,RC Entonces la dirección C contendrá: 0000000D

Si el comando es: SWS,ONECHAR AA,4,RC Entonces la dirección C contendrá: ABCDEFGD

En lenguaje de máquina, todos los desplazamientos se representaban en binario a la derecha. Todos los códigos ARGUS en formato x,n,d se pueden reducir a binario a la derecha.

Macros y subrutinas

Una macro se llamaría por: L$,macroname Esto solicitaría al ensamblador que insertara el texto ARGUS de la macro “macroname” en ese punto. Esto se hacía durante una etapa temprana del ensamblaje antes de que ARGUS se tradujera a código de máquina. Había bastantes macros en la biblioteca estándar (almacenadas en su propia cinta) y los clientes podían agregar más. Las macros GET y PUT obtendrían un elemento del búfer de cinta de entrada o colocarían un elemento en el búfer de cinta de salida, leyendo o escribiendo un registro según corresponda.

Había dos tipos de subrutinas. Una estaba escrita íntegramente en ARGUS. A continuación se muestra un ejemplo, utilizando la subrutina SUBA:

El otro tipo de subrutina se entregaba en lenguaje de máquina con un envoltorio de macro. Normalmente, la escribía el personal de Honeywell. La macro utilizaba el comando GOSUB para llamar a la subrutina.

Comandos de punto flotante

El Honeywell 1800 tenía un adaptador de punto flotante opcional para computación científica. Había un conjunto de comandos para ello. Estos comandos también estaban disponibles en forma de simulación si el hardware no incluía el adaptador, pero no se recomendaba para uso regular. Los comandos de punto flotante de ARGUS eran los mismos independientemente de si había un adaptador. En su ausencia, ARGUS proporcionaría una simulación en lenguaje de máquina de la operación de punto flotante real.

Control de entrada/salida periférica

Las direcciones de los dispositivos de entrada y salida a nivel de máquina eran dos dígitos octales del 0 al 7. A nivel de ARGUS eran dos letras AG. Los primeros dígitos identificaban al controlador, el segundo dígito identificaba el número de dispositivo en ese controlador.

En el procesamiento de cintas, en los manuales de Honeywell, cada unidad de datos de la cinta se denominaba registro. IBM lo llamaba, y lo sigue llamando, bloque. Una subdivisión de un registro se denominaba elemento. IBM lo denominaba registro. La terminología de IBM se convirtió en el estándar estadounidense.

Comandos:

El comando RW,AA rebobinaría la cinta en la unidad de cinta AA, octal 00.

El comando RF,AA leería el siguiente registro en la unidad de cinta AA, octal 00.

El comando RB,AA volvería a leer el registro anterior en la unidad de cinta AA, octal 00, sin entregar datos. Para modificar una cinta existente, podría utilizar RF para encontrar el primer registro que no deseaba, luego RB para llegar al espacio anterior, luego WF para escribir sobre él y así sucesivamente.

El comando WF,AB escribiría el siguiente registro en la unidad de cinta AB, octal 01.

El comando RF,GA leería la siguiente tarjeta en el lector de tarjetas, dispositivo GA, octal 70.

La dirección A sería la primera palabra del búfer para esa operación de lectura o escritura. Era normal utilizar dos búferes para cada dispositivo, de modo que la lectura o la escritura pudieran ejecutarse en paralelo con el procesamiento. Esto se denomina doble búfer . El tamaño del búfer era un factor limitante en el tamaño de los “registros” (bloques) porque la memoria del núcleo era limitada.

Al preparar la grabación de un registro en cinta, cada elemento terminaba con una palabra de fin de elemento con un código prescrito. Cada registro terminaba con una palabra orto para comprobar errores seguida de una palabra de fin de registro. Una vez que el búfer de salida se había llenado con elementos, se utilizaba el comando Compute Ortho (CC) para calcular la palabra orto y proporcionar la palabra de fin de registro. Para el comando Compute Ortho, las direcciones A y B marcaban las posiciones de la primera y la última palabra. A continuación, el registro se escribía con el comando WF. Finalmente, el control se devolvía al programa principal.

Para el funcionamiento normal de la aplicación, todos los comandos periféricos, excepto quizás RW, se colocarían en una subrutina.

Comandos de administración de programas

Existían comandos ARGUS para gestionar la administración de programas. Para ensamblar un programa se requería lo siguiente: [ cita requerida ]

Se necesitaban muy pocos comandos de administración para cada programa que se iba a crear o modificar.

U,NEWPROG progname Las tarjetas que siguen son para un programa nuevo y completo llamado progname. U,REASSMB progname Las tarjetas que siguen son revisiones del programa existente progname. U,NEWSEG progname segname Las tarjetas que siguen son un segmento nuevo y completo llamado segname del programa (nuevo o existente) llamado progname. U,SEGMENT progname segname Las tarjetas que siguen son revisiones del segmento segname del programa progname. U,ENDSEG Este es el final del segmento (o sus revisiones). U,ENDPROG Este es el final del programa (o sus revisiones).

Véase también

Referencias

  1. ^ "Manual de ventas de la empresa Honeywell 1800" (PDF) .
  2. ^ ARGUS - Sistema automático de generación y actualización de rutinas, Manual en lenguaje ensamblador. Honeywell Inc. 1959.

Enlaces externos