A DOS interrupt used to activate disk functions, such as seek, read, write and format.
Download Computer Desktop Encyclopedia to your iPhone/iTouch
A DOS interrupt used to activate disk functions, such as seek, read, write and format.
Download Computer Desktop Encyclopedia to your iPhone/iTouch
| 5min Related Video: INT 13 |
| Wikipedia: INT 13 |
| This article does not cite any references or sources. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed. (August 2009) |
INT 13 is shorthand for interrupt 0x13, the 20th interrupt vector in an x86 based computer system (interrupts start at zero, and are labeled with hexadecimal values). INT is an x86 instruction that triggers a software interrupt, and 0x13 is the vector passed to the instruction. The BIOS typically sets up a real mode interrupt handler at this vector that provides sector based hard disk and floppy disk read and write services using Cylinder Head Sector (CHS) addressing.
Under real mode operating systems, such as MS-DOS, calling INT 0x13 would jump into the computer's BIOS code for Low Level Disk Services, which will carry out sector-based disk read or write for the program. In MS-DOS it serves as a foundation for higher-level MS-DOS API (INT 21h) functions which deal with file system access.
Under protected mode operating systems, such as Microsoft Windows NT derivatives (e.g. NT4, 2000, XP, and 2003 Server) or Linux with dosemu, the O/S intercepts the call and passes it to the operating system's native disk I/O mechanism. Windows 9x and Windows for Workgroups 3.11 also bypass BIOS routines when using 32-bit File Access.
The original BIOS real-mode INT 0x13 interface supports drives of sizes up to about 504 MB using what is commonly referred to as Physical CHS addressing. This limit originates from the hardware interface of the x86 disk hardware. The BIOS used the cylinder-head-sector (CHS) address given in the INT 0x13 call, and transmitted it directly to the hardware interface.
This interface was later extended to support addressing of up to exactly 8064 MB using what is commonly referred to as Logical CHS addressing. This limit originates from a combination of the register value based calling convention used in the INT 0x13 interface, and the goal of maintaining backward compatibility. There were originally a number of BIOS that offered incompatible versions of this interface, but eventually the computer industry standardized on the interface developed in the //strike//Award BIOS//replace// Microid Research ("MR BIOS") in 1989. This limit uses 1024 cylinders, 256 heads, 63 sectors, and 512 byte blocks, giving roughly 7.875 GB of addressing (1024 * 256 * 63 * 512).
To support even larger addressing modes, an interface known as INT13h Extensions was introduced by Western Digital and Phoenix Technologies as part of BIOS Enhanced Disk Drive Services (EDD) standard. It uses 64-bit logical block addressing (LBA) which allows addressing up to 8 ZB (the drive can also support 32-bit or 48-bit LBA which allows up to 2 TB or 128 PB respectively). This is a packet interface, because it uses a pointer to a packet of information rather than the register based calling convention of the original INT 13 interface. This packet is a data structure that contains an interface version, data size, and LBAs.
| DL = 00h | 1st floppy disk ( "drive A:" ) |
| DL = 01h | 2nd floppy disk ( "drive B:" ) |
| DL = 80h | 1st hard disk |
| DL = 81h | 2nd hard disk |
| AH = 00h | Reset Disk Drives | |
| AH = 01h | Check Drive Status | |
| AH = 02h | Read Sectors From Drive | |
| AH = 03h | Write Sectors To Drive | |
| AH = 04h | Verify Sectors | |
| AH = 05h | Format Track | |
| AH = 08h | Read Drive Parameters | |
| AH = 09h | HD | Initialize Disk Controller |
| AH = 0Ah | HD | Read Long Sectors From Drive |
| AH = 0Bh | HD | Write Long Sectors To Drive |
| AH = 0Ch | HD | Move Drive Head To Cylinder |
| AH = 0Dh | HD | Reset Disk Drives |
| AH = 0Eh | PS/2 | Controller Read Test |
| AH = 0Fh | PS/2 | Controller Write Test |
| AH = 10h | HD | Test Whether Drive Is Ready |
| AH = 11h | HD | Recalibrate Drive |
| AH = 12h | PS/2 | Controller RAM Test |
| AH = 13h | PS/2 | Drive Test |
| AH = 14h | HD | Controller Diagnostic |
| AH = 15h | Read Drive Type | |
| AH = 16h | FD | Detect Media Change |
| AH = 17h | FD | Set Media Type For Format ( used by DOS versions <= 3.1 ) |
| AH = 18h | FD | Set Media Type For Format ( used by DOS versions >= 3.2 ) |
| AH = 41h | EXT | Test Whether Extensions Are Available |
| AH = 42h | EXT | Read Sectors From Drive |
| AH = 43h | EXT | Write Sectors To Drive |
| AH = 44h | EXT | Verify Sectors |
| AH = 45h | EXT | Lock/Unlock Drive |
| AH = 46h | EXT | Eject Drive |
| AH = 47h | EXT | Move Drive Head To Sector |
| AH = 48h | EXT | Read Drive Parameters |
| AH = 49h | EXT | Detect Media Change |
Second column is empty == function may be used both for floppy and hard disk.
"FD" == for floppy disk only.
"HD" == for hard disk only.
"PS/2" == for hard disk on PS/2 system only.
"EXT" == part of the Int 13h Extensions which were written in the 1990s to support hard drives with more than 8 GB.
Parameters:
| AH | 00h |
| DL | Drive Index (e.g. 1st HDD = 80h) |
Parameters:
| AH | 01h |
Results:
| AL | Return Code
|
Parameters:
| AH | 02h |
| AL | Sectors To Read Count |
| CH | Track |
| CL | Sector |
| DH | Head |
| DL | Drive |
| ES:BX | Buffer Address Pointer |
Results:
| CF | Set On Error, Clear If No Error |
| AH | Return Code |
| AL | Actual Sectors Read Count |
Remarks:
Register CX contains both the cylinder number (10 bits, possible values are 0 to 1023) and the sector number (6 bits, possible values are 1 to 63):
CX = ---CH--- ---CL--- cylinder : 76543210 98 sector : 543210
Examples of translation:
Turbo Pascal: CX := ( ( cylinder and 255 ) shl 8 ) or ( ( cylinder and 768 ) shr 2 ) or sector; cylinder := hi ( CX ) or ( ( lo ( CX ) and 192 ) shl 2 ); sector := CX and 63;
Addressing of Buffer should guarantee that the complete buffer is inside the given segment, i.e. ( BX + size_of_buffer ) <= 10000h. Otherwise the interrupt may fail with some BIOS or hardware versions.
Example: Assume you want to read 16 sectors (= 2000h bytes) and your buffer starts at memory address 4FF00h. There are different ways to calculate the register values, e.g.:
ES = segment = 4F00h BX = offset = 0F00h sum = memory address = 4FF00h would be a good choice because 0F00h + 2000h = 2F00h <= 10000h ES = segment = 4000h BX = offset = FF00h sum = memory address = 4FF00h would not be a good choice because FF00h + 2000h = 11F00h > 10000h
Function 02h of interrupt 13h may only read sectors of the first 16,450,560 sectors of your hard drive, to read sectors beyond the 8 GB limit you should use function 42h of Int 13h Extensions. Another alternate may be DOS interrupt 25h which reads sectors within a partition.
Parameters:
| Registers | |
|---|---|
| AH | 08h = function number for read_drive_parameters |
| DL | drive index (e.g. 1st HDD = 80h) |
Results:
| CF | Set On Error, Clear If No Error |
| AH | Return Code |
| DL | number of hard disk drives |
| DH | logical last index of heads = number_of - 1 (because index starts with 0) |
| CX | logical last index of cylinders = number_of - 1 (because index starts with 0) logical last index of sectors per track = number_of (because index starts with 1) |
Remarks:
Logical values of function 08h may/should differ from physical CHS values of function 48h.
Result register CX contains both cylinders and sector/track values, see remark of function 02h.
The only difference between this function and function 02h (see above) is that function 0Ah reads 516 bytes per sector instead of only 512. The last 4 bytes contains the Error Correction Code ECC, a checksum of sector data.
Parameters:
| Registers | |
|---|---|
| AH | 41h = function number for extensions check |
| DL | drive index (e.g. 1st HDD = 80h) |
| BX | 55AAh |
Results:
| CF | Set On Not Present, Clear If Present |
| AH | Error Code or Major Version Number |
| BX | AA55h |
| CX | Interface support bitmask: 1 - Device Access using the packet structure |
Parameters:
| Registers | |
|---|---|
| AH | 42h = function number for extended read |
| DL | drive index (e.g. 1st HDD = 80h) |
| DS:SI | segment:offset pointer to the DAP, see below |
| DAP : Disk Address Packet | ||
|---|---|---|
| offset range | size | description |
| 00h | 1 byte | size of DAP = 16 = 10h |
| 01h | 1 byte | unused, should be zero |
| 02h | 1 byte | number of sectors to be read, 0..127 (= 7Fh) |
| 03h | 1 byte | unused, should be zero |
| 04h..07h | 4 bytes | segment:offset pointer to the memory buffer to which sectors will be transferred |
| 08h..0Fh | 8 bytes | absolute number of the start of the sectors to be read (1st sector of drive has number 0) |
Results:
| CF | Set On Error, Clear If No Error |
| AH | Return Code |
Parameters:
| Registers | |
|---|---|
| AH | 48h = function number for extended_read_drive_parameters |
| DL | drive index (e.g. 1st HDD = 80h) |
| DS:SI | segment:offset pointer to Result Buffer, see below |
| Result Buffer | ||
|---|---|---|
| offset range | size | description |
| 00h..01h | 2 bytes | size of Result Buffer = 30 = 1Eh |
| 02h..03h | 2 bytes | information flags |
| 04h..07h | 4 bytes | physical number of cylinders = last index + 1 (because index starts with 0) |
| 08h..0Bh | 4 bytes | physical number of heads = last index + 1 (because index starts with 0) |
| 0Ch..0Fh | 4 bytes | physical number of sectors per track = last index (because index starts with 1) |
| 10h..17h | 8 bytes | absolute number of sectors = last index + 1 (because index starts with 0) |
| 18h..19h | 2 bytes | bytes per sector |
| 1Ah..1Dh | 4 bytes | optional pointer to Enhanced Disk Drive (EDD) configuration parameters
which may be used for subsequent interrupt 13h Extension calls (if supported) |
Results:
| CF | Set On Error, Clear If No Error |
| AH | Return Code |
Remark: Physical CHS values of function 48h may/should differ from logical values of function 08h.
This entry is from Wikipedia, the leading user-contributed encyclopedia. It may not have been reviewed by professional editors (see full disclaimer)
| PowerSCSI (technology) | |
| Bootman | |
| Kharda |
| Int k0 for int you 1 jn ix 2 for int i1 jn j k what is the value of k when is equal to 20? | |
| What numbers go int 94? | |
| How do you change 15925000 int a decimal? |
Copyrights:
![]() | Computer Desktop Encyclopedia. THIS DEFINITION IS FOR PERSONAL USE ONLY. All other reproduction is strictly prohibited without permission from the publisher. © 1981-2010 The Computer Language Company Inc. All rights reserved. Read more | |
![]() | Wikipedia. This article is licensed under the Creative Commons Attribution/Share-Alike License. It uses material from the Wikipedia article "INT 13". Read more |
Mentioned in