Navigation
  • Home
  • Recent
  • Most Active
  • Popular
  • Blog
  • Credits
  • RSS
  •   Interaction
  • Register
  • Statistics
  •   Help
  • Suggestions
  • Contact Us
  • How to Edit
  • Help



  • [Edit]


    BIOS Interrupt Calls are a facility that DOS programs, and some other software such as boot loaders, use to invoke the BIOS's facilities. Some operating systems also use the BIOS to probe and initialise hardware resources during their early stages of booting.

        BIOS interrupt call
            Interrupt Table
                Drive Table
                Function Table
                INT 13h AH00h: Reset Disk Drives
                INT 13h AH01h: Check Drive Status
                INT 13h AH02h: Read Sectors From Drive
                INT 13h AH08h: Read Drive Parameters
                INT 13h AH0Ah: Read Long Sectors From Drive
                INT 13h AH41h: Check Extensions Present
                INT 13h AH42h: Extended Read Sectors From Drive
                INT 13h AH48h: Extended Read Drive Parameters
            INT 18h: Execute BASIC
            See also

    top

    Interrupt Table


    top

    Drive Table





    DH = 00h1st floppy disk ( "drive A:" )
    DH = 01h2nd floppy disk ( "drive B:" )
    DH = 80h1st hard disk
    DH = 81h2nd hard disk


    top

    Function Table

































    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 GBytes.

    top

    INT 13h AH00h: Reset Disk Drives
    Parameters:


    top

    INT 13h AH01h: Check Drive Status
    Parameters:

    Results:


    top

    INT 13h AH02h: Read Sectors From Drive
    Parameters:

    Results:

    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 be no 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 GByte limit you should use function 42h
    of Int 13h Extensions. Another alternate may be DOS interrupt 25h which reads sectors
    within a partition.

    top

    INT 13h AH08h: Read Drive Parameters
    Parameters:




    Registers
    AH08h = function number for read_drive_parameters
    DLdrive index (e.g. 1st HDD = 80h)



    Results:






    CFSet On Error, Clear If No Error
    AHReturn Code
    DLnumber of hard disk drives
    DHlogical last index of heads = number_of - 1 (because index starts with 0)
    CXlogical 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.

    top

    INT 13h AH0Ah: Read Long Sectors From Drive
    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.

    top

    INT 13h AH41h: Check Extensions Present
    Parameters:





    Registers
    AH41h = function number for extensions check
    DLdrive index (e.g. 1st HDD = 80h)
    BX55AAh




    Results:





    CFSet On Not Present, Clear If Present
    AHError Code or Major Version Number
    BXAA55h
    CXInterface support bitmask:

    1 - Device Access using the packet structure

    2 - Drive Locking and Ejecting

    4 - Enhanced Disk Drive Support (EDD)


    top

    INT 13h AH42h: Extended Read Sectors From Drive
    Parameters:





    Registers
    AH42h = function number for extended read
    DLdrive index (e.g. 1st HDD = 80h)
    DS:SIsegment:offset pointer to the DAP, see below












    DAP
    Disk Address Packet
    offset rangesizedescription
    00h1 bytesize of DAP = 16 = 10h
    01h1 byteunused, should be zero
    02h1 bytenumber of sectors to be read, 0..127 (= 7Fh)
    03h1 byteunused, should be zero
    04h..07h4 bytessegment:offset pointer to the memory buffer to which sectors will be transferred
    08h..0Fh8 bytesabsolute number of the start of the sectors to be read (1st sector of drive has number 0)


    Results:



    CFSet On Error, Clear If No Error
    AHReturn Code


    top

    INT 13h AH48h: Extended Read Drive Parameters
    Parameters:





    Registers
    AH48h = function number for extended_read_drive_parameters
    DLdrive index (e.g. 1st HDD = 80h)
    DS:SIsegment:offset pointer to Result Buffer, see below














    Result Buffer
    offset rangesizedescription
    00h..01h2 bytessize of Result Buffer = 30 = 1Eh
    02h..03h2 bytesinformation flags
    04h..07h4 bytesphysical number of cylinders = last index + 1 (because index starts with 0)
    08h..0Bh4 bytesphysical number of heads = last index + 1 (because index starts with 0)
    0Ch..0Fh4 bytesphysical number of sectors per track = last index (because index starts with 1)
    10h..17h8 bytesabsolute number of sectors = last index + 1 (because index starts with 0)
    18h..19h2 bytesbytes per sector
    1Ah..1Dh4 bytesoptional pointer to Enhanced Disk Drive (EDD) configuration parameters
    which may be used for subsequent interrupt 13h Extension calls (if supported)



    Results:



    CFSet On Error, Clear If No Error
    AHReturn Code


    Remark: Physical CHS values of function 48h may/should differ from logical values of function 08h.

    top

    INT 18h: Execute BASIC
    Description:

    This interrupt traditionally jumped to an implementation of BASIC stored in ROM. This call would typically be invoked if the BIOS was unable to identify any bootable volumes on startup. (At the time the original IBM PC was released in 1981, the BASIC in ROM was a key feature.) As time went on and BASIC was no longer shipped on all PCs, this interrupt would simply display an error message indicating that no bootable volume was found (famously, "No ROM BASIC", or more self-explanatory messages in later BIOS versions); in other BIOS versions it would prompt the user to insert a bootable volume and press a key, and then after the user did so it would loop back to the bootstrap loader to try booting again.

    top

    See also
     
    Search more:
     

       
    Source Privacy License Download Contact Us Atlas
    Scientus.org Dictionary (Yet Another Wiki) RC : 1.39
    MIT OpenCourseWare
    This article is licensed under the GNU Free Documentation License [copyleft]. It uses material from the Wikipedia article "BIOS interrupt call". link