Nova

A Data General in 1969, and the mainstay of the company's product line through the decade of the 1970s. The Nova was one of the first 16-bit minicomputers, and at the time it was introduced, it was smaller, faster, and less expensive than competing products. It became popular initially in scientific and process control applications, and then as the available software suite expanded, it gained a market in offices and educational institutions.

The Nova line consisted of four basic series. The original systems were known as the 1200 and 800 models, the number referring to the microprocessors did not exist at the time). Compared to many competing products, Data General had chosen a very large circuit board standard of 15x15 inches, which made it possible to implement the processor on two boards with no need of manual wiring between, reducing assembly costs compared to their competitors. The elimination of hand wiring also improved reliability, and made servicing easier. (Circuit boards were routinely repaired in the field, rather than swapped out.)

The Nova II eventually replaced these models, offering a more integrated CPU with more hardware options. The Nova 3 re-implemented the CPU using TTL logic circuits in place of the older types used in the earlier Novas, making higher clock speeds possible. The final series was the Nova 4, which used the same hardware as the original 16-bit assembly language programs rather tedious. Four direct memory access (DMA). Most faster devices used DMA. The CPU used channel I/O instructions to send commands and setup data to the device, which would then use DMA to perform the actual I/O. The DMA was essentially invisible to the CPU; the device wishing to do a DMA transfer would request a DMA cycle, and the CPU would signal when the bus was clear. (Due to the register-to-register instruction set, most instructions had at least one execution cycle where the CPU did not need to be on the bus.) The device then accessed the memory directly, without any CPU intervention at all. DMA devices could use the capabilities of the mini-arithmetic unit on the memory board; for example, an input value could be added to the existing contents of a memory location. This capability was exploited by many process control applications to gather process performance and statistical data with a minimum of performance overhead, since the software did not have to be involved in the data collection.

All of the Novas except for the Nova 4 had front panels , and the front panel design was an iconic feature of the Nova series. The Nova 800/1200 and Nova II front panels were also notorious among field service personnel, since they used incandescent lamps soldered into the panel board. A routine and tedious part of any field service call for which the customer had a maintenance contract was to pull the panel board, unsolder all of the burned-out bulbs, and solder in new ones. It was necessary to use the front panel to boot the Nova; on most models, this involved setting the channel number of the boot device in the data switches, and then pressing a switch usually marked PROGRAM LOAD. This started the CPU and transferred control to a small Summary of the Nova instruction set [ ]

The Nova instruction set has four types of instructions:

All instructions are one word (16 bits) long. A problem this creates for the memory access and transfer of control instructions is that they cannot accommodate an address field large enough to address the entire memory address space. So the instruction set creates four addressing modes:

There are four memory access instructions:

Each of these instructions takes an addressing mode number and an addressing field value; the LDA and STA also take the number of the accumulator to be loaded or stored. In addition, these instructions have an indirect bit; if this bit is set, the target memory location is loaded and its contents are taken to be the address of the memory location to be loaded, stored, incremented, or decremented. Setting of the indirect bit is indicated by the presence of the at-sign ('@') in the instruction. Examples:

Loads accumlator zero (AC0) with the contents of the memory location whose address is the value contained in AC2, plus 6.

Stores AC2 in the memory locatin that has been labeled LOCA. The assembler looks at the address of LOCA and figures out whether to use mode 0 or mode 1, and computes the value of the address field. If LOCA is not in page zero and is not within 128 words of the current location, the assembler flags an error

The memory location whose address is in AC3 is accessed, and its value is taken to be a memory address. The memory location at that address is incremented. If the incremented value is zero, the next instruction is skipped.

There are two transfer of control instructions:

The transfer of control instructions take an address field, an addressing mode, and an indirect bit. Examples:

Jumps to location FUNCT, which must be either in page zero, or within 128 words of the current instruction. The assembler figures out the addressing mode (0 or 1) and the address field offset value.

Jumps to location that is pointed to by the contents of location SUB1; as above, the assembler figures out the addressing mode and address field offset for SUB1.

Jumps to the location whose address is in AC3. (This is the standard method of returning from a subroutine, assuming that AC3 hasn't been altered.)

Note that transfer of control instructions which use the indirect bit allow multiple levels of indirection. When a JMP@ or JSR@ is executed, if the memory address contained in the target location has its high bit set, it assumes that the pointed-to address is another indirect address, and it will perform an additional cycle of indirection. This will repeat until the instruction succeeds in retrieving a jump address that does not have the high bit set. In the earlier Nova models, there is no protection against infinite indirection, which locks up the CPU.

The arithmetic and logical instructions all operate between registers. All take a source and destination accumulator number; for two-operand instructions, the second operand is obtained from the destination accumulator. In addition, the instructions take four option fields:

The carry field specifies how the carry bit shall be set prior to performing the operation. The options are: O -- set the carry bit; Z -- clear the carry bit, C -- complement (invert) the carry bit; blank -- do not change the carry bit.

The shift specifier specifies what type of shift should be performed on the result of the operation. Shifts are circular shifts of 17 bits -- the carry bit participates as the bit "between" the most significant bit and the least significant bit. The shift options are: L -- shift left; R -- shift right; S -- swap bytes of the result (carry does not participate in a swap); blank -- do not shift.

The test specifier specifies what type of test should be performed after the operation and the shift are completed. If the tested condition is true, the next instruction will be skipped. The options are:

The no-load bit, if set, tells the CPU to discard the result of the computation after performing the specified test. The destination accumulator is never altered when the no-load bit is set. Setting of the no-load bit is indicated by the presence of the pound sign ('#') in the instruction.

There are eight arithmetic and logical instructions:

The I/O instructions control I/O devices and actually move I/O data for some types of devices (the ones that do not use DMA). By convention, each I/O device controller is expected to have: (1) three 16-bit registers, which are arbitrarily labeled A, B, and C, and (2) two single-bit flags, which are named Busy and Done. The A, B, and C registers may be used to pass data or control information. The device is expected to set its Busy flag while it is performing I/O, and its Done flag when the specified I/O is complete.

All devices are assigned a channel number in the range 0-63. This is usually done by setting jumpers on the circuit board. Devices respond only to their specified channel. The I/O instructions take one option field, which can be used to send control signals to the device. The control options are: S -- signals the device to initiate I/O and set its Busy flag; C -- signals the device to stop I/O and to clear its Busy and Done flags; P -- a control signal that tells a device to perform a device-specific special function; blank -- send no control signal.

There are eleven I/O instructions:

In addition, there are certain special instructions that perform control operations on the CPU. These are actually defined as I/O instructions on channel 63, which loops back to the CPU itself. However, the assembler gives them their own mnenomics for clarity. They are:

In addition, performing a SKPDN/SKPDZ on channel 63 tested for the presence of the power fail interrupt.