Go to the first, previous, next, last section, table of contents.
Syntax
#include <bios.h>
unsigned _bios_disk(unsigned cmd, struct diskinfo_t *di)
Description
This function interfaces with the BIOS disk sevice (interrupt 0x13).
The parameter cmd select the corresponding disk service and
the structure di holds the disk parameters.
struct diskinfo_t {
unsigned drive; /* Drive number. */
unsigned head; /* Head number. */
unsigned track; /* Track number. */
unsigned sector; /* Sector number. */
unsigned nsectors; /* Number of sectors to read/write/verify. */
void *buffer; /* Buffer for reading/writing/verifying. */
}
The following services are available based on value of cmd:
_DISK_RESET
-
Forces the disk controller to do a hard reset, preparing for floppy-disk
I/O. This is useful after an error occurs in another operation, such
as a read. If this service is specified, the di argument is
ignored. Status is returned in the 8 high-order bits (AH) of the return
value. If there is an error, the high-order byte will contain a set of
status flags, as defined below under Return Value.
_DISK_STATUS
-
Obtains the status of the last disk operation. If this service is specified,
the <diskinfo> argument is ignored. Status is returned in the 8 low-order bits
(AL) of the return value. If there is an error, the low-order byte (AL) will
contain a set of status flags, as defined below under Return Value.
_DISK_READ
-
Reads one or more disk sectors into memory. This service uses all fields
of the structure pointed to by diskinfo. If no error occurs, the
function returns 0 in the high-order byte and the number of sectors read
in the low-order byte. If there is an error, the high-order byte (AH) will
contain a set of status flags, as defined below under Return Value.
_DISK_WRITE
-
Writes data from memory to one or more disk sectors. This service uses
all fields of the structure pointed to by <diskinfo>. If no error occurs,
the function returns 0 in the high-order byte (AH) and the number of
sectors written in the low-order byte (AL). If there is an error,
the high-order byte will contain a set of status flags, as defined below
under Return Value.
_DISK_FORMAT
-
Formats the track specified by diskinfo. The head and track
fields indicate the track to format. Only one track can be formatted
in a single call. The buffer field points to a set of sector markers.
The format of the markers depends on the type of disk drive (see a technical
reference to the PC BIOS to determine the marker format). The high-order
byte (AH) of the return value contains the status of the call; 0 equals
success. If there is an error, the high-order byte will contain a set of
status flags, as defined below under Return Value.
_DISK_VERIFY
-
Checks the disk to be sure the specified sectors exist and can be read.
It also runs a CRC (cyclic redundancy check) test. This service uses all
fields (except buffer) of the structure pointed to by diskinfo.
If no error occurs, the function returns 0 in the high-order byte (AH)
and the number of sectors compared in the low-order byte (AL), as defined
below under Return Value.
Return Value
Return value of AX register. The meaning of high-order byte (AH):
0x00 No error
0x01 Invalid request or a bad command
0x02 Address mark not found
0x03 Disk write protected
0x04 Sector not found
0x05 Reset failed
0x06 Floppy disk removed
0x07 Drive parameter activity failed
0x08 Direct Memory Access (DMA) overrun
0x09 DMA crossed 64K boundary
0x0A Bad sector flag detected
0x0B Bad track flag detected
0x0C Media type not found
0x0D Invalid number of sectors on format
0x0E Control data access mark detected
0x0F DMA arbitration level out of range
0x10 Data read (CRC or ECC) error
0x11 Corrected data read (ECC) error
0x20 Controller failure
0x40 Seek error
0x80 Disk timed out or failed to respond
0xAA Drive not ready
0xBB Undefined error
0xCC Write fault on drive
0xE0 Status error
0xFF Sense operation failed
Portability
not ANSI, not POSIX
Example
char record_buffer[512];
struct diskinfo_t di;
di.drive = 0x80;
di.head = 0;
di.track = 0;
di.sector = 0;
di.nsectors = 1;
di.buffer = &record_buffer;
if ( _bios_disk(_DISK_READ, &di) )
puts("Disk error.");
Go to the first, previous, next, last section, table of contents.