PCjs Machines

Home of the original IBM PC emulator for browsers.

Logo

The MS-DOS Encyclopedia

Appendix O: IBM PC ROM BIOS Calls

        To invoke an IBM PC ROM BIOS routine, set register AH to the desired
        function and execute the software interrupt (INT) for the desired
        routine.

        Graphics pixel coordinates and cursor row and column coordinates are
        always zero based.


Interrupt 10H: Video Services

Function 00H: Set Video Mode

To call:
        AH      = 00H
        AL      = mode:
                = 00H    16-shade gray text           40 by 25    B000:8000H
                        EGA: 64-color
                = 01H    16/8-color text              40 by 25    B000:8000H
                        EGA: 64-color
                = 02H    16-shade gray text           80 by 25    B000:8000H
                        EGA: 64-color
                = 03H    16/8-color text              80 by 25    B000:8000H
                        EGA: 64-color
                = 04H    4-color graphics            320 by 200   B000:8000H
                = 05H    4-shade gray graphics       320 by 200   B000:8000H
                = 06H    2-shade gray graphics       640 by 200   B000:8000H
                = 07H    monochrome text              80 by 25    B000:0000H
                = 08H    16-color graphics           160 by 200   B000:0000H
                = 09H    16-color graphics           320 by 200   B000:0000H
                = 0AH    4-color graphics            640 by 200   B000:0000H
                = 0BH    Reserved
                = 0CH    Reserved
                = 0DH    16-color graphics           320 by 200   A000:0000H
                = 0EH    16-color graphics           640 by 200   A000:0000H
                = 0FH    monochrome graphics         640 by 350   A000:0000H
                = 10H    16/64-color graphics        640 by 350   A000:0000H

Returns:
        Nothing

Function 01H: Set Cursor Size and Shape

To call:
        AH      = 01H
        CH      = starting scan line
        CL      = ending scan line

        Note: CH < CL gives normal one-part cursor; CH > CL gives two-part
        cursor; CH = 20H gives no cursor.

Returns:
        Nothing

Function 02H: Set Cursor Position

To call:
        AH      = 02H
        BH      = display page (0 in graphics)
        DH      = row number
        DL      = line number

Returns:
        Nothing

Function 03H: Read Cursor Position, Size, and Shape

To call:
        AH      = 03H
        BH      = display page

Returns:
        CH      = starting scan line
        CL      = ending scan line
        DH      = row number
        DL      = column number

Function 04H: Read Light-Pen Position

To call:
        AH      = 04H

Returns:
        AH      = status:
                = 01H    pen triggered
                = 00H    not triggered
        BX      = pixel column number
        CH      = pixel line number
        CX      = pixel line number for some EGA modes
        DH      = character row number
        DL      = character column number

Function 05H: Select Active Page

To call:
        AH      = 05H
        AL      = page number:
                = 00-07H    40-column text modes
                = 00-03H    80-column text modes
                = varies    EGA graphics modes

        Note: Each page = 2 KB in 40-column text mode, 4 KB in 80-column text
        mode.

Returns:
        Nothing

Function 06H: Scroll Window Up
Function 07H: Scroll Window Down

To call:
        AH      = 06H    scroll up
                = 07H    scroll down
        AL      = number of lines to scroll (00H blanks screen)
        BH      = display attributes for blank lines
        CH      = row number of upper left corner
        CL      = column number of upper left corner
        DH      = row number of lower right corner
        DL      = column number of lower right corner

Returns:
        Nothing

Function 08H: Read Character and Attribute at Cursor

To call:
        AH      = 08H
        BH      = display page (for text mode only)

Returns:
        If text mode:

        AH      = color attributes of character
        AL      = ASCII character from current location

        If graphics mode:

        AL      = ASCII character (00H if unmatched)

Function 09H: Write Character and Attribute

To call:
        AH      = 09H
        AL      = ASCII character to write
        BH      = display page
        BL      = text attribute or graphics foreground color
        CX      = number of times to write character (must be > 0)

Returns:
        Nothing

        Note: Cursor position unchanged.

Function 0AH: Write Character Only

To call:
        AH      = 0AH
        AL      = ASCII character to write
        BH      = display page
        BL      = graphics foreground color (unused in text modes)
        CX      = number of times to write character (must be > 0)

Returns:
        Nothing

        Note: Cursor position unchanged.

Function 0BH: Select Color Palette

To call:
        AH      = 0BH
        BH      = palette color ID
        BL      = color or palette value

Returns:
        Nothing

Function 0CH: Write Pixel Dot

To call:
        AH      = 0CH
        AL      = color attribute of pixel
        CX      = pixel column number
        DX      = pixel raster line number

Returns:
        Nothing

Function 0DH: Read Pixel Dot

To call:
        AH      = 0DH
        CX      = pixel column number (0-based)
        DX      = pixel raster line number (0-based)

Returns:
        AL      = pixel color attribute

Function 0EH: Write Character as TTY

To call:
        AH      = 0EH
        AL      = ASCII character
        BH      = display page
        BL      = foreground color of character (unused in text mode)

Returns:
        Nothing

        Note: Cursor position advanced; beep, backspace, linefeed, and
        carriage return active; all other characters displayed.

Function 0FH: Get Current Video Mode

To call:
        AH      = 0FH

Returns:
        AH      = characters per line (20, 40, or 80)
        AL      = current video mode (see Interrupt 10H Function 00H)
        BH      = active display page

Function 13H: Write Character String

To call:
        AH      = 13H
        AL      = subfunction number:
                = 00H    string shares attribute in BL, cursor unchanged
                = 01H    string shares attribute in BL, cursor advanced
                = 02H    each character has attribute, cursor unchanged
                = 03H    each character has attribute, cursor advanced
        BH      = active display page
        BL      = string attribute (for AL = 00H or 01H only)
        CX      = length of character string
        DH      = starting row number
        DL      = starting column number
        ES:BP   = address of string to be displayed

        Note: For AL = 00H or 01H, string = (char, char, char, ...). For AL =
        02H or 03H, string = (char, attr, char, attr, ...).

Returns:
        Nothing

        Note: For AL = 01H or 03H, cursor position set to location following
        last character output.

Interrupt 11H: Get Peripheral Equipment List

Returns:
        AX      = equipment list code word (bit settings
                PPMURRRUFFVVUUCI):
                = PP    number of printers installed
                = M     1 if internal modem installed
                = RRR   number of RS-232 ports installed
                = U     unused
                = FF    number of floppy-disk drives minus 1 (0 = one drive)
                = VV    initial video mode:
                        00 = reserved
                        01 = 40-by-25 color
                        10 = 80-by-25 color
                        11 = 80-by-25 monochrome
                = U     unused
                = C     1 if math coprocessor installed
                = I     1 if IPL (Initial Program Load) diskette installed


Interrupt 12H: Get Usable Memory Size (KB)

Returns:
        AX      = available memory size in KB


Interrupt 13H: Disk Services

Function 00H: Reset Disk System

To call:
        AH      = 00H
        AL      = drive number:
                = 00-7FH    floppy disk
                = 80-FFH    fixed disk

Returns:
        CF      = 0    no error
                = 1    error
        AH      = error code (see Interrupt 13H Function 01H below)

Function 01H: Get Disk Status

To call:
        AH      = 01H

Returns:
        AL      = disk status of previous disk operation:
                = 00H    no error
                = 01H    invalid command
                = 02H    address mark not found
                = 03H    write attempt on write-protected disk (F)
                = 04H    sector not found
                = 05H    reset failed (H)
                = 06H    floppy disk removed (F)
                = 07H    bad parameter table (H)
                = 08H    DMA overflow (F)
                = 09H    DMA crossed 64 KB boundary
                = 0AH    bad sector flag (H)
                = 10H    data error
                = 11H    ECC data error (H)
                = 20H    controller failed
                = 40H    seek failed
                = 80H    time out
                = AAH    drive not ready (H)
                = BBH    undefined error (H)
                = CCH    write fault (H)
                = E0H    status error (H)

        Note: H = fixed disk only, F = floppy disk only.

Function 02H: Read Disk Sectors
Function 03H: Write Disk Sectors
Function 04H: Verify Disk Sectors
Function 05H: Format Disk Tracks

To call:
        AH      = 02H    read disk sectors
                = 03H    write disk sectors
                = 04H    verify disk sectors
                = 05H    format disk track
        AL      = number of sectors
        CH      = cylinder number
        CL      = sector number (unused if AH = 05H)
        DH      = head number
        DL      = drive number
        ES:BX   = buffer address (unused if AH = 04H)

Returns:
        CF      = 0    no error
                = 1    error
        AH      = error code (see Interrupt 13H Function 01H)

        If AH was 05H on call:

        ES:BX   = 4-byte address field entries, 1 per sector:
                = byte 0    cylinder number
                = byte 1    head number
                = byte 2    sector number
                = byte 3    sector-size code:
                            00H    128 bytes per sector
                            01H    256 bytes per sector
                            02H    512 bytes per sector (standard)
                            03H    1024 bytes per sector

Function 08H: Get Current Drive Parameters

To call:
        AH      = 08H
        DL      = drive number

Returns:
        AX      = 00H
        BH      = 00H
        BL      = drive type
        CH      = low-order 8 bits of 10-bit maximum number of cylinders
        CL      = bits 7 and 6    high-order 2 bits of 10-bit maximum
                number of cylinders
                = bits 5-0        maximum number of sectors/track
        DH      = maximum head number
        DL      = number of drives installed
        ES:DI   = address of floppy-disk-drive parameter table

Function 09H: Initialize Hard-Disk Parameter Table

To call:
        AH      = 09H

Returns:
        Nothing

Function 0AH: Read Long

        Reads 512-byte sector plus 4-byte ECC code.

To call:
        See Interrupt 13H Function 02H.

Returns:
        See Interrupt 13H Function 02H.

Function 0BH: Write Long

        Writes 512-byte sector plus 4-byte ECC code.

To call:
        See Interrupt 13H Function 03H.

Returns:
        See Interrupt 13H Function 03H.

Function 0CH: Seek to Head

        Positions head but does not transfer data.

To call:
        See Interrupt 13H Functions 02H and 03H.

Returns:
        See Interrupt 13H Functions 02H and 03H.

Function 0DH: Alternate Disk Reset

To call:
        AH      = 0DH
        DL      = drive number

Returns:
        Nothing

Function 10H: Test for Drive Ready

To call:
        AH      = 10H
        DL      = drive number

Returns:
        AH      = status

Function 11H: Recalibrate Drive

To call:
        AH      = 11H
        DL      = drive number

Returns:
        AH      = status

Function 14H: Controller Diagnostic

To call:
        AH      = 14H

Returns:
        AH      = status

Function 15H: Get Disk Type

To call:
        AH      = 15H
        DL      = drive number

Returns:
        AH      = drive type code:
                = 00H    no drive present
                = 01H    cannot sense when floppy disk is changed

Function 16H: Get Disk Type

To call:
        AH      = 16H
        DL      = drive number to check

Returns:
        AH      = 00H    no change
                = 06H    floppy-disk change

Function 17H: Set Disk Type

To call:
        AH      = 17H
        DL      = drive number
        AL      = floppy-disk type code

Returns:
        Nothing


Interrupt 14H: Serial Port Services

Function 00H: Initialize Port Parameters

To call:
        AH      = 00H
        AL      = serial port parameters (bit settings BBBPPSCC):
                = BBB    baud rate:
                        000      110 baud
                        001      150 baud
                        010      300 baud
                        011      600 baud
                        100     1200 baud
                        101     2400 baud
                        110     4800 baud
                        111     9600 baud
                = PP     parity code:
                        00         none
                        01         odd
                        10         none
                        11         even
                = S      number of stop bits code:
                        0          one stop bit
                        1          two stop bits
                = CC     character size:
                        00         unused
                        01         unused
                        10         7-bit character size
                        11         8-bit character size
        DX       = serial port number (0 = first port)

Returns:
        Nothing

Function 01H: Send One Character

To call:
        AH      = 01H
        AL      = character to send
        DX      = serial port number (0 = first port)

Returns:
        AH      = error status (see Interrupt 14H Function 03H below):
                = 00H    no error

Function 02H: Receive One Character

To call:
        AH      = 02H
        DX      = serial port number (0 = first port)

Returns:

        AL      = character received
        AH      = error status (see Interrupt 14H Function 03H below):
                = 00H    no error

Function 03H: Get Port Status

To call:
        AH      = 03H
        DX      = serial port number (0 = first port)

Returns:
        AX      = serial port status:
                = 8000H    time out
                = 4000H    transfer shift register empty
                = 2000H    transfer holding register empty
                = 1000H    break detect
                = 0800H    framing error
                = 0400H    parity error
                = 0200H    overrun error
                = 0100H    data ready
                = 0080H    received line signal detect
                = 0040H    ring indicator
                = 0020H    data set ready
                = 0010H    clear to send
                = 0008H    delta receive line signal detect
                = 0004H    trailing edge ring detector
                = 0002H    delta data set ready
                = 0001H    delta clear to send

        Note: Multiple conditions can be active simultaneously.


Interrupt 15H: Miscellaneous System Services

Function 00H: Turn On Cassette Motor
Function 01H: Turn Off Cassette Motor

To call:
        AH      = 00H    turn on cassette motor
                = 01H    turn off cassette motor

Returns:
        Nothing

Function 02H: Read Data from Cassette

To call:
        AH      = 02H
        CX      = number of bytes to read
        ES:BX   = buffer address

Returns:
        CF      = 0      no error
                = 1      error
        AH      = error status (if needed):
                = 01H    CRC error
                = 02H    bit signals scrambled
                = 03H    no data found
        DX      = number of bytes read
        ES:BX   = location following last byte read

Function 03H: Write Data to Cassette

To call:
        AH      = 03H
        CX      = number of bytes to write
        ES:BX   = buffer address

        Note: Blocking factor = 256 bytes/block.

Returns:
        CX      = 00H
        ES:BX   = location following last byte written


Interrupt 16H: Keyboard Services

Function 00H: Read Next Character

To call:
        AH      = 00H

Returns:
        If ASCII characters:

        AH      = standard PC keyboard scan code
        AL      = ASCII character

        If extended ASCII codes:

        AH      = extended ASCII code
        AL      = 00H

        Note: Does not return until character is read; removes character from
        keyboard buffer.

Function 01H: Report If Character Ready

To call:
        AH      = 01H

Returns:
        ZF      = 0      character ready
                = 1      character not ready
        AH      = see Interrupt 16H Function 00H
        AL      = see Interrupt 16H Function 00H

        Note: Returns immediately; does not remove character from keyboard
        buffer.

Function 02H: Get Shift Status

To call:
        AH      = 02H

Returns:
        AL      = shift status:
                = 01H    right shift active
                = 02H    left shift active
                = 04H    Ctrl active
                = 08H    Alt active
                = 10H    Scroll Lock active
                = 20H    Num Lock active
                = 40H    Caps Lock active
                = 80H    insert state active

        Note: Multiple states can be active simultaneously.


Interrupt 17H: Printer Services

Function 00H: Send Byte to Printer

To call:
        AH      = 00H
        AL      = character to be printed
        DX      = printer number

Returns:
        AH      = status (see Interrupt 17H Function 02H

Function 01H: Initialize Printer

To call:
        AH      = 01H
        DX      = printer number

Returns:
        AH      = status (see Interrupt 17H Function 02H below)
)

Function 02H: Get Printer Status

To call:
        AH      = 02H
        DX      = printer number

Returns:
        AH      = status:
                = 01H    time out
                = 02H    unused
                = 04H    unused
                = 08H    I/O error
                = 10H    printer selected
                = 20H    out of paper
                = 40H    printer acknowledgment
                = 80H    printer not busy (bit off, 0, = busy)

        Note: Multiple states can be active simultaneously.


Interrupt 18H: Transfer Control to ROM-BASIC


Interrupt 19H: Reboot Computer (Warm Start)


Interrupt 1AH: Get/Set Time/Date

Function 00H: Read Current Clock Count

To call:
        AH      = 00H

Returns:
        AL      = midnight signal
        CX      = high-order word of tick count
        DX      = low-order word of tick count

Function 01H: Set Current Clock Count

To call:
        AH      = 01H
        CX      = high-order word of tick count
        DX      = low-order word of tick count

Returns:
        Nothing

Function 02H: Read Real-Time Clock

To call:
        AH      = 02H

Returns:
        CF      = 0      clock running
                = 1      clock stopped
        CH      = hours in BCD
        CL      = minutes in BCD
        DH      = seconds in BCD

Function 03H: Set Real-Time Clock

To call:
        AH      = 03H
        CH      = hours in BCD
        CL      = minutes in BCD
        DH      = seconds in BCD
        DL      = 00H    standard time
                = 01H    daylight saving time

Returns:
        Nothing

Function 04H: Read Date from Real-Time Clock

To call:
        AH      = 04H

Returns:
        CF      = 0      clock running
                = 1      clock stopped
        CH      = century in BCD (19 or 20)
        CL      = year in BCD
        DH      = month in BCD
        DL      = day in BCD

Function 05H: Set Date in Real-Time Clock

To call:
        AH      = 05H
        CH      = century in BCD (19 or 20)
        CL      = year in BCD
        DH      = month in BCD
        DL      = day in BCD

Returns:
        Nothing

Function 06H: Set Alarm

To call:
        AH      = 06H
        CH      = hours in BCD
        CL      = minutes in BCD
        DH      = seconds in BCD

Returns:
        CF      = status:
                = 0      operation successful
                = 1      alarm already set or clock stopped

Function 07H: Reset Alarm (Turn Alarm Off)

To call:
        AH      = 07H

Returns:
        Nothing

Return to The MS-DOS Encyclopedia: Contents