DKIP(7-SysV) RISC/os Reference Manual DKIP(7-SysV)
NAME
dkip - Interphase SMD disk controller interface
SYNOPSIS
VECTOR: module=dkip vector=0x80 ipl=1 unit=0 base=0xBD008600
VECTOR: module=dkip intr=dkipscintr vector=0x81 ipl=1 unit=0
base=0xBD008600
VECTOR: module=dkip vector=0x82 ipl=1 unit=1 base=0xBD008800
VECTOR: module=dkip intr=dkipscintr vector=0x83 ipl=1 unit=1
base=0xBD008800
VECTOR: module=dkip vector=0x84 ipl=1 unit=2 base=0xBD008A00
VECTOR: module=dkip intr=dkipscintr vector=0x85 ipl=1 unit=2
base=0xBD008A00
VECTOR: module=dkip vector=0x86 ipl=1 unit=3 base=0xBD008C00
VECTOR: module=dkip intr=dkipscintr vector=0x87 ipl=1 unit=3
base=0xBD008C00
VECTOR: module=dkip vector=0x88 ipl=1 unit=4 base=0xBD007600
VECTOR: module=dkip intr=dkipscintr vector=0x89 ipl=1 unit=4
base=0xBD007600
VECTOR: module=dkip vector=0x8a ipl=1 unit=5 base=0xBD007800
VECTOR: module=dkip intr=dkipscintr vector=0x8b ipl=1 unit=5
base=0xBD007800
VECTOR: module=dkip vector=0x8c ipl=1 unit=6 base=0xBD007A00
VECTOR: module=dkip intr=dkipscintr vector=0x8d ipl=1 unit=6
base=0xBD007A00
VECTOR: module=dkip vector=0x8e ipl=1 unit=7 base=0xBD007C00
VECTOR: module=dkip intr=dkipscintr vector=0x8f ipl=1 unit=7
base=0xBD007C00
DESCRIPTION
This is a driver for all of the Interphase SMD disk con-
trollers. The 3200 controller is supported only on the
M/1000, while the 4200 and 4400 controllers are supported on
all the other VMEbus based machines.
The standard device names begin with ``ip'' followed by a
``c'' and the controller number (corresponding to the unit
number specified in the VECTOR field), a ``d'' and the drive
number on that controller, an ``s'' and the slice (parti-
tion) number to which that device name corresponds. Parti-
tion 6 on drive 0 of controller 4 would be represented as:
/dev/dsk/ipc4d0s6
Each device name has a unique major/minor number combina-
tion. Since only 256 minor numbers are supported for each
major number, only 16 drives with 16 partitions on each can
exist. Since up to eight controllers are supported, and
with the 4400 disk controllers there can be 4 drives per
controller, 32 drives can be addressed. This requires two
major numbers. Controllers 0-3 are accessed with major
number 4, and controllers 4-7 are accessed with major number
Printed 1/28/91 Page 1
DKIP(7-SysV) RISC/os Reference Manual DKIP(7-SysV)
9. To make the minor number consistent among the three con-
troller types (3200, 4200 and 4400), the scheme for minor
numbering assumes that there are 4 drives per controller.
When using 3200 or 4200 controllers, an error will be
returned when trying to access drives 2 and 3.
Block files access the disk via the system's normal buffer-
ing mechanism and may be read and written without regard to
physical disk records. There is also a "raw" interface that
provides for direct transmission between the disk and the
user's read or write buffer. The names of the raw files
conventionally are prepended with an `r' before the `dsk'
component of the name.
In raw I/O, buffers should be page aligned and the transfer
size should be a page multiple for best performance. If
they aren't, the driver assumes that the data transfer could
cross a physical page, and since direct memory access (dma)
can't occur over page boundaries, the driver will use an
intermediate buffer that is guaranteed not to cross a page
boundary. This is obviously less efficient. I/O counts
should be a multiple of 512 bytes (a disk sector). Likewise
seek calls must specify a multiple of 512 bytes. The driver
allows transfers of less than 512 bytes (not recommended,
but necessary for backwards compatibility), but all
transfers must start on a sector boundary.
In general, I/O through the block device is more efficient
if the amount of data to transfer is 8k or less. Of course,
all I/O that requires asynchronous transfers must be done
with raw i/o, since the system's buffering mechanism doesn't
write to the disk immediately.
Disk volumes on MIPS computers systems contain a volume
header that describes the contents of the disk and parame-
ters of the physical disk drive. The volume header is a
block located at the beginning of all disk media. It con-
tains information about physical device parameters and logi-
cal partition information. Refer to dvh(4) for details on
the disk volume header format. Volume headers are created
by formatters and may be manipulated by dvhtool(1M) via the
drive's volume header partition, specified by either
/dev/dsk/ipc?d?vh or /dev/rdsk/ipc?d?vh.
DISK SUPPORT
The first drive on the first controller usually contains the
root partition. There is a standard way these drives are
partitioned. ``ipc0d0s8'' contains the volume header, the
defect map, and sash (see sash(1Mspp). ``ipc0d0s9'' con-
tains all of the mapped tracks that are used when tracks on
other parts of the disk are bad. Accessing this partition
directly may result in ``sector not found'' errors being
Page 2 Printed 1/28/91
DKIP(7-SysV) RISC/os Reference Manual DKIP(7-SysV)
reported, since the sectors have already been re-mapped.
These two partitions together make up ``ipc0d0vh''. Physi-
cally next on the drive is ``ipc0d0s0'', the root (/) parti-
tion, followed by ``ipc0d0s6'' the /usr partition. The next
partition, ``ipc0d0s7'', isn't assigned to anything, and can
be added as another swap partition. Refer to swap(1M) for
details on how to do this. The final partition,
``ipc0d0s1'', is the main swap partition.
For subsequent drives, the volume header partition can not
be used. The largest accessible partition is ``ipc?d?s2''.
Running the command prtvtoc(1M) will show the layouts of the
filesystems. When determining which filesystems to create,
the output of this command should be referenced to insure
that no two filesystems don't overlap.
FILES
/dev/dsk/ipc[0-7]d[0-3]s[0-15]
/dev/rdsk/ipc[0-7]d[0-3]s[0-15]
/dev/dsk/ipc[0-7]d[0-3]vh
/dev/rdsk/ipc[0-7]d[0-3]vh
DIAGNOSTICS
If the ``showconfig'' option has been specified when the
kernel was booted, some diagnostic information will be
displayed as the kernel goes through initialization.
ipc%d: controller not present
The driver did not find this controller in the machine.
If that controller is actually installed, it could be
that the switch settings are incorrect, the VMEbus
jumpers are installed incorrectly, or the board isn't
seated properly.
ipc%d: reset failed
The reset command failed. This command is sent to each
controller as the system initializes. This usually
indicates a faulty board.
ipc%d: can't get controller info
During initialization, a command is sent to each con-
troller to determine the type of controller and the
revision level of the proms. This message is printed
if that command fails. This usually indicates a faulty
board.
ipc%dd%d: volume header contains bad parameters
During system initialization, the volume header is read
in using a set of default parameters. Once a valid
volume header is read in, the drive is then reconfig-
ured with the parameters specified in the volume
header. This message indicates that an error occurred
Printed 1/28/91 Page 3
DKIP(7-SysV) RISC/os Reference Manual DKIP(7-SysV)
when reconfiguring the drive.
ipc%d: spurious interrupt
This indicates that somehow the controller received an
interrupt before it was initialized. These interrupts
are ignored.
ipc%dd%d: cyl/head/sec, X:1 interleave
Once the drive had been reconfigured, this message
prints out the drive configuration that was used.
CONTROLLER: [ctype] ipc%d:prom id [rlvl] [prdata] [cenable]
This is printed out for each controller that has been
configured during initialization.
ctype - Controller type. This will be one of:
Interphase V/SMD 3200
Interphase Cheetah 4200
Interphase Phoenix 4400
rlvl - Controller firmware revision level.
prdata - The date that the firmware was released.
cenable - The functionality enabled or disabled on this
controller.
no scatter gather - The firmware doesn't support
scatter gather operations. This feature is used in
many instances to combine operations and to support
transfer over page boundaries. Upgrading to
firmware that supports scatter/gather operations
will increase performance.
no cache - The controller doesn't contain any on
board cache. This cache also increases performance
when it is in use.
MACSI - This is an interface to certain 4200 con-
trollers (rlvl at 040 or later), and all 4400 con-
trollers. Its main benefit is that it allows multi-
ple commands to be active at the same time. The
feature also increases performance.
overlapped seeks - This feature makes it possible to
seek to the correct cylinder on one drive, while
doing the data transfer on another.
sorting - Since controllers with the MACSI feature
have multiple commands active, it has the capability
to sort those commands. MIPS doesn't enable this
feature, since the sorting algorithm doesn't have an
consideration for fairness built into it. This
sometimes allows for the current process to throttle
the controller, and other processes to become
starved.
auto restore - When a driver fault occurs, this
Page 4 Printed 1/28/91
DKIP(7-SysV) RISC/os Reference Manual DKIP(7-SysV)
feature automatically performs a drive restore. If
the restore command doesn't complete within 3
seconds, an error message will be printed.
Four-Unit mode - This controller supports up to 4
drives. This usually means that is it a 4400 con-
troller. However, all controllers with the MACSI
feature enabled must be in Four-Unit mode. The
driver will check if it is a 4200 controller, and
even if is set to be in Four-Unit mode, it will
still disallow requests of drives two and three on
that controller.
Two-Unit mode - This controller supports up to 2
drives.
ERROR MESSAGES
The controller reports both exceptions and errors. Excep-
tions are errors from which the controller was able to
recover. There are three types of exceptions
was applied. chs=%d/%d/%d
ipc%dd%ds%d : Command completed successully after ECC correction
The data read from the disk was bad, but was fixed
using ECC correction.
& recal. chs=% d/%d/%d
ipc%dd%ds%d : Command completed successfully after drive restore
If restoring and recalibrating the drive corrected
whatever problem was found, this message is printed.
This usually occurs when the disk returns a seek error.
These messages should be investigated, since restoring
and recalibrating a drive can take up to 3 seconds and
thus greatly affect performance.
pleted successfully. chs=%d/%d/%d
ipc%dd%ds%d : %d controller retries attempted before command com-
In addition to the driver retrying each command 3 times
before returning an error to a program, the controller
will retry each command up to three times before
returning an error to the driver. If any controller
retries were necessary before the command could be com-
pleted successfully, this message is displayed.
Whenever the controller reports an error, a brief descrip-
tion is printed, along with the first cylinder/head/sector
of the request. For some error types, like DMA errors, the
memory address of the buffer is also printed. These mes-
sages are printed in different forms depending upon when
they occur.
chs=%d/%d/%d
ipc%dd%ds%d : Error during system initialization -
Printed 1/28/91 Page 5
DKIP(7-SysV) RISC/os Reference Manual DKIP(7-SysV)
[error type]
While the system is booting, it will probe to find out
which controllers and how many disks are installed, and
if each disk has a valid volume header. This message
will print if any errors occur during that time. If
the drive isn't connected, the message will be:
ipc%dd%ds%d : Error during system initialization - unit
not selected chs=0/0/0.
All other messages should be investigated, and so
should this if it's printed for a drive that actually
is installed.
ipc%dd%ds%d : Retrying... [error type] chs=%d/%d/%d.
The driver will retry each command up to 3 times before
returning an error to a program. If an error occurs
before the maximum number of retries has been
exhausted, this message will be printed.
chs=%d/%d/%d.
ipc%dd%ds%d : Hard error after 3 retries -
[error type]
After 3 retries, the driver will return an error to the
calling program. These hard errors should be investi-
gate. Refer to the following section on ERROR TYPES
for possible causes and solutions for each error type.
Please note that the cyl/hd/sec is the first sector of the
request. Most requests through the file system are done 8K
at a time. This is 16-512 byte sectors. The controller
doesn't report the exact sector that contained the error; it
just reports that during the last transfer, an error
occurred. To be sure that the defect is mapped out, run
badspots(1M) in manual mode and scan that portion of the
disk.
ERROR TYPES
disk not ready
This occurs when there is an attempt to access the disk
before it has come ready. This shouldn't happen once the
system is booted, unless there is a problem with the disk
itself.
seek error
If the controller cannot find the requested sector of data
within two revolutions, it will try to verify that the head
is on the right track by reading several sectors. If the
cylinder number in the sector is incorrect, this error type
is printed. These errors are usually cleared by a restore
and recalibrate command, so they often appear as a command
retry. These errors cannot be cleared by mapping out the
sector reported in the error message.
Page 6 Printed 1/28/91
DKIP(7-SysV) RISC/os Reference Manual DKIP(7-SysV)
ECC error in data field
This error should only occur when ECC correction is turned
off via the DIONOECC ioctl function call. It occurs if the
computed ECC of the data did not agree with the ECC appended
to the data field on the disk. This may also be caused by
the Gap 2 field, used when formatting the disk, not being
properly set. Mapping out this sector or reformatting the
track in which it's contain should prohibit this error from
occuring.
invalid command code
The command code sent to the controller was valid. This is
an internal driver error.
illegal fetch and execute
This error indicates that a Fetch and Execute IOPB command
was encountered in a place other than in the controller's
memory. Since the driver doesn't use Fetch and Execute IOPB
commands, this shouldn't occur.
invalid sector in command
The sector number was greater than the capacity of the drive
that was specified while formatting the disk. Check the
volume header for a valid sectors per track parameter.
illegal memory type
The memory type specified in the command block was invalid.
This is an internal driver error.
bus timeout
This error indicates that bus acquisition was not completed
with 100 milliseconds of a request. This error is typically
caused by either a non-existant address or incorrect command
set up by the driver.
header checksum error
This indicates that there was an error in the header field
on the disk. The data on the disk has been corrupted. This
can likely be fixed by mapping out this sector on the disk,
but may require reformatting the track in which it's con-
tained.
disk write protected
This error occurs when attempts are made to write to a disk
that has the write protect switch turned on.
unit not selected
This error occurs when the controller sends a signal to the
drive, and the drive fails to respond. This usually occurs
upon system initialization when a drive is not connected,
but can also occur if the unit switch setting on the drive
is incorrect, the drive is not powered up, or the cables
Printed 1/28/91 Page 7
DKIP(7-SysV) RISC/os Reference Manual DKIP(7-SysV)
aren't properly connected.
seek error timeout
This occurs when a Restore and Recalibrate command failed to
correct a seek error from the drive within 3 seconds. If
this error messages is printed, check to make sure that tha
B-cable is connected correctly.
fault timeout
This error occurs when a Clear Drive Fault command or a
Restore and Recalibrate command failed to correct a drive
fault condition from the drive within 3 seconds. If this
error messages is printed, check to make sure that tha B-
cable is connected correctly.
drive faulted
This indicates that a fault condition exists on the selected
drive. This error occurs when the drive tries to access a
nonexistent head or cylinder. Check to make sure that the
drive has been formatted with the correct parameters.
ready timeout
This occurs when a Restore and Recalibrate command failed to
bring the unit ready within 3 seconds. If this error mes-
sage is printed, check to make sure that tha B-cable is con-
nected correctly.
end of medium
This indicates that multi-sector transfer exceeded the end
of media.
translation fault
This fault indicates that the drive was initialized as hav-
ing zero heads. Check to make sure that the volume header
contains the correct information.
invalid header pad
This error indicates that the drive was formatted with an
improper Gap 2. The value for Gap 2 will need to be
changed, and the drive must be reformatted.
uncorrectable error
When this error is posted, error correction was attempted on
the user-data field and the error was found to be uncorrect-
able. This sector should be mapped out, or the entire track
should be reformatted.
cylinder translation error
This indicates that the translation of a logical sector
resulted in a bad cylinder number. If the drive was format-
ted correctly, then this indicates an internal driver error.
Page 8 Printed 1/28/91
DKIP(7-SysV) RISC/os Reference Manual DKIP(7-SysV)
head translation error
This indicates that the translation of a logical sector
resulted in a bad head number. If the drive was formatted
correctly, then this indicates an internal driver error.
sector translation error
This indicates that the translation of a logical sector
resulted in a bad head sector. If the drive was formatted
correctly, then this indicates an internal driver error.
data overrun
This indicates a data timeout error. It is generally caused
by a missing signal on the B-cable, so make sure that it is
connected correctly.
no index pulse on format
During a format operation, the controller looks for the
index pulse from the disk drive. If it's not found within
65 milliseconds, this error is posted.
sector not found
If the target sector cannot be found during a read or write
operation, this error type is printed. This typically means
that one of the following: there is a bad sector on the
disk; a track is improperly formatted; or Gap 1 was not set
correctly.
id field error - wrong head
This error occurs if the head number read from the disk's
header field was wrong. This sector should either be mapped
out, or the track must be reformatted.
invalid sync in data field
This indicates that the first word read after Gap 2 was not
a valid sync field. This occurs when either the track was
improperly formatted, or there's a bad sector on the disk.
no valid header found
This indicates that during the Read Header command, no valid
header was found. After checking every sector, including
the runt sector and short sector, every header was invalid.
This error is usually posted when a attempting to read a
disk that has not been formatted for use with the Interphase
controller.
seek timeout error
If issued, this error indicates that a seek was made and the
drive did not return an "on-cylinder" indication within 600
milliseconds.
busy timeout
This error occurs when using a dual-ported drive and the
Printed 1/28/91 Page 9
DKIP(7-SysV) RISC/os Reference Manual DKIP(7-SysV)
BUSY signal from the A-cable was active for more than 600
milliseconds. This error indicates that one of the con-
troller has held the drive for too long. Dual-ported drives
are not yet supported, so this error should never occur.
not on cylinder
This error messages is printed if the drive is not on-
cylinder within three seconds after being selected.
rtz timeout
This error occurs when a Restore and Recalibrate command was
executed but a normal completion did not occur withing the
specified timeout period.
invalid sync in header
This error occurs if the controller encounters an invalid
sync character in a sector's header field. This sector
should be mapped out or the track should be reformatted.
incorrect UIB skew factor
This error occurs if the spiral skew factor specified when
formatting the disk exceeds the sectors per track parameter
(plus any spares). Check that the spiral skew field in the
volume header is correct.
unit not initialized
This error indicates that a write or format command was
attempted on a unit that has not been initialized. This is
an internal driver error.
gap spec error
This error occurs when the size of either Gap 1 or Gap 2 is
less than 6 or greater than 32. Check these entries in the
device parameter entries in the volume header.
drive seek error
The disk drive has reported a seek error. This usually
indicates a problem with the disk, and can't be fixed by
mapping out the block number specified in the error message.
sectors per track spec error
This indicates that the sectors per track parameter speci-
fied when formatting the disk is either 0 or greater than
160.
bytes per sector spec error
This indicates that the bytes per sector parameter specified
when formatting the disk is either less than 256 or greater
than 4096.
interleave spec error
If this error occurs, the interleave parameter specified
Page 10 Printed 1/28/91
DKIP(7-SysV) RISC/os Reference Manual DKIP(7-SysV)
when formatting the disk os either 0 or greater than the
sectors per track parameter.
invalid head address
The head number exceeded the capacity of the drive. Check
the volume header to make sure that it was formatted
correctly.
invalid cylinder address
The cylinder number exceeded the capacity of the drive.
Check the volume header to make sure that it was formatted
correctly.
zero sector count
The number of sectors to either read or write was specified
as zero. This is an internal driver error.
invalid dma transfer count
The specified DMA transfer count caused the controller to
attempt to transfer an odd number of bytes. All data
transfers must be either word or longword. This is an
internal driver error.
iopb failed
A VMEbus error occurred during a transfer initiated by a
linked IOPB. The block number specified in the error mes-
sage idicates the starting address on which the bus error
occurred. Since linked IOPBs are not supported, this error
should not occur.
dma failed
The error indicates that a VMEbus error occurred during the
DMA transfer of data to or from the buffer in memory or the
bus. The buffer address printed in the error message points
to the start of the sector block in system memory where the
error occurred. The block number printed points to the disk
location where the disk transfers were when the error
occurred. This indicates a software programming error of
some kind.
illegal vme address
For 16-bit transfers, the buffer address must fall on a word
boundary (even address, multiple of two). For 32-bit
transfers, the buffer address must fall on a longword boun-
dary.
unrecognized header field
During a read or verify operation, one or more of the
requested headers were not found. This error differs from
the Sector not found error in that one or more headers were
ignored because of invalid sync, checksum, or post-header
pad fields. Possible causes include unformatted sectors,
Printed 1/28/91 Page 11
DKIP(7-SysV) RISC/os Reference Manual DKIP(7-SysV)
Gap 1 being too small or the drive was formatted
incorrectly.
mapped header error
This indicates that the first byte of the header indicates
that it's a mapped sector or track, but the rest of the
header is unrecognizable. This could be due to the same
reasons as the previous error type.
mapped sector number
This error indicates that the sector number to be mapped is
beyond the end of the track. This sector number must be
less than the number of sectors per track specified at for-
mat time. Make sure that the volume header contains the
correct information.
no spare sector enabled
A Map Sector command was issued and the UIB did not specify
the spare sector mapping. Since format(1M) supports the
Slip Sector command instead of the Map Sector command, this
error should never occur.
command aborted
This indicates that the controller received and serviced the
Abort bit. This is never used in the driver, so this error
should never occur.
acfail detected
This indicates that the controller detected an active VMEbus
ACFAIL* control signal. This error requires that the con-
troller be reset before normal operation can continue.
S/G list too large
The scatter/gather list cannot be larger than the sector
size specified in the bytes per sector field of the volume
header. If this value in the volume header is correct, then
this indicates an internal driver error.
Illegal element byte count
For scatter/gather commands, the byte count for each entry
in the list must be a multiple of the bytes per sector field
in the volume header. This is an internal driver error
indicating that one of the entries in the list contains an
invalid count.
Bad element address
This is an internal error indicating that the driver issued
a scatter/gather command containing a scatter/gather element
whose address is not on a word boundary.
Illegal entry count
The number of entries for the scatter/gather list was
Page 12 Printed 1/28/91
DKIP(7-SysV) RISC/os Reference Manual DKIP(7-SysV)
illegally specified as zero by the driver.
Illegal element size
The driver must specify that all scatter/gather elements as
an even number of bytes. The controller cannot transfer
less than a word; therefore, if an element contains an odd
number of bytes, this error will occur.
Illegal list byte count
The total bytes count specified by the driver for the
scatter/gather list must be an integer multiple of the bytes
per sector parameter specified in the volume header. The
controller will not complete a scatter or a gather command
with partial sectors, and this error will be returned.
Illegal IOPB sector count
The Sector Count parameter specified by the driver in the
IOPB does not agree with the total bytes specified in the
scatter/gather list.
Illegal element count
The Entry Count field cannot be zero for the scatter/gather
commands
Both bits set
This error type will be printed if both the Spare Sector
enable bit, and the Multiple Spare Enable bit are set in the
device parameters portion of the volume header. This is an
internal driver error.
MSE without Initialize Long
This error type is printed if the Multiple Spare Enable bit
is set and the unit was not initialized with the Initialize
Long command. Since Multiple Spare Enable is not supported,
this error should never occur.
Write Delay
The controller supports the option of delaying writing to
the drive for a specified number of sectors during a zero-
latency operation. If this number is greater than the
number of sectors per track specified in the volume header,
then this error is printed. This feature isn't supported,
so this error should never occur.
Already in MACSI mode
The GO TO MACSI MODE command was issued when the controller
was already in MACSI mode. This indicates an internal
driver error.
Bad CIB offset
The address specified by the driver in the Controller Ini-
tialization Block is invalid. This address cannot be
Printed 1/28/91 Page 13
DKIP(7-SysV) RISC/os Reference Manual DKIP(7-SysV)
0x00000000.
Illegal number of CQEs
The number of Command Queue Entries must be greater than 0
and less than 9. This is an internal driver error.
MACSI mode required
The command specified in the driver can only be run in MACSI
mode.
MACSI IOPB size invalid
The IOPB length must be greater than 0 and less than 9.
This is an internal driver error.
Illegal number of Work Queue entries
The number of Work Queue entries must be greater than 0 and
less than 65.
Mapped Header encountered
A mapped bad header was encountered on the current track.
If this error occurs, the controller must be reset.
No Write List
No list was available to start a gather operation. This is
an internal driver error. If it occurs, the controller must
be reset.
No Write Buffers
No write buffers were available for a gather operation.
This is an internal driver error. If it occurs, the con-
troller must be reset.
Out of Buffers
All of the buffers were full before gathered data could be
transferred. This is an internal driver error. If it
occurs, the controller must be reset.
Command not implemented
The command issued will be supported in a later release.
This is an internal driver error. If it occurs, the con-
troller must be reset.
BUGS
The block number reported in error is the first block of the
transfer, and not necessarily the exact block in error.
SEE ALSO
dvhtool(1M), prtvtoc(1M), badspots(1M), format(1M),
sash(1Mspp), swap(1M).
dvh(4), dkio(7) in the Programmer's Reference Manual.
Page 14 Printed 1/28/91