ralf@b.gp.cs.cmu.edu (Ralf Brown) (12/18/88)
rather than called directly
ACh (DV2.2) clear ??? flag
ADh (DV2.2) set ??? flag
AEh ???
AFh set selected field marker character
BYTE character to display at left edge of selected fields
BCh disable use of cursor pad for navigating menus, maybe other???
BDh enable use of cursor pad for navigating menus, maybe other???
BEh disable ???
BFh enable ???
C0h make current window topmost in system
C1h force current process into foreground
C2h make current window topmost in process
C3h position mouse pointer relative to origin of current field
BYTE rows below upper left corner of field
BYTE columns to right of upper left corner of field
C4h position mouse pointer relative to origin of given field
BYTE field number
BYTE rows below upper left corner of field
BYTE columns to right of upper left corner of field
C5h hide current window
C6h show windows for this process
C7h hide all windows for this process
C8h suspend process and hide all its windows
C9h force current process into background
CAh make current window bottom-most in process
CBh ???
CCh close window
CEh reorder windows
DWORD pointer to null-terminated list of words
each word is segment of object handle for a window
MODES 14h to 1Fh "USER STREAMS"
normally NOPs, but may be defined by SETESC message to invoke FAR
routines, one for each mode number
on entry to handler,
DS:SI = first byte of actual stream (not header)
CX = #bytes in stream
ES:DI = window's handle
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SIZEOF" - GET OBJECT SIZE
AH = 12h
BH = 08h
BL = object
00h handle in DWORD on top of stack
timer: elapsed time since timer started
pointer: number of messages queued to pointer object
panel: number of panels in panel file
01h total chars in current task's default window
02h number of messages in task's mailbox (task's handle on stack)
03h number of messages in current task's mailbox
04h number of input buffers queued in task's kbd (handle on stack)
05h number of input buffers queued for current task's default kbd
06h number of objects queued in OBJECTQ (task's handle on stack)
07h number of objects queued in current task's OBJECTQ
Return: DWORD on stack is result
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "LEN" - GET OBJECT LENGTH
AH = 12h
BH = 09h
BL = object
00h handle in DWORD on top of stack
window: chars/line
timer: timer remaining before timer expires
01h number of chars/line in current task's default window
Return: DWORD on top of stack is length
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "ADDTO" - SET OBJECT BITS
AH = 12h
BH = 0Ah
BL = object
00h handle is DWORD on top of stack
window: write characters and attributes
timer: start timer for specified interval
pointer: set control flags
01h write characters and attributes to task's default window
02h send message/status by value to mailbox (task's handle on stack)
03h send message/status by value to current task's default mailbox
04h set control flags on KEYBOARD object (handle on top of stack)
05h set control flags on task's default KEYBOARD object
STACK: (if mailbox) DWORD status
DWORD length of message
DWORD address
(if timer) DWORD duration in 1/100 seconds
(if window) DWORD count of characters
DWORD address of characters
DWORD count of attributes
DWORD address of attributes
(otherwise) DWORD bits to set
For keyboard objects, the bits have the following significance:
bit 15 reserved, can't be set
bit 14 unused
bit 13 reserved, can't be set
bit 12-5 unused
bit 4 filter all keys (used with handler established by SETESC)
bit 3 program continues executing while input in progress
bit 2 insert mode active
bit 1 keyboard is active
bit 0 keyboard is in field mode
For pointer objects, the bits have the following significance:
bit 15 reserved, can't be set
bit 14-8 unused
bit 7 mouse pointer is hidden while in window
bit 6 get messages even if window not topmost
bit 5 get messages even if window not foreground
bit 4 mouse button must be held 1/2 second before it "clicks"
bit 3 pointer position is relative to screen origin, not window origin
bit 2 send message on button release as well as button press
bit 1 unused???
bit 0 send message only on button activity, not movement
DV-specific, and INT 15h/AX=DE0Fh must have been called first
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SUBFROM" - RESET OBJECT BITS
AH = 12h
BH = 0Bh
BL = object
00h handle is DWORD on top of stack
window: write attributes only
mailbox: send message by reference
pointer: reset control flags
01h write attributes only to task's default window
02h send msg/status by reference to mailbox (task's handle on stack)
03h send msg/status by reference to current task's mailbox
04h clear control flags on KEYBOARD object (handle on top of stack)
05h clear control flags on task's default KEYBOARD object
06h remove specific object from OBJECTQ (task's handle on stack)
07h remove specific object from task's default OBJECTQ
STACK: (if mailbox) DWORD status
DWORD length
DWORD address
(if window) DWORD number of attributes to write
DWORD address of attributes
(if objectq) DWORD handle of object to remove
(otherwise) DWORD indicates which bits to clear
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "OPEN" - OPEN OBJECT
AH = 12h
BH = 0Ch
BL = object
00h handle is DWORD on top of stack
window: fill with given character
keyboard: attach to a window
timer: open
pointer: start taking input for window
panel: associate with a panel file
01h fill task's default window with given character
02h open given task's mailbox for input (task's handle on stack)
03h open current task's mailbox
04h attach a KEYBOARD to a window (handle on top of stack)
05h attach task's default KEYBOARD to a window
06h open a task's OBJECTQ (task's handle on top of stack)
07h open current task's OBJECTQ
STACK: (if window) DWORD character to fill with
(if keyboard) DWORD handle of window to attach to
(if pointer) DWORD handle of window to attach to
(if panel) DWORD length of filename
DWORD address of filename
(otherwise) nothing
Notes: special action taken if first byte of panel file name is 1Bh
if first two bytes of panel file "name" are C0hC3h, then the "name" IS
the panel file
result code of open may be retrieved with STATUS message
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "CLOSE" - CLOSE OBJECT
AH = 12h
BH = 0Dh
BL = object
00h handle is DWORD on top of stack
timer: close
keyboard: detach from window
pointer: stop taking input
panel: close
02h close given task's mailbox (task's handle on top of stack)
03h close task's default mailbox
04h close KEYBOARD object (handle on top of stack)
05h close task's default KEYBOARD
06h close givent task's OBJECTQ (task's handle on top of stack)
07h close current task's OBJECTQ
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "ERASE" - ERASE OBJECT
AH = 12h
BH = 0Eh
BL = object
00h handle is DWORD on top of stack
window: clear
keyboard: discard input
timer: cancel current interval
pointer: discard all pending messages
01h clear task's default window
02h discard all queued messages in mailbox (handle on top of stack)
03h discard all queued messages in current task's default mailbox
04h discard all input queued to KEYBOARD (handle on top of stack)
05h discard all input queued to task's default KEYBOARD
06h remove all objects from OBJECTQ (task's handle on top of stack)
07h remove all objects from current task's OBJECTQ
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "STATUS" - GET OBJECT STATUS
AH = 12h
BH = 0Fh
BL = object
00h handle is DWORD on top of stack
timer: is it running?
pointer: return status of last message
panel: verify success of last OPEN or APPLY
02h return status of last msg READ from mailbox (handle on stack)
03h return status of last msg READ from task's default mailbox
04h get status of last msg from task's KEYBOARD (task handle on stk)
05h get status of last msg from task's default KEYBOARD
06h return whether OBJECTQ is open or not (handle on top of stack)
07h return whether task's default OBJECTQ is open or not
Return: DWORD on top of stack is status
Note: if object is a panel object, the status indicates the error code:
14h ???
15h ???
16h invalid panel format
17h panel file already open
95h ???
98h null panel file name
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "EOF" - GET OBJECT EOF STATUS
AH = 12h
BH = 10h
BL = object
00h handle is DWORD on top of stack
01h returns TRUE if logical cursor past end of task's def window
02h return ??? for task's mailbox (task's handle on top of stack)
03h return ??? for current task's mailbox
Return: DWORD on top of stack is status
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "AT" - POSITION OBJECT CURSOR
AH = 12h
BH = 11h
BL = object
00h window's handle is DWORD on top of stack
01h position logical cursor on task's default window
STACK: DWORD column
DWORD row
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SETNAME" - ASSIGN NAME TO MAILBOX
AH = 12h
BH = 11h
BL = mailbox to name
00h DWORD on top of stack is mailbox handle
02h use given task's mailbox (task's handle on top of stack)
03h use current task's default mailbox
STACK: DWORD length of name
DWORD address of name
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SETSCALE" - SET POINTER SCALE FACTOR
AH = 12h
BX = 1100h
STACK: DWORD object handle for pointer object
DWORD number of colums to scale pointer position to
DWORD number of rows to scale pointer position to
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "READN" - GET NEXT N OBJECT BYTES
AH = 12h
BH = 12h
BL = object
00h handle is DWORD on top of stack
01h read next N chars/attributes on task's default window
STACK: DWORD count
Return: STACK: DWORD width of screen line
DWORD address
DWORD count actually read
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "GETSCALE" - GET POINTER SCALE FACTOR
AH = 12h
BX = 1200h
STACK: DWORD object handle for pointer
Return: STACK: DWORD pointer pos scaled as if window were this many colums wide
DWORD pointer pos scaled as if window were this many rows high
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "REDRAW" - REDRAW WINDOW
AH = 12h
BH = 13h
BL = window object
00h DWORD on top of stack is handle for window to redraw
01h redraw task's default window
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SETICON" - SPECIFY POINTER ICON
AH = 12h
BX = 1300h
STACK: DWORD object handle for pointer
DWORD character to use for pointer
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "SETESC" - SET ESCAPE ROUTINE ADDRESS
AH = 12h
BH = 14h
BL = message modifier
00h handle is DWORD on top of stack
01h define user stream
04h intercept keystrokes from KEYBOARD to a window (handle on stack)
05h intercept keystrokes from task's default KEYBOARD to a window
STACK: (if window) DWORD user stream number (14h-1Fh)
DWORD address of FAR user stream handler
(if keyboard) DWORD address of FAR filter function
The keyboard filter function is called when the keyboard is in field mode. On
entry,
AL = character
AH = 0 or extended ASCII code if AL = 0
BX = field number
CH = cursor column
CL = cursor row
DL = field type modifier (sixth item in field table entry)
DH = ??? (seventh item in field table entry)
ES:SI = window's handle
(also, in DV 2.00, DS:DI points to the field table entry. This may change in
other versions)
The filter function should return
AH = 0 use keystroke
1 ignore keystroke
>1 beep and ignore keystroke
---------------------------------------------
INT 15 - TopView - SEND MESSAGE - "LOCK" - REQUEST EXCLUSIVE ACCESS TO RESOURCE
AH = 12h
BH = 14h
BL = object
00h mailbox handle is DWORD on top of stack
02h use given task's mailbox (task's handle on top of stack)
03h use current task's default mailbox
Note: release exclusive access by sending CLOSE message to mailbox
access may be requested multiple times, and requires multiple CLOSEs
---------------------------------------------
INT 15 - DESQview 2.2 - SEND MESSAGE - SET ???
AH = 12h
BH = 15h
BL = object
00h DWORD on top of stack
mailbox, keyboard, or pointer only
02h mailbox for task whose handle is on top of stack
03h mailbox for current task
04h keyboard for task whose handle is on top of stack
05h keyboard for current task
STACK: DWORD ???
Return: nothing
Note: this call is only available if the API level has been set to at least 2.2
---------------------------------------------
INT 15 - DESQview 2.2 - SEND MESSAGE - GET ???
AH = 12h
BH = 16h
BL = object
00h DWORD on top of stack
mailbox, keyboard, or pointer only
02h mailbox for task whose handle is on top of stack
03h mailbox for current task
04h keyboard for task whose handle is on top of stack
05h keyboard for current task
Return: STACK: DWORD ???
Note: this call is only available if the API level has been set to at least 2.2
---------------------------------------------
INT 15 - PRINT.COM - ??? (AT,XT286,PS50+)
AH = 20h
AL = subfunction
00h ???
01h ???
10h setup of SYSREQ routine (OS hook)
11h completion of SYSREQ function (OS hook)
Note: AL = 0,1 set or reset some flags which affect what PRINT does when it
tries to access the disk
---------------------------------------------
INT 15 - SYSTEM - POWER-ON SELF-TEST ERROR LOG (PS50+)
AH = 21h
AL = subfunction
00h read POST log
01h write POST log
BH = device ID
BL = error code
Return: CF set on error
AH = status (00h OK, 01h list full, 80h invalid cmd, 86h unsupported)
if function 00h:
BX = number of error codes stored
ES:DI -> error log
Note: the log is a series of words, the first byte of which identifies the
error code and the second the device.
---------------------------------------------
INT 15 - READ/MODIFY PROFILES (CONVERTIBLE)
AH = 40h
AL = subfunction
0: get system profile in CX and BX
1: set system profile from CX and BX
2: get internal modem profile in BX
3: set internal modem profile from BX
---------------------------------------------
INT 15 - SYSTEM - WAIT ON EXTERNAL EVENT (CONVERTIBLE)
AH = 41h
AL = condition type
bits 0-2: condition to wait for
0 any external event
1 compare and return if equal
2 compare and return if not equal
3 test and return if not zero
4 test and return if zero
bit 3: reserved
bit 4: 1=port address, 0=user byte
bits 5-7: reserved
BH = condition compare or mask value
BL = timeout value times 55 milliseconds
0 means no timeout
DX = I/O port address if AL bit 4 set
ES:DI -> user byte if AL bit 4 clear
---------------------------------------------
INT 15 - SYSTEM - REQUEST POWER OFF (CONVERTIBLE)
AH = 42h
AL = 0 to use system profile
1 to force suspend regardless of system profile
---------------------------------------------
INT 15 - SYSTEM - READ SYSTEM STATUS (CONVERTIBLE)
AH = 43h
Return: AL = status bits
bit 0: LCD detached
bit 1: reserved
bit 2: RS232/parallel adapter powered on
bit 3: internal modem powered on
bit 4: power activated by alarm
bit 5: standby power lost
bit 6: external power in use
bit 7: power low
---------------------------------------------
INT 15 - SYSTEM - (DE)ACTIVATE INTERNAL MODEM POWER (CONVERTIBLE)
AH = 44h
AL = 0 to power off
1 to power on
---------------------------------------------
INT 15 - OS HOOK - KEYBOARD INTERCEPT (AT model 3x9,XT2,XT286,CONV,PS)
AH = 4Fh
AL = scan code
CF set
Return: CF set
AL = scan code
CF clear
scan code should not be used
Note: Called by INT 9 handler to translate scan codes
---------------------------------------------
INT 15 - OS HOOK - DEVICE OPEN (AT,XT2,XT286,PS)
AH = 80h
BX = device ID
CX = process type
Return: CF set on error
AH = status
---------------------------------------------
INT 15 - OS HOOK - DEVICE CLOSE (AT,XT2,XT286,PS)
AH = 81h
BX = device ID
CX = process type
Return: CF set on error
AH = status
---------------------------------------------
INT 15 - OS HOOK - DEVICE PROGRAM TERMINATE (AT,XT2,XT286,PS)
AH = 82h
BX = device ID
Return: CF set on error
AH = status
Note: closes all devices opened with function 80h
---------------------------------------------
INT 15 - SYSTEM - EVENT WAIT (AT,XT286,CONV,PS)
AH = 83h
AL = subservice
0 = set interval
1 = cancel
ES:BX -> event flag (bit 7 set when interval expires)
CX:DX = number of microseconds to wait (only accurate to 977 us)
Return: CF set if function already busy
---------------------------------------------
INT 15 - SYSTEM - READ JOYSTICK (AT,XT2,XT286,PS)
AH = 84h
DX = subservice
0 get switch settings
Return: AL = switch settings (bits 7-4)
1 read joystick inputs
Return: AX = A(x) value
BX = A(y) value
CX = B(x) value
DX = B(y) value
---------------------------------------------
INT 15 - OS HOOK - SYSTEM REQUEST KEY PRESSED (AT,XT2,XT286,CONV,PS)
AH = 85h
AL = 0 press
= 1 release
Return: CF set on error
AH = status
Note: called by keyboard decode routine
---------------------------------------------
INT 15 - SYSTEM - WAIT (AT,XT2,XT286,CONV,PS)
AH = 86h
CX,DX = number of microseconds to wait (only accurate to 977 us)
Return: CF clear: after wait elapses
CF set: immediately due to error
---------------------------------------------
INT 15 - EXTENDED MEMORY - BLOCK MOVE (AT,XT286,PS)
AH = 87h
CX = number of words to move
ES:SI -> global descriptor table
00h-0Fh zero
10h-11h source segment length in bytes (2*CX-1 or greater)
12h-14h 24-bit linear source address
15h access rights byte (93h)
16h-17h zero
18h-19h destination segment length in bytes (2*CX-1 or greater)
1Ah-1Ch 24-bit linear destination address
1Dh access rights byte (93h)
1Eh-2Fh zero
Return: CF set on error
AH = status
00h source copied into destination
01h parity error
02h interrupt error
03h address line 20 gating failed
---------------------------------------------
INT 15 - EXTENDED MEMORY - GET MEMORY SIZE (AT,XT286,PS)
AH = 88h
Return: AX = memory size in K
---------------------------------------------
INT 15 - SYSTEM - SWITCH TO VIRTUAL MODE (AT,XT286,PS50+)
AH = 89h
BL = interrupt number of IRQ0 (IRQ1-7 use next 7 interrupts)
BH = interrupt number of IRQ8 (IRQ9-F use next 7 interrupts)
DS:SI -> GDT for protected mode
offset 0h null descriptor
8h GDT descriptor
10h IDT descriptor
18h DS
20h ES
28h SS
30h CS
38h uninitialized, used to build descriptor for BIOS CS
CX = offset into protected-mode CS to jump to
Return: CF set on error
AH = 0FFh error enabling address line 20
---------------------------------------------
INT 15 - OS HOOK - DEVICE BUSY LOOP (AT,XT2,XT286,CONV,PS)
AH = 90h
AL = type code
00h: disk
01h: diskette
02h: keyboard
03h: PS/2 pointing device
80h: network
FCh: disk reset
FDh: diskette motor start
FEh: printer
ES:BX -> request block for type codes 80h through BFh
Return: CF set if wait time satisfied
CF clear if driver must perform wait
Note: type codes are allocated as follows:
00-7F non-reentrant devices; OS must arbitrate access
80-BF reentrant devices; ES:BX points to a unique control block
C0-FF wait-only calls, no complementary INT 15/AH=91h call
---------------------------------------------
INT 15 - OS HOOK - SET FLAG AND COMPLETE INTERRUPT (AT,XT2,XT286,CONV,PS)
AH = 91h
AL = type code, see AH=90h above
ES:BX -> request block for type codes 80h through BFh
Return: AH = 0
---------------------------------------------
INT 15 - SYSTEM - GET CONFIGURATION (XT after 1/10/86,AT mdl 3x9,CONV,XT286,PS)
AH = C0h
Return: CF set if BIOS doesn't support call
ES:BX -> ROM table
byte_count dw ? ; number of bytes following
model db ? ; PC=ff, XT=fe or fb, PCjr = fd, etc, etc
submodel db ? ; distingushes between AT and XT/286, etc.
BIOS_rev db ? ; 0 for first release, 1 for 2nd, etc.
featbyte db ? ; 80h = DMA channel 3 used by hd BIOS
; 40h = 2nd 8259 installed
; 20h = Real-Time Clock installed
; 10h = INT 15h/AH=4Fh called upon INT 9h
; 8h = wait for external event supported
; 4h = extended BIOS area allocated at 640K
; 2h = bus is Micro Channel instead of PC
; 1h reserved
res1 dw 0
res2 dw 0
Note: the 1/10/86 XT BIOS returns an incorrect value for featbyte.
---------------------------------------------
INT 15 - SYSTEM - RETURN EXTENDED-BIOS DATA-AREA SEGMENT ADDRESS (PS)
AH = C1h
Return: CF set on error
ES = segment of data area
---------------------------------------------
INT 15 - POINTING DEVICE BIOS INTERFACE (PS,DESQview 2.x)
AH = C2h
AL = subfunction
00h enable/disable
BH = 00h disable
01h enable
01h reset
Return: BH = device ID
02h set sampling rate
BH = 00h 10/second
01h 20/second
02h 40/second
03h 60/second
04h 80/second
05h 100/second
06h 200/second
03h set resolution
BH = 00h one count per mm
01h two counts per mm
02h four counts per mm
03h eight counts per mm
04h get type
Return: BH = device ID
05h initialize
BH = data package size (1 - 8 bytes)
06h get/set scaling factor
BH = 00h return device status
Return: BL = status
bit 0: right button pressed
bit 1: reserved
bit 2: left button pressed
bit 3: reserved
bit 4: 0 if 1:1 scaling, 1 if 2:1 scaling
bit 5: device enabled
bit 6: 0 if stream mode, 1 if remote mode
bit 7: reserved
CL = resolution (see function 03h)
DL = sample rate, reports per second
01h set scaling at 1:1
02h set scaling at 2:1
07h set device handler address
ES:BX = user device handler
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
--------------------------------------------
INT 15 - ENABLE/DISABLE WATCHDOG TIMEOUT (PS50+)
AH = C3h
AL = 00h disable
01h enable
BX = timer counter
Return: CF set on error
Note: the watchdog timer generates an NMI
---------------------------------------------
INT 15 - PROGRAMMABLE OPTION SELECT (PS50+)
AH = C4h
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)
---------------------------------------------
INT 15 - DESQview - GET PROGRAM NAME
AX = DE00h
Return: AX = offset into DESQVIEW.DVO of current program's record:
BYTE length of name
N BYTES name
2 BYTES keys to invoke program (second = 00h if only one key used)
WORD ??? (I see 0 always)
BYTE end flag: 00h for all but last entry, which is FFh
---------------------------------------------
INT 15 - DESQview - UPDATE "OPEN WINDOW" MENU
AX = DE01h
Return: nothing
Note: reads DESQVIEW.DVO, disables Open menu if file not in current directory
---------------------------------------------
INT 15 - DESQview - UNIMPLEMENTED IN DV 2.x
AX = DE02h
Return: nothing (NOP in DV 2.x)
---------------------------------------------
INT 15 - DESQview - UNIMPLEMENTED IN DV 2.x
AX = DE03h
Return: nothing (NOP in DV 2.x)
---------------------------------------------
INT 15 - DESQview - GET AVAILABLE COMMON MEMORY
AX = DE04h
Return: BX = bytes of common memory available
CX = largest block available
DX = total common memory in bytes
---------------------------------------------
INT 15 - DESQview - GET AVAILABLE CONVENTIONAL MEMORY
AX = DE05h
Return: BX = K of memory available
CX = largest block available
DX = total conventional memory in K
---------------------------------------------
INT 15 - DESQview - GET AVAILABLE EXPANDED MEMORY
AX = DE06h
Return: BX = K of expanded memory available
CX = largest block available
DX = total expanded memory in K
---------------------------------------------
INT 15 - DESQview - "APPNUM" - GET CURRENT PROGRAM'S NUMBER
AX = DE07h
Return: AX = number of program as it appears on the "Switch Windows" menu
---------------------------------------------
INT 15 - DESQview - GET ???
AX = DE08h
Return: AX = 0 if ??? is not set to the current task
1 if ??? is set to the current task
---------------------------------------------
INT 15 - DESQview - UNIMPLEMENTED IN DV 2.x
AX = DE09h
Return: nothing (NOP in DV 2.x)
---------------------------------------------
INT 15 - DESQview 2.x - "DBGPOKE" - DISPLAY CHARACTER ON STATUS LINE
AX = DE0Ah
BL = character
Return: character displayed, next call will display in next position (which
wraps back to the start of the line if off the right edge of screen)
Notes: displays character on bottom line of *physical* screen, regardless
of current size of window (even entirely hidden)
does not know about graphics display modes, just pokes the characters
into display memory
---------------------------------------------
INT 15 - DESQview 2.x - "APILEVEL" - DEFINE MINIMUM API LEVEL REQUIRED
AX = DE0Bh
BL = API level major version number
BH = API level minor version number
Return: AX = maximum API level???
Note: if the requested API level is greater than the version of DESQview, a
"You need a newer version" error window is popped up
---------------------------------------------
INT 15 - DESQview 2.x - "GETMEM" - ALLOCATE "SYSTEM" MEMORY
AX = DE0Ch
BX = number of bytes
Return: ES:DI -> allocated block
---------------------------------------------
INT 15 - DESQview 2.x - "PUTMEM" - DEALLOCATE "SYSTEM" MEMORY
AX = DE0Dh
ES:DI -> previously allocated block
Return: nothing
---------------------------------------------
INT 15 - DESQview 2.x - FIND MAILBOX BY NAME
AX = DE0Eh
ES:DI -> name to find
CX = length of name
Return: BX = 0 not found
1 found
DS:SI = object handle
---------------------------------------------
INT 15 - DESQview 2.x - ENABLE DESQview EXTENSIONS
AX = DE0Fh
Return: AX and BX destroyed (seems to be bug, weren't saved&restored)
Notes: sends a manager stream with opcodes AEh, BDh, and BFh to task's window
enables an additional mouse mode
---------------------------------------------
INT 15 - DESQview 2.x - "PUSHKEY" - PUT KEY INTO KEYBOARD INPUT STREAM
AX = DE10h
BH = scan code
BL = character
Return: BX = ??? (sometimes, but not always, same as BX passed in)
Note: a later read will get the keystroke as if it had been typed by the user
---------------------------------------------
INT 15 - DESQview 2.x - ENABLE/DISABLE AUTOMATIC JUSTIFICATION OF WINDOW
AX = DE11h
BL = 0 viewport will not move automatically
nonzero viewport will move to keep cursor visible
Return: nothing
---------------------------------------------
INT 15 - DESQview 2.01+ - SET ???
AX = DE12h
BX = 0 clear ??? flag
nonzero set ??? flag
Return: nothing
---------------------------------------------
INT 15 - DESQview 2.2 - GET INVOCATION COUNT
AX = DE13h
Return: BX = number of calls to DESQview still pending completion
---------------------------------------------
INT 15 - DESQview 2.2 - GET OBJECT TYPE
AX = DE14h
ES:DI -> object
Return: BL = 00h not an object
08h window or task
09h mailbox
0Ah keyboard
0Bh timer
0Ch objectq
0Fh pointer
10h panel
---------------------------------------------
INT 15 - DESQview 2.2 - SET ???
AX = DE15h
BL = 0 ???
1 ???
Return: nothing
---------------------------------------------
INT 15 - DESQview 2.2 - GET ???
AX = DE16h
Return: BL = 0 ???
1 ???
Note: returns value set with function DE15h
---------------------------------------------
INT 15 - DESQview 2.2 - reserved
AX = DE17h
Return: pops up "Programming error" window
Note: AX = 1117h is NOT identical to this call
---------------------------------------------
INT 15 - DESQview 2.2 - ???
AX = DE18h
Note: calls video driver (NOP for Hercules driver)
---------------------------------------------
INT 16 - KEYBOARD - READ CHAR FROM BUFFER, WAIT IF EMPTY
AH = 00h
Return: AH = scan code
AL = character
---------------------------------------------
INT 16 - KEYBOARD - CHECK BUFFER, DO NOT CLEAR
AH = 01h
Return: ZF = 0 character in buffer
AH = scan code
AL = character
ZF = 1 no character in buffer
---------------------------------------------
INT 16 - KEYBOARD - GET SHIFT STATUS
AH = 02h
AL = shift status bits
0 = right shift key depressed
1 = left shift key depressed
2 = CTRL depressed
3 = ALT depressed
4 = SCROLL LOCK active
5 = NUM LOCK active
6 = CAPS LOCK active
7 = INSERT state active
---------------------------------------------
INT 16 - KEYBOARD - SET DELAYS (Jr,AT model 339,XT286,PS)
AH = 03h
AL = subfunction
0 reset typematic (PCjr)
1 increase initial delay (PCjr)
2 increase continuing delay (PCjr)
3 increase both delays (PCjr)
4 turn off typematic (PCjr)
5 Set typematic rate (AT or PS/2)
BH = 00 - 03 for delays of 250ms, 500ms, 750ms, or 1s
BL = 00 - 1F for typematic rates of 30cps down to 2cps
---------------------------------------------
INT 16 - KEYBOARD - KEYCLICK (Jr,CONV)
AH = 04h
AL =
0 click off
1 click on
---------------------------------------------
INT 16 - KEYBOARD - WRITE TO KEYBOARD BUFFER (AT model 339,XT2,XT286,PS)
AH = 05h
CH = scan code
CL = character
Return: AL = 1 if buffer full
---------------------------------------------
INT 16 - KEYBOARD - GET ENHANCED KEYSTROKE (AT model 339,XT2,XT286,PS)
AH = 10h
Return: AH = scan code
AL = character
---------------------------------------------
INT 16 - KEYBOARD - CHECK ENHANCED KEYSTROKE (AT model 339,XT2,XT286,PS)
AH = 11h
Return: ZF = 0 if keystroke available
AH = scan code \ meaningless if ZF = 1
AL = character /
ZF = 1 if kbd buffer empty
---------------------------------------------
INT 16 - KEYBOARD - GET ENHANCED SHIFT FLAGS (AT model 339,XT2,XT286,PS)
AH = 12h
Return: AL (same as for AH=02h)
bit 7: Ins ON
bit 6: CapsLock ON
bit 5: NumLock ON
bit 4: ScrollLock ON
bit 3: Either ALT key down
bit 2: Either CTRL key down
bit 1: Left shift key down
bit 0: Right shift key down
AH
bit 7: SysReq key down
bit 6: CapsLock key down
bit 5: NumLock key down
bit 4: ScrollLock key down
bit 3: Right Alt key down
bit 2: Right Ctrl key down
bit 1: Left Alt key down
bit 0: Right Alt key down
---------------------------------------------
INT 16 - Compaq 386 - SET CPU SPEED
AH = F0h
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)
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
---------------------------------------------
INT 16 - Compaq 386 - READ CURRENT CPU SPEED
AH = F1h
Return: AL = speed code (see function F0h above)
if AL = 09h, CX = speed code
---------------------------------------------
INT 16 - Compaq 386 - DETERMINE ATTACHED KEYBOARD TYPE
AH = F2h
Return: AL = type
00h if 11-bit AT keyboard is in use
01h if 9-bit PC keyboard is in use
---------------------------------------------
INT 17 - PRINTER - OUTPUT CHARACTER
AH = 00h
AL = character
DX = printer port (0-3)
Return: AH = status bits
0 = time out
1 = unused
2 = unused
3 = I/O error
4 = selected
5 = out of paper
6 = acknowledge
7 = not busy
---------------------------------------------
INT 17 - PRINTER - INITIALIZE
AH = 01h
DX = printer port (0-3)
Return: AH = status (see AH = 00h above)
---------------------------------------------
INT 17 - PRINTER - GET STATUS
AH = 02h
DX = printer port (0-3)
Return: AH = status (see AH = 00h above)
---------------------------------------------
INT 18 - TRANSFER TO ROM BASIC
causes transfer to ROM-based BASIC (IBM-PC)
often reboots a compatible; often has no effect at all
---------------------------------------------
INT 19 - DISK BOOT
causes reboot of disk system (no memory test performed)
---------------------------------------------
INT 1A - CLOCK - GET TIME OF DAY
AH = 00h
Return: CX:DX = clock count
AL = 0 if clock was read or written (via AH=0,1)
within the current 24-hour period
Otherwise, AL > 0
---------------------------------------------
INT 1A - CLOCK - SET TIME OF DAY
AH = 01h
CX:DX = clock count
Return: time of day set
---------------------------------------------
INT 1A - CLOCK - READ REAL TIME CLOCK (AT,XT286,CONV,PS)
AH = 02h
Return: CH = hours in BCD
CL = minutes in BCD
DH = seconds in BCD
---------------------------------------------
INT 1A - CLOCK - SET REAL TIME CLOCK (AT,XT286,CONV,PS)
AH = 03h
CH = hours in BCD
CL = minutes in BCD
DH = seconds in BCD
DL = 1, if daylight savings; 0 if standard time
Return: CMOS clock set
---------------------------------------------
INT 1A - CLOCK - READ DATE FROM REAL TIME CLOCK (AT,XT286,CONV,PS)
AH = 04h
Return: DL = day in BCD
DH = month in BCD
CL = year in BCD
CH = century (19h or 20h)
---------------------------------------------
INT 1A - CLOCK - SET DATE IN REAL TIME CLOCK (AT,XT286,CONV,PS)
AH = 05h
DL = day in BCD
DH = month in BCD
CL = year in BCD
CH = century (19h or 20h)
Return: CMOS clock set
---------------------------------------------
INT 1A - CLOCK - SET ALARM (AT,XT286,CONV,PS)
AH = 06h
CH = hours in BCD
CL = minutes in BCD
DH = seconds in BCD
Return: CF set if alarm already set or clock inoperable
INT 4Ah will be called when alarm goes off, every 24 hours until reset
---------------------------------------------
INT 1A - CLOCK - RESET ALARM (AT,XT286,CONV,PS)
AH = 07h
Return: alarm disabled
---------------------------------------------
INT 1A - CLOCK - SET RTC ACTIVATED POWER ON MODE (CONVERTIBLE)
AH = 08h
CH = hours in BCD
CL = minutes in BCD
DH = seconds in BCD
---------------------------------------------
INT 1A - CLOCK - READ RTC ALARM TIME AND STATUS (CONV,PS30)
AH = 09h
Return: CH = hours in BCD
CL = minutes in BCD
DH = seconds in BCD
DL = alarm status
0 alarm not enabled
1 alarm enabled but will not power up system
2 alarm will power up system
---------------------------------------------
INT 1A - CLOCK - READ SYSTEM-TIMER DAY COUNTER (XT2,PS)
AH = 0Ah
Return: CF set on error
CX = count of days since Jan 1,1980
---------------------------------------------
INT 1A - CLOCK - SET SYSTEM-TIMER DAY COUNTER (XT2,PS)
AH = 0Bh
CX = count of days since Jan 1,1980
Return: CF set on error
---------------------------------------------
INT 1A - PCjr - SET UP SOUND MULTIPLEXOR
AH = 80h
AL = 0 source is 8253 channel 2
1 source is cassette input
2 source is I/O channel "Audio IN"
3 source is sound generator chip
---------------------------------------------
INT 1A - AT&T 6300 - READ TIME AND DATE
AH = FEh
Return: BX = day count (1 = Jan 1, 1984)
CH = hour
CL = minute
DH = second
DL = hundredths
---------------------------------------------
INT 1B - CTRL-BREAK KEY
This interrupt is called when the keyboard scanner of the IBM
machines detects CTRL and BREAK pressed at the same time. It
normally points to a short routine in DOS which sets the
Ctrl-C flag, thus invoking INT 23h the next time DOS checks
for Ctrl-C.
---------------------------------------------
INT 1C - CLOCK TICK
This interrupt is called (in the IBM) at the end of each time-update
operation by the time-of-day routines. It normally points to an IRET.
---------------------------------------------
INT 1D -> 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
---------------------------------------------
INT 1E -> DISKETTE PARAMS (BASE TABLE)
(Default at F000:EFC7 in PC and most compatibles)
DB step rate & head unload times
DB head load time & DMA
DB motor off time in clock ticks (36 or 37 typical)
DB sector size in bytes (0->128, 1->256, 2->512, 3->1024)
DB last sector number (8 or 9 typical)
DB inter-sector gap size on read/write (42 typical)
DB data transfer length (255 typical)
DB inter-sector gap size on format (80 typical)
DB sector fill on format (F6h typical)
DB head-settle time ms (typical 25, 1.10->0, 2.10->15, 3.10->1)
DB motor start-up time (1/8 secs) (typical 4, 2.10->2)
---------------------------------------------
INT 1F -> GRAPHICS SET 2
(NOT a vector!) pointer to bitmaps for high 128 chars
---------------------------------------------
INT 20 - Minix - SEND/RECEIVE MESSAGE
AX = process ID of other process
BX -> message
CX = 1 send
2 receive
3 send&receive
Note: the message contains the system call number (numbered as in V7 Unix(tm))
and the call parameters
---------------------------------------------
INT 20 - DOS - PROGRAM TERMINATION
returns to DOS--identical to INT 21/AH=00h
---------------------------------------------
INT 21 - DOS - PROGRAM TERMINATION
AH = 00h
Return: never
---------------------------------------------
INT 21 - DOS - KEYBOARD INPUT
AH = 01h
Return: AL = character read
Note: ^C/^Break are checked, and INT 23h executed if read
character is echoed to standard output
---------------------------------------------
INT 21 - DOS - DISPLAY OUTPUT
AH = 02h
DL = character to send to standard output
Note: ^C/^Break are checked, and INT 23h executed if pressed
---------------------------------------------
INT 21 - DOS - AUX INPUT
AH = 03h
Return: AL = character read
---------------------------------------------
INT 21 - DOS - AUX OUTPUT
AH = 04h
DL = character to send
---------------------------------------------
INT 21 - DOS - PRINTER OUTPUT
AH = 05h
DL = character to print
---------------------------------------------
INT 21 - DOS - DIRECT CONSOLE I/O CHARACTER OUTPUT
AH = 06h
DL = character <> FFh
---------------------------------------------
INT 21 - DOS - DIRECT CONSOLE I/O CHARACTER INPUT
AH = 06h
DL = 0FFh
Return: ZF set = no character
ZF clear = character recieved
AL = character
Notes: Character is echoed to STDOUT if received.
^C/^Break are NOT checked
---------------------------------------------
INT 21 - DOS - DIRECT STDIN INPUT, NO ECHO
AH = 07h
Note: same as function 06h for input but char not echoed
---------------------------------------------
INT 21 - DOS - KEYBOARD INPUT, NO ECHO
AH = 08h
Return: AL = character
Note: same as function 07h, but ^C/^Break are checked
---------------------------------------------
INT 21 - DOS - PRINT STRING
AH = 09h
DS:DX = address of string terminated by "$"
Note: ^C/^Break checked, and INT 23h called if pressed
---------------------------------------------
INT 21 - DOS - BUFFERED KEYBOARD INPUT
AH = 0Ah
DS:DX = address of buffer
Note: first byte of buffer must contain maximum length
on entry, second byte contains actual length of previous line which may
be recalled with the DOS line-editing commands
on return the second byte contains actual length, third and
subsequent bytes contain the input line
---------------------------------------------
INT 21 - DOS - CHECK STANDARD INPUT STATUS
AH = 0Bh
Return: AL = FFh if character available
00h if no character
Note: ^C/^Break checked, and INT 23h called if pressed
---------------------------------------------
INT 21 - DOS - CLEAR KEYBOARD BUFFER
AH = 0Ch
AL must be 1, 6, 7, 8, or 0Ah.
Notes: Flushes all typeahead input, then executes function specified by AL
(effectively moving it to AH and repeating the INT 21 call).
If AL contains a value not in the list above, the keyboard buffer is
flushed and no other action is taken.
---------------------------------------------
INT 21 - DOS - DISK RESET
AH = 0Dh
Note: Flushes all disk buffers.
---------------------------------------------
INT 21 - DOS - SELECT DISK
AH = 0Eh
DL = new default drive number (0 = A, 1 = B, etc.)
Return: AL = number of logical drives
---------------------------------------------
INT 21 - DOS - OPEN DISK FILE
AH = 0Fh
DS:DX = address of FCB
Return: AL = 00h file found
FFh file not found
Note: (DOS 3.x) file opened in compatibility mode
---------------------------------------------
INT 21 - DOS - CLOSE DISK FILE
AH = 10h
DS:DX = address of FCB
Return: AL = 00h directory update successful
FFh file not found in directory
---------------------------------------------
INT 21 - DOS - SEARCH FIRST USING FCB
AH = 11h
DS:DX = address of FCB
Return: AL = status
00h file found
FFh file not found
Note: If file found, FCB is created at DTA address and set up to
OPEN or DELETE it.
---------------------------------------------
INT 21 - DOS - SEARCH NEXT USING FCB
AH = 12h
DS:DX = address of FCB
Return: AL = status
00h file found
FFh file not found
Note: If file found, FCB is created at DTA address and set up to
OPEN or DELETE it.
---------------------------------------------
INT 21 - DOS - DELETE FILE via FCB
AH = 13h
DS:DX = address of FCB with filename field filled with template for
deletion ('?' wildcard allowed)
Return: AL = status
00h file found
FFh file not found
---------------------------------------------
INT 21 - DOS - SEQUENTIAL DISK FILE READ
AH = 14h
DS:DX = address of FCB
Return: AL = status
0 successful read
1 end of file
2 data transfer area too small
3 partial record, EOF
---------------------------------------------
INT 21 - DOS - SEQUENTIAL DISK RECORD WRITE
AH = 15h
DS:DX = address of FCB
Return: AL = status
0 successful write
1 disk full
2 data transfer area too small
---------------------------------------------
INT 21 - DOS - CREATE A DISK FILE
AH = 16h
DS:DX = address of FCB
Return: AL = status
00h successful creation
FFh directory full
Note: if file already exists, it is truncated to zero length
---------------------------------------------
INT 21 - DOS - RENAME FILE via FCB
AH = 17h
DS:DX = address of FCB
FCB contains new name starting at byte 17h.
Return: AL = status
00h file found
FFh file not found
---------------------------------------------
INT 21 - DOS internal - UNUSED
AH = 18h
Return: AL = 0
---------------------------------------------
INT 21 - DOS - GET DEFAULT DISK NUMBER
AH = 19h
Return: AL = current drive number (letter - 'A')
---------------------------------------------
INT 21 - DOS - SET DISK TRANSFER AREA ADDRESS
AH = 1Ah
DS:DX = address of buffer
---------------------------------------------
INT 21 - DOS - ALLOCATION TABLE INFORMATION
AH = 1Bh
Return: DS:BX points to FAT ID byte for default drive
DX = number of allocation units on disk
AL = number of sectors per allocation unit (cluster)
CX = number of bytes per sector
---------------------------------------------
INT 21 - DOS - ALLOCATION TABLE INFORMATION FOR SPECIFIC DEVICE
AH = 1Ch
DL = Drive Number to check
Return: DS:BX points to FAT ID byte
DX = number of allocation units on disk
AL = number of sectors per allocation unit (cluster)
CX = number of bytes per sector
---------------------------------------------
INT 21 - DOS internal - UNUSED
AH = 1Dh
Return: AL = 0
---------------------------------------------
INT 21 - DOS internal - UNUSED
AH = 1Eh
Return: AL = 0
---------------------------------------------
INT 21 - DOS internal - GET DEFAULT DRIVE PARAMETER BLOCK
AH = 1Fh
Return: AL = 00h No Error
FFh Error
DS:BX -> drive parameter block
Note: for DOS 2.x and 3.x, this just invokes function 32h with DL = 0
---------------------------------------------
INT 21 - DOS internal - UNUSED
AH = 20h
Return: AL = 0
---------------------------------------------
INT 21 - DOS - RANDOM DISK RECORD READ
AH = 21h
DS:DX = address of FCB
Return: AL = status
0 successful read
1 end of file
2 data transfer area too small
3 partial record, EOF
---------------------------------------------
INT 21 - DOS - RANDOM DISK RECORD WRITE
AH = 22h
DS:DX = address of FCB
Return: AL = status (see AH = 21h above)
---------------------------------------------
INT 21 - DOS - GET FILE SIZE
AH = 23h
DS:DX = address of unopened FCB with filename and record size fields
initialized
Return: AL = status
00h file found
FFh file not found
Note: FCB's random-record field set to number of records (rounded up)
---------------------------------------------
INT 21 - DOS - SET RANDOM RECORD FIELD
AH = 24h
DS:DX = address of FCB
Return: Random Record Field of FCB is set to be same as Current Block
and Current Record.
Note: FCB must be OPEN already
---------------------------------------------
INT 21 - DOS - SET INTERRUPT VECTOR
AH = 25h
AL = interrupt number
DS:DX = new vector to be used for specified interrupt
---------------------------------------------
INT 21 - DOS - CREATE PSP
AH = 26h
DX = Segment number to set up PSP at
Return: Current PSP is copied to specified segment
Note: new PSP is updated with memory size information; INTs 22h, 23h, 24h
taken from interrupt vector table
---------------------------------------------
INT 21 - DOS - RANDOM BLOCK READ
AH = 27h
DS:DX = address of FCB
CX = number of records to be read
Return: AL = status
0 successful read
1 end of file
2 data transfer area too small
3 partial record, EOF
---------------------------------------------
INT 21 - DOS - RANDOM BLOCK WRITE
AH = 28h
DS:DX = address of FCB
CX = number of records to be written
if zero, truncate file to current random file position
Return: AL = status
0 successful write
1 disk full
2 data transfer area too small
---------------------------------------------
INT 21 - DOS - PARSE FILENAME
AH = 29h
DS:SI -> string to parse
ES:DI -> buffer to fill with unopened FCB
AL = bit mask to control parsing
0 = 0: parsing stops if file separator found
1: leading separator ignored
1 = 0: drive number in FCB set to default drive if not present
in string
1: drive number in FCB not changed
2 = 0: filename in FCB set to blanks if no filename in string
1: filename in FCB not changed if string does not contain
a filename
3 = 0: extension in FCB set to blanks if no extension in string
1: extension left unchanged
Return: AL = 00h: no wildcards in name or extension
01h: wildcards appeared
FFh: drive specifier invalid
DS:SI -> first byte after parsed string
ES:DI buffer filled with unopened FCB
---------------------------------------------
INT 21 - DOS - GET CURRENT DATE
AH = 2Ah
Return: DL = day
DH = month
CX = year
AL = day of the week (0=Sunday, 1=Monday, etc.)
---------------------------------------------
INT 21 - DOS - SET CURRENT DATE
AH = 2Bh
DL = day
DH = month
CX = year
Return: AL = 00h if no error
= FFh if bad value sent to routine
Note: DOS 3.3 also sets CMOS clock
---------------------------------------------
INT 21 - DESQview - INSTALLATION CHECK
AH = 2Bh
AL = subfunction (DV v2.00+)
01h get version
Return: BX = version (BH = major, BL = minor)
Note: early copies of v2.00 return 0002h
02h get shadow buffer info, and start shadowing
Return: BH = rows in shadow buffer
BL = columns in shadow buffer
DX = segment of shadow buffer
04h get shadow buffer info
Return: BH = rows in shadow buffer
BL = columns in shadow buffer
DX = segment of shadow buffer
05h stop shadowing
CX = 4445h ('DE')
DX = 5351h ('SQ')
Return: AL = FFh if DESQview not installed
Note: in DESQview v1.x, there were no subfunctions; this call only identified
--