COSMAC CASE HISTORY
This article appeared as a sidebar in the September 1974 issue of IEEE Spectrum magazine.

Interfaces were a central concern in our design of a microprocessor-based store-and-forward system at RCA, for international leased line communications.

We found it desirable to make a number of interface parameters program-selectable, or programmable. For example, in our communication link interfaces, transmission characteristics such as data rate, stop-bit length, character length, and parity are programmable and can all be set by simple software instructions.

Just how our design finally took shape will become evident as we present a description of the system's interface hardware and software.


Figure A. (Click for a larger version.)

Moving messages through the system

Incoming messages enter the system through one of two communications interfaces. Here the messages are converted from a stream of bits into characters, each containing in an 8-bit data byte. These bytes are transferred, one at a time, into the system's semiconductor random access memory (RAM). When 232 bytes accumulate, they form a block of data.

The data block is then moved into the larger disk memory, where it is held until needed for retransmission. Outgoing data blocks move from disk, to RAM, to the appropriate communications line.

The RCA COSMAC microprocessor controls this sequence of events with programs written to fill the requirements of the overall store-and-forward communications process.

The entire microprocessor system (Fig. A) consists of a large-scale integrated microprocessor, a 4096-byte RAM, and five peripheral interfaces, each of which use a group of integrated circuit packages, and serve to connect different "devices" to the system.

The microprocessor makes both a data bus and a control bus available to the peripherals. These busses carry almost all the information that flows between the processor and the peripherals.

Since several different interfaces are connected to these busses, there must be a clear way to indicate which interface is permitted to be active at any given moment. The Select instruction performs this assignment function.

Each interface has its own, unique selection number. For example, a Select instruction together with the number 08 on the data bus, will activate the floppy disk interface. Once an interface is selected, it is free to act on further processor instructions.

To control certain peripheral functions - such as disk startup and head location, or communications transmission speed - the processor issues a Set instruction. Other processor instructions are used to test the state of external flag lines. These lines are connected to flip-flops, set by the peripheral interfaces to indicate such conditions as readiness to read or write, as well as faults and error conditions.

Three special lines allow the peripheral interfaces to initiate system actions, without first getting permission from the processor. By using the Interrupt line, the communication interfaces demand immediate handling of incoming data as it arrives on the communications links, and an immediate supply of outgoing data from the RAM, as it is needed for transmission over the links. With the Cycle steal lines, the floppy disk memory and TV display gain direct access to the RAM so they can write into the memory, or read from it, without software instructions. Finally, via the Load line, the system can be reset and restarted - using a disk-stored program - after a catastrophic failure or loss of power.

Inside the communications interface

When a communications interface has received an incoming character from its communications link, it raises the microprocessor interrupt line. At the same time, this unit raises an external flag, EF1, to indicate that a received character is available.

At the microprocessor, the interrupt causes the ongoing program to branch to a special software routine designed to service interrupts. Since there is only one interrupt line, the routine must first find out which is the two communications interfaces sent the interrupt, and then determine what kind of service is needed. This information is obtained by testing to see which external flags are raised.

The actual programmed sequence in the interrupt routine includes a Select instruction for each communications interface. After an interface is selected, its external flags are tested to determine the presence and cause of the pending interrupt. Knowing the device and its flagged condition, the processor issues an appropriate instruction to service that condition. For example, in response to flag EF1, indicating a received byte of data is available, a Read instruction would be issued to call for the transfer of a byte of data from the communications interface to the procesor (for transfers in the opposite direction, a Write instruction is used). On receipt of the Read instruction, the interface places the received byte on the ingoing data bus, and the processor clocks the byte into RAM memory.

The system allows up to four external flags (EFs) for each peripheral interface, and the meaning of each of these flags - or combinations of flags - can be different for each interface. For the communications interfaces, EF4 is set in conjunction with EF1 if the received character is erroneous (bad parity). When an interface is transmitting data, EF2 is set to indicate that the next character can be transferred. Finally, EF3 is used to indicate special conditions, such as abnormal communcation line operation.

While a given interrupt is being serviced, all other interrupts must wait their turn. Priorities for servicing interrupts are established in the processor's software interrupt routine. For example, the domestic communications interface is always selected first by the routine. Domestic data rates are usually higher then international rates, and therefore the penalty for keeping the domestic line waiting is greater. Likewise, Read interrupts are always given priority over Write interrupts, because failure to read may result in loss of data, but the worst penalty for failure to write is time lost on an idle transmission line.

The interrupt-driven form of data transfer is well suited to the communications function. Competing functions and devices are easily queued; each input character can be examined and processed as it is received; new devices are easily added; and existing device priorities are easily changed.


Figure B. (Click for a larger version.)

The hardware that communicates

Communications interface hardware centers on a large-scale integrated circuit - contained in a single 40-lead package - that handles several key functions. This circuit, called a Universal asynchronous receiver-transmitter (UART), converts data bytes from the microprocessor into a stream of serial bits for the communications link. The UART also performs the opposite conversion, taking serial bits from the communications link and shaping them into characters for the microcomputer system. Actually, each character consists of up to 8 data bits, and an odd-even parity bit may be added. When called for, these parity bits are generated by the UART as it transmits characters, and the UART also checks the parity of incoming characters from the communications link.

Surrounding the UART are a number of functional blocks implemented in transistor-transistor logic (see Figure B). The Interface program register provides the means for microcomputer program instructions to control the Clock and the communications mode (half- or full-duplex). Flip-flops in this register select speed-control lines into the clock to allow program selection of bit-per-second transmission and reception rates. The type of parity (even or odd), length of characters, and number of stop bits used in serial transmission are also under program control.

To connect the transistor-transistor logic (TTL) circuits in the interface to communications link circuits, some matching is necessary. This is done in the Communications link interface circuitry. For links using RS-232 industry-standard data interfaces, voltage-level shifting of TTL signals is needed. For teletype links, output currents must be controlled to specified levels. Some communications links require that there be no direct ground connections. For these, optical isolation devices must also be included.

Instructions to the communications interface from the processor are received over the system's control bus and routed through the Instruction decoder which interprets microprocessor codes and generates logic signals that can be used to control the interface hardware. Since some of these microprocessor codes come over the system data bus, there is a Command decoder to interpret this added information. The Interface status register indicates whether the interface is, or is not, currently selected and thus allowed to communicate with the processor.

The Control logic distributes all the appropriate information to the Interface program register, the UART, and other parts of the interface. The external flags that inform the processor of the interface current status are placed on the system's control bus by the Interrupt and flag generator. This information comes from the UART and Status register, which is used by the UART and other circuits to record the occurence of such fault conditions as parity errors and open communications lines.

The third major element of the system, in addition to the communications interface and the microprocessor-RAM combination, is the floppy disk interface.

Stealing cycles for more efficient operation

The key feature of the floppy disk interface is its direct access to RAM memory, without need for detailed microcomputer program control. Using this direct memory access feature - built into the COSMAC processor - the disk can put data bytes into the RAM, or take them out, without receiving even a Select command. In fact, it can transfer this data while the processor is occupied with other tasks, such as talking to a communications interface.

The direct memory access mechanism used here is called cyycle stealing. There are normally two microprocessor cycles for each program instruction: a fetch cycle, followed by an execute cycle. When the cycle steal line comes up, say during a fetch, the processor will complete that fetch, and the corresponding execute cycle, and then hold its breath for a one-cycle interval before moving on with the next instruction, fetch cycle. It is during these stolen one-cycle intervals that data bytes are moved between the RAM and the disk.

Before the cycle stealing can begin, a direct memory access address register must be loaded with the first RAM memory address of the data block to be read from, or written on, the disk. Then the register is automatically incremented at each succeeding stolen cycle, until an dentire block of 232 data bytes has been transferred. And all the processor sees is a slight slowdown, usually less than a 1-percent reduction in the time available for its ongoing program activities.


Figure C. (Click for a larger version.)

Controlling the floppy disk

The floppy disks used in this system are 7.5 inches in diameter. Data is recorded on one side of the disk - coated with oxide material - which is made of flexible plastic. The disk is packeted in a paper envelope, and a recording band, about one inch wide is accessible through the envelope.

During reading and writing the disk is "loaded," so that physical contact is made between the read-write head and the disk surface. Since this causes wear, it is desirable to unload the disk as soon as possible. The disk rotates at 90 r/min, can store 1.4 Mb, and costs about $5. Data can be transferred from the disk at a rate of 33 kb/s, and it tkaes an average of 560 ms to reach a desired specific data block on the disk.

Each of the disk's 64 concentric data tracks can hold 8 complete blocks of data. And each of these blocks begins with 16 bytes of synchronization information, followed by 232 bytes of data, and capped off by 8 bytes of trailing zeros.

This structure provides an 11-ms gap between adjacent blocks on the same track, and this gives the system enough time to process the blocks one right after another.

Data from the disk is always transferred to the system's RAM memory, before going elsewhere, and all data stored on the disk comes to it from the RAM.

As with the communications interfaces, a Select instruction - including the disk's identifying number - is used to initiate contact between the processor and the disk. Four additional instructions are used to control disk functions. Locate A and Locate B specify the disk storage location for each block of data; Start loads the disk head and allows data flow to or from the disk when the desired location is reached; Stop unloads the disk when the desired data transfer is completed.

To follow these disk control operations in more detail, refer to the interface function diagram in Figure C. The Locate A instruction sends the desired track-location number to the interface Control Logic, and Locate B sends the corresponding sector-location number.

Actually, the Locate B instruction serves a double purpose since it also tells the control logic whether data is to be written onto the disk or read from it. This information, along with the current track and sector location data, is stored in the Control Buffer, where it is available until updated by new Locate A or Locate B instructions.

When a Start instruction is received, the Control Logic activates the Head Positioning Logic to move the head into the position stored in the Control Buffer, and simultaneously loads the head into contact with the disk.

After the disk mechanisms have had time to settle to steady-state operation (delays to guarantee this are generated by the Control Logic), the actual data transfer is initiated by the interface itself. No processor instructions are needed during this transfer, which is not complete until an entire block of data has been moved.

When the disk is to be read, the disk head is first loaded, the desired location is reached, and the read circuits are activated somewhere within the 16-byte synchronizing pattern that prefaces the desired block of 232 data bytes. The Sync Pattern Detector then searches for the synchronizing pattern to determine the exact moment when the first data bit in the block is about to move into position under the read-write head. This mode of operation allows large design tolerances on both the location of the head and on the timing for reading and writing.

The Read-Write Logic frames the data bytes while the disk is read. That is, it defines the beginning and end of each byte as it appears in the serial stream of one-bit read pulses from the disk. When it is time to transfer a byte of data to microcomputer RAM, the Control Logic raises one of the cycle steal lines, and the byte is then placed on the system data bus. When data is being recorded on the disk, the Read-Write Logic takes in each data byte and converts it into a stream of one-bit write pulses to the disk head.

At the present time, the Read-Write Logic adds a parity bit after every 8 bits it sends to the disk. When the disk is read, these parity bits are checked to get indications of errors that may have occurred during the disk read operation. Since disk errors tend to occur in bunches, or bursts, future system design plans plans call for the use of burst error-detecting coding techniques rather than parity bits. The savings in available storage space should be substantial.

In addition to coordinating all the other disk interface operations, the Control Logic sets the external flags that notify the processor about disk conditions. For example, a flag is raised when the interface finishes transferring a complete block of data to the RAM, or when a complete block of data has been written on the disk. By testing this flag, the microprocessor program can decide when to change Locate instructions, and initiate new Start instructions to read or write additional data blocks.

As a convenience feature, the disk stores a bootstrap program that can restart the entire microcomputer system from scratch after power is lost, or after some other unanticipated condition puts the system out of commission. Any other program residing on the disk can then be loaded using the bootstrap program, eliminating the need for auxiliary program load devices such as cassettes or paper tape, and greatly simplifying system regeneration after a crash.

Less vital to the system than the floppy disk, but still interesting from an interfacing viewpoint, is the TV display.

Talking to a TV display

The TV can display text indicating communication-link fault conditions. But experience has shown that its most useful function is to display memory patterns; bit patterns on the data bus; and other information for diagnosis, test, and maintenance of the system.

A standard, unmodified TV set is used for the display which is refreshed from 128 bytes of RAM memory. This storage space is dedicated to the display, and these data provide 1024 dots for the display. Like the floppy disk, the TV display uses the direct memory access (cycle-stealing) capability of the system.

Every 60th of a second, the TV interface interrupts the processor and asks for new information. The interrupt routine then points to the beginning of the 128 bytes of RAM memory that contain the TV display data. These data are then sent to the TV interface on a cycle-stealing basis.

Since only one peripheral device can be served at a time by the direct memory access capability, the disk and the TV cannot operate simultaneously. The disk, vital to the main communcations function of the system, is given absolute priority over the TV. The result is that when disk and TV needs conflict, the TV display may flicker or show a reset pattern for up to about 1/2 second.

The lowest-priority peripheral in the system is the manual keyboard used to enter data butes (in the hexadecimal code internally used by the system) into the RAM memory. This provides a means to debug and modify programs - for example, to change track and sector numbers manually for floppy disk operations.

 

Paul M. Russo (M) joined RCA Laboratories, Princeton, N.J., in September 1970. There, he has done research in the areas of computer architecture, program behavior, computer system performance evaluation, microprocessors, and data communications. During the 1969-70 academic year, he taught circuit theory and circuit optimization at the University of California, Berkeley. Dr. Russo was born in Plevlje, Yugoslavia, in 1943. He received the B.Eng. degree in Engineering Physics from McGill University in 1965, and the M.S. and Ph.D. degrees in electrical engineering from the University of California, Berkeley, in 1966 and 1970. He is a member of ACM, Eta Kappa Nu, and Sigma Xi.

Michael D. Lippman (M) has been a member of the Technical Staff of the RCA Laboratories, Princeton, N.J., since 1966. He has done research on magnetic data recording, vapor transport processes, and graphics development and design of microprocessor-based data communications systems. Mr. Lippman is a member of Tau Beta Pi and Eta Kappa Nu.


Comments to Webmaster

Click here for the Home page.
Click here for the COSMAC page.
Click here for the Wanted page.

Last updated January 28, 2006