home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Hack-Phreak Scene Programs
/
cleanhpvac.zip
/
cleanhpvac
/
DOSREF33.ZIP
/
CHAPTER.003
< prev
next >
Wrap
Text File
|
1994-01-20
|
138KB
|
3,106 lines
** Programmer's Technical Reference for MSDOS and the IBM PC **
USA copyright TXG 392-616 ALL RIGHTS RESERVED
──────────────────────────┤ DOSREF (tm) ├───────────────────────────
ISBN 1-878830-02-3 (disk-based text)
Copyright (c) 1987, 1994 Dave Williams
┌─────────────────────────────┐
│ Shareware Version, 01/20/94 │
│ Please Register Your Copy │
└─────────────────────────────┘
C H A P T E R T H R E E
R O M B I O S A N D S E R V I C E I N T E R R U P T S
C O N T E N T S
Calling the ROM BIOS ............................................ 3**1
Interrupt 10h Video Services ................................... 3**2
Interrupt 11h Equipment Check .................................. 3**3
Interrupt 12h Memory Size ...................................... 3**4
Interrupt 13h Disk Functions ................................... 3**5
Interrupt 14h Initialize and Access Serial Port ................ 3**6
FOSSIL Drivers ................................... 3**7
Interrupt 15h Cassette I/O ..................................... 3**8
Interrupt 16h Keyboard I/O ..................................... 3**9
Interrupt 17h Printer .......................................... 3**10
Interrupt 18h ROM BASIC ........................................ 3**11
Interrupt 19h Bootstrap Loader ................................. 3**12
Interrupt 1Ah Time of Day ...................................... 3**13
Interrupt 1Bh Control-Break .................................... 3**14
Interrupt 1Ch Timer Tick ....................................... 3**15
Interrupt 1Dh Vector of Video Initialization Parameters ........ 3**16
Interrupt 1Eh Vector of Diskette Controller Parameters ......... 3**17
Interrupt 1Fh Ptr to Graphics Char Extensions (Graphics Set 2) . 3**18
The ROM BIOS is the lowest level of software access. It contains
the following routines:
(all)
power-on self-test (POST)
boostrap loader
clock
floppy disk I/O
video I/O
keyboard
serial ports
parallel ports
print screen
equipment check
report memory size
(AT)
hard disk I/O
report memory size (extended memory)
extended memory block moves
enhanced video and keyboard I/O
high resolution timer
alarm
Machines such as the PC Convertible, PCjr, and non-IBM machines add
additional functions.
Calling the ROM BIOS ............................................ 3**1
The BIOS services are invoked by placing the number of the desired
function in register AH, subfunction in AL, setting the other
registers to any specific requirements of the function, and invoking
any of ints 10h through int 1Fh.
The original IBM PC Technical Reference gave the absolute addresses
of the ROM routines. Some early software jumped directly to these
addresses, with mixed results on non-IBM BIOSes. This practice was
common on machines predating the PC, but there is no practical use for
it now. The OS/2 1.x Compatibility Box also does not support jumping
directly into the ROM.
When the interrupt is called, all register and flag values are
pushed into the stack. The interrupt address contains a pointer into
an absolute address in the ROM BIOS chip address space. This location
may be further vectored into the IBMBIO.COM (or equivalent) file or
user file.
At power-up, many BIOSes point unused interrupt vectors to zero.
Others point to an interrupt handler routine, usually just an IRET
instruction. Still others don't even make an attempt to initialize
unused vectors. A common programming mistake is to expect
uninitialized vectors will be zero.
The address vector points to a particular BIOS command handler. The
handler pops the register values, compares them to its list of
functions, and executes the function if valid. When the function is
complete, it may pass values back to the command handler. The handler
will push the values into the stack and then return control to the
calling program.
Most functions will return an error code; some return more
information. Details are contained in the listings for the individual
functions.
Register settings listed are the ones used by the BIOS. Some
functions will return with garbage values in unused registers. Do not
test for values in unspecified registers; your program may exhibit odd
behavior.
Three sets of BIOS routines are available: PC BIOS, AT BIOS (also
called CBIOS or "Old compatibility BIOS", and the PS/2 ABIOS "Advanced
BIOS".
The Advanced BIOS is contained in PS/2 ROMs. It is primarily
intended for OS use rather than application use. OS/2 can take
advantage of ABIOS routines to reduce RAM use on PS/2 systems. The
ABIOS can be replaced by disk and RAM based ABIOS code if desired.
There is a new BIOS Data Area defined in high memory that occupies one
K of RAM. In OS/2 systems, parts of the ABIOS are replaced by OS/2
drivers.
While the CBIOS must be addressed via pointers, the routines in the
ABIOS are fixed in absolute locations so they can be referenced
directly by OS/2.
The ABIOS can run in protected mode, and is fully reentrant. It
supports three types of function requests - single staged, discrete
multistaged, or continuous multistaged. A single-staged request does
its job immediately and returns control to the caller. A discrete
multistaged request may happen in two or more stages with pauses
between the stages. The caller may regain control during the pauses.
A continuous multistaged request starts a staged operation that never
ends. (sometimes called a daemon).
Unlike the CBIOS which is called with software interrupts, ABIOS is
accessed with FAR calls. ABIOS calls are completely reentrant in both
real and protected modes. To call an ABIOS function, the calling
program must pass pointers to two data structures - a request block
and a common data area. The request block specifies the desired
function number and the common data area is a table that contains
pointers to all the ABIOS' other tables and data areas. The common
data area's internal structure contains the function transfer tables
which have the addresses of the BIOS routines.
ABIOS stack frame and calling conventions:
bytes stack contents
2 common data area pointer (segment/selector only)
required
4 request block pointer - required
4 function transfer table pointer - furnished by ABIOS
or caller
4 device block pointer - furnished by ABIOS or caller
4 return address
In ABIOS Transfer Convention, only the first two items are required.
ABIOS assigns the second two. In Operating System Transfer
Convention, the caller provides the second two. Since the parameters
are not removed from the stack on return to the caller, the operating
system may save the function transfer table and device addresses after
they have been furnished by the ABIOS by a call.
ABIOS does no interrupt arbitration. It assumes all interrupts are
handled by the caller or the OS and it is called only for service. If
more than one device is sharing a hardware interrupt, the OS must
determine which interrupt is valid for the ABIOS.
OS/2 may use the ABIOS if found, but otherwise duplicates the BIOS
calls for the DOS Compatibility Box by vectoring BIOS calls into its
own device drivers. This makes it rather difficult for DOS drivers
for mass storage, high resolution video boards, multitasking APIs
using int 15h, etc. If your software needs to manipulate hardware
directly you might want to check if your code is running under OS/2.
The simplest method is to check for DOS version 10 or higher.
note Some references list an "XT/2" machine, which was reputedly
an 8mHz 8088 with 640k and a clock on the motherboard. IBM
doesn't list such a machine, and I have a late '86 XT, one of
the last made. It is pretty much like the older ones.
┌─────────────────────────────────────────────────────────────────────┐
│Interrupt 10h Video Services 3**2 │
└─────────────────────────────────────────────────────────────────────┘
(0:0040h) The BIOS Video Services may be found in Chapter 16.
(internal) Coprocessor Error (80286+)
Generated by the CPU when the -ERROR pin is asserted by the
coprocessor (usually 80x87, but may be any multimaster CPU or
alternate NDP such as Weitek, etc.). ATs and clones usually
wire the coprocessor to use IRQ13, but not all get it right.
┌─────────────────────────────────────────────────────────────────────┐
│Interrupt 11h Equipment Check 3**3 │
└─────────────────────────────────────────────────────────────────────┘
(0:0044h) Reads the BIOS Data Area and returns two bytes of setup
information.
entry no parameters are required
return AX Equipment listing word. Bits are:
0 number of floppy drives
0 no drives
1 bootable (IPL) diskette drive installed
1 math chip
0 no math coprocessor (80x87) present
1 math coprocessor (80x87) present
(PS/2) 2 0 mouse not installed
1 mouse installed
(PC) 2,3 system board RAM
0,0 16k (PC-0, PC-1)
0,1 32k
1,0 48k
1,1 64k (PC-2, XT)
note 1) not commonly used. Set both bits to 1
2) both bits always 1 in AT
4,5 initial video mode
0,0 no video installed
(use with dumb terminal)
0,1 40x25 color (CGA)
1,0 80x25 color
(CGA, EGA, PGA, MCGA, VGA)
1,1 80x25 monochrome (MDA or Hercules,
most super-hires mono systems)
6,7 number of diskette drives (only if bit 0 is 1)
0,0 1 drives
0,1 2 drives
1,0 3 drives
1,1 4 drives
8 0 DMA present
1 no DMA (PCjr, some Tandy 1000s, 1400LT)
9,A,B number of RS232 serial ports (0-3)
0,0,0 none
0,0,1 1
0,1,0 2
0,1,1 3
1,0,0 4
C 0 no game I/O attached
1 game I/O attached (default for PCjr)
D serial accessory installation
0 no serial accessories installed
1 Convertible - internal modem installed
or PCjr - serial printer attached
E,F number of parallel printers
0,0 none
0,1 one (LPT1, PRN)
1,0 two (LPT2)
1,1 three (LPT3)
note Models before PS/2 would allow a fourth
parallel printer. Remapping of the
BIOS in the PS/2s does not allow the
use of LPT4.
(386 extended AX)
23d 0 Weitek ABACUS - virtual '86 EMS page
tables not correctly initialized
1 Weitek ABACUS - virtual '86 EMS page
tables OK
24d 0 Weitek ABACUS NDP not present
1 Weitek ABACUS NDP present
note Not all BIOSes properly return the presence of a game port.
In my experience, most BIOSes require a joystick to actually
be present even if the port is otherwise enabled.
┌─────────────────────────────────────────────────────────────────────┐
│Interrupt 12h Memory Size 3**4 │
└─────────────────────────────────────────────────────────────────────┘
(0:0048h) get amount of system memory
entry no parameters required
return AX number of contiguous 1K RAM blocks available for DOS
note 1) This is the same value stored in absolute address 04:13h.
2) For some early PC models, the amount of memory returned by this
call is determined by the settings of the DIP switches on the
motherboard and may not reflect all the memory that is
physically present.
3) For the PC/AT, the value returned is the amount of functional
memory found during the power-on self-test, regardless of the
memory size configuration information stored in CMOS RAM.
4) The value returned does not reflect any extended memory (above
the 1 Mb boundary) that may be present on machines using 80286
or later microprocessors.
┌─────────────────────────────────────────────────────────────────────┐
│Interrupt 13h Disk Functions 3**5 │
└─────────────────────────────────────────────────────────────────────┘
(0:0049h) The service calls for BIOS disk functions are located
in Chapter 8.
┌─────────────────────────────────────────────────────────────────────┐
│Interrupt 14h Initialize and Access Serial Port For Int 14 3**6 │
└─────────────────────────────────────────────────────────────────────┘
Note 1) Some IBM PS/2 Model 50Z machines were delivered with serial
ports that did not meet specification. Some cheap clone serial
ports may also be troublesome.
2) The standard IBM serial routines are unbuffered and not
interrupt driven. They are fairly useless for anything other
than serial printers. Most application software either
programs the UARTs directly or use a driver with a high-level
interface such as a FOSSIL.
3) PC-MOS/386' $SERIAL.SYS driver is buffered, device-independent,
and interrupt-driven. It supports COM1 through COM24.
(0:0050h) the following status is defined:
serial status byte:
bits 0 delta clear to send
1 delta data set ready
2 trailing edge ring detector
3 delta receive line signal detect
4 clear to send
5 data set ready
6 ring indicator
7 receive line signal detect
line status byte:
bits 0 data ready
1 overrun error
2 parity error
3 framing error
4 break detect
5 transmit holding register empty
6 transmit shift register empty
7 time out
note: if bit 7 set then other bits are invalid
Though present on the IBM PS/2s, COM3 and COM4 are not widely
standardized across the industry. The most common definitions
are:
port addr. IRQ interrupt
COM1 3F8 IRQ4 int 0Ch
COM2 2F8 IRQ3 int 0Bh
COM3 3E8 IRQ4 int 0Ch
COM4 2E8 IRQ3 int 0Bh
As you can see, COM1/COM3 and COM2/COM4 are siamesed. Since
the ISA bus does not support shared interrupts, simultaneous
access of two of a pair may cause conflict. For example, a
mouse and a modem would not coexist well on paired ports.
All routines have AH=function number and DX=RS232 card number (0
based). AL=character to send or received character on exit, unless
otherwise noted.
entry AH 00h Initialize and Access Serial Port
bit pattern: BBBPPSLL
BBB = baud rate: 110, 150, 300, 600, 1200,
2400, 4800, 9600
PP = parity: 01 = odd, 11 = even
S = stop bits: 0 = 1, 1 = 2
LL = word length: 10 = 7-bits, 11 = 8-bits
AL parms for initialization:
bit pattern:
0 word length
1 word length
2 stop bits
3 parity
4 parity
5 baud rate
6 baud rate
7 baud rate
word length 10 7 bits
11 8 bits
stop bits 0 1 stop bit
1 2 stop bits
parity 00 none
01 odd
11 even
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 (4800 on PCjr)
DX port number (0=COM1, 1=COM2, etc.)
return AH line status
AL modem status
note To initialize the serial port to more than 9600 baud on PS/2
machines, see functions 04h and 05h.
Function 01h Send Character in AL to Comm Port
entry AH 01h
AL character
DX port number (0 - 3)
return AH RS232 status code
bit 0 data ready
1 overrun error
2 parity error
3 framing error
4 break detected
5 transmission buffer register empty
6 transmission shift register empty
7 timeout
AL modem status
bit
0 delta clear-to-send
1 delta data-set-ready
2 trailing edge ring detected
3 change, receive line signal detected
4 clear-to-send
5 data-set-ready
6 ring received
7 receive line signal detected
Function 02h Wait For A Character From Comm Port DX
entry AH 02h
DX port number (0-3)
return AL character received
AH error code (see above)(00h for no error)
Function 03h Fetch the Status of Comm Port DX (0 or 1)
entry AH 03h
DX port (0-3)
return AH set bits (01h) indicate comm-line status
bit 7 timeout
bit 6 empty transmit shift register
bit 5 empty transmit holding register
bit 4 break detected ("long-space")
bit 3 framing error
bit 2 parity error
bit 1 overrun error
bit 0 data ready
AL set bits indicate modem status
bit 7 received line signal detect
bit 6 ring indicator
bit 5 data set ready
bit 4 clear to send
bit 3 delta receive line signal detect
bit 2 trailing edge ring detector
bit 1 delta data set ready
bit 0 delta clear to send
Function 04h Extended Initialize
(Convertible, PS/2)
entry AH 04h
AL break status
01h if break
00h if no break
BH parity
00h no parity
01h odd parity
02h even parity
03h stick parity odd
04h stick parity even
BL number of stop bits
00h one stop bit
01h 2 stop bits (1½ if 5 bit word length)
CH word length
00h 5 bits
01h 6 bits
02h 7 bits
03h 8 bits
CL baud rate
00h 110
01h 150
02h 300
03h 600
04h 1200
05h 2400
06h 4800
07h 9600
08h 19200
DX comm port (0-3)
return AH line control status
AL modem status
note Provides a superset of fn 00h capabilities for PS/2 machines.
Function 05h Extended Communication Port Control
(Convertible, PS/2)
entry AH 05h
AL 00h read modem control register
01h write modem control register
BL modem control register
bits 0 DTR data terminal ready
1 RTS request to send
2 out1
3 out2
4 loop
5,6,7 reserved
DX port number (0=COM1, 1=COM2, etc.)
return AH port status (see 00h above)
AL modem status (see 00h above)
BL modem control register (see 01h above)
Function 80-97h PC-MOS/386 Serial Device Interface
(see PCMOS xhapter)
FOSSIL Drivers .................................................. 3**7
Interrupt 14h FOSSIL (Fido/Opus/Seadog Standard Interface Level)
A FOSSIL is a device driver for handling the IBM PC
serial communications ports in a standard fashion from
an application (communications) program. A FOSSIL
chains into the int 14h BIOS communications vector and
replaces many functions with enhanced routines which
may be easily accessed by an application.
For all functions, all registers not specifically
containing a function return value must be preserved
across the call.
entry AH 00h FOSSIL: Set Baud Rate And Parameters
AL byte
bits 7,6,5 baudrate
000 19200 baud
001 38400 baud
010 300 baud
011 600 baud
100 1200 baud
101 2400 baud
110 4800 baud
111 9600 baud
bits 4,3 parity
00 none
01 odd
10 none
11 even
bit 2 stop bits
0 1 stop bit
1 2 stop bits
bit 1 char length
0 5 bits plus value
other optional
DX port number (NOP if DX=00FFh)
return AX status (see fn 03h)
note Low-order 5 bits are undefined by FOSSIL 1.0 spec.
entry AH 01h FOSSIL: Transmit Character With Wait
AL ASCII value of character to be sent
DX port number (NOP if DX=00FFh)
return AX status bits (see function 03h)
note Character is queued for transmission. If there is room in the
transmitter buffer when this call is made, the character will
be stored and control returned to caller. If the buffer is
full, the driver will wait for room. Use this function with
caution when flow control is enabled.
entry AH 02h FOSSIL: Receive A Character With Wait
DX port number (0-3) (NOP if DX=00FFh)
return AH RS-232 status code (see AH=00h above)
AL ASCII value of character received from serial port
note Will timeout if DSR is not asserted, even if function 03h
returns data ready.
entry AH 03h FOSSIL: Request Status
DX port number (NOP if DX=00FFh)
return AX status bit mask
AH bit 0 set RDA input data is available
in buffer
1 set OVRN input buffer overrun
2 N/A
3 N/A
4 N/A
5 set THRE room is available in output
buffer
6 set TSRE output buffer is empty
7 N/A
AL bit 0 N/A
1 N/A
2 N/A
3 set this bit is always set
4 N/A
5 N/A
6 N/A
7 set DCD carrier detect
note Bit 3 of AL is always returned set to enable programs to use
it as a carrier detect bit on hardwired (null modem) links.
entry AH 04h FOSSIL: Initialize FOSSIL Driver
BX 4F50h (optional)
DX port number (DX=00FFh special)
ES:CX pointer to ^C flag address (optional)
return AX 1954h if successful
BL maximum function number supported (excluding 7Eh-0BFh)
BH revision of FOSSIL supported
note 1) DTR is raised when FOSSIL inits.
2) Existing baudrate is preserved.
3) If BX contains 4F50h, the address specified in ES:CX is that
of a ^C flag byte in the application program, to be
incremented when ^C is detected in the keyboard service
routines. This is an optional service and only need be
supported on machines where the keyboard service can't (or
won't) perform an int 1Bh or int 23h when a control-C is
entered.
entry AH 05h FOSSIL: Deinitialize FOSSIL Driver
DX port number (DX=00FFh special)
return none
note 1) DTR is not affected.
2) Disengages driver from comm port. Should be done when
operations on the port are complete.
3) If DX=00FFh, the initialization that was performed when
FOSSIL function 04h with DX=00FFh should be undone.
entry AH 06h FOSSIL: Raise/Lower DTR
AL DTR state to be set
00h lower DTR
01h raise DTR
DX comm port (NOP if DX=00FFh)
return none
entry AH 07h FOSSIL: Return Timer Tick Parameters
return AH ticks per second on interrupt number shown in AL
AL timer tick interrupt number (not vector!)
DX milliseconds per tick (approximate)
entry AH 08h FOSSIL: Flush Output Buffer
DX port number (NOP if DX=00FFh)
return none
note Waits until all output is done.
entry AH 09h FOSSIL: Purge Output Buffer
DX port number (NOP if DX=00FFh)
return none
note Returns to caller immediately.
entry AH 0Ah FOSSIL: Purge input buffer
DX port number (NOP if DX=00FFh)
return none
note 1) If any flow control restraint has been employed (dropping
RTS or transmitting XOFF) the port will be "released" by
doing the reverse, raising RTS or sending XON.
2) Returns to caller immediately.
entry AH 0Bh FOSSIL: Transmit No Wait
AL ASCII character value to be sent
DX port number (NOP if DX=00FFh)
return AX 0000h character not accepted
0001h character accepted
note This is exactly the same as the "regular" transmit call
except that if there is no space available in the output
buffer a value of zero is returned in AX, if room is
available a value 1 (one) is returned.
entry AH 0Ch FOSSIL: Nondestructive Read No Wait
DX port number (NOP if DX=00FFh)
return AH character
0FFFFh character not available
note 1) Reads async buffer.
2) Does not remove keycode from buffer.
entry AH 0Dh FOSSIL: Keyboard Read No Wait
return AX IBM keyboard scan code or
0FFFFh if no keyboard character available
note 1) Use IBM-style function key mapping in the high order byte.
2) Scan codes for non function keys are not specifically
required but may be included.
3) Does not remove keycode from buffer.
entry AH 0Eh FOSSIL: Keyboard Input With Wait
return AX IBM keyboard scan code
note Returns the next character from the keyboard or waits if
no character is available.
entry AH 0Fh FOSSIL: Toggle Flow Control
AL bit mask describing requested flow control
bits 0 XON/XOFF on transmit (watch for XOFF while
sending)
1 CTS/RTS (CTS on transmit/RTS on receive)
2 reserved
3 XON/XOFF on receive (send XOFF when buffer
near full)
4-7 not used, FOSSIL spec calls for setting to 1
DX port number (NOP if DX=00FFh)
return none
note 1) Bit 2 is reserved for DSR/DTR, but is not currently
supported in any implementation.
2) TRANSMIT flow control allows the other end to restrain the
transmitter when you are overrunning it. RECEIVE flow control
tells the FOSSIL to attempt to do just that if it is being
overwhelmed.
3) Enabling transmit XON/XOFf will cause the FOSSIL to stop
transmitting upon receiving an XOFf. The FOSSIL will resume
transmitting when an XON is received.
4) Enabling CTS/RTS will cause the FOSSIL to cease transmitting
when CTS is lowered. Transmission will resume when CTS is
raised. The FOSSIL will drop RTS when the receive buffer
reaches a predetermined percentage full. The FOSSIL will
raise RTS when the receive buffer empties below the
predetermined percentage full. The point(s) at which this
occurs is left to the individual FOSSIL implementor.
5) Enabling receive Xon/Xoff will cause the FOSSIL to send an XOFF
when the receive buffer reaches a pre-determined percentage
full. An XON will be sent when the receive buffer empties
below the predetermined percentage full. The point(s) at which
this occurs is left to the individual FOSSIL implementor.
6) Applications using this function should set all bits ON in the
high nibble of AL as well. There is a compatible (but not
identical) FOSSIL driver implementation that uses the high
nibble as a control mask. If your application sets the high
nibble to all ones, it will always work, regardless of the
method used by any given driver.
entry AH 10h Extended Ctrl-C/Ctrl-K Checking
And Transmit On/Off
AL flags bit mask byte (bit set if activated)
bits 0 enable/disable Ctrl-C/Ctrl-K checking
1 disable/enable the transmitter
2-7 not used
DX port number (NOP if DX=00FFh)
return AX status byte
0000h control-C/K has not been received
0001h control-C/K has been received
note This is used primarily for programs that can't trust XON/XOFF
at FOSSIL level (such as BBS software).
entry AH 11h FOSSIL: Set Current Cursor Location
DH row (line) 0-24
DL column 0-79
return none
note 1) This function looks exactly like the int 10h, fn 02h on the
IBM PC. The cursor location is passed in DX: row in DH and
column in DL. This function treats the screen as a coordinate
system whose origin (0,0) is the upper left hand corner of the
screen.
2) Row and column start at 0.
entry AH 12h FOSSIL: Read Current Cursor Location
return DH row (line)
DL column
note 1) Looks exactly like int 10h/fn 03h in the IBM PC BIOS. The
current cursor location (same coordinate system as function
16h) is passed back in DX.
2) Row and column start at 0.
entry AH 13h FOSSIL: Single Character ANSI Write To Screen
AL value of character to display
return none
note This call might not be reentrant since ANSI processing may be
through DOS.
entry AH 14h FOSSIL: Toggle Watchdog Processing
AL 00h to disable watchdog
01h to enable watchdog
DX port number (NOP if DX=00FFh)
return none
note 1) This call will cause the FOSSIL to reboot the system if Carrier
Detect for the specified port drops while watchdog is turned
on.
2) The port need not be active for this function to work.
entry AH 15h FOSSIL: Write Character To Screen Using BIOS
AL ASCII code of character to display
return none
note 1) This function is reentrant.
2) ANSI processing may not be assumed.
entry AH 16h FOSSIL: Insert or Delete a Function From The
Timer Tick Chain
AL 00h to delete a function
01h to add a function
ES:DX address of function
return AX 0000h successful
0FFFFh unsuccessful
entry AH 17h FOSSIL: Reboot System
AL boot type
00h cold boot
01h warm boot
return none
entry AH 18h FOSSIL: Read Block
CX maximum number of characters to transfer
DX port number (NOP if DX=00FFh)
ES:DI pointer to user buffer
return AX number of characters transferred
note 1) This function does not wait for more characters to become
available if the value in CX exceeds the number of characters
currently stored.
2) ES:DI are left unchanged by the call; the count of bytes
actually transferred will be returned in AX.
entry AH 19h FOSSIL: Write Block
CX maximum number of characters to transfer
DX port number (NOP if DX=00FFh)
ES:DI pointer to user buffer
return AX number of characters transfered
note ES and DI are not modified by this call.
entry AH 1Ah FOSSIL: BREAK Signal Begin Or End
AL 00h stop sending 'break'
01h start sending 'break'
DX port number (NOP if DX=00FFh)
return none
note 1) Resets all transmit flow control restraints such as an XOFF
received from remote.
2) Init (fn 04h) or UnInit (fn 05h) will stop an in-progress
break.
3) The application must determine the "length" of the break.
entry AH 1Bh FOSSIL: Return Driver Information
CX size of user buffer in bytes
DX port number (if DX=00FFh, port data will not be valid)
ES:DI pointer to user buffer
return AX number of characters transferred
ES:DI user buffer structure:
00h word size of structure in bytes
02h byte FOSSIL driver version
03h byte revision level of this specific driver
04h dword FAR pointer to ASCII ID string
08h word size of the input buffer in bytes
0Ah word number of bytes in input buffer
0Ch word size of the output buffer in bytes
0Eh word number of bytes in output buffer
10h byte width of screen in characters
11h byte screen height in characters
12h byte actual baud rate, computer to modem
(see mask in function 00h
note 1) The baud rate byte contains the bits that fn 00h would use to
set the port to that speed.
2) The fields related to a particular port (buffer size, space
left in the buffer, baud rate) will be undefined if port=0FFh
or an invalid port is contained in DX.
3) Additional information will always be passed after these, so
that the fields will never change with FOSSIL revision changes.
entry AH 7Eh FOSSIL: Install An External Application Function
AL code assigned to external application
ES:DX pointer to entry point
return AX 1954h FOSSIL driver present
not 1954h FOSSIL driver not present
BH 00h failed
01h successful
BL code assigned to application (same as input AL)
note 1) Application codes 80h-0BFh are supported. Codes 80h-83h are
reserved.
2) An error code of BH=00h with AX=1954h should mean that another
external application has already been installed with the code
specified in AL.
3) Applications are entered via a FAR call and should make a FAR
return.
entry AH 7Fh FOSSIL: Remove An External Application Function
AL code assigned to external application
ES:DX pointer to entry point
return AX 1954h
BH 00h failed
01h successful
BL code assigned to application (same as input AL)
┌─────────────────────────────────────────────────────────────────────┐
│Interrupt 15h Cassette I/O 3**8 │
└─────────────────────────────────────────────────────────────────────┘
(0:0054h) 1) Renamed "System Services" on PS/2 line.
2) Issuing int 15h on an XT may cause a system crash.
On AT and after, interrupts are disabled with CLI when
the interrupt service routine is called, but most ROM
versions do not restore interrupts with STI.
3) For the original IBM PC, int 15h returns AH=80h and CF
set for all calls with AH not 0,1, or 2.
4) For the PC/XT int 15h returns AH=86h, CF set if called
at all. (the PC/XT ROM BIOS does not support int 15h)
5) For the AT/339, int 15h returns AH=86h, CF set if
called with an invalid function code.
Function 00h Turn Cassette Motor On
(PC, PCjr only)
entry AH 00h
return CF set on error
AH error code
00h no errors
01h CRC error
02h bad tape signals
no data transitions (PCjr)
03h no data found on tape
not used (PCjr)
04h no data
no leader (PCjr)
80h invalid command
86h no cassette present
not valid in PCjr
note NOP for systems where cassette not supported.
Function 01h Turn Cassette Motor Off
(PC, PCjr only)
entry AH 01h
return CF set on error
AH error code (86h)
note NOP for systems where cassette not supported.
Function 02h Read Blocks From Cassette
(PC, PCjr only)
entry AH 02h
CX number of bytes to read
ES:BX segment:offset + 1 of last byte read
return CF set on error
AH error code (01h, 02h, 04h, 80h, 86h)
DX count of bytes actually read
ES:BX pointer past last byte written
note 1) NOP for systems where cassette not supported.
2) Cassette operations normally read 256 byte blocks.
Function 03h Write Data Blocks to Cassette
(PC, PCjr only)
entry AH 03h
CX count of bytes to write
ES:BX pointer to data buffer
return CF set on error
AH error code (80h, 86h)
CX 00h
ES:BX pointer to last byte written+1
note 1) NOP for systems where cassette not supported.
2) The last block is padded to 256 bytes with zeroes if needed.
3) No errors are returned by this service.
Function 0Fh ESDI Format Unit Periodic Interrupt
(PS/2 50+)
entry AH 0Fh
AL phase code
00h reserved
01h surface analysis
02h formatting
return CF clear if formatting should continue
set if it should terminate
note 1) Called the BIOS on the ESDI Fixed Disk Drive Adapter/A during
a format or surface analysis operation after each cylinder is
completed.
2) This function call can be captured by a program so that it
will be notified as each cylinder is formatted or analyzed.
The program can count interrupts for each phase to determine
the current cylinder number.
3) The BIOS default handler for this function returns with CF set.
Function 10h TopView API Function Calls (TopView)
see Chapter 17
Function 20h PRINT.COM (DOS 3.1+ internal)
(AT, XT/286, PS/2 50+)
entry AH 20h
AL subfunction
00h disable critical region flag
01h set critical region flag
ES:BX pointer to flag byte set while inside
DOS calls
10h set up SysReq routine
11h completion of SysReq routine (software only)
Function 21h Read Power-On Self Test (POST) Error Log
(PS/2 50+)
entry AH 21h
AL 00h read POST log
01h write POST log
BH device ID
BL device error code
return CF set on error
AH status
00h successful read
BX number of POST error codes stored
ES:DI pointer to error log
01h list full
80h invalid command
86h function unsupported
note The log is a series of words, the first byte of which
identifies the error code and the second is the device ID.
Function 40h Read/Modify Profiles
(Convertible)
entry AH 40h
AL 00h read system profile in CX,BX
01h write system profile from CX, BX
02h read internal modem profile in BX
03h write internal modem profile from BX
BX profile info
return BX internal modem profile (from 02h)
CX,BX system profile (from 00h)
Function 41h Wait On External Event
(Convertible)
entry AH 41h
AL condition type
bits 0-2 condition to wait for
0,0,0 any external event
0,0,1 compare and return if equal
0,1,0 compare and return if not equal
0,1,1 test and return if not zero
1,0,0 test and return if zero
3 reserved
4 0 user byte
1 port address
5-7 reserved
BH condition compare or mask value
condition codes:
00h any external event
01h compare and return if equal
02h compare and return if not equal
03h test and return if not zero
04h test and return if zero
BL timeout value times 55 milliseconds
00h if no time limit
DX I/O port address (if AL bit 4=1)
ES:DI pointer to user byte (if AL bit 4=0)
Function 42h Request System Power Off
(Convertible)
entry AH 42h
AL 00h to use system profile
01h to force suspend regardless of profile
return unknown
note With early versions of DOS 5.0, the IBM L40SX would not
Suspend/Resume if DOS=LOW was in CONFIG.SYS.
Function 43h Read System Status
(Convertible)
entry AH 43h
return AL status byte
bit 0 LCD detached
1 reserved
2 RS232/parallel powered on
3 internal modem powered on
4 power activated by alarm
5 bad time
6 external power in use
7 battery low
Function 44h Toggle Internal Modem Power
(Convertible)
entry AH 44h
AL 00h to power off
01h to power on
return unknown
Function 4Fh OS Hook - Keyboard Intercept
(except PC, PCjr, and XT)
entry AH 4Fh
AL scan code, CF set
return AL scan code
CF set processing desired
clear scan code should not be used
note 1) Called by int 9 handler for each keystroke to translate scan
codes.
2) An OS or a TSR can capture this function to filter the raw
keyboard data stream. The new handler can substitute a new
scan code, return the same scan code, or return the carry flag
clear causing the keystroke to be discarded. The BIOS default
routine simply returns the scan code unchanged.
3) A program can call int 15h/fn0C0h to determine whether the host
machine's BIOS supports keyboard intercept.
4) Used internally by PC-MOS/386 v4.00+ for keyboard input.
5) Some BIOSes do not properly support this call. Int 15h/fn 0C0h
will tell if the BIOS is supposed to support this call.
6) Some versions of KEYB.COM provide additional 4Fh support.
Function 70h EEROM handler
(Tandy 1000HX)
entry AH 00h read from EEROM
BL 00h
01h write to EEROM
BL word number to write (0-15)
DX word value to write
return DX (AH=00h) word value
CF set on error (system is not a Tandy 1000 HX)
Function 80h OS Hook - Device Open
(AT, XT/286, PS/2)
entry AH 80h
BX device ID
CX process ID
return CF set on error
AH status
00h OK
note 1) Acquires ownership of a logical device for a process.
2) This call, along with fns 81h and 82h, defines a simple
protocol that can be used to arbitrate usage of devices by
multiple processes. A multitasking program manager would be
expected to capture int 15h and provide the appropriate
service.
3) The default BIOS routine for this function simply returns with
CF clear and AH=00h.
Function 81h Device Close
(AT, XT/286, PS/2)
entry AH 81h
BX device ID
CX process ID
return CF set on error
AH status
00h OK
note 1) Releases ownership of a logical device for a process.
2) A multitasking program manager would be expected to capture
int 15h and provide the appropriate service.
3) The BIOS default routine for this function simply returns with
the CF clear and AH=00h.
Function 82h Program Termination
(AT, XT/286, PS/2)
AH 82h
BX device ID
return CF set on error
AH status
00h OK
note 1) Closes all logical devices opened with function 80h.
2) A multitasking program manager would be expected to capture
int 15h and provide the appropriate service.
3) The BIOS default routine for this function simply returns with
CF clear and AH=00h.
Function 83h Event Wait
(AT, XT/286, Convertible, PS/2 50+)
entry AH 83h
AL 00h to set interval
01h to cancel (CX:DX and ES:BX not required)
CX:DX number of microseconds to wait (granularity is 976
microseconds)
ES:BX pointer to semaphore flag (bit 7 is set when interval
expires)
(pointer is to caller's memory) (some sources list bit
15 set)
return CF clear OK
set function already busy
note 1) Requests setting of a semaphore after a specified interval or
cancels a previous request.
2) The calling program is responsible for clearing the semaphore
before requesting this function.
3) The actual duration of an event wait is always an integral
multiple of 976 microseconds. The CMOS date/clock chip
interrupts are used to implement this function.
4) Use of this function allows programmed, hardware-independent
delays at a finer resolution than can be obtained through use
of the MS-DOS Get Time function (int 21h/fn 2Ch) which returns
time in hundredths of a second.
5) CX:DX is a four-byte integer.
7) This function is called by int 70h and is not the normal int
08h/1Ch clock tick. It is generated by the MC146818A Real Time
Clock chip. This is the battery backed up CMOS clock chip.
Function 84h Read Joystick Input Settings
(AT, XT/286, PS/2)
entry AH 84h
DX 00h to read current switch settings
(return in AL)
01h to read resistive inputs
return CF set on error
(fn 00h)
AL switch settings (bits 7-4)
(fn 01h)
AX stick A (X) value
BX stick A (Y) value
CX stick B (X) value
DX stick B (Y) value
note 1) An error is returned if DX does not contain a valid
subfunction number.
2) If no game adapter is installed, all returned values are 00h.
3) Using a 250K Ohm joystick, the potentiometer values usually
lie within the range 0-416 (0000h-01A0h).
4) Not all BIOSes properly return the presence of a game port.
In my experience, most BIOSes require a joystick to actually
be present even if the port is otherwise enabled.
Function 85h System Request (SysReq) Key Pressed
(except PC, PCjr, XT)
entry AH 85h
AL 00h key pressed
01h key released
return CF set on error
AH error code
note 1) Called by BIOS keyboard decode routine when the SysReq key
is detected.
2) The BIOS handler for this call is a dummy routine that always
returns a success status unless called with an invalid
subfunction number in AL.
3) A multitasking program manager would be expected to capture
int 15h so that it can be notified when the user strikes the
SysReq key.
Function 86h Wait
(except PC, PCjr, XT)
AH 86h
CX:DX 4-byte integer, number of microseconds to wait
CX high word, DX low word
return CF clear after wait elapses
CF set immediately due to error
note 1) Suspends the calling program for a specified interval in
microseconds.
2) The actual duration of the wait is always an integral multiple
of 976 microseconds.
3) Use of this function allows programmed, hardware-independent
delays at a finer resolution than can be obtained through use
of the MS-DOS Get Time function (int 21h fn 2Ch) which returns
time in hundredths of a second.
4) This function calls int 70h and is not the normal Int 08h/1Ch
clock tick. It is generated by the MC146818A Real Time Clock
chip. This is the battery backed CMOS clock chip.
Function 87h Memory Block Move
(2-3-486 machines only)
AH 87h
CX number of words to move
ES:SI pointer to Global Descriptor Table (GDT)
offset 00h-0Fh reserved, set to zero
00h null descriptor
08h uninitialized, will be made into GDT
descriptor
10h-11h source segment length in bytes
(2*CX-1 or greater)
12h-14h 24-bit linear source address
15h access rights byte (always 93h)
16h-17h reserved, set to zero
18h-19h destination segment length in bytes
(2*CX-1 or greater)
1Ah-1Ch 24-bit linear destination address
1Dh access rights byte (always 93h)
1Eh-1Fh reserved, set to zero
20h *uninitialized, used by BIOS
28h *uninitialized, will be made into SS
descriptor
(*) some sources say initialized to zero
return CF set on error
AH status
00h success - source copied into destination
01h RAM parity error
02h exception interrupt error
03h address line 20 gating failed
note 1) The GDT table is composed of six 8-byte descriptors to be
used by the CPU in protected mode. The four descriptors in
offsets 00h-0Fh and 20h-2Fh are filled in by the BIOS before
the CPU mode switch.
2) The addresses used in the descriptor table are linear
(physical) 24-bit addresses in the range 000000h-0FFFFFFh -
not segments and offsets - with the least significant byte at
the lowest address and the most significant byte at the highest
address.
3) Interrupts are disabled during this call; use may interfere
with the operation of comm programs, network drivers, or other
software that relies on prompt servicing of hardware interrupts.
4) This call is not valid in the OS/2 Compatibility Box.
5) This call will move a memory block from any real or protected
mode address to any other real or protected mode address.
6) DESQview does not intercept function 87, but QEXT and QEMM do,
thereby allowing function 87 to work correctly inside DV.
VDISK, which uses function 87, works inside DV. If VDISK is
sitting at the 1 MB mark, then the int 19h vector will have a
VDISK signature in it. The normal way to check for VDISK
presence is by checking for the string "VDISK" at offset 12h
of the segment of the int 19h vector. If the string matches,
then you can determine how much extended memory is reserved
for VDISK by looking at offset 2Ch is the 3-byte address of the
lowest extended memory address NOT in use by VDISK (i.e. if you
see at 2Ch "00 00 14" then that means that VDISK is using
memory up to 1 MB + 256K).
Function 88h Get Extended Memory Size
(AT, XT/286, PS/2)
entry AH 88h
return AX number of contiguous 1K blocks of extended memory
starting at address 0FFFFh (1024Kb)
note 1) This call will not work in the OS/2 Compatibility Box.
2) Some BIOSes and software manipulate the Carry flag when this
function is called. When tested on a vanilla 386 with AMI BIOS
the machine returned with the Carry Flag set. When 386Max was
loaded, the flag was not set.
3) Used by IBM VDISK 4.0.
Function 89h Switch Processor to Protected Mode
(AT, XT/286, PS/2)
entry AH 89h
BH interrupt number for IRQ0, written to ICW2 of 8259
PIC #1 (must be evenly divisible by 8, determines
IRQ0-IRQ7)
BL interrupt number for IRQ8, written to ICW2 of 8259
PIC #2 (must be evenly divisible by 8, determines
IRQ8-IRQ15)
ES:SI pointer to 8-entry Global Descriptor Table for
protected mode:
offset 00h null descriptor, initialized to zero
08h GDT descriptor
10h IDT (Interrupt Descriptor Table)
descriptor
18h DS, user's data segment
20h ES, user's extra segment
28h SS, user's stack segment
30h CS, user's code segment
38h uninitialized, used to build descriptor
for BIOS code segment
return CF set on error
AH 0FFh error enabling address line 20
CF clear function successful (CPU is in protected mode)
AH 00h
CS user-defined selector
DS user-defined selector
ES user-defined selector
SS user-defined selector
note 1) The user must initialize the first seven descriptors; the
eighth is filled in by the BIOS to provide addressability for
its own execution. The calling program may modify and use the
eighth descriptor for any purpose after return from this
function call.
2) Intercepted by Microsoft's HIMEM.SYS and Quarterdeck's
QEMM.SYS.
Function 90h Device Busy Loop (except PC, PCjr, XT)
entry AH 90h
AL predefined device type code:
00h disk (may timeout)
01h diskette (may timeout)
02h keyboard (no timeout)
03h PS/2 pointing device (may timeout)
80h network
(no timeout)
0FCh hard disk reset (PS/2) (may timeout)
0FDh diskette motor start (may timeout)
0FEh printer (may timeout)
ES:BX pointer to request block for type codes 80h through 0FFh
(for network adapters, ES:BX is a pointer to network
control block)
return CF set if wait time satisfied
clear if driver must perform wait
AH status
note 1) Used by NETBIOS, TOPS Network, Tom Wagner's CTASK multitasker,
Hyperdisk disk cache.
2) Generic type codes are allocated as follows:
00h-7Fh non-reentrant devices; OS must arbitrate access
serially reusable devices
80h-0BFh reentrant devices; ES:BX points to a unique control
block
0C0h-0FFh wait-only calls, no complementary POST int 15/fn 91h
call
3) Invoked by the BIOS disk, printer, network, and keyboard
handlers prior to performing a programmed wait for I/O
completion.
4) A multitasking program manager would be expected to capture
int 15h/fn 90h so that it can dispatch other tasks while I/O
is in progress.
5) The default BIOS routine for this function simply returns with
the CF clear and AH=00h.
6) QEMM 6.0's "Stealth" mode suppresses this call. Quarterdeck
claims very few programs properly handle the EMS page frame
when using this call.
Function 91h Interrupt Completed
(AT, XT/286, PS/2 50+)
entry AH 91h
AL type code (see AH=90h above)
00h-7Fh serially reusable devices
80h-0BFh reentrant devices
ES:BX pointer to request block for type codes 80h through
0BFh
return AH 00h
note 1) Used by NETBIOS and TOPS network, Tom Wagner's CTASK
multitasker, Hyperdisk disk cache.
2) Invoked by the BIOS disk network, and keyboard handlers to
signal that I/O is complete and/or the device is ready.
3) Predefined device types that may use Device POST are:
00H disk (may timeout)
01H floppy disk (may timeout)
02H keyboard (no timeout)
03H PS/2 pointing device (may timeout)
80H network (no timeout)
4) The BIOS printer routine does not invoke this function because
printer output is not interrupt driven.
5) A multitasking program manager would be expected to capture
int 15h/fn 91h so that it can be notified when I/O is
completed and awaken the requesting task.
6) The default BIOS routine for this function simply returns with
the CF flag clear and AH=00h.
7) QEMM 6.0's "Stealth" mode suppresses this call. Quarterdeck
claims very few programs properly handle the EMS page frame
when using this call.
Function 0C0h Get System Configuration
(XT after 1/10/86, PC Convertible, XT/286, AT, PS/2)
entry AH 0C0h
return CF set if BIOS doesn't support call
ES:BX pointer to ROM system descriptor table
bytes 00h-01h number of bytes in the following table
(normally 16 bytes)
02h system ID byte; see Chapter 2 for
interpretation
03h secondary ID distingushes between AT and
XT/286, etc.
04h BIOS revision level, 0 for 1st release, 1 for
2nd, etc.
05h feature information byte
bits 0 reserved
1 Micro Channel bus (instead of ISA or
EISA)
2 extended BIOS area allocated at 640k
3 wait for external event supported
(int 15h/fn 41h), used on Convertible;
reserved on PS/2 systems
4 keyboard intercept: int 15h, fn 04Fh
called upon int 09h
5 realtime clock installed
6 second 8259 installed (cascaded IRQ2)
7 DMA channel 3 - used by hard disk
BIOS
06h unknown (set to 0) (reserved by IBM)
07h unknown (set to 0) (reserved by IBM)
08h unknown (set to 0)
09h unknown (set to 0) (Award BIOS copyright here)
note 1) Int 15h is also used for the Multitask Hook on PS/2 machines.
No register settings available yet.
2) The 1/10/86 XT BIOS returns an incorrect value for the
feature byte.
3) Novell documents some versions of Netware prior to 2.2 as
having problems on PS/2 machines due to a bug which did not
return from the interrupt correctly.
4) Some AMI BIOSes do not support this function, such as the
ones in early Dell machines.
Function 0C1h Return Extended BIOS Data Area Segment Address
(AT & later)
entry AH 0C1h
return CF set on error
ES segment of XBIOS data area
note 1) The XBIOS Data Area is allocated at the high end of
conventional memory during the POST sequence.
2) The word at 0040:0013h (memory size) is updated to reflect the
reduced amount of memory available for DOS and application
programs.
3) The first byte in the XBIOS Data Area is initialized to its
length in Kb.
4) A program can determine whether the XBIOS Data Area exists by
using int 15h/fn 0C0h.
Function 0C2h Pointing Device BIOS Interface
(DesQview 2.x) (PS/2)
entry AH 0C2h
AL 00h Enable/Disable Pointing Device
BH 00h disable
01h enable
01h Reset Pointing Device
Resets the system's mouse or other pointing
device, sets the sample rate, resolution, and
other characteristics to their default values.
return BH device ID (0=first)
note 1) After a reset operation, the state of
the pointing device is as follows:
disabled;
sample rate at 100 reports per second;
resolution at 4 counts per millimeter;
scaling at 1 to 1.
2) The data package size is unchanged by
this function.
3) Apps can use the fn 0C2h subfunctions
to initialize the pointing device to
other parameters, then enable the
device with fn 00h.
4) BL is altered on return.
02h Set Sampling Rate
BH 00h 10/second
01h 20/second
02h 40/second
03h 60/second
04h 80/second
05h 100/second (default)
06h 200/second
03h Set Pointing Device Resolution
BH 00h one count per mm
01h two counts per mm
02h four counts per mm (default)
03h eight counts per mm
04h Get Pointing Device Type
return BH ID code for the mouse or other
pointing device
05h Initialize Pointing Device Interface
Sets the data package size for the system's
mouse or other pointing device, and initializes
the resolution, sampling rate, and scaling to
their default values.
BH data package size (1 - 8 bytes)
note After this operation, the state of the
pointing device is as follows:
a) disabled;
b) sample rate at 100 reports per
second;
c) resolution at 4 counts per
millimeter;
d) scaling set at 1 to 1.
06h Get Status or Set Scaling Factor
Returns the current status of the system's
mouse or other pointing device or sets the
device's scaling factor.
BH 00h return device status
return BL status byte
bits 0 set if right button
is pressed
1 reserved
2 set if left button
is pressed
3 reserved
4 0 1:1 scaling
1 2:1 scaling
5 0 device disabled
1 device enabled
6 0 stream mode
1 remote mode
7 reserved
CL resolution
00h 1 count per mm
01h 2 counts per mm
02h 4 counts per mm
03h 8 counts per mm
DL sample rate (hex count)
0Ah 10 reports/sec
14h 20 reports/sec
28h 40 reports/sec
3Ch 60 reports/sec
50h 80 reports/sec
64h 100 reports/sec
0C8h 200 reports/sec
01h set scaling to 1:1
02h set scaling to 2:1
07h Set Pointing Device Handler Address
Notifies BIOS pointing device driver of the
address for a routine to be called each time
pointing device data is available.
ES:BX address of user device handler
return AL 00h
return CF set on error
AH status
00h successful
01h invalid function
02h invalid input
03h interface error
04h need to resend
05h no device handler installed
note 1) The values in BH for those functions that take it as input are
stored in different locations for each subfunction.
2) The user's handler for pointing device data is entered via a
FAR call with four parameters on the stack:
SS:SP+0Ah status
SS:SP+08h x coordinate
SS:SP+06h y coordinate
SS:SP+04h z coordinate (always 0)
The handler must exit via a far return without removing the
parameters from the stack.
3) The status parameter word passed to the user's handler is
interpreted as follows:
bits 0 left button pressed
1 right button pressed
2-3 reserved
4 sign of x data is negative
5 sign of y data is negative
6 x data has overflowed
7 y data has overflowed
8-0Fh reserved
Function 0C3h Enable/Disable Watchdog Timeout
(PS/2 50+, EISA)
entry AH 0C3h
AL 00h disable watchdog
01h enable watchdog
BX timer counter
return CF set on error
note 1) The watchdog timer generates an NMI.
2) This would be subject to protection with a real OS so temporary
masters would not be able to seize the bus forever.
Function 0C3h Fail-Safe Timer Control
(EISA)
entry AH 0C3h
AL 00h disable fail-safe timer
AL 01h enable fail-safe timer
BX timer count value
return CF clear OK
set invalid input
note 1) Fn 00h clears WDTIC in the Extended BIOS Data Area.
2) Fn 01h puts the timer in Mode 0, enables the fail-safe timer
NMI, places the value in BX in the WDTIC. When BX counts to
zero a fail-safe timer NMI is generated.
Function 0C4h Programmable Option Select
(PS/2 50+)
entry AH 0C4h
AL 00h return base POS register address
01h enable slot
BL slot number
02h enable adapter
return CF set on error
DX base POS register address (if function 00h)
note 1) Fn 00h returns the base Programmable Option Select register
address, enables a slot for setup, or enables an adapter.
2) Valid on machines with Micro Channel Architecture (MCA) bus
only.
3) After a slot is enabled with fn 01h, specific information can
be obtained for the adapter in that slot by performing port
input operations:
Port Function
100h MCA ID (low byte)
101h MCA ID (high byte)
102h Option Select Byte 1
bit 0 0 if disabled
1 if enabled
103h Option Select Byte 2
104h Option Select Byte 3
105h Option Select Byte 4
bits 6-7 are channel check indicators
106h Subaddress Extension (low byte)
107h Subaddress Extension (high byte)
Function 0C5h Used by PS/2 Model 50+ and Olivetti MCA machines
Used by Desqview 2.2
Used by Lotus 123 Release 2.2
Used by Microsoft Word 5.0
note Functions unknown. Reported by InfoWorld Nov 13 1989's Micro
Channel 386 test as a conflict between the above software
packages. InfoWorld said that Quarterdeck (DESQview) was
working on a fix for their product. No other information.
Function 0D8h Access System Information
(EISA)
entry AH 0D8h Read Slot Information
AL 00h (CS specifies 16-bit addressing)
AL 80h (CS specifies 32-bit addressing)
CL slot number (0-63)
return AH status
00h OK
80h invalid slot number
82h extended CMOS RAM corrupted
83h specified slot is empty
86h invalid BIOS call
87h invalid system configuration
AL miscellaneous vendor information byte
bits 7 duplicate IDs exist
6 product ID
5,4 slot type
0,0 expansion slot
0,1 embedded device
1,0 virtual device
1,1 reserved by EISA
3,0 duplicate ID number
0,0,0,0 no duplicated IDs
0,0,0,1 first duplicate ID
-------
1,1,1,1 15th duplicate ID
BH configuration utility, major version number
BL configuration utility, minor version number
CH configuration file, MSD of checksum
CL configuration file, LSD of checksum
DH number of device functions
DL combined function information
SI:DI four byte compressed vendor ID
CF clear OK
set error
AH will be nonzero if an error occurs
entry AH 0D8h Read Function Information
AL 01h (CS specifies 16-bit addressing)
AL 81h (CS specifies 32-bit addressing)
CH function number (0-n-1)
CL slot number (0-63)
DS:SI address pointer for output data
return AH status
00h OK
80h invalid slot number
82h extended CMOS RAM corrupted
83h specified slot is empty
86h invalid BIOS call
87h invalid system configuration
DS segment for return data buffer
SI offset for return data buffer (16 bit)
ESI offset for return data buffer (32 bit)
note 320-byte data buffer:
offset size description
00h 2 words compressed ID
byte 0
bits 7 reserved
6-2 character 1
1-0 character 2
byte 1
7-5 character 2
4-0 character 3
byte 2
7-4 second digit of product number
3-0 first digit of product number
byte 3
7-4 third digit of product number
3-0 product revision number
04h 1 word ID and slot information
byte 0
bits 7 0 no duplicate ID is present
1 duplicate ID is present
6 0 ID is readable
1 ID is not readable
5-4 slot type
0,0 expansion slot
0,1 embedded slot
1,0 virtual slot
1,1 reserved by EISA
3,0 duplicate ID number
0,0,0,0 no duplicated IDs
0,0,0,1 first duplicate ID
-------
1,1,1,1 15th duplicate ID
byte 1
bits 7 0 configuration complete
1 configuration not complete
6-2 reserved by EISA
1 0 EISA IOCHKERR not supported
1 EISA IOCHKERR supported
0 0 EISA ENABLE not supported
1 EISA ENABLE supported
06h 1 word configuration file extension revision level
byte 0 minor revision level
byte 1 major revision level
07h 13words Selections
byte 0 first selection
byte 1 second selection
---- - ----------------
byte 25 twenty-sixth selection
022h 1 byte Function Information
bits 7 0 function is enabled
1 function is disabled
6 configuration extension free-form data
5 port initialization entries follow
4 port range entries follow
3 DMA entries follow
2 interrupt entries follow
1 memory entries follow
0 type/subtype entries follow
023h 80bytes Type and subtype ASCII string
(strings less than 80 characters padded with
zeroes)
byte 0 first ASCII character
byte 1 second ASCII character
---- -- ----------------------
byte 79 eightieth ASCII character
073h 205byts Free-Form Data Field
If Function Information byte 6 IS set, the
next 205 bytes (to the end of the 320-byte data
block) is a free-form data field. Byte 0 is
the length of the field in bytes, and data
starts with byte 1.
073h 63bytes Memory configuration information
(if Function Information bit 6 NOT set)
byte 0
bits 7 0 last entry
1 more entries follow
6 reserved by EISA
5 0 unshared memory
1 shared memory
4,3 memory type
0,0 SYS (base or extended)
0,1 EXP (expanded)
1,0 VIR (virtual)
1,1 OTH (other)
2 reserved by EISA
1 0 not cached
1 cached
0 0 read only (ROM)
1 read/write (RAM)
byte 1
7-4 reserved by EISA
3,2 decode size
0,0 20
0,1 24
1,0 32
1,1 reserved by EISA
1,0 data size (access size)
0,0 byte
0,1 word
1,0 doubleword
1,1 reserved by EISA
bytes 2-4 memory start address divided by 100h
bytes 5-6 memory size divided by 400h
Up to 8 more 7-byte entries may follow.
0B2h 14bytes Interrupt Configuration
(if Function Information bit 6 is NOT set)
byte 0
bits 7 0 last entry
1 more entries follow
6 0 not shared
1 shared
5 0 edge triggered
1 level triggered
4 reserved by EISA
3-0 interrupt (0-F)
byte 1 reserved by EISA
Up to 6 more 2-byte entries may follow.
0C0h 4 words DMA Channel Description
(if Function Information bit 6 is NOT set)
byte 0
bits 7 0 last entry
1 more entries follow
6 0 not shared
1 shared
5-3 reserved by EISA
2-0 DMA channel number (0-7)
byte 1
7,6 reserved by EISA
5,4 data timing
0,0 default (ISA competible)
0,1 type A
1,0 type B
1,1 type C (burst mode)
3,2 transfer size
0,0 8-bit
0,1 16-bit
1,0 32-bit
1,1 reserved by EISA
1,0 reserved by EISA
Up to 3 more 2-byte entries may follow
0C8h 60bytes Port I/O Information
byte 0
bits 7 0 last entry
1 more entries follow
6 0 not shared
1 shared
5 reserved by EISA
4-0 number of sequential ports, less 1
bytes 1,2 I/O Port Address
Up to 19 more 3-byte entries may follow
104h 60bytes Initialization Data
(If Function Information bit 6 is NOT set)
byte 0 Initialization Type
bits 7 0 last entry
1 more entries follow
6-3 reserved by EISA
2 port value or mask value
0 write to port without mask
1 write to port with mask
2,0 type of access
0,0 byte addressable
0,1 word addressable
1,0 doubleword addressable
1,1 reserved by EISA
bytes 1,2 I/O Port address
bytes 3-10 (Depends on value of byte 0, bit 2)
if bit=0, bytes 3-6 will have the
following values based on the access
type specified by byte 0, bits 0-1:
byte 0, bits 0-1:
0,0 this byte 3 - port value
0,1 this bytes 3,4 - port value
1,0 this bytes 3-6 - port value
1,1 reserved by EISA
if bit=1, bytes 3-10 will have the
following values based on the access
type specified by byte 0, bits 0-1:
byte 0, bits 0-1:
0,0 this byte 3 - port value
4 - port mask
0,1 this bytes 3,4 - port value
5,6 - port mask
1,0 this bytes 3-6 - port value
7-10 - port mask
1,1 reserved by EISA
Up to 7 more 4, 5, 7, or 11-byte entries
may follow.
entry AH 0D8h Clear Configuration Storage
AL 02h (CS specifies 16-bit addressing)
AL 82h (CS specifies 32-bit addressing)
BH configuration utility major revision level
BL configuration utility minor revision level
return AH 00h OK
84h error writing to extended CMOS RAM
86h invalid BIOS call
88h configuration utility not supported
entry AH 0D8h Write Function Information
AL 03h (CS specifies 16-bit addressing)
AL 83h (CS specifies 32-bit addressing)
CX length of data structure (in bytes)
DS segment of data buffer
SI offset of data buffer (16-bit)
ESI offset of data buffer (32-bit)
return AH 00h OK
84h error writing to extended CMOS RAM
85h CMOS RAM is full
86h invalid BIOS call
note See Function 1 for data fields.
Function 0DEh DESQview Services (DESQview)
┌─────────────────────────────────────────────────────────────────────┐
│Interrupt 16h Keyboard I/O 3**9 │
└─────────────────────────────────────────────────────────────────────┘
(0:0058h) Access the keyboard. Scancodes are found in Appendix
1. ASCII codes are found in Appendix 2.
IBM's original keyboard layout is referred to as the
84-key or "old style". It has the function keys on the
left and an embedded cursor/numeric keypad on the
right. The 101-key "new style" or "enhanced" keyboard
(such as used on the PS/2s) adds several keys. The
early BIOS will not detect the new scancodes and the
new BIOS for some reason added new function calls for
this purpose instead of enhancing the old ones. This
causes some hassle when writing programs which need to
support both keyboards fully. Most programs limit
themselves to the 84-key functions in the interest of
backward compatibility.
The SWITCHES CONFIG.SYS command forces DOS 4.0 to use
the standard int 16h requests for keyboard I/O rather
than the extended int 16h requests.
The DOS KEYB command does not hook into the BIOS. It
is a total replacement for the BIOS int9 driver. The
only good thing about this is that you can use 101-key
keyboards on old ATs without support for enhanced
keyboards. KEYB is very peculiar in its handling of
the keyboard, causing some programs to break. It also
tends to disable interrupts for a long time while
processing each scan code.
There are machines such as the Toshiba 5200 which have
84-key layouts but "simulate" being 101-key, at least
as far as int 16h goes. (always good for confusing
your software...)
IBM's TopView saved the state of the capslock,
scrollock, and numlock keys during task switches.
DESQview does not save the toggle states unless you
change the default setup.
Function 00h Get Keyboard Input
Read the next character in keyboard buffer, if no key
is ready, then wait for one.
entry AH 00h
return AH scan code
AL ASCII character
note 1) Removes keystroke from buffer (destructive read).
2) Does not work with the extra keys on the 101-key "enhanced"
keyboard.
Function 01h Check Keystroke Buffer - Do Not Clear
entry AH 01h
return ZF 0 (clear) if character in buffer
1 (set) if no character in buffer
AH scan code of character (if ZF=0)
AL ASCII character if applicable
note 1) Keystroke is not removed from buffer. The same character and
scan code will be returned by the next call to Int 16h/fn 00h.
2) This call flushes the 101-key codes from the buffer if they
precede an 84-key code.
Function 02h Shift Status
Fetches bit flags indicating shift status.
entry AH 02h
return AL status byte (same as [0040:0017])
bits 7 Insert on
6 CapsLock on
5 NumLock on
4 ScrollLock on
3 Alt key down
2 Control key down
1 Left shift (left caps-shift key) down
0 Right shift (right caps-shift key) down
note The Keyboard Flags Byte is stored in the BIOS Data Area at
0000:0417h.
Function 03h Keyboard - Set Repeat Rate
(PCjr, AT, XT/286, PS/2)
entry AH 03h
AL 00h reset typematic defaults (PCjr)
01h increase initial delay (PCjr)
02h decrease repeat rate by 1/2 (PCjr)
03h increase both delays by 1/2 (PCjr)
04h turn off typematic (PCjr)
05h set typematic rate (AT, PS/2)
BH 00h-03h for delays of 250ms, 500ms, 750ms, or 1 second
0,0 250ms
0,1 500ms
1,0 750ms
1,1 1 second
BL 00h-1Fh for typematic rates of 30cps down to 2cps
00000 30 01011 10.9 10101 4.5
00001 26.7 01100 10 10110 4.3
00010 24 01101 9.2 10111 4
00011 21.8 01110 8.6 11000 3.7
00100 20 01111 8 11001 3.3
00101 18.5 10000 7.5 11010 3
00110 17.1 10001 6.7 11011 2.7
00111 16 10010 6 11100 2.5
01000 15 10011 5.5 11101 2.3
01001 13.3 10011 5.5 11110 2.1
01010 12 10100 5 11111 2
return nothing
note 1) Subfunction 05h is available on ATs with ROM BIOS dated
11/15/85 and later, the XT/286, and the PS/2.
2) Subfunction 0 (Return to Default Keyboard State) restores the
keyboard to its original state. An IBM AT's original state at
power-on is typematic on, normal initial delay and normal
typematic rate.
3) Subfunction 1 (Increase Initial Delay) increases the delay
between the first character typed and the burst of typematic
characters.
4) For Subfunctions 0 through 4, each time the typematic rate is
changed, all previous states are removed.
5) Some clone keyboards (Northgate Omnikey and Focus) and
BIOSES (AMI) have much higher repeat rates for the same bit
values.
Function 04h Keyboard Click Toggle
(PCjr and Convertible)
entry AH 04h
AL 00h for click off
01h for click on
return nothing
Function 05h Load Keyboard Buffer
(AT or PS/2 with enhanced kbd)
entry AH 05h
CH scan code
CL ASCII character
return CF set on error
AL 00h success
01h if buffer full
note Places a character and scan code at the end of the keyboard
type-ahead buffer.
Function 06h Keyboard Buffer Write (Fansi-Console to 2.00)
entry AH 06h
BX extended key value to place in typeahead buffer
return unknown
note This call may be dropped since it now duplicates function 05h.
Function 07h Change Shift Key Status (Fansi-Console to 2.00)
entry AH 07h
AL shift key status value
return unknown
note Status byte is same as function 02h.
Function 10h Get Enhanced Keystroke And Read
(XT/286, PS/2, AT with "Enhanced" keyboard)
entry AH 10h
return AH scan code
AL ASCII character if applicable
note 1) Reads a character and scan code from the keyboard type-ahead
buffer.
2) Use this function for the enhanced keyboard instead of int 16h
fn 00h. It allows applications to obtain the scan codes for
the additional F11, F12, and cursor control keys.
3) This is the enhanced version of function 00h.
Function 11h Check Enhanced Keystroke
(XT/286, PS/2, AT with "Enhanced" keyboard)
entry AH 11h
return ZF 0 (clear) if key pressed
AH scan code
AL ASCII character if applicable
1 if buffer is empty
note 1) Keystroke is not removed from buffer. The same char and scan
code will be returned by the next call to Int 16h/fn 10h.
2) Use this function for the enhanced keyboard instead of int
16h/fn 00h. It allows applications to test for the additional
F11, F12, and cursor control keys.
Function 12h Extended Get Shift Status (F11, F12 Enhanced keyboard)
entry AH 12h
return AX status word
AL bit 0 right Shift key depressed
1 left Shift key depressed
2 Control key depressed
3 Alt key depressed
4 ScrollLock state active
5 NumLock state active
6 CapsLock state active
7 insert state is active
AH bit 0 left Control key pressed
1 left Alt key depressed
2 right Control key pressed
3 right Alt key depressed
4 Scroll Lock key depressed
5 NumLock key depressed
6 CapsLock key depressed
7 SysReq key depressed
note Use this function for the enhanced keyboard instead of int
16h/fn 02h.
Function 4fh Gerkey - German keyboard remapper from OVI-SYSTEM
entry AH 4Fh Gerkey function
AL 56h installation check
return AX 0FFFFh installed, otherwise not present
BH major version
BL minor version
Function 70h, 71h, 72h Internal Functions (SEAware's FAKEY.COM)
note FAKEY.COM is a TSR keyboard utility distributed to registered
users of SEAware products.
Function 75h Set Tick Count for Scanning (pcAnywhere 2.00)
entry AH 75h
AL tick count
return none
note 1) Sets count of 55ms timer ticks between checks for new screen
changes.
2) pcAnywhere is a program that allows operation of a remote
machine over a serial link.
Function 76h Set Error Checking Mode (pcAnywhere 2.00)
entry AH 76h
AL error checking type
00h none
01h fast
02h slow
return none
Function 77h reserved (pcAnywhere 2.00)
pcAnywhere API - reserved
Function 78h Log Off (pcAnywhere 2.00)
entry AL 00h wait for another call
01h exit but remain TSR
02h automatic mode - watches DTR
0FFh leave in current operating mode (ver. 2.1)
return none
Function 79h Installation Check (pcAnywhere 2.00)
entry AH 79h
AL 00h installation check
return AX 0FFFFh resident and active
0FFFEh resident but not active
0FFFDh resident TSR
0FFFCh automatic mode
any other value - not resident
Function 7Ah Cancel pcAnywhere Session (pcAnywhere 2.00)
entry AH 7Ah
return none
note Leaves pcAnywhere resident but unable to answer another call.
Function 7Bh Enable/Disable Operation (pcAnywhere 2.00)
entry AH 7Bh
AL state
00h disabled
01h enabled
return none
note Remote screen is automatically refreshed when session is enabled.
Function 7Ch Get Port Configuration (pcAnywhere 2.00)
entry AH 7Ch
return AH port number in binary (0-15)
AL baud rate
00h 50
01h 75
02h 110
03h 134.5
04h 150
05h 300
06h 600
07h 1200
08h 1800
09h 2000
0Ah 2400
0Bh 4800
0Ch 7200
0Dh 9600
0Fh 19,200
Function 7Dh Get/Set Terminal Parameters (pcAnywhere 2.00)
entry AH 7Dh
AL 00h set parameters
01h get parameters
02h get configuration header and terminal
parameters
CX:DS address of Terminal Parameter Block
return AL 00h nothing
01h current Terminal Parameter Block in CX:DS
02h configuration header and Terminal Parameter
Block in CX:DS
note Terminal Parameter Block format: (1152 bytes) (decimal)
384 bytes CRT Control Information
bytes function
1-8 cursor up
9-16 cursor down
17-24 cursor left
25-32 cursor right
33-40 cursor home
41-48 clear screen
49-56 clear to end of line
57-64 clear to end of page
65-72 insert line
73-80 delete line
81-88 insert character
89-96 delete character
97-104 cursor position lead in
105-112 between row and column
113-120 after cursor position
121-128 CRT initialization
256 bytes Character Translation Table
translates ASCII characters from host. Normally
changes IBM graphics characters to other displayable
symbols
512 bytes keyboard sequences
641-644 cursor up
645-648 cursor down
649-652 cursor left
653-656 cursor right
657-660 home
661-664 end
665-668 PgUp
669-672 PgDn
673-676 insert
677-680 delete
681-684 control-home
685-688 control-end
689-692 control-PgUp
693-696 control-PgDn
697-700 escape
701-740 F1...F10
741-780 sF1...sF10
781-820 ^F1...^F10
821-860 aF1...aF10
861-964 alt A-Z
965-1004 alt 0-9
1005-1008 alt =
1009-1012 alt -
1013-1016 print screen
1017-1020 ctrl-left arrow
1021-1024 ctrl-right arrow
1025-1120 reserved
1121-1124 begin conv. mode
1125-1128 remote printing off
1129-1132 remote printing on
1133-1136 backspace
1137-1140 refresh screen
1141-1144 send next code
1145-1148 display top 24 lines
1149-1152 display bottom 24 lines
Function 7Eh Serial I/O Through pcAnywhere Port (pcAnywhere 2.00)
entry AH 7Eh
AL I/O function
01h get port input status
02h get port input character
03h output character
04h hang up phone
CX ASCII character to output (fn 03h)
return (if AL=01h)
AX 00h no character ready
01h character is available
(if AL=02h)
AL ASCII code received
Function 7Fh Set Keyboard/Screen Mode (pcAnywhere 2.00)
entry AH 7Fh
AL parameters
00h enable remote keyboard only |
01h enable host keyboard only | keyboard group
02h enable both keyboards |
08h display top 24 lines | screen group
09h display bottom 24 lines |
10h Hayes modem |
11h other modems | modem group
12h direct connect |
Function 0A5h Central Point Software PC-Tools PC-CACHE 6.0 and later
entry AH 0A5h installation check
AL 0FFh
CX 1111h magic number
return CH 00h installed
note DOS Disk Reset call will also flush the cache from mid
version 6 on.
Function 0AFh Central Point Software PC-Tools PC-CACHE 5.x
entry AH 0AFh flush cache
AL 0FFh
CX 0FFFFh magic number
return unknown
note This is safe, even if PC Cache in not installed.
Function 0EDh Borland Turbo Lightning API (partial)
entry AH 0EDh
BH 0EDh
BL function
00h installation check
02h pointer to Lightning internal data structure
low byte
03h pointer to Lightning internal data structure
high byte
04h load auxiliary dictionary
06h autoproof mode
0Fh get number of substitutions (segment)
DS:DI pointer to string to be processed
return AX error code (unknown)
note I've made several attempts to get a copy of the Turbo
Lightning API, which was originally supposed to be available
for developers in 1985. In 1988 Borland sent me a letter
saying they were still working on it. In late 1989 the Borland
rep on BIX told me basically that there were no plans for
releasing the API any more. The information here was dredged
from Chris Dunford's LSPELL.PAS interface into Lighting.
Function 0F0h Set CPU speed (Compaq 386)
entry AH 0F0h set speed
AL speed
00h equivalent to 6 mHz 80286 (COMMON)
01h equivalent to 8 mHz 80286 (FAST)
02h full 16 mHz (HIGH)
03h toggles between 8 MHz-equivalent and speed
set by system board switch (AUTO or HIGH)
04h-07h unknown
08h full 16 MHz except 8 MHz-equivalent during
floppy disk access
09h specify speed directly
CX speed value, 1 (slowest) to 50 (full),
3 ~=8088
return none?
note 1) Used by Compaq DOS MODE command.
Function 0F1h Read Current CPU Speed (Compaq 386)
entry AH 0F1h
return AL speed code (see function 0F0h above)
if AL=09h, CX=speed code
Function 0F2h Determine Attached Keyboard Type (Compaq 386)
entry AH 0F2h
return AL type
00h if 11-bit AT keyboard is in use
01h if 9-bit PC keyboard is in use
Function 0FFh PC-Tools API
entry AH 0FFh
AL 0A5h detect PC-Cache disk cache (ver 5.0 & later)
CH 11h
CL 11h
return CH 00h cache is present
note PC-Tools is a Swiss-army-knife software package with an
editor, DOS shell, cache, disk optimizer, and several other
functions from Central Point Software.
Function 0FFh PC-Tools API
entry AH 0AFh
AL 0AFh flush PC-Cache disk cache (from mid-version-6)
CH 0FFh
CL 0FFh
return none
note PC-Tools is a Swiss-army-knife software package with an
editor, DOS shell, cache, disk optimizer, and several other
functions from Central Point Software.
Function 0FFh 2-The-Max VGA-16 Board
entry AH 0FFh query zoom interrupt
return AL zoom interrupt number
AL+1 old BIOS keyboard handler interrupt number
BX hot key
Function 0FFh Programmer Interface to Carbon Copy Plus (5.0)
entry AH 0FFh
AL 00h check connection between CC and CCHELP
return BL 00h Carbon Copy not connected to CCHELP
01h Carbon Copy is connected to CCHELP
entry AL 01h disconnects and resets the line if the Host
or CC side is connected to CCHELP
entry AL 02h return a pointer to the last phone number
dialed by CC
return ES:DI dword pointer to ASCIIZ phone number string
┌────────────────────────────────────────────────────────────────────┐
│Interrupt 17h Printer 3**10 │
└────────────────────────────────────────────────────────────────────┘
(0:005Ch) Access the parallel printer(s)
AH is changed. All other registers left alone.
Printer ports vary widely in compatibility, since the
original IBM MDA's parallel port did not match its own
spec. Many parallel ports do not use IRQ7 at all.
The parallel port on a monochrome adapter is at 3BCh.
The port on a parallel printer adapter is at 378h or
278h. At boot time, the BIOS looks at them in the
order 3BCh, 378h, 278h, and assigns the first port it
finds to LPT1, the second to LPT2, etc. If you have a
monochrome adapter, LPT1 is probably 3BCh; otherwise,
it is probably 378h.
Function 00h Print Character/send AL to printer DX (0, 1, or 2)
entry AH 00h
AL ASCII character code
DX printer to be used
00h PRN or LPT1
01h LPT2
02h LPT3
return AH status byte
bits 0 time out
1 unused
2 unused
3 I/O error
4 printer selected
5 out of paper
6 acknowledge
7 not busy
Function 01h Initialize Printer
Set init line low, send 0Ch to printer DX
entry AH 01h
DX printer port to be initialized (0,1,2)
return status as below
Function 02h Printer Status
Read status of printer DX into AH
entry AH 02h
DX printer port to be used (0,1,2)
return AH status byte
bits 7 0 busy/paused: the printer cannot
immediately take more data because it
is in the middle of accepting a
character, printing a line, is
offline, or it is in error status.
1 ready
6 ACKnowledge line toggled: reflects the state of
the ACK line on the printer port at the moment the
status was read. ACK is a strobe: it goes low for
a very short time (12 microseconds on an Epson)
when the printer is ready for another character.
As far as printer status is concerned, this is
useless; it's only useful for something like an
interrupt-driven interface. Most of the time,
you'll see ACK high (bit 6 on), but occasionally,
if you check status just after sending a character,
you might see it low. ACK is low when the printer
is powered off.
5 out-of-paper line toggled
4 printer selected: printer is selected, ready,
or, online. There is usually a button on the
printer to control this.
3 I/O error: offline, out of paper or other error
condition such as out of ribbon.
2 unused
1 unused
0 timeout error: printer failed to send ACK and
drop busy after being sent a character.
note 1) You can expect to see these states in a properly functioning
printer:
Normal Offline Power off
====== ======= =========
not busy/paused busy/paused busy/paused
not out of paper not out of paper not out of paper
selected/online not selected/online not selected/online
not I/O error I/O error (usually) I/O error
not timeout error not timeout error not timeout error
2) Not all printers return the status codes properly. That's OK,
not all clone BIOSes do it right either. If your program
depends on the return codes, you might want to make the code
easily patched or configured for nonstandard hardware.
Function 03h Versa-Spool print spooler
entry AH 03h Versa-Spool
AL 00h Return Signature
01h Toggle Pause
02h Clear Buffer
03h Request Pause Condition
04h Request Free Buffer Space
05h Request Total Buffer Size
06h Redirect Output to LPT1
07h Redirect Output to LPT2
08h Redirect Output to LPT3
09h Request Output Device
0Ah Request Output Speed
0Bh Request Device Spooled Status
return (AH=00h) AX 1234h if Versa-Spool is installed
undefined if not installed
(AH=01h) AX 0001h if paused
0000h if resumed
(AH=02h) AX 0302h not cleared
0000h cleared
(AH=03h) AX 0001h if paused
0000h if resumed
(AH=04h) AX remaining buffer space (in Kbytes)
(AH=05h) AX total buffer space (in Kbytes)
(AH=06h) AX nothing
(AH=07h) AX nothing
(AH=08h) AX nothing
(AH=09h) AX printer output (0..2)
(AH=0Ah) AX output speed in CPS
(AH=0Bh) AX 0001h is spooled
0000h otherwise
Function 03h Print String (PC-MOS/386)
Print an entire string with one interrupt call
entry AH 03h
CX number of characters in string
DX printer port number
DS:SI pointer to string
return AH status code (same as PC BIOS)
CX number of characters printed
note 1) Any redirection set up with the MOS ROUTE command or
SPOOL.COM will be in effect.
2) Some serial terminals so not provide printer status feedback.
Function 0C0h PC Magazine PCSPOOL - get printer status
entry AH 0C0h
DX printer port to be used (0,1,2)
return ES:BX address of printer control block
note PC Magazine, January 15, 1991. (Vol 10, Number 1)
Function 0C1h PC Magazine PCSPOOL - add pause to spool queue
entry AH 0C1h
DX printer port to be used (0,1,2)
DS:SI pointer to ASCIIZ string to display
return AH printer status
Function 0C2h PC Magazine PCSPOOL - flush queue record
entry AH 0C2h
DX printer port to be used (0,1,2)
return AH printer status
Function 0C3h PC Magazine PCSPOOL - cancel printer queue
entry AH 0C3h
DX printer port to be used (0,1,2)
return AH printer status
Function 0C4h PC Magazine PCSPOOL - determine of spooler is active
entry AH 0C4h
return DI 0B0BFh if PCSPOOL is loaded
SI segment of the PSP of the active PCSPOOL
┌─────────────────────────────────────────────────────────────────────┐
│Interrupt 18h ROM BASIC 3**11 │
└─────────────────────────────────────────────────────────────────────┘
(0:0060h) Execute ROM BASIC at address 0F600h:0000h
entry no parameters used
return jumps into ROM BASIC on IBM systems
note 1) Often reboots a compatible.
2) Used by Turbo C 1.5. 2.0 and later do not use it.
3) On IBM systems, this interrupt is called if disk boot failure
occurs.
4) Video interrupt on DEC Rainbow.
5) Digital Research's ROM-based implementation of DR-DOS uses int
18h as the initial entry vector into the operating system code.
Note that some clone BIOSes may not properly implement int 18h
in the ROM and use of DR-DOS ROMs may not always work.
6) Maxon 286/HD laptop: called by BIOS power management routines
to communicate with applications.
┌─────────────────────────────────────────────────────────────────────┐
│Interrupt 19h Bootstrap Loader / Extended Memory VDISK ID 3**12 │
└─────────────────────────────────────────────────────────────────────┘
(0:0064h)
entry no parameters used
return none
note 1) Reads track 0, sector 1 into address 0000h:7C00h, then
transfers control to that address. If no diskette drive is
available, scans memory from C:000 to F:000 for a valid hard
disk or other ROM. If none, transfers to ROM-BASIC via int 18h
or displays loader error message.
2) Causes reboot of disk system if invoked while running.
(no memory test performed).
3) If location 0000:0472h does not contain the value 1234h, a
memory test (POST) will be performed before reading the boot
sector.
4) VDISK from DOS 3.0+ traps this vector to determine when the
CPU has shifted from protected mode to real mode. A detailed
discussion can be found by Ray Duncan in PC Magazine, May 30,
1989.
5) Reportedly, some versions of DOS 2.x and all versions of DOS
3.x+ intercept int 19h in order to restore some interrupt
vectors DOS takes over, in order to put the machine back to a
cleaner state for the reboot, since the POST will not be run on
the int 19h. These vectors are reported to be: 02h, 08h, 09h,
0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 70h, 72h, 73h, 74h, 75h, 76h, and 77h.
After restoring these, it restores the original int 19h vector
and calls int 19h.
6) The system checks for installed ROMs by searching memory from
0C000h to the beginning of the BIOS, in 2k chunks. ROM memory
is identified if it starts with the word 0AA55h. It is
followed a one byte field length of the ROM (divided by 512).
If ROM is found, the BIOS will call the ROM at an offset of 3
from the beginning. This feature was not supported in the
earliest PC machines. The last task turns control over to the
bootstrap loader (assuming the floppy controller is
operational).
7) 8255 port 60h bit 0 = 1 if booting from diskette.
8) All IBM BIOSes and most clone BIOSes will try to boot from
floppy A: if no other boot device is present. Some machines
(notably mil-spec Zeniths) have a jumper to prohibit booting
from floppy at all, for "security reasons". Many Tandy
machines will try to boot from drive B: if the F2 key is held
down during POST. With a CompatiCard floppy controller you
can boot off ANY drive.
9) Phoenix BIOSes with password protection enabled use this call
for the password routine.
10) With early versions of DOS 5.0, int 19h fails with EMM386.EXE
loaded and and DOS=HIGH in CONFIG.SYS
┌─────────────────────────────────────────────────────────────────────┐
│Interrupt 1Ah Time of Day 3**13 │
└─────────────────────────────────────────────────────────────────────┘
(0:0068h) 1) Accesses the PC internal clock.
2) This interrupt is not supported on some machines, such
as the HP150 PC.
3) Some "turbo" BIOSes run the clock slower than normal in
order to throw off benchmark software, which usually
uses int 1Ah for timekeeping.
4) Counts occur at the rate of 1193180/65536 counts/sec
(about 18.2 per second).
Function 00h Read System Timer Tick Counter (except PC)
entry AH 00h
return AL 00h if clock was read or written (via AH=0,1)
within the current 24-hour period.
<>0 midnight was passed since last read
CX:DX 32-bit tick count (high 16 bits in CX)
note 1) The returned value is the cumulative number of clock ticks
since midnight. There are 18.2 clock ticks per second, or one
every 54.92ms. When the counter reaches 1,573,040, it is
cleared to zero, and the rollover flag is set.
2) The rollover flag is cleared by this function call, so the
flag will only be returned nonzero once per day.
3) Int 1Ah/fn 01h can be used to set the counter to an arbitrary
32 bit value.
4) This function does not return seconds/100 in DL. The best you
can do is set it to zero (or any value <=99). This means that
your DOS clock could be up to 1 second off from the BIOS
clock, however the effect is not cumulative.
Function 01h Set Clock Tick Counter Value (except PC)
entry AH 01h
CX:DX 32-bit high word/low word count of timer ticks
return none
note 1) The clock ticks are incremented by timer interrupt at 18.2065
times per second or 54.9254 milliseconds/count. Therefore:
counts per second 18 (12h)
counts per minute 1092 (444h)
counts per hour 65543 (10011h)
counts per day 1573040 (1800B0h)
2) The counter is zeroed when system is rebooted.
3) Stores a 32-bit value in the clock tick counter.
4) The rollover flag is cleared by this call.
Function 02h Read Real Time Clock Time
(AT and after)
entry AH 02h
return CH hours in BCD
CL minutes in BCD
DH seconds in BCD
DL 00h standard time
01h daylight savings time
CF 0 if clock running
1 if clock not operating
note 1) Reads the current time from the CMOS time/date chip.
2) Also for Leading Edge Model M.
3) According to Phoenix this call will fail if the BIOS is
"updating" its clock value. You should check the carry flag
and retry if it is set following the call.
Function 03h Set Real Time Clock Time
(AT and after)
entry AH 03h
CH hours in BCD
CL minutes in BCD
DH seconds in BCD
DL 0 (clear) if standard time
1 (set) if daylight savings time option
return none
note 1) Sets the time in the CMOS time/date chip.
2) Also for Leading Edge Model M.
Function 04h Read Real Time Clock Date
(AT and after)
entry AH 04h
return CH century in BCD (19 or 20)
CL year in BCD
DH month in BCD
DL day in BCD
CF 0 (clear) if clock is running
1 (set) if clock is not operating
note 1) Reads the current date from the CMOS time/date chip.
2) Also for Leading Edge Model M.
Function 05h Set Real Time Clock Date
(AT and after)
entry AH 05h
CH century in BCD (19 or 20)
CL year in BCD
DH month in BCD
DL day in BCD
return none
note 1) Sets the date in the CMOS time/date chip.
2) Also for Leading Edge Model M with Leading Edge DOS 2.11.
Function 06h Set Real Time Clock Alarm
(AT and after)
entry AH 06h
CH hours in BCD
CL minutes in BCD
DH seconds in BCD
return CF set if alarm already set or clock inoperable
note 1) Sets alarm in the CMOS date/time chip. Int 4Ah occurs at the
specified alarm time every 24hrs until reset with Int 1Ah
function 07h.
2) A side effect of this function is that the clock chip's
interrupt level (IRQ8) is enabled.
3) Only one alarm may be active at any given time.
4) The program using this function must place the address of its
interrupt handler for the alarm in the vector for Int 4Ah.
Function 07h Reset Real Time Clock Alarm
(AT and after)
entry AH 07h
return none
note 1) Cancels any pending alarm request on the CMOS date/time chip.
2) This function does not disable the clock chip's interrupt
level (IRQ8).
Function 08h Set Real Time Clock Activated Power On Mode
(Convertible)
entry AH 08h
CH hours in BCD
CL minutes in BCD
DH seconds in BCD
Function 09h Read Real Time Clock Alarm Time and Status
(Convertible and PS/2 Model 30)
entry AH 09h
return CH hours in BCD
CL minutes in BCD
DH seconds in BCD
DL alarm status:
00h if alarm not enabled
01h if alarm enabled but will not power up system
02h if alarm will power up system
Function 0Ah Read System-Timer Day Counter
(PS/2)
entry AH 0Ah
return CF set on error
CX count of days since Jan 1,1980
note Returns the contents of the system's day counter.
Function 0Bh Set System-Timer Day Counter
(PS/2)
entry AH 0Bh
CX count of days since Jan 1,1980
return CF set on error
note Stores an arbitrary value in the system's day counter.
Function 80h Set Up Sound Multiplexor
(PCjr) (Tandy 1000?)
entry AH 80h
AL sound source
00h source is 8253 timer chip, channel 2
01h source is cassette input
02h source is I/O channel "audio in" line
03h source is TI sound generator chip
return none
note Sets up the source for tones that will appear on the PCjr's
Audio Out bus line or RF modulator.
Function 81h Get Sound status (Tandy 1000RL)
parameters unknown
Function 82h Input Sound (from the microphone) (Tandy 1000RL)
parameters unknown
Function 83h Output Sound (to the speaker) (Tandy 1000RL)
parameters unknown
Function 84h Stop Sound input and output (Tandy 1000RL)
parameters unknown
Function 1Ah Read Time and Date (AT&T 6300)
entry AH 0FEh
return BX days count (1=Jan 1, 1984)
CH hours
CL minutes
DH seconds
DL hundredths
note Day count in BX is unique to AT&T/Olivetti computers.
┌─────────────────────────────────────────────────────────────────────┐
│Interrupt 1Bh Control-Break 3**14 │
└─────────────────────────────────────────────────────────────────────┘
(0:006Ch) This interrupt is called when the keyboard handler
detects Ctrl and Break pressed at the same time. DOS
normally points this interrupt at its own Ctrl-Break
handler.
note 1) If the break occurred while processing an interrupt, one or
more end of interrupt commands must be send to the 8259
Programmable Interrupt Controller.
2) All I/O devices should be reset in case an operation was
underway at the time.
3) It is normally pointed to an IRET during system initialization
so that it does nothing, but some programs change it to return
a Ctrl-C scan code and thus invoke int 23h.
┌─────────────────────────────────────────────────────────────────────┐
│Interrupt 1Ch Timer Tick 3**15 │
└─────────────────────────────────────────────────────────────────────┘
(0:0070h)
note 1) Taken 18.2065 times per second by the int 08h interrupt.
2) Normally vectors to dummy IRET unless PRINT.COM has been
installed.
3) If an application moves the interrupt pointer, it is the
responsibility of that application to save and restore all
registers that may be modified.
4) returns values at absolute address 40:6x (BIOS Data Area);
number of ticks since midnight
40:6C word timer counter high word
40:6E word timer counter low word
5) Ventura Publisher 2.0 grabs this interrupt and does not pass
subsequent vector reassignments along. This causes problems
with some TSRs and network software.
6) When installing a user interrupt for int 1Ch, the external
interrupts must be disabled before the vector is altered. If a
timer interrupt occurs between the setting of the offset and
segment, an incorrect address will result.
┌─────────────────────────────────────────────────────────────────────┐
│Interrupt 1Dh Vector of Video Initialization Parameters 3**16 │
└─────────────────────────────────────────────────────────────────────┘
(0:0074h) This doubleword address points to 3 sets of 16 bytes
containing data to initialize for video modes for video
modes 0 & 1 (40 column), 2 & 3 (80 column), and 4, 5 &
6 (graphics) on the Motorola 6845 CRT controller chip.
6845 registers:
R0 horizontal total (horizontal sync in characters)
R1 horizontal displayed (characters per line)
R2 horizontal sync position (move display left or right)
R3 sync width (vertical and horizontal pulse: 4-bits each)
R4 vertical total (total character lines)
R5 vertical adjust (adjust for 50 or 60 Hz refresh)
R6 vertical displayed (lines of chars displayed)
R7 vertical sync position (lines shifted up or down)
R8 interlace (bits 4 and 5) and skew (bits 6 and 7)
R9 max scan line addr (scan lines per character row)
R10 cursor start (starting scan line of cursor)
R11 cursor stop (ending scan line of cursor)
R12 video memory start address high byte (6 bits)
R13 video memory start address low byte (8 bits)
R14 cursor address high byte (6 bits)
R15 cursor address low byte (8 bits)
6845 Video Init Tables:
table for modes 0 and 1 \
table for modes 2 and 3 \ each table is 16 bytes long and
table for modes 4,5, and 6 / contains values for 6845 registers
table for mode 7 /
4 words size of video RAM for modes 0/1, 2/3, 4/5, and 6/7
8 bytes number of columns in each mode
8 bytes video controller mode byte for each mode
note 1) There are four separate tables, and all four must be
initialized if all video modes will be used.
2) The power-on initialization code of the computer points this
vector to the ROM BIOS video routines.
3) IBM recommends that if this table needs to be modified, it
should be copied into RAM and only the necessary changes made.
┌─────────────────────────────────────────────────────────────────────┐
│Interrupt 1Eh Vector of Diskette Controller Parameters 3**17 │
└─────────────────────────────────────────────────────────────────────┘
(0:0078h) Dword address points to data base table that is used by
BIOS. Default location is at 0F000:0EFC7h. 11-byte
table format:
bytes:
00h 4-bit step rate, 4-bit head unload time
01h 7-bit head load time, 1-bit DMA flag
02h 54.9254 ms ticks - delay til motor off (36-38
typical)
03h sector size:
00h 128 bytes
01h 256 bytes
02h 512 bytes
03h 1024 bytes
04h last sector on track (8 or 9 typical)
05h inter-sector gap on read/write (42 typical)
06h data length for DMA transfers (0FFh typical)
07h gap length between sectors for format (80 typ)
08h sector fill byte for format (0F6h typical)
09h head settle time (in milliseconds)
(15 to 25 typical)
DOS 1.0 0
DOS 1.10 0
DOS 2.10 15
DOS 3.1 1
0Ah motor start time (in 1/8 sec intervals)
(2-4 typical)
DOS 2.10 2
note 1) This vector is pointed to the ROM BIOS diskette tables on
system initialization
2) IBM recommends that if this table needs to be modified, it
should be copied into RAM and only the necessary changes made.
3) Some versions of DOS 3.2 may contain a bug. DOS 3.2 assumes
that the dword at 0070:0F37 contains the address of the
diskette parameter block and changes values in that block. The
location does contain a copy of the value at 0:78 (int 1Eh,
DISK_POINTER) if DOS is booted from diskette, but when booted
from the hard disk, the location contains 0:0. This leads to
strange things, especially when running under a debugger since
DOS overwrites parts of the interrupt vectors for interrupts 1
to 3. The solution to the problem is to either upgrade to DOS
3.3 or to copy the disk parameter vector to 70:0F37 before
running or at the start of your program.
┌─────────────────────────────────────────────────────────────────────┐
│Interrupt 1Fh Ptr to Graphic Char Extensions (Graphics Set 2) 3**18 │
└─────────────────────────────────────────────────────────────────────┘
(0:007Ch) This is the pointer to data used by the ROM video
routines to display characters above ASCII 127 while in
CGA medium and high res graphics modes.
note 1) Doubleword address points to 1K table composed of 28 8-byte
character definition bit-patterns. First byte of each entry is
top row, last byte is bottom row.
2) The first 128 character patterns are located in system ROM.
3) This vector is set to 000:0 at system initialization.
4) Used by DOS' external GRAFTABL command.