+9. Command Descriptions
+
+Commands are issued to the drive by loading the pertinent registers in the
+command block with the needed parameters, and then writing the command code to
+the Command Register.
+
+The manner in which a command is accepted varies. There are three classes
+(see Table 9-1) of command acceptance, all predicated on the fact that to
+receive a command, BSY=0:
+
+ - Upon receipt of a Class 1 command, the drive sets BSY within 400 nsec.
+ - Upon receipt of a Class 2 command, the drive sets BSY within 400 nsec, sets
+ up the sector buffer for a write operation, sets DRQ within 700 usec, and
+ clears BSY within 400 nsec of setting DRQ.
+ - Upon receipt of a Class 3 command, the drive sets BSY within 400 nsec, sets
+ up the sector buffer for a write operation, sets DRQ within 20 msec, and
+ clears BSY within 400 nsec of setting DRQ.
+
+..rm102
+ NOTE: DRQ may be set so quickly on Class 2 and Class 3 that the BSY
+ transition is too short for BSY=1 to be recognized.
+
+The drive shall implement all mandatory commands as identified by an M, and
+may implement the optional commands identified by an O, in Table 9-1. V
+indicates a Vendor Specific command code.
+
+ TABLE 9-1: COMMAND CODES AND PARAMETERS
+ +-------+-------------------+
+ +-----+ |Command| Parameters Used |
+ |Class| | Code |FR SC SN CY DH |
+ +-----+----------------------------------+---+-------+---+---+---+---+---+
+ | 1 | Check Power Mode | O |98h E5h| | y | | | D |
+ | 1 | Execute Drive Diagnostic | M | 90h | | | | | D*|
+ | 2 | Format Track | M | 50h | * | y | | y | y |
+ | 1 | Identify Drive | O | ECh | | | | | D |
+ | 1 | Idle | O |97h E3h| | y | | | D |
+ | 1 | Idle Immediate | O |95h E1h| | | | | D |
+ | 1 | Initialize Drive Parameters | M | 91h | | y | | | y |
+ | 1 | Recalibrate | M | 1xh | | | | | D |
+ | 1 | Read Buffer | O | E4h | | | | | D |
+ | 1 | Read DMA (w/retry) | O | C8h | | y | y | y | y |
+ | 1 | Read DMA (w/o retry) | O | C9h | | y | y | y | y |
+ | 1 | Read Multiple | O | C4h | | y | y | y | y |
+ | 1 | Read Sector(s) (w/retry) | M | 20 | | y | y | y | y |
+ | 1 | Read Sector(s) (w/o retry) | M | 21 | | y | y | y | y |
+ | 1 | Read Long (w/retry) See 9.13 | M | 22 | | y | y | y | y |
+ | 1 | Read Long (w/o retry) See 9.13 | M | 23 | | y | y | y | y |
+ | 1 | Read Verify Sector(s) (w/retry) | M | 40 | | y | y | y | y |
+ | 1 | Read Verify Sector(s) (w/o retry)| M | 41 | | y | y | y | y |
+ | 1 | Seek | M | 7xh | | | y | y | y |
+ | 1 | Set Features | O | EFh | y | | | | D |
+ | 1 | Set Multiple Mode | O | C6h | | y | | | D |
+ | 1 | Set Sleep Mode | O |99h E6h| | | | | D |
+ | 1 | Standby | O |96h E2h| | y | | | D |
+ | 1 | Standby Immediate | O |94h E0h| | | | | D |
+ | 2 | Write Buffer | O | E8h | | | | | D |
+ | 3 | Write DMA (w/retry) | O | CAh | | y | y | y | y |
+ | 3 | Write DMA (w/o retry) | O | CBh | | y | y | y | y |
+ | 3 | Write Multiple | O | C5h | * | y | y | y | y |
+ | 3 | Write Same | O | E9h | y | y | y | y | y |
+ | 2 | Write Sector(s) (w/retry) | M | 30 | * | y | y | y | y |
+ | 2 | Write Sector(s) (w/o retry) | M | 31 | * | y | y | y | y |
+ | 2 | Write Sector(s) (w/retry) | M | 32 | * | y | y | y | y |
+ | 2 | Write Sector(s) (w/o retry) | M | 33 | * | y | y | y | y |
+ | 3 | Write Verify | O | 3Ch | * | y | y | y | y |
+ | | Vendor Unique | V | 9Ah | | | | | |
+ | | Vendor Unique | V | C0-C3h| | | | | |
+ | | Vendor Unique | V | 8xh | | | | | |
+ | | Vendor Unique | V |F5h-FFh| | | | | |
+ | | EATA Standard (CAM/89-004) | O |F0h-F4h| | | | | |
+ | | Reserved: All remaining codes | | | | | | | |
+ +-----+----------------------------------+---+-------+---+---+---+---+---+
+ | | CY = Cylinder Registers SC = Sector Count Register |
+ | | DH = Drive/Head Register SN = Sector Number Register |
+ | | FR = Features Register (see command descriptions for use) |
+.. | | |
+.. | | M = Mandatory O = Optional V = Vendor Specific |
+ | | y - the register contains a valid parameter for this command. |
+ | | For the Drive/Head Register, y means both the drive and |
+ | | head parameters are used. |
+ | | D - only the drive parameter is valid and not the head parameter.|
+ | | D* - Addressed to Drive 0 but both drives execute it. |
+ | | * - Maintained for compatibility (see 7.2.9) |
+ +-----+------------------------------------------------------------------+
+
+9.1 Check Power Mode
+
+This command checks the power mode.
+
+If the drive is in, going to, or recovering from the Standby Mode the drive
+shall set BSY, set the Sector Count Register to 00h, clear BSY, and generate
+an interrupt.
+
+If the drive is in the Idle Mode, the drive shall set BSY, set the Sector
+Count Register to FFh, clear BSY, and generate an interrupt.
+
+9.2 Execute Drive Diagnostic
+
+This command shall perform the internal diagnostic tests implemented by the
+drive. See also 6.3.4 and 6.3.13. The DRV bit is ignored. Both drives, if
+present, shall execute this command.
+
+If Drive 1 is present:
+
+ - Drive 0 waits up to 5 seconds for Drive 1 to assert PDIAG-.
+ - If Drive 1 has not asserted PDIAG-, indicating a failure, Drive 0 shall
+ append 80h to its own diagnostic status.
+ - Both drives shall execute diagnostics.
+ - If Drive 1 diagnostic failure is detected when Drive 0 status is read,
+ Drive 1 status is obtained by setting the DRV bit, and reading status.
+
+If there is no Drive 1 present:
+
+ - Drive 0 posts only its own diagnostic results.
+ - Drive 0 clears BSY, and generates an interrupt.
+
+The Diagnostic Code written to the Error Register is a unique 8-bit code as
+shown in Table 9-2, and not as the single bit flags defined in 7.2.9.
+
+..Table 9-2 details the codes and the corresponding explanations.
+If Drive 1 fails diagnostics, Drive 0 "ORs" 80h with its own status and loads
+that code into the Error Register. If Drive 1 passes diagnostics or there is
+no Drive 1 connected, Drive 0 "ORs" 00h with its own status and loads that
+code into the Error Register.
+
+ TABLE 9-2: DIAGNOSTIC CODES
+ +-------+
+ | Code |
+ +-------+----------------------------------+
+ | 01h | No error detected |
+ | 02h | Formatter device error |
+ | 03h | Sector buffer error |
+ | 04h | ECC circuitry error |
+ | 05h | Controlling microprocessor error |
+ | 8xh | Drive 1 failed |
+ +-------+----------------------------------+
+
+9.3 Format Track
+
+The implementation of the Format Track command is vendor specific. The actions
+may be a physical reformatting of a track, initializing the data field
+contents to some value, or doing nothing.
+
+The Sector Count Register contains the number of sectors per track.
+
+The track address is specified in the Cylinder High and Cylinder Low
+Registers, and the number of sectors is specified in the Sector Count
+Register. When the command is accepted, the drive sets the DRQ bit and waits
+for the host to fill the sector buffer. When the sector buffer is full, the
+drive clears DRQ, sets BSY and begins command execution.
+
+The contents of the sector buffer shall not be written to the media, and may
+be either ignored or interpreted as follows:
+
+ DD15 ---- DD0 DD15 ---- DD0
+ +------+------+ +------+------+--------------------------+
+ | First|Desc- | | Last |Desc- | Remainder of buffer |
+ |Sector|riptor| : : : : : : |Sector|riptor| filled with zeros |
+ +------+------+ +------+------+--------------------------+
+
+One 16-bit word represents each sector, the words being contiguous from the
+start of a sector. Any words remaining in the buffer after the representation
+of the last sector are filled with zeros. DD15-8 contain the sector number. If
+an interleave is specified, the words appear in the same sequence as they
+appear on the track. DD7-0 contain a descriptor value defined as follows:
+
+ 00h - Format sector as good
+ 20h - Unassign the alternate location for this sector
+ 40h - Assign this sector to an alternate location
+ 80h - Format sector as bad
+
+..rm102
+ NOTE: Some users of the ATA drive expect the operating system partition
+ table to be erased on a Format command. It is recommended that a drive
+ which does not perform a physical format of the track, write a data
+ pattern of all zeros to the sectors which have been specified by the
+ Format Track command.
+
+..rm102
+ NOTE: It is recommended that implementors resassign data blocks which show
+ repeated errors.
+
+9.4 Identify Drive
+
+The Identify Drive command enables the host to receive parameter information
+from the drive. When the command is issued, the drive sets BSY, stores the
+required parameter information in the sector buffer, sets DRQ, and generates
+an interrupt. The host then reads the information out of the sector buffer.
+The parameter words in the buffer have the arrangement and meanings defined in
+Table 9-3. All reserved bits or words shall be zero.
+
+ +-------+ TABLE 9-3: IDENTIFY DRIVE INFORMATION
+ | Word |
+ +-------+------------------------------------------------------------------+
+ | 0 | General configuration bit-significant information: |
+ | | 15 0 reserved for non-magnetic drives |
+ | | 14 1=format speed tolerance gap required |
+ | | 13 1=track offset option available |
+ | | 12 1=data strobe offset option available |
+ | | 11 1=rotational speed tolerance is > 0.5% |
+ | | 10 1=disk transfer rate > 10 Mbs |
+ | | 9 1=disk transfer rate > 5Mbs but <= 10Mbs |
+ | | 8 1=disk transfer rate <= 5Mbs |
+ | | 7 0 reserved for removable cartridge drive |
+ | | 6 1=fixed drive |
+ | | 5 1=spindle motor control option implemented |
+ | | 4 1=head switch time > 15 usec |
+ | | 3 1=not MFM encoded |
+ | | 2 1=soft sectored |
+ | | 1 1=hard sectored |
+ | | 0 0=reserved |
+ | 1 | Number of fixed cylinders |
+ | 2 | reserved |
+ | 3 | Number of heads |
+ | 4 | Number of unformatted bytes per track |
+ | 5 | Number of unformatted bytes per sector |
+ | 6 | Number of sectors per track |
+ | 7-9 | Vendor Unique |
+ | 10-19 | Serial number (20 ASCII characters, 0000h=not specified) |
+ | 20 | Buffer type |
+ | 21 | Buffer size in 512 byte increments (0000h=not specified) |
+ | 22 | # of ECC bytes passed on Read/Write Long cmds (0000h=not spec'd) |
+ | 23-26 | Firmware revision (8 ASCII characters, 0000h=not specified) |
+ | 27-46 | Model number (40 ASCII characters, 0000h=not specified) |
+ | 47 | 0000h = Read/Write Multiple commands not implemented |
+ | | x = number of sectors that can be transferred per interrupt |
+ | | on Read and Write Multiple commands |
+ | 48 | 0000h = cannot perform doubleword I/O |
+ | | 0001h = can perform doubleword I/O |
+ | 49 | Capabilities |
+ | | 15-9 0=reserved |
+ | | 8 1=DMA Supported |
+ | | 7-0 Vendor Unique |
+ | 50 | reserved |
+ | 51 | PIO data transfer cycle timing mode |
+ | 52 | DMA data transfer cycle timing mode |
+ | 53-127| reserved |
+ |128-159| Vendor Unique |
+ |160-255| reserved |
+ +-------+------------------------------------------------------------------+
+
+The fields described in 9.4.1 through 9.4.5 are not affected by the Initialize
+Drive Parameters command.
+
+9.4.1 Number of fixed cylinders
+
+The number of translated cylinders in the default translation mode.
+
+9.4.2 Number of heads
+
+The number of translated heads in the default translation mode.
+
+9.4.3 Number of unformatted bytes per track
+
+The number of unformatted bytes per translated track in the default
+translation mode.
+
+9.4.4 Number of unformatted bytes per sector
+
+The number of unformatted bytes per sector in the default translation mode.
+
+9.4.5 Number of sectors per track
+
+The number of sectors per track in the default translation mode.
+
+9.4.6 Serial Number
+
+The contents of this field are right justified and padded with spaces (20h).
+
+9.4.7 Buffer Type
+
+The contents of the field are determined by the manufacturer.
+
+ 0000h = not specified.
+ 0001h = a single ported single sector buffer which is not capable of
+ simultaneous data transfers to or from the host and the disk.
+ 0002h = a dual ported multi-sector buffer capable of simultaneous data
+ transfers to or from the host and the disk.
+ 0003h = a dual ported multi-sector buffer capable of simultaneous transfers
+ with a read cacheing capability.
+ 0004-FFFFh = reserved
+
+These codes are typically not used by the operating system, however, they are
+useful for diagnostic programs which perform initialization routines e.g. a
+different interleave may be desirable for 0001h vs 0002h or 0003h.
+
+9.4.8 Firmware Revision
+
+The contents of this field are left justified and padded with spaces (20h).
+
+9.4.9 Model Number
+
+The contents of this field are left justified and padded with spaces (20h).
+
+9.4.10 PIO data transfer cycle timing mode
+
+The PIO transfer timing for each ATA device falls into categories which have
+unique parametric timing specifications. To determine the proper device timing
+category, compare the Cycle Time specified in Figure 11-1 with the contents of
+this field. The value returned should fall into one of the categories
+specified in Figure 11-1, and if it does not, then Mode 0 shall be used to
+serve as the default timing.
+
+9.4.11 DMA data transfer cycle timing mode
+
+The DMA transfer timing for each ATA device falls into categories which have
+unique parametric timing specifications. To determine the proper device timing
+category, compare the Cycle Time specified in Figure 11-3 with the contents of
+this field. The value returned should fall into one of the categories
+specified in Figure 11-3, and if it does not, then Mode 0 shall be used to
+serve as the default timing.
+
+9.5 Idle
+
+This command causes the drive to set BSY, enter the Idle Mode, clear BSY, and
+generate an interrupt. The interrupt is generated even though the drive may
+not have fully transitioned to Idle Mode.
+
+If the drive is already spinning, the spinup sequence is not executed.
+
+If the Sector Count Register is non-zero then the automatic power down
+sequence shall be enabled and the timer begins counting down immediately. If
+the Sector Count Register is zero then the automatic power down sequence shall
+be disabled.
+
+9.6 Idle Immediate
+
+This command causes the drive to set BSY, enter the Idle Mode, clear BSY, and
+generate an interrupt. The interrupt is generated even though the drive may
+not have fully transitioned to Idle Mode.
+
+9.7 Initialize Drive Parameters
+
+..This command enables the host to control certain drive parameters. Some
+..parameters are standard while others are vendor specific.
+This command enables the host to set the number of sectors per track and the
+number of heads minus 1, per cylinder. Upon receipt of the command, the drive
+sets BSY, saves the parameters, clears BSY, and generates an interrupt.
+
+The only two register values used by this command are the Sector Count
+Register which specifies the number of sectors per track, and the Drive/Head
+Register which specifies the number of heads minus 1. The DRV bit designates
+these values to Drive 0 or Drive 1, as appropriate.
+
+The sector count and head values are not checked for validity by this command.
+If they are invalid, no error will be posted until an illegal access is made
+by some other command.
+
+9.8 Recalibrate
+
+This command moves the read/write heads from anywhere on the disk to cylinder
+0. Upon receipt of the command, the drive sets BSY and issues a seek to
+cylinder zero. The drive then waits for the seek to complete before updating
+status, clearing BSY and generating an interrupt.
+
+If the drive cannot reach cylinder 0, a Track Not Found error is posted.
+
+9.9 Read Buffer
+
+The Read Buffer command enables the host to read the current contents of the
+drive's sector buffer. When this command is issued, the drive sets BSY, sets
+up the sector buffer for a read operation, sets DRQ, clears BSY, and generates
+an interrupt. The host then reads up to 512 bytes of data from the buffer.
+
+The Read Buffer and Write Buffer commands shall be synchronized such that
+sequential Write Buffer and Read Buffer commands access the same 512 bytes
+within the buffer.
+
+9.10 Read DMA
+
+This command executes in a similar manner to the Read Sectors command except
+for the following:
+
+ - the host initializes a slave-DMA channel prior to issuing the command
+ - data transfers are qualified by DMARQ and are performed by the slave-DMA
+ channel
+ - the drive issues only one interrupt per command to indicate that data
+ transfer has terminated and status is available.
+
+Any error encountered during execution of a Read DMA command results in the
+termination of data transfer at the sector where the error was detected. The
+sector in error is not transferred. The drive generates an interrupt to
+indicate that data transfer has terminated and status is available. The error
+posting is the same as that of the Read Sectors command.
+
+9.11 Read Long
+
+The Read Long command performs similarly to the Read Sectors command except
+that it returns the data and the ECC bytes contained in the data field of the
+desired sector. During a Read Long command, the drive does not check the ECC
+bytes to determine if there has been a data error. Only single sector read
+long operations are supported.
+
+The transfer of the ECC bytes shall be 8-bits wide.
+
+9.12 Read Multiple Command
+
+The Read Multiple command performs similarly to the Read Sectors command.
+Interrupts are not generated on every sector, but on the transfer of a block
+which contains the number of sectors defined by a Set Multiple command.
+
+Command execution is identical to the Read Sectors operation except that the
+number of sectors defined by a Set Multiple command are transferred without
+intervening interrupts. DRQ qualification of the transfer is required only at
+the start of the data block, not on each sector.
+
+The block count of sectors to be transferred without intervening interrupts is
+programmed by the Set Multiple Mode command, which shall be executed prior to
+the Read Multiple command.
+
+When the Read Multiple command is issued, the Sector Count Register contains
+the number of sectors (not the number of blocks or the block count) requested.
+
+If the number of requested sectors is not evenly divisible by the block count,
+as many full blocks as possible are transferred, followed by a final, partial
+block transfer. The partial block transfer shall be for n sectors, where
+
+ n = (sector count) - modulo (block count)
+
+If the Read Multiple command is attempted before the Set Multiple Mode command
+has been executed or when Read Multiple commands are disabled, the Read
+Multiple operation shall be rejected with an Aborted Command error.
+
+Disk errors encountered during Read Multiple commands are posted at the
+beginning of the block or partial block transfer, but DRQ is still set and the
+data transfer shall take place as it normally would, including transfer of
+corrupted data, if any.
+
+The contents of the Command Block Registers following the transfer of a data
+block which had a sector in error are undefined. The host should retry the
+transfer as individual requests to obtain valid error information.
+
+Subsequent blocks or partial blocks are transferred only if the error was a
+correctable data error. All other errors cause the command to stop after
+transfer of the block which contained the error. Interrupts are generated when
+DRQ is set at the beginning of each block or partial block.
+
+..The error reporting is the same as that on a Read Sectors command.
+..
+9.13 Read Sector(s)
+
+This command reads from 1 to 256 sectors as specified in the Sector Count
+register. A sector count of 0 requests 256 sectors. The transfer begins at the
+sector specified in the Sector Number Register. See 10.1 for the DRQ, IRQ and
+BSY protocol on data transfers.
+
+If the drive is not already on the desired track, an implied seek is
+performed. Once at the desired track, the drive searches for the appropriate
+ID field.
+
+If retries are disabled and two index pulses have occurred without error free
+reading of the requested ID, an ID Not Found error is posted.
+
+If retries are enabled, up to a vendor specific number of attempts may be made
+to read the requested ID before posting an error.
+
+If the ID is read correctly, the data address mark shall be recognized within
+a specified number of bytes, or the Address Mark Not Found error is posted.
+
+..Once the data address mark is found, the data field is read into the sector
+..buffer, error bits are set if an error was encountered, DRQ is set, and an
+..interrupt is generated.
+..
+DRQ is always set regardless of the presence or absence of an error condition
+at the end of the sector.
+
+At command completion, the Command Block Registers contain the cylinder, head,
+and sector number of the last sector read.
+
+If an error occurs, the read terminates at the sector where the error
+occurred. The Command Block Registers contain the cylinder, head, and sector
+number of the sector where the error occurred.
+
+The flawed data is pending in the sector buffer.
+
+9.14 Read Verify Sector(s)
+
+This command is identical to the Read Sectors command, except that DRQ is
+never set, and no data is transferred to the host. See 10.3 for protocol.
+..When the command is accepted, the drive sets BSY.
+
+When the requested sectors have been verified, the drive clears BSY and
+generates an interrupt. Upon command completion, the Command Block Registers
+contain the cylinder, head, and sector number of the last sector verified.
+
+If an error occurs, the verify terminates at the sector where the error
+occurs. The Command Block Registers contain the cylinder, head, and sector
+number of the sector where the error occurred. The Sector Count Register shall
+contain the number of sectors not yet verified.
+
+9.15 Seek
+
+This command initiates a seek to the track and selects the head specified in
+the command block. The drive need not be formatted for a seek to execute
+properly. See 10.3 for protocol. The drive shall not set DSC=1 until the
+action of seeking has completed. The drive may return the interrupt before the
+seek is completed.
+
+If another command is issued to the drive while a seek is being executed, the
+drive sets BSY=1, waits for the seek to complete, and then begins execution of
+the command.
+
+..The Sector Number Register is used to translate between perceived and real
+..geometry.
+..
+9.16 Set Features
+
+This command is used by the host to establish the following parameters which
+affect the execution of certain drive features:
+
+ 44h Vendor unique length of ECC on Read Long/Write Long commands
+ 55h Disable read look-ahead feature
+ AAh Enable read look-ahead feature
+ BBh 4 bytes of ECC apply on Read Long/Write Long commands
+
+See 10.3 for protocol. If the value in the register is not supported or is
+invalid, the drive posts an Aborted Command error.
+
+At power on, or after a software or hardware reset, the default mode is read
+look-ahead enabled and 4 bytes of ECC.
+
+9.17 Set Multiple Mode
+
+This command enables the drive to perform Read and Write Multiple operations
+and establishes the block count for these commands. See 10.3 for protocol.
+
+The Sector Count Register is loaded with the number of sectors per block.
+Drives shall support block sizes of 2, 4, 8, and 16 sectors, if their buffer
+size is at least 8,192 bytes, and may also support other block sizes. Upon
+receipt of the command, the drive sets BSY=1 and checks the Sector Count
+Register.
+
+If the Sector Count Register contains a valid value and the block count is
+supported, the value is loaded for all subsequent Read Multiple and Write
+Multiple commands and execution of those commands is enabled. If a block count
+is not supported, an Aborted Command error is posted, and Read Multiple and
+Write Multiple commands are disabled.
+
+If the Sector Count Register contains 0 when the command is issued, Read and
+Write Multiple commands are disabled.
+
+At power on, or after a hardware or software reset, the default mode is Read
+and Write Multiple disabled.
+
+9.18 Sleep
+
+This command is the only way to cause the drive to enter Sleep Mode. The drive
+is spun down, and when it is stopped, BSY is cleared, an interrupt is
+generated, and the interface becomes inactive.
+
+The only way to recover from Sleep mode without a reset or power on, is for
+the host to issue a software reset.
+
+A drive shall not power on in Sleep Mode nor remain in Sleep Mode following a
+reset sequence. If the drive is already spun down, the spin down sequence is
+not executed.
+
+9.19 Standby
+
+This command causes the drive to enter the Standby Mode. See 10.3 for
+protocol. The drive may return the interrupt before the transition to Standby
+Mode is completed.
+
+If the drive is already spun down, the spin down sequence is not executed.
+
+If the Sector Count Register is non-zero then the automatic power down
+sequence shall be enabled and the timer will begin counting down when the
+drive returns to Idle mode. If the Sector Count Register is zero then the
+automatic power down sequence shall be disabled.
+
+9.20 Standby Immediate
+
+This command causes the drive to enter the Standby Mode. See 10.3 for
+protocol. The drive may return the interrupt before the transition to Standby
+Mode is completed.
+
+If the drive is already spun down, the spin down sequence is not executed.
+
+9.21 Write Buffer
+
+This command enables the host to overwrite the contents of the drive's sector
+buffer with any data pattern desired. See 10.2 for protocol.
+
+The Read Buffer and Write Buffer commands shall be synchronized within the
+drive such that sequential Write Buffer and Read Buffer commands access the
+same 512 bytes within the buffer.
+
+9.22 Write DMA
+
+This command executes in a similar manner to Write Sectors except for the
+following:
+
+ - the host initializes a slave-DMA channel prior to issuing the command
+ - data transfers are qualified by DMARQ and are performed by the slave-DMA
+ channel
+ - the drive issues only one interrupt per command to indicate that data
+ transfer has terminated and status is available.
+
+Any error encountered during Write DMA execution results in the termination of
+data transfer. The drive issues an interrupt to indicate that data transfer
+has terminated and status is available in the Error Register. The error
+posting is the same as that of the Write Sectors command.
+
+9.23 Write Multiple Command
+
+This command is similar to the Write Sectors command. The drive sets BSY
+within 400 nsec of accepting the command, and interrupts are not presented on
+each sector but on the transfer of a block which contains the number of
+sectors defined by Set Multiple.
+
+Command execution is identical to the Write Sectors operation except that the
+number of sectors defined by the Set Multiple command are transferred without
+intervening interrupts. DRQ qualification of the transfer is required only at
+the start of the data block, not on each sector.
+
+The block count of sectors to be transferred without intervening interrupts is
+programmed by the Set Multiple Mode command, which shall be executed prior to
+the Read Multiple command.
+
+When the Write Multiple command is issued, the Sector Count Register contains
+the number of sectors (not the number of blocks or the block count) requested.
+
+If the number of requested sectors is not evenly divisible by the block count,
+as many full blocks as possible are transferred, followed by a final, partial
+block transfer. The partial block transfer is for n sectors, where
+
+ n = (sector count) - modulo (block count)
+
+If the Write Multiple command is attempted before the Set Multiple Mode
+command has been executed or when Write Multiple commands are disabled, the
+Write Multiple operation shall be rejected with an aborted command error.
+
+Disk errors encountered during Write Multiple commands are posted after the
+attempted disk write of the block or partial block transferred. The Write
+command ends with the sector in error, even if it was in the middle of a
+block. Subsequent blocks are not transferred in the event of an error.
+Interrupts are generated when DRQ is set at the beginning of each block or
+partial block.
+
+..The Command Block Registers contain the cylinder, head, and sector number of
+..the sector where the error occurred and the Sector Count Register contains the
+..residual of sectors that need to be transferred for successful completion of
+..the command e.g. each block has 4 sectors, a request for 8 sectors is issued,
+..and an error occurs on the third sector. The Sector Count Register contains 6
+..and the address is that of the third sector.
+..
+The contents of the Command Block Registers following the transfer of a data
+block which had a sector in error are undefined. The host should retry the
+transfer as individual requests to obtain valid error information.
+
+9.24 Write Same
+
+This command executes in a similar manner to Write Sectors except that only
+one sector of data is transferred. The contents of the sector are written to
+the medium one or more times.
+
+NOTE: The Write Same command allows for initialization of part or all of the
+medium to the specified data with a single command.
+
+If the Features Register is 22h, the drive shall write that part of the medium
+specified by the sector count, sector number, cylinder and drive/head
+registers. If the Features Register contains DDh, the drive shall initialize
+all the user accessible medium. If the register contains a value other than
+22h or DDh, the command shall be rejected with an aborted command error.
+
+The drive issues an interrupt to indicate that the command is complete. Any
+error encountered during execution results in the termination of the write
+operation. Status is available in the Error Register if an error occurs. The
+error posting is the same as that of the Write Sectors command.
+
+9.25 Write Long
+
+This command is similar to the Write Sectors command except that it writes the
+data and the ECC bytes directly from the sector buffer; the drive does not
+generate the ECC bytes itself. Only single sector Write Long operations are
+supported.
+
+The transfer of the ECC bytes shall be 8-bits wide.
+
+9.26 Write Sector(s)
+
+This command writes from 1 to 256 sectors as specified in the Sector Count
+Register (a sector count of zero requests 256 sectors), beginning at the
+specified sector. See 10.1 for the DRQ, IRQ and BSY protocol on data
+transfers.
+
+..When this command is accepted, the drive sets DRQ and waits
+..for the host to fill the sector buffer with the data to be written. No
+..interrupt is generated to start the first buffer fill operation. Once the
+..buffer is full, the drive clears DRQ, sets BSY and begins command execution.
+..
+If the drive is not already on the desired track, an implied seek is
+performed. Once at the desired track, the drive searches for the appropriate
+ID field.
+
+If retries are disabled and two index pulses have occurred without error free
+reading of the requested ID, an ID Not Found error is posted.
+
+If retries are enabled, up to a vendor specific number of attempts may be made
+to read the requested ID before posting an error.
+
+If the ID is read correctly, the data loaded in the buffer is written to the
+data field of the sector, followed by the ECC bytes. Upon command completion,
+the Command Block Registers contain the cylinder, head, and sector number of
+the last sector written.
+
+If an error occurs during a write of more than one sector, writing terminates
+at the sector where the error occurs. The Command Block Registers contain the
+cylinder, head, and sector number of the sector where the error occurred. The
+host may then read the command block to determine what error has occurred, and
+on which sector.
+
+9.27 Write Verify
+
+This command is similar to the Write Sectors command, except that each sector
+is verified immediately after being written. The verify operation is a read
+without transfer and a check for data errors. Any errors encountered during
+the verify operation are posted. Multiple sector write verify commands write
+all the requested sectors and then verify all the requested sectors before
+generating the final interrupt.
+