ARGUS, an acronym for Automatic Routine Generating and Updating System, was an assembly language devised in the late 1950s by Honeywell for their Honeywell 800 and 1800 computers.
As with other assembly languages, each line of ARGUS was copied on to one card and related to one word in memory, except that one ARGUS command, RESERVE, could reserve any specified number of words in the position specified. The RESERVE command was also exceptional in not prescribing the initial data in the reserved words. With a few exceptions machine language words were coded in the same order as the ARGUS lines.
Honeywell 800 Memory The Honeywell 800 and 1800 had a main memory and a control memory, both using ferrite cores. The main memory had between 4 and 16 banks, depending on customer requirements. Each bank contained 2048 words of 48 bits each. The actual number of banks in an individual installation had to be a multiple of 4.
The control memory had 256 registers of 16 bits each. At any given time the machine could theoretically run one Operating System and 7 application programs, each with exclusive use of 32 registers.
A program that required more than 2048 words (data and instructions combined) had to be split into segments of 2048 words or less. Each segment would have exclusive use of one bank of main memory. There were special instructions to pass control from one segment to another.
Layout of ARGUS Commands Each line of ARGUS command had six fields as follows:
Location is an optional ARGUS name to be assigned to that word in memory. When the address of each word has been assigned in memory, the ARGUS name of the line would be linked with the position of its corresponding word. Other lines of ARGUS could refer to that name and their words would be assigned the correct memory address. Within the program, each name had to be unique.
This field could begin with R, . If so then the rest of the card is remarks only.
This field could begin with X, or X,addressname. If so then this line and any other X, lines will be placed away from the lines not so marked. They can then be addressed by X,+n or by the addressname in the address field.
This field could begin with M,maskname. If so the line defines a Mask
Operation: The ARGUS name of a Machine Language command or an ARGUS-only command. This could be followed by the address of a mask, if required. A few commands had extra information.
A, B and C addresses: To be translated into machine code (see below). The A and B addresses were typically the two input words and the C address was the destination.
ID: Normally a serial number punched on to the card by the card punch machine. Used to resort any cards that might be dropped.
Layout of Machine Language Commands Each Machine Language Command used one word of 48 bits. This was split into 4 sections of 12 bits each. The first 12 bits specified the operation, with ancillary information including the offset address of any mask for the command. The three other sections were the A, B and C addresses.
If a mask was specified then the final result of the command would pass through that mask before reaching the destination. For example, if bit 17 of the mask was 1 then the result would go to bit 17 of the destination. If bit 17 of the mask was 0 then something else would go to bit 17 of the destination. It might be 0 or it might be the unchanged bit 17 of the input word, depending on the command.
A segment was allowed up to 16 masks and they had to be in consecutive words, beginning at an address whose last four bits were all 0. All of them had ARGUS location names. A special register called the Mask Register held the base address. The command field had 4 bits to hold the offset address of the named mask.
Modes of Addressing Memory For most commands the A, B and C address sections were used to denote actual locations in memory. There were six modes of addressing. Two were rarely used. The remainder were: Direct, Direct Special Register, Indirect Addressing and Indexed.
Direct Addressing
The main memory address is specified directly by the command. In machine language one of the 12 bits indicates direct mode, the other 11 specify the exact address. 11 bits can represent the numbers 0 to 2047 but nothing larger. However this is the most efficient type of addressing. This dilemma is why a bank has only 2048 words and a segment is confined to only one bank.
There are two ways of writing this in a line of ARGUS code: 1. A name, previously defined in the location column. A number (decimal) can be added to this, e.g.: BUFFER0+59 2. A location several lines (words) beyond the current line, e.g. C,2 means the line two beyond this one.
Indirect Addressing In 12 bits the mode of addressing and the address of a register in control memory are identified. Also an increment between 0 and 32 is specified. The main memory address is in the register in control memory. The processor will first obtain the main memory address from the register, then call for the word at that main memory address. Finally it will increase (increment) the register value by the amount specified. The 16 bit address from the register contains a bank address from 0 to 31 using 5 bits and a word in that bank using 11 bits. Incrementing was recommended only for addresses A and B.
In ARGUS: N,R0,3 means use register R0 and then increase it by 3.
Direct Special Register A register is addressed directly in the same manner as a word in main memory.
In ARGUS: Z,R0,3 means read from or write to register R0 directly and then increase it by 3. The increase is not recommended when writing.
Indexed Addressing This applies only to 8 registers, called index registers. It takes 3 bits to specify the index register and another 7 to specify an offset of 0 to 127. So the offset is added to a full-length main memory address. This is a powerful tool. It is helpful for processing a multiword text or record. Tape buffers are usually addressed this way.
In ARGUS: X0,35 or 0,35 means use Index Register 0, increase that number by 35 (decimal) and read from or write to that location in main memory. DO NOT change the value in X0.
Inactive Address In ARGUS, the address field was a dash (-). It meant the field would be ignored by the processor, thereby nullifying part of the usual action of the command.
Registers As mentioned, the program had access to 32 registers. 8 had special functions, 16 registers (R0 to R15) were general purpose and 8 (X0 to X7) were index registers.
Index addressing was only possible for index registers.
Direct and Indirect addressing were applicable to both general purpose and index registers. They would probably work with other registers too but that would be bad practice.
The special registers were: SC (Sequence Counter) SH (Sequence History) CSC (Cosequence Counter) CSH (Cosequence History) MSK (Mask Register) AU1 and AU2 They were used by the computer to execute the program.
In operation, the Sequence Counter always contained the full address of the command that was running. Normally commands were executed in location order. The Sequence History contained the last value of the Sequence Counter. This value had to be stored immediately upon jumping to a subroutine. Otherwise it would be impossible to return. The Cosequence Counter and History performed the same functions for any command that had X, at the beginning of its ARGUS location.
The MSK register held the full location of the first mask (see below).
AU1 and AU2 were used internally by some commands, especially TN. They could also be used by programs. However, there was a risk that an internal operation might interfere so it was not a wise choice.
Commands Each ARGUS line defines a word in memory. In normal operation the processor performs each command in address order. Some commands can order a JUMP to another address (by Direct Addressing into the same bank).
Arithmetic The commands WA, BA and DA, in different ways, all obtain numbers from addresses A and B, add them together and put the result into address C.
The commands BS and DS both subtract the number in address B from the number in address A, placing the result into address C.
WA (Word Add) treats the two input numbers as binary numbers with no sign. This was often used to add an increment to a known address.
BA and BS (Binary Add and Binary Subtract) treat the two input numbers as signed binary.
DA and DS (Decimal Add and Decimal Subtract) treat the two input numbers as signed decimal.
The leftmost four bits define the sign. If they are all zero then the sign is positive. Otherwise it is negative.
The command DM multiplies the number in address B by the number in address A, placing the left half of the result into address C. The remaining low end digits are left in LOP, the Low Output Register. They can be transferred from there to a main memory address by the TX or TS command. DM is fully supported by the Floating Point Adaptor. In its absence, simulation is required.
Data Transfer and Program Control TX Transfer from address A to address C. Address B MUST be Inactive (see Modes of Addressing)
TS Transfer from address A to address B then JUMP out of sequence to the command at address C. C must be a direct address. Optionally A and B can be Inactive and the command becomes a pure jump. This is the nearest that this machine gets to a GOTO command.
MT Transfer from address A to address C several times. The number of times is specified as a decimal number in address field B. This number is NOT a true address. It is converted to binary and positioned in the operation section of the machine language command. So the value cannot be large. Address C MUST be Indirect with an increment of one or more so that each individual transfer operates on a different word. This command was rarely used in my experience of application programming. However it may be more useful in operating systems and compilers.
TN Transfer from address A to address C. Then transfer from A+1 to C+1. Continue in total for the number of times specified in address B. As for MT this is a decimal number that ends up in binary in the operation section of the machine command. This command was frequently used in applications, especially for “blanking” out areas of text. This command used registers AU1 and AU2 to manage the address increments.
NA Compare addresses A and B. If equal continue as normal. If unequal JUMP to address C.
LA Compare addresses A and B. If A (as unsigned binary) is less than or equal to B then continue as normal. Otherwise JUMP to C. For a loop with a counter, LA is safer than NA. If the logic goes astray than an NA loop could run away.
PR Proceed. This was a "do nothing" command which nevertheless would take some time. All three addresses would be inactive. It could be used in a loop to wait for the operator to take some action before perhaps reminding him.
Constants and Initial Value Definition These were ARGUS commands to be translated into the initial value in binary of an address in memory. The actual value would go into address A, continuing into addresses B and C, as long as necessary. Most of these lines were for use as constants and would have a location code for reference by active commands.
OCT The punched letter or number is translated into a three bit octal code. So 0 becomes 000, 1 becomes 001, 2 becomes 010.... and 7 becomes 111.
HEX The punched letter or number is translated into a four bit hexadecimal code. 0 becomes 0000, 1 becomes 0001, ..... 9 becomes 1001. Then B to G indicate decimal 10 to 15, which in binary is 1010 to 1111. Honeywell hexadecimal code used B to G where IBM used A to F.
DEC The punched letter or number is translated into a four bit decimal code. This is like hexadecimal except that only 0 to 9 are valid.
ALF The punched letter or number is translated according to Honeywell's own binary code for Alphanumeric numbers, letters and symbols.