----------------------------------------------------------- Release 88.6 Last edited 7/6/88 ----------------------------------------------------------- If you know any information which is not in this list, or which is incorrect, please let me know! Ralf Brown ARPA: ralf@cs.cmu.edu UUCP: {ucbvax,harvard,uunet}!cs.cmu.edu!ralf BIT: ralf%cs.cmu.edu@cmuccvma FIDO: Ralf Brown at 1:129/31 ----------------------------------------------------------- ---cut---cut---cut---cut---cut---cut---cut---cut---cut---cut--- ----------------------------------------------------------- Key to system abbreviations (unless otherwise indicated, a function is available on all systems) PC IBM PC XT IBM PC XT PORT IBM PC Portable (uses same BIOS as XT) Jr IBM PCjr AT IBM PC AT XT2 IBM PC XT 2 XT286 IBM PC XT/286 CONV IBM Convertible PS IBM PS/2, any model PS30 IBM PS/2 Model 30 and below PS50+ IBM PS/2 Model 50,60,80 CGA Color Graphics Adapter EGA Enhanced Graphics Adapter VGA Video Graphics Array MCGA Multi-Color Graphics Array TopView TopView/DESQview/TaskView/other TopView-compatible environments ------------------------------------------------------ Microsoft, MS, MS DOS, OS/2 are trademarks of Microsoft Corp. IBM, PC, PCjr, PC/XT, PC/AT, XT/286, PS/2, TopView are trademarks of IBM Corp. Compaq is a registered trademark of Compaq Corp. Tandy 1000 is a registered trademark of Tandy Corp. DESQview is a trademark of Quarterdeck Office Systems TaskView is a trademark of Sunny Hill Software Various other names are trademarks of their respective companies ----------------------------------------------------------- INT 00 - HARDWARE - DIVIDE ERROR Automatically called at end of DIV or IDIV operation that results in error. or overflow. Normally set by DOS to display an error message and abort the program. ----------------------------------------------------------- INT 01 - HARDWARE - SINGLE-STEP Generated at end of each machine instruction if TF bit in FLAGS is set. This is what makes the T command of DEBUG work for single-stepping. It is not generated after MOV to segment register or POP of segment register (unless you have a very early 8088 with a microcode bug). ----------------------------------------------------------- INT 02 - HARDWARE -NMI (NON-MASKABLE INTERRUPT) Generated by NMI signal in hardware. This signal has various uses: Parity error: all except Jr and CONV Coprocessor interrupt: all except Jr and CONV Keyboard interrupt: Jr, CONV I/O channel check: CONV, PS50+ Disk-controller power-on request: CONV System suspend: CONV Real-time clock: CONV System watch-dog timer, time-out interrupt: PS50+ DMA timer time-out interrupt: PS50+ ----------------------------------------------------------- INT 03 - HARDWARE - 1-BYTE INTERRUPT Generated by opcode CCh. Similar to 8080's RST instruction. Generally used to set breakpoints for DEBUG. Also used by Turbo Pascal versions 1,2,3 when {$U+} specified ----------------------------------------------------------- INT 04 - HARDWARE - OVERFLOW Generated by INTO instruction if OF flag is set. If flag is not set, INTO is effectively a NOP. Used to trap any arithmetic errors before the erroneous results propagate further through the computation. ----------------------------------------------------------- INT 05 - PRINT-SCREEN KEY Automatically called by keyboard scan when print-screen key is pressed. Normally executes routine to print the screen, but may call any routine that can safely be executed from inside the keyboard scanner. Status and result byte for default handler is at address 0050:0000. ----------------------------------------------------------- INT 05 - BOUND CHECK FAILED (80186/80286 internal interrupt) Generated by BOUND instruction when the value to be tested is less than the indicated lower bound or greater than the indicated upper bound. ----------------------------------------------------------- INT 06 - UNDEFINED OPCODE (80286 internal interrupt) ----------------------------------------------------------- INT 07 - NO MATH UNIT AVAILABLE (80286 internal interrupt) ----------------------------------------------------------- INT 08 thru 0F - VECTORED HARDWARE LINES In IBM, these 8 interrupts are generated in response to IRQ 0 through IRQ 7 (if enabled via port 21h). [Tandy 1000] [Adapters] IRQ0 - timer interrupt IRQ1 - keyboard interrupt IRQ2 - EGA vertical retrace [fixed disk] [TOPS&PCnet default] IRQ3 - serial port 2 (com2:) [TOPS&PCnet alternate] IRQ4 - serial port 1 (com1:) IRQ5 - fixed disk (PC/AT: LPT2) [60 Hz ram refresh] IRQ6 - diskette interrupt IRQ7 - PPI interrupt (lpt1:, lpt2:) ----------------------------------------------------------- INT 08 - DOUBLE FAULT (80286 protected-mode internal) Called when multiple exceptions occur on one instruction, or an exception occurs in an exception handler. If an exception occurs in the double fault handler, the CPU goes into SHUTDOWN mode (which circuitry in the PC/AT converts to a reset). ----------------------------------------------------------- INT 09 - MATH UNIT PROTECTION FAULT (80286 protected-mode internal) ----------------------------------------------------------- INT 0A - INVALID TASK STATE SEGMENT (80286 protected-mode internal) ----------------------------------------------------------- INT 0B - NOT PRESENT (80286 protected-mode internal) Generated when loading a segment register if the segment descriptor indicates that the segment is not currently in memory. ----------------------------------------------------------- INT 0C - STACK FAULT (80286 protected-mode internal) Generated on stack overflow/underflow. Note that the 80286 will shut down in real mode if SP=1 before a push. ----------------------------------------------------------- INT 0D - GENERAL PROTECTION VIOLATION (80286 internal interrupt) Called in real mode when an instruction attempts to access a word operand located at offset FFFFh ----------------------------------------------------------- INT 0E - PAGE FAULT (80386 native-mode internal interrupt) ----------------------------------------------------------- INT 10 - VIDEO - SET VIDEO MODE AH = 00h AL = mode (graphics mode if graphics resolution listed) text pixel graphic color disp scrn system resol box resoltn page addr 00h = 40x25 8x8 B&W 8 B800 CGA 01h = 40x25 8x8 16 8 B800 CGA 02h = 80x25 8x8 B&W 4 B800 CGA 8 B800 EGA/MCGA/VGA 03h = 80x25 8x8 16 4 B800 CGA 8 B800 EGA/MCGA/VGA 04h = 40x25 8x8 320x200 4 1 B800 CGA 05h = 40x25 8x8 320x200 4 gray 1 B800 CGA 06h = 80x25 8x8 640x200 B&W 1 B800 CGA 07h = 80x25 8x14 mono 1 B000 MDA/Hercules 8 EGA/VGA 08h = 20x25 160x200 16 B800 PCjr/Tandy 1000 09h = 40x25 320x200 16 B800 PCjr/Tandy 1000 0Ah = 80x25 640x200 4 B800 PCjr/Tandy 1000 0Bh = reserved (used internally by EGA BIOS) 0Ch = reserved (used internally by EGA BIOS) 0Dh = 40x25 320x200 16 8 A000 EGA/VGA 0Eh = 80x25 640x200 16 4 A000 EGA/VGA 0Fh = 80x25 640x350 mono 2 A000 EGA/VGA 10h = 80x25 640x350 4or16 2 A000 EGA/VGA 11h = 80x30 640x480 mono A000 VGA/MCGA 12h = 80x30 640x480 16 A000 VGA 13h = 40x24 320x200 256 A000 VGA/MCGA 18h = 132x44 8x8 mono Tseng Labs EVA 19h = 132x25 8x14 mono Tseng Labs EVA 1Ah = 132x28 8x13 mono Tseng Labs EVA 22h = 132x44 8x8 ??? Tseng, Ahead 23h = 132x25 6x14 ??? Tseng Labs EVA = 132x25 8x14 ??? Ahead Systems EGA2001 24h = 132x28 6x13 ??? Tseng Labs EVA 25h = 80x60 8x8 640x480 ??? Tseng Labs EVA = 640x480 16 VEGA VGA 26h = 80x60 8x8 ??? Tseng Labs EVA = 80x60 8x8 640x480 ??? Ahead Systems EGA2001 27h = 720x512 16 VEGA VGA 28h = ???x??? VEGA VGA 29h = 800x600 16 VEGA VGA 2Dh = 640x350 256 VEGA VGA 2Eh = 640x480 256 VEGA VGA 2Fh = 720x512 256 VEGA VGA 30h = 800x600 256 VEGA VGA = ???x??? ??? AT&T 6300 36h = 960x720 16 VEGA VGA 37h = 1024x768 16 VEGA VGA 40h = 640x400 2 B800 AT&T 6300 41h = 640x200 16 AT&T 6300 42h = 640x400 16 AT&T 6300 43h = unsupported 640x200 of 640x400 viewport AT&T 6300 44h = disable VDC and DEB output AT&T 6300 48h = 80x50 640x400 2 B800 AT&T 6300 50h = 132x25 9x14 mono Ahead Systems EGA2001 = 80x30 8x16 640x480 16 Paradise EGA-480 51h = 80x30 8x16 ??? Paradise EGA-480 52h = 132x44 9x8 mono Ahead Systems EGA2001 54h = 132x43 8x8 ??? Paradise EGA-480 55h = 132x25 8x14 ??? Paradise EGA-480 56h = 132x43 8x8 3??? 2 B000 NSI Smart EGA+ 57h = 132x25 8x14 3??? 4 B000 NSI Smart EGA+ 58h = 800x600 16 Paradise VGA 5Eh = 640x400 256 Paradise VGA,VEGA VGA 5Fh = 640x480 256 Paradise VGA 60h = 80x??? ???x400 ??? Corona/Cordata BIOS v4.10+ 61h = ???x400 ??? Corona/Cordata BIOS v4.10+ 71h = 100x35 8x16 800x600 16of64 A000 NSI Smart EGA+ 74h = 640x400 ??? Toshiba 3100 82h = 80x25 B&W AT&T VDC overlay mode * 83h = 80x25 ??? AT&T VDC overlay mode * 86h = 640x200 B&W AT&T VDC overlay mode * C0h = 640x400 2/prog pallet AT&T VDC overlay mode * C4h = disable output AT&T VDC overlay mode * D0h = 640x400 2 DEC VAXmate AT&T mode ??? = 640x225 ??? Z-100 ??? = 640x400 ??? Z-100 * for AT&T VDC overlay modes, BL contains the DEB mode, which may be 06h, 40h, or 44h Note: IBM standard modes do not clear the screen if the high bit of AL is set ----------------------------------------------------------- INT 10 - VIDEO - SET CURSOR CHARACTERISTICS AH = 01h CH bits 0-4 = start line for cursor in character cell bits 5-6 = blink attribute (00=normal, 01=invisible, 10=slow, 11=fast) CL bits 0-4 = end line for cursor in char. cell ----------------------------------------------------------- INT 10 - VIDEO - SET CURSOR POSITION AH = 02h DH,DL = row, column (0,0 = upper left) BH = page number 0 in graphics modes 0-3 in modes 2&3 0-7 in modes 0&1 ----------------------------------------------------------- INT 10 - VIDEO - READ CURSOR POSITION AH = 03h BH = page number 0 in graphics modes 0-3 in modes 2&3 0-7 in modes 0&1 Return: DH,DL = row,column CH = cursor start line CL = cursor end line ----------------------------------------------------------- INT 10 - VIDEO - READ LIGHT PEN POSITION (all but PS) AH = 04h Return: AH = 0: light pen switch not activated AH = 1: light pen values in registers DH,DL = row,column of current position CH = raster line (0-199) (EGA) old graphics modes CX = (EGA) raster line (0-nnn) new graphics modes BX = pixel column (0-319 or 0-639) ----------------------------------------------------------- INT 10 - VIDEO - SELECT DISPLAY PAGE AH = 05h AL = 0-7: new page value for modes 0 & 1 0-3: new page value for modes 2 & 3 80h: read CRT/CPU page registers [PCjr only] 81h: set CPU page register to value in BL [PCjr only] 82h: set CRT page register to value in BH [PCjr only] 83h: set both display registers to values in BH, BL [PCjr only] {Corona/Cordata BIOS v4.10+} 0: set address of graphics bitmap buffer (video modes 60h,61h) BX = segment of buffer 0Fh: get address of graphics bitmap buffer (video modes 60h,61h) Return: BH = CRT page register (if AL >= 80h) BL = CPU page register (if AL >= 80h) DX = segment of graphics bitmap buffer (video modes 60h,61h; AL=0Fh) ----------------------------------------------------------- INT 10 - VIDEO - SCROLL PAGE UP AH = 06h AL = number of lines to scroll window (0 = blank whole window) BH = attributes to be used on blanked lines CH,CL = row,column of upper left corner of window to scroll DH,DL = row,column of lower right corner of window ----------------------------------------------------------- INT 10 - VIDEO - SCROLL PAGE DOWN AH = 07h AL = number of lines to scroll window (0 = blank whole window) BH = attributes to be used on blanked lines CH,CL = row,column of upper left corner of window to scroll DH,DL = row,column of lower right corner of window ----------------------------------------------------------- INT 10 - VIDEO - READ ATTRIBUTES/CHARACTER AT CURSOR POSITION AH = 08h BH = display page Return: AL = character AH = attribute of character (alpha modes) ----------------------------------------------------------- INT 10 - VIDEO - WRITE ATTRIBUTES/CHARACTERS AT CURSOR POS AH = 09h AL = character BH = display page BL = attributes of char (alpha modes) or color (graphics modes) if bit 7 == 1 in graphics mode, character is xor'ed onto screen CX = number of times to write character Note: all characters are displayed, including CR, LF, and BS ----------------------------------------------------------- INT 10 - VIDEO - WRITE CHARACTERS ONLY AT CURSOR POS AH = 0Ah AL = character BH = display page - alpha mode BL = color of character (graphics mode, PCjr only) if bit 7 == 1 in graphics mode, character is xor'ed onto screen CX = number of times to write character (EGA) in graphics modes, replication count in CX works correctly only if all character written are contains on the same row Note: all characters are displayed, including CR, LF, and BS ----------------------------------------------------------- INT 10 - VIDEO - SET COLOR PALETTE AH = 0Bh BH = 0 BL = border color (0-15) (text modes) border color and background color (graphics modes) (EGA) BL = border color (0-15) and high-intensity background color (16-31??? maybe should be high nybble?) BH = 1 BL = palette (0-3) ----------------------------------------------------------- INT 10 - VIDEO - WRITE DOT ON SCREEN AH = 0Ch AL = color of dot (0/1 in mode 6, 0-3 in modes 4 and 5) if bit 7 set, new color will be XORed with current pixel BH = display page (ignored if mode only supports one page) DX = row (0 - 199 CGA) CX = column (0 - 319 in modes 4/5/13, 0 - 639 in modes 6/14/15/16) Note: only valid in graphics modes ----------------------------------------------------------- INT 10 - VIDEO - READ DOT ON SCREEN AH = 0Dh BH = display page (ignored if mode only supports one page) CX = column (0 - 319 or 639) DX = row (0 - 199) Return: AL = color read Note: only valid in graphics modes ----------------------------------------------------------- INT 10 - VIDEO - WRITE CHARACTER AND ADVANCE CURSOR (TTY WRITE) AH = 0Eh AL = character BH = display page (alpha modes) BL = foreground color (graphics modes) ----------------------------------------------------------- INT 10 - VIDEO - GET CURRENT VIDEO MODE AH = 0Fh Return: AH = number of columns on screen AL = current video mode (see INT 10h/AH=00h) BH = current active display page ----------------------------------------------------------- INT 10 - VIDEO - SET PALETTE REGISTERS (Jr, PS, TANDY 1000, EGA, VGA) AH = 10h AL = 00h: set palette register BL = palette register to set BH = color value to store (on MCGA, only BX = 0712h is supported) AL = 01h: set border color register BH = color value to store AL = 02h: set all palette registers and overscan ES:DX = pointer to 17-byte list bytes 0-15 = values for palette regs. 0-15 byte 16 = value for border color register (EGA/VGA/MCGA) AL = 03h: toggle intensity/blinking bit BL = 0: enable intensity BL = 1: enable blink (VGA/MCGA) AL = 07h: read individual palette register (VGA only) BL = palette register number Return: BH = palette register value AL = 08h: read overscan (border color) register (VGA only) Return: BH = value AL = 09h: read all palette registers and overscan register (VGA only) ES:DX = buffer address (17 bytes) AL = 10h: set individual DAC register BX = register number CH = new value for green (0-63) CL = new value for blue (0-63) DH = new value for red (0-63) AL = 12h: set block of DAC registers BX = starting color register CX = number of registers to set ES:DX = Table of 3*CX bytes where each 3 byte group represents one byte each of red, green and blue (0-63) AL = 13h: select video DAC color page (VGA only) BL = 00h Select paging mode BH = 00h Select 4 blocks of 64 BH = 01h Select 16 blocks of 16 BL = 01h Select Page BH = page number (00h to 03h) or (00h to 0Fh) AL = 15h: read individual DAC register BL = palette register number Return: DH = red value CH = green value CL = blue value AL = 17h: read block of DAC registers BX = starting palette register CX = number of palette registers to read ES:DX = buffer (3 * CX bytes in size) Return: CX number of red, green and blue triples in buffer AL = 18h *UNDOCUMENTED* set PEL mask BL = new PEL value AL = 19h *UNDOCUMENTED* read PEL mask BL = value read AL = 1Ah: read video DAC color-page state (VGA only) Return: BL = paging mode BH = current page AL = 1Bh: perform gray-scale summing BX = starting palette register CX = number of registers to convert ----------------------------------------------------------- INT 10 - VIDEO - TOGGLE INTENSITY/BLINKING BIT (Jr, PS, TANDY 1000, EGA, VGA) AX = 1003h BL = 00h: enable intensity = 01h: enable blink ----------------------------------------------------------- INT 10 - VIDEO - TEXT-MODE CHARACTER GENERATOR FUNCTIONS (PS, EGA, VGA) AH = 11h The following functions will cause a mode set, completely resetting the video environment, but without clearing the video buffer AL = 00h, 10h: load user-specified patterns ES:BP = pointer to user table CX = count of patterns to store DX = character offset into map 2 block BL = block to load in map 2 BH = number of bytes per character pattern AL = 01h, 11h: load ROM monochrome patterns (8 by 14) BL = block to load AL = 02h, 12h: load ROM 8 by 8 double-dot patterns BL = block to load AL = 03h: set block specifier BL = block specifier (EGA/MCGA) bits 0,1 = block selected by chars with attribute bit 3 = 0 bits 2,3 = block selected by chars with attribute bit 3 = 1 (VGA) bits 0,1,4 = block selected by attribute bit 3 = 0 bits 2,3,5 = block selected by attribute bit 3 = 1 AL = 04h, 14h: load ROM 8x16 character set (VGA) The routines called with AL=1xh are designed to be called only immediately after a mode set and are similar to the routines called with AL=0xh, except that: Page 0 must be active. Bytes/character is recalculated. Max character rows is recalculated. CRT buffer length is recalculated. CRTC registers are reprogrammed as follows: R09 = bytes/char-1 ; max scan line (mode 7 only) R0A = bytes/char-2 ; cursor start R0B = 0 ; cursor end R12 = ((rows+1)*(bytes/char))-1 ; vertical display end R14 = bytes/char ; underline loc (*** BUG: should be 1 less ***) The following functions are meant to be called only after a mode set: AL = 20h: user 8 by 8 graphics characters (INT 1Fh) ES:BP = pointer to user table AL = 21h: user graphics characters ES:BP = pointer to user table CX = bytes per character BL = row specifier 0: user set DL = number of rows 1: 14 rows 2: 25 rows 3: 43 rows AL = 22h: ROM 8 by 14 set BL = row specifier AL = 23h: ROM 8 by 8 double dot BL = row specifier AL = 24h: load 8x16 graphics characters (VGA) ----------------------------------------------------------- INT 10 - VIDEO - GET FONT INFORMATION (EGA, MCGA, VGA) AX = 1130h BH = pointer specifier 0: INT 1Fh pointer 1: INT 44h pointer 2: ROM 8 by 14 character font pointer 3: ROM 8 by 8 double dot font pointer 4: ROM 8 by 8 DD font (top half) 5: ROM alpha alternate (9 by 14) pointer Return: ES:BP = specified pointer value CX = bytes/character DL = character rows on screen ----------------------------------------------------------- INT 10 - VIDEO - ALTERNATE FUNCTION SELECT (PS, EGA, VGA, MCGA) AH = 12h BL = 10h: return EGA information Returns: BH = 0: color mode in effect (3Dx) 1: mono mode in effect (3Bx) BL = 0: 64k bytes memory installed 1: 128k bytes memory installed 2: 192k bytes memory installed 3: 256k bytes memory installed CH = feature bits CL = switch settings BL = 20h: select alternate print screen routine BL = 30h: select vertical resolution for alphanumeric modes (VGA only) AL = 00h 200 scan lines 01h 350 scan lines 02h 400 scan lines Return: AL = 12h if function supported BL = 31h: enable/disable default palette loading (VGA/MCGA) AL = 00h enable default palette loading 01h disable default palette loading Return: AL = 12h if function was supported BL = 32h: enable/disable video addressing (VGA/MCGA) AL = 00h enable video 01h disable video Return: AL = 12h if function was supported BL = 33h: enable/disable default gray-scale summing (VGA/MCGA) AL = 00h enable gray scale summing 01h disable gray scale summing Return: AL = 12h if function was supported BL = 34h: enable/disable alphanumeric cursor emulation (VGA only) AL = 00h enable cursor emulation 01h disable cursor emulation Return: AL = 12h if function was supported BL = 35h: PS/2 display-switch interface AL = 00h initial adapter video off 01h initial planar video on 02h switch active video off 03h switch inactive video on 80h *UNDOCUMENTED* set system board video active flag ES:DX = buffer (128 byte save area if AL = 0, 2 or 3) Return: AL = 12h if function was supported BL = 36h: video refresh control (VGA/PS) AL = 00h enable refresh 01h disable refresh Return: AL = 12h if function supported ----------------------------------------------------------- INT 10 - VIDEO - WRITE STRING (AT,XT286,PS,EGA,VGA) AH = 13h AL = mode bit 0: set in order to move cursor after write bit 1: set if string contains alternating characters and attributes BL = attribute if AL bit 1 clear BH = display page number DH,DL = row,column of starting cursor position CX = length of string ES:BP = pointer to start of string Note: recognizes CR, LF, BS, and bell ----------------------------------------------------------- INT 10 - VIDEO - LOAD LCD CHARACTER FONT (CONVERTIBLE) AH = 14h AL = 0 load user-specified font ES:DI = pointer to character font BH = number of bytes per character BL = 0: load main font (block 0) 1: load alternate font (block 1) CX = number of characters to store DX = character offset into RAM font area AL = 1 load system rom default font BL = 0: load main font (block 0) 1: load alternate font (block 1) AL = 2 set mapping of LCD high intensity attributes BL = 0: ignore high intensity attribute 1: map high intensity to underscore 2: map high intensity to reverse video 3: map high intensity to selected alternate font ----------------------------------------------------------- INT 10 - VIDEO - GET PHYSICAL DISPLAY PARAMETERS (CONVERTIBLE) AH = 15h Return: AX = alternate display adapter type ES:DI = pointer to parameter table word 0: monitor model number 1: vertical pixels per meter 2: horizontal pixels per meter 3: total vertical pixels 4: total horizontal pixels 5: horizontal pixel separation in micrometers 6: vertical pixel separation in micrometers ----------------------------------------------------------- INT 10 - VIDEO - DISPLAY COMBINATION (PS,VGA/MCGA) AH = 1Ah AL = 0: read display combination code Return: BL = active display code BH = alternate display code 1: set display combination code BL = active display code BH = alternate display code Return: AL = 1Ah if function was supported Display combination codes: 00h no display 01h monochrome adapter w/ monochrome display 02h CGA w/ color display 03h reserved 04h EGA w/ color display 05h EGA w/ monochrome display 06h PGA w/ color display 07h VGA w/ monochrome analog display 08h VGA w/ color analog display 09h reserved 0Ah MCGA w/ digital color display 0Bh MCGA w/ monochrome analog display 0Ch MCGA w/ color analog display FFh unknown display type ----------------------------------------------------------- INT 10 - VIDEO - FUNCTIONALITY/STATE INFORMATION (PS,VGA/MCGA) AH = 1Bh BX = implementation type = 0000h return funtionality/state information ES:DI = pointer to 64 byte buffer Return: AL = 1Bh if function supported ES:DI buffer filled 00h address of static funtionality table 04h video mode in effect 05h number of columns 07h length of regen buffer in bytes 09h starting address of regen buffer 0Bh cursor position for page 0 0Dh cursor position for page 1 0Fh cursor position for page 2 11h cursor position for page 3 13h cursor position for page 4 15h cursor position for page 5 17h cursor position for page 6 19h cursor position for page 7 1Bh cursor type 1Dh active display page 1Eh CRTC port address 20h current setting of register (3?8) 21h current setting of register (3?9) 22h number of rows 23h bytes/character 25h DCC of active display 26h DCC of alternate display 27h number of colors supported in current mode 29h number of pages supported in current mode 2Ah number of scan lines active (0,1,2,3) = (200,350,400,480) 2Bh primary character block 2Ch secondary character block 2Dh Miscellaneous flags bit 0 all modes on all displays on 1 gray summing on 2 monochrome display attached 3 default palette loading disabled 4 cursor emulation enabled 5 0 = intensity; 1 = blinking 6 reserved 7 reserved 2Eh to 30h reserved 31h video memory available 00h = 64K, 01h = 128K, 02h = 192K, 03h = 256K 32h save pointer state flags bit 0 512 character set active 1 dynamic save area present 2 alpha font override active 3 graphics font override active 4 palette override active 5 DCC override active 6 reserved 7 reserved 33h to 3Fh reserved State Functionality Table format (16 bytes) 00h modes supported #1 bit 0 to bit 7 = 1 modes 0,1,2,3,4,5,6 supported 01h modes supported #2 bit 0 to bit 7 = 1 modes 8,9,A,B,C,D,E,F supported 02h modes supported #3 bit 0 to bit 3 = 1 modes 10,11,12,13 supported bit 4 to bit 7 reserved 03h to 06h reserved 07h scan lines supported bit 0 to bit 2 = 1 if scan lines 200,350,400 supported 08h total number of character blocks available in text modes 09h maximum number of active character blocks in text modes 0Ah miscellaneous function flags #1 bit 0 all modes on all displays function supported 1 gray summing function supported 2 character font loading function supported 3 default palette loading enable/disable supported 4 cursor emulation function supported 5 EGA palette present 6 color palette present 7 color paging function supported 0Bh miscellaneous function flags #2 bit 0 light pen supported 1 save/restore state function 1Ch supported 2 intensity blinking function supported 3 Display Combination Code supported 4-7 reserved 0Ch to 0Dh reserved 0Eh Save pointer function flags bit 0 512 character set supported 1 dynamic save area supported 2 alpha font override supported 3 graphics font override supported 4 palette override supported 5 DCC extension supported 6 reserved 7 reserved 0Fh reserved ----------------------------------------------------------- INT 10 - VIDEO - SAVE/RESTORE VIDEO STATE (PS50+,VGA) AH = 1Ch CX = requested states bit 0 video hardware 1 BIOS data areas 2 color registers and DAC state 3-15 reserved AL = 0: return state buffer size Return: BX = number of 64 byte blocks needed 1: save video state ES:BX = buffer address 2: restore video state ES:BX = buffer address of previously saved state Return: AL = 1Ch if function supported ----------------------------------------------------------- INT 10 - VIDEO - SET GRAPHICS MODE (Hercules GRAFIX) AH = 40h ----------------------------------------------------------- INT 10 - VIDEO - SET TEXT MODE (Hercules GRAFIX) AH = 41h ----------------------------------------------------------- INT 10 - VIDEO - CLEAR CURRENT PAGE (Hercules GRAFIX) AH = 42h ----------------------------------------------------------- INT 10 - VIDEO - SELECT DRAWING PAGE (Hercules GRAFIX) AH = 43h AL = Page number (0,1) ----------------------------------------------------------- INT 10 - VIDEO - SELECT DRAWING FUNCTION (Hercules GRAFIX) AH = 44h AL = 0 : Clear pixels AL = 1 : Set pixels AL = 2 : Invert pixels ----------------------------------------------------------- INT 10 - VIDEO - SELECT PAGE TO DISPLAY (Hercules GRAFIX) AH = 45h AL = Page number (0,1) ----------------------------------------------------------- INT 10 - VIDEO - DRAW ONE PIXEL (Hercules GRAFIX) AH = 46h DI = x (0-720) BP = y (0-347) Note: Function 44h determines operation and function 43h which page to use. ----------------------------------------------------------- INT 10 - VIDEO - FIND PIXEL VALUE (Hercules GRAFIX) AH = 47h DI = x (0-720) BP = y (0-347) Return: AL = 0 Pixel clear AL = 1 Pixel set Note: Function 43h specifies page that is used. ----------------------------------------------------------- INT 10 - VIDEO - MOVE TO POINT (Hercules GRAFIX) AH = 48h DI = x (0-720) BP = y (0-347) ----------------------------------------------------------- INT 10 - VIDEO - DRAW TO POINT (Hercules GRAFIX) AH = 49h DI = x (0-720) BP = y (0-347) Note: Function 48h or 49h specify first point, 44h operation and 43h page to use. ----------------------------------------------------------- INT 10 - VIDEO - BLOCK FILL (Hercules GRAFIX) AH = 4Ah ----------------------------------------------------------- INT 10 - VIDEO - DISPLAY CHARACTER (Hercules GRAFIX) AH = 4Bh AL = Character to display DI = x (0-720) BP = y (0-347) Note: Unlike the other BIOS character functions character position is specified in pixels rather than rows and columns. ----------------------------------------------------------- INT 10 - VIDEO - DRAW ARC (Hercules GRAFIX) AH = 4Ch ----------------------------------------------------------- INT 10 - VIDEO - DRAW CIRCLE (Hercules GRAFIX) AH = 4Dh ----------------------------------------------------------- INT 10 - VIDEO - FILL AREA (Hercules GRAFIX) AH = 4Eh ----------------------------------------------------------- INT 10 - Direct Graphics Interface Standard (DGIS) - INQUIRE AVAILABLE DEVICES AX = 6A00h BX = 0 CX = 0 DX = buffer length (may be 0) ES:DI = address of buffer Return: BX = number of bytes stored in buffer CX = bytes required for all descriptions (0 if no DGIS) Note: buffer contains descriptions and addresses of DGIS-compatible display(s) and printer(s) ----------------------------------------------------------- INT 10 - DGIS - REDIRECT CHARACTER OUTPUT AX = 6A01h CX = 0 ES:DI = address of device to send INT 10 output to Return: CX = 0 output could not be redirected else INT 10h output now routed to requested display ----------------------------------------------------------- INT 10 - DGIS - INQUIRE INT 10 OUTPUT DEVICE AX = 6A02h ES:DI = 0:0 Return: ES:DI = 0:0 if current display is non-DGIS else address of the current DGIS INT 10 display ----------------------------------------------------------- INT 10 - VIDEO - SET VIDEO MODE (VEGA EXTENDED EGA/VGA) AX = 6F05h BL = mode (graphics mode if graphics resolution listed) text pixel graphic color disp scrn system resol box resoltn page addr 62h = 800x600 16 VEGA Extended EGA 65h = 1024x768 16 VEGA Extended EGA 66h = 640x400 256 VEGA Extended VGA 67h = 640x480 256 VEGA Extended VGA 68h = 720x540 256 VEGA Extended VGA 69h = 800x600 256 VEGA Extended VGA ------------------------------------------------------ INT 10 - VIDEO - GET VIDEO RAM ADDRESS (TANDY 1000) AH = 70h Return: AX = segment address of the following [BX] = offset address of green plane [CX] = segment address of green plane [DX] = segment address of red/blue plane (red offset = 0, blue offset = 4000) ----------------------------------------------------------- INT 10 - VIDEO - GET INCRAM ADDRESSES (TANDY 1000) AH = 71h Return: AX = segment address of the following [BX] = segment address of INCRAM [CX] = offset address of INCRAM ----------------------------------------------------------- INT 10 - VIDEO - SCROLL SCREEN RIGHT (TANDY 1000) AH = 72h AL = number of columns blanked at left of window 0 = blank entire window BH = attributes to be used on blank columns CH,CL = row, column of upper left corner of window DH,DL = row, column of lower right corner ---------------------------------------------------------- INT 10 - VIDEO - SCROLL SCREEN LEFT (TANDY 1000) AH = 73h AL = number of columns blanked at right of window 0 = blank entire window BH = attributes to be used on blank columns CH,CL = row, column of upper left corner of window DH,DL = row, column of lower right corner ----------------------------------------------------------- INT 10 - VIDEO (DESQview) - ??? AH = 80h DX = 4456h ('DV') ES:DI = pointer to ??? Return: DS = segment of DESQview data structure for video buffer Note: this function is probably meant for internal use only, due to the magic value required in DX ----------------------------------------------------------- INT 10 - VIDEO (DESQview) - ??? AH = 81h DX = 4456h Return: ES = segment of DESQview data structure for video buffer BYTE ES:[0] = current window number Note: this function is probably meant for internal use only, due to the magic value required in DX ----------------------------------------------------------- INT 10 - VIDEO (DESQview) - ??? AH = 82h DX = 4456h Return: DS = segment in DESQview for ??? ES = segment of DESQview data structure for video buffer AL = current window number AH = ??? BL = direct screen writes 0 program does not do direct writes 1 program does direct writes, so shadow buffer not usable BH = ??? CL = ??? CH = ??? Note: this function is probably meant for internal use only, due to the magic value required in DX ----------------------------------------------------------- INT 10 - Microsoft Mouse driver EGA support - READ ONE REGISTER AH = F0h BH = 00h BL = pointer for pointer/data chips Pointer/data chips 00h CRTC (3B4h mono modes, 3D4h color modes) 08h Sequencer 3C4h 10h Graphics Controller 3CEh 18h Attribute Controller 3C0h Single registers 20h Miscellaneous Output register 3C2h 28h Feature Control register (3BAh mono modes, 3DAh color modes) 30h Graphics 1 Position register 3CCh 38h Graphics 2 Position register 3CAh DX = port number Return: BL = data ----------------------------------------------------------- INT 10 - Microsoft Mouse driver EGA support - WRITE ONE REGISTER AH = F1h BH = 00h BL = pointer for pointer/data chips Pointer/data chips 00h CRTC (3B4h mono modes, 3D4h color modes) 08h Sequencer 3C4h 10h Graphics Controller 3CEh 18h Attribute Controller 3C0h Single registers 20h Miscellaneous Output register 3C2h 28h Feature Control register (3BAh mono modes, 3DAh color modes) 30h Graphics 1 Position register 3CCh 38h Graphics 2 Position register 3CAh DX = port number Return: BL = data ----------------------------------------------------------- INT 10 - Microsoft Mouse driver EGA support - READ REGISTER RANGE AH = F2h CH = starting pointer value CL = Number of registers (>1) DX = port number 00h CRTC (3B4h mono modes, 3D4h color modes) 08h Sequencer 3C4h 10h Graphics Controller 3CEh 18h Attribute Controller 3C0h ES:BX buffer size of CL ----------------------------------------------------------- INT 10 - Microsoft Mouse driver EGA support - WRITE REGISTER RANGE AH = F3h CH = starting pointer value CL = Number of registers (>1) DX = port number 00h CRTC (3B4h mono modes, 3D4h color modes) 08h Sequencer 3C4h 10h Graphics Controller 3CEh 18h Attribute Controller 3C0h ES:BX buffer size of CL ----------------------------------------------------------- INT 10 - Microsoft Mouse driver EGA support - READ REGISTER SET AH = F4h CX = number of registers (>1) ES:BX address of table of records in this format: bytes 1-2 port number Pointer/data chips 00h CRTC (3B4h mono modes, 3D4h color modes) 08h Sequencer 3C4h 10h Graphics Controller 3CEh 18h Attribute Controller 3C0h Single registers 20h Miscellaneous Output register 3C2h 28h Feature Control register (3BAh mono modes, 3DAh color) 30h Graphics 1 Position register 3CCh 38h Graphics 2 Position register 3CAh byte 3 pointer value (0 for single registers) byte 4 EGA Register Interface returns data here ----------------------------------------------------------- INT 10 - Microsoft Mouse driver EGA support - READ REGISTER SET AH = F5h CX = number of registers (>1) ES:BX address of table of records in this format: bytes 1-2 port number Pointer/data chips 00h CRTC (3B4h mono modes, 3D4h color modes) 08h Sequencer 3C4h 10h Graphics Controller 3CEh 18h Attribute Controller 3C0h Single registers 20h Miscellaneous Output register 3C2h 28h Feature Control register (3BAh mono modes, 3DAh color) 30h Graphics 1 Position register 3CCh 38h Graphics 2 Position register 3CAh byte 3 pointer value (0 for single registers) byte 4 EGA Register Interface writes data here ---------------------------------------------------------- INT 10 - Microsoft Mouse driver EGA support - REVERT TO DEFAULT REGISTERS AH = F6h ---------------------------------------------------------- INT 10 - Microsoft Mouse driver EGA support - DEFINE DEFAULT REGISTER TABLE AH = F7h DX = port number Pointer/data chips 00h CRTC (3B4h mono modes, 3D4h color modes) 08h Sequencer 3C4h 10h Graphics Controller 3CEh 18h Attribute Controller 3C0h Single registers 20h Miscellaneous Output register 3C2h 28h Feature Control register (3BAh mono modes, 3DAh color modes) 30h Graphics 1 Position register 3CCh 38h Graphics 2 Position register 3CAh ES:BX address of table of one byte entries, one byte to be written to each register ---------------------------------------------------------- INT 10 - Microsoft Mouse driver EGA support - INTERROGATE DRIVER AH = FAh BX = 0 Return: BX = 0 if mouse driver not present ES:BX pointer to EGA Register Interface version number, if present: byte 1 = major release number byte 2 = minor release number ---------------------------------------------------------- INT 10 - VIDEO (TopView) - GET VIDEO BUFFER AH = FEh ES:DI = segment:offset of assumed video buffer Return: ES:DI = segment:offset of actual video buffer ----------------------------------------------------------- INT 10 - VIDEO (TopView) - UPDATE REAL SCREEN FROM VIDEO BUFFER AH = FFh CX = number of sequential characters that have been modified DI = offset of first character that has been modified ES = segment of video buffer Note: avoid CX=0 ----------------------------------------------------------- INT 11 - EQUIPMENT DETERMINATION Return: AX = equipment flag bits 0 diskette installed 1 8087 present 2 mouse installed (PS2 only) 2,3 number of 16K banks of RAM on motherboard (PC only) number of 64K banks of RAM on motherboard (XT only) always = 11 on AT and above 4,5 initial video mode 01 = 40x25 color 10 = 80x25 color 11 = 80X25 IBM monochrome 6,7 number of diskette drives (only if bit 0 = 1) 00 = 1, 01 = 2, 10 = 3, 11 = 4 8 0 = dma present, 1 = no dma on system (PCjr???) 9-11 number of RS232 cards 12 game I/O attached 13 serial printer installed (IBM-PCjr) internal modem installed (Convertible) 14,15 number of printers ----------------------------------------------------------- INT 12 - MEMORY SIZE Return: AX = number of contiguous 1K blocks of memory ----------------------------------------------------------- INT 13 - DISK - RESET DISK SYSTEM AH = 00h DL = drive (if bit 7 is set both hard disks and floppy disks reset) ----------------------------------------------------------- INT 13 - DISK - STATUS OF DISK SYSTEM AH = 01h DL = drive (hard disk if bit 7 set) Return: AL = status 00h = successful completion 01h = bad command 02h = address mark not found 03h = write attempted on write-protected disk 04h = sector not found 05h = reset failed (hard disk) 06h = diskette changed 07h = parameter act. failed (hard disk) 08h = DMA overrun 09h = DMA across 64K boundary 0Ah = bad sector detected (hard disk) 0Bh = bad track detected (hard disk) 0Ch = unsupported track 0Dh = invalid number of sectors on format (hard disk) 0Eh = control data address mark detected (hard disk) 0Fh = DMA arbitration error (hard disk) 10h = bad CRC/ECC 11h = data ECC corrected 20h = controller failure 40h = seek failed 80h = time out AAh = drive not ready (hard disk) BBh = undefined error (hard disk) CCh = write fault (hard disk) E0h = status register error (hard disk) FFh = sense operation failed (hard disk) ----------------------------------------------------------- INT 13 - DISK - READ SECTORS INTO MEMORY AH = 02h AL = number of sectors to read CH = track (for hard disk, bits 8,9 in high bits of CL) CL = sector DH = head DL = drive ES:BX = address of buffer to fill Return: CF = set if error occurred AH = status (see AH=1 above) AL = number of sectors read ----------------------------------------------------------- INT 13 - DISK - WRITE SECTORS FROM MEMORY AH = 03h AL = number of sectors to write CH = track (if hard disk, bits 8,9 in high bits of CL) CL = sector (if hard disk, high two bits are high bits of track #) DH = head DL = drive ES:BX = address of buffer Return: CF = set if error occurred AH = status (see AH=1 above) AL = number of sectors written ----------------------------------------------------------- INT 13 - DISK - VERIFY SECTORS AH = 04h AL = number of sectors to verify CH = track (for hard disk, bits 8,9 in high bits of CL) CL = sector DH = head DL = drive Return: CF = set if error occurred AH = status (see AH=1 above) AL = number of sectors verified ----------------------------------------------------------- INT 13 - FLOPPY - FORMAT TRACK AH = 05h AL = number of sectors to create on this track CH = track CL = sector DH = head DL = drive ES:BX = pointer to array of 4-byte address fields byte 1 = track byte 2 = head byte 3 = sector byte 4 = bytes/sector 0=128, 1=256, 2=512, 3=1024 Return: CF set if error occurred AH = status code (see AH=1 above) ----------------------------------------------------------- INT 13 - FIXED DISK - FORMAT TRACK AH = 05h AL = interleave value (XT only) ES:BX = 512-byte format buffer the first 2*(sectors/track) bytes contain F,N for each sector F = 00 for good sector, 80h for bad sector N = sector number CH = cylinder number (bits 8,9 in high bits of CL) CL = sector number DH = head DL = drive Return: AH = status code (see AH=1 above) ----------------------------------------------------------- INT 13 - FIXED DISK - FORMAT TRACK AND SET BAD SECTOR FLAGS (XT,PORT) AH = 06h AL = interleave value CH = cylinder number (bits 8,9 in high bits of CL) CL = sector number DH = head DL = drive Return: AH = status code (see AH=1 above) ----------------------------------------------------------- INT 13 - FIXED DISK - FORMAT DRIVE STARTING AT GIVEN TRACK (XT,PORT) AH = 07h AL = interleave value (XT only) ES:BX = 512-byte format buffer, see AH=6 above CH = cylinder number (bits 8,9 in high bits of CL) CL = sector number DH = head DL = drive Return: AH = status code (see AH=1 above) ----------------------------------------------------------- INT 13 - DISK - GET CURRENT DRIVE PARAMETERS (XT,AT,XT286,CONV,PS) AH = 08h DL = drive number Return: CF set on error AH = status code (see AH=1 above) BL = drive type (see AH=17h below) (AT/PS2 floppies only) DL = number of consecutive acknowledging drives DH = maximum value for head number CL = maximum value fo sector number CH = maximum value for cylinder number ES:DI = drive parameter table ----------------------------------------------------------- INT 13 - FIXED DISK - INITIALIZE TWO FIXED DISK BASE TABLES (XT,AT,XT286,PS) AH = 09h Return: CF set on error AH = status code (see AH=1 above) INT 41h points to table for drive 0 INT 46h points to table for drive 1 ----------------------------------------------------------- INT 13 - FIXED DISK - READ LONG (XT,AT,XT286,PS) AH = 0Ah DL = drive ID DH = head CH = cylinder (bits 8,9 in high bits of CL) CL = sector ES:BX = pointer to buffer to fill Return: CF set on error AH = status code (see AH=1 above) AL = number of sectors read Note: used for diagnostics only on PS/2 systems ----------------------------------------------------------- INT 13 - FIXED DISK - WRITE LONG (XT,AT,XT286,PS) AH = 0Bh DL = drive ID DH = head CH = cylinder (bits 8,9 in high bits of CL) CL = sector ES:BX = pointer to buffer containing data Return: CF set on error AH = status code (see AH=1 above) AL = number of sectors written Note: used for diagnostics only on PS/2 systems ----------------------------------------------------------- INT 13 - FIXED DISK - SEEK TO CYLINDER (XT,AT,XT286,PS) AH = 0Ch DL = drive ID DH = head CH = cylinder (bits 8,9 in high bits of CL) Return: CF set on error AH = status code (see AH=1 above) ----------------------------------------------------------- INT 13 - FIXED DISK - ALTERNATE DISK RESET (XT,PORT,AT,XT286,PS) AH = 0Dh DL = drive ID Return: CF set on error AH = status code (see AH=1 above) ----------------------------------------------------------- INT 13 - FIXED DISK - READ SECTOR BUFFER (XT,PORT,PS) AH = 0Eh ES:BX = pointer to buffer Return: CF set on error AH = status code (see AH=1 above) Notes: transfers controller's sector buffer. No data is read from the drive used for diagnostics only on PS/2 systems ----------------------------------------------------------- INT 13 - FIXED DISK - WRITE SECTOR BUFFER (XT,PORT,PS) AH = 0Fh ES:BX = pointer to buffer Return: CF set on error AH = status code (see AH=1 above) Notes: should be called before formatting to initialize the controller's sector buffer. used for diagnostics only on PS/2 systems ----------------------------------------------------------- INT 13 - FIXED DISK - TEST FOR DRIVE READY (XT,AT,XT286,PS) AH = 10h DL = drive ID Return: CF set on error AH = status code (see AH=1 above) ----------------------------------------------------------- INT 13 - FIXED DISK - RECALIBRATE DRIVE (XT,PORT,AT,XT286,PS) AH = 11h DL = drive ID Return: CF set on error AH = status code (see AH=1 above) ----------------------------------------------------------- INT 13 - FIXED DISK - CONTROLER RAM DIAGNOSTIC (XT,PORT,PS) AH = 12h Return: CF set on error AH = status code (see AH=1 above) Note: used for diagnostics only on PS/2 systems ----------------------------------------------------------- INT 13 - FIXED DISK - DRIVE DIAGNOSTIC (XT,PORT,PS) AH = 13h Return: CF set on error AH = status code (see AH=1 above) Note: used for diagnostics only on PS/2 systems ----------------------------------------------------------- INT 13 - FIXED DISK - CONTROLLER DIAGNOSTICS (XT,PORT,AT,XT286,PS) AH = 14h Return: CF set on error AH = status code (see AH=1 above) Note: used for diagnostics only on PS/2 systems ----------------------------------------------------------- INT 13 - DISK - GET TYPE (AT,XT2,XT286,CONV,PS) AH = 15h DL = drive ID Return: CF set on error AH = disk type 0 = disk not there 1 = floppy, no change detection present 2 = floppy with change detection 3 = fixed disk CX:DX = number of 512-byte sectors ----------------------------------------------------------- INT 13 - DISK - CHANGE OF DISK STATUS (AT,XT2,XT286,CONV,PS) AH = 16h DL = drive to check Return: AH = disk change status 0 = no disk change 6 = disk changed ----------------------------------------------------------- INT 13 - DISK - SET TYPE (AT,XT2,XT286,CONV,PS) AH = 17h AL = disk type 00h = no disk 01h = regular disk in regular drive 02h = regular disk in high-capacity drive 03h = high-capacity disk in high-capacity drive 04h = 720K disk in 720K drive DL = drive ID ----------------------------------------------------------- INT 13 - DISK - SET MEDIA TYPE FOR FORMAT (AT model 3x9,XT2,XT286,PS) AH = 18h DL = drive number CH = lower 8 bits of number of tracks CL = sectors per track (bits 0-5) top 2 bits of number of tracks (bits 6,7) Return: AH = 00h requested combination supported 01h function not available 0Ch not supported or drive type unknown 80h there is no disk in the drive ES:DI = pointer to 11-byte parameter table ----------------------------------------------------------- INT 13 - FIXED DISK - PARK HEADS (XT286,PS) AH = 19h DL = drive Return: CF set on error AH = status (see AH=1 above) ----------------------------------------------------------- INT 13 - ESDI FIXED DISK - FORMAT UNIT (PS) AH = 1Ah AL = defect table count CL = format modifiers bit 0: ignore primary defect map bit 1: ignore secondary defect map bit 2: update secondary defect map bit 3: perform surface analysis bit 4: generate periodic interrupt DL = drive ES:BX -> defect table Return: CF set on error AH = status (see AH=1 above) Note: if periodic interrupt selected, INT 15h/AH=0Fh is called after each cylinder is formatted ----------------------------------------------------------- INT 14 - SERIAL I/O - INITIALIZE USART AH = 00h AL = initializing parameters 7 - 6 - 5 4 - 3 2 1 - 0 -BAUD RATE- PARITY STOP WORD BITS LENGTH 000 110 bd 00 none 0-1 10 - 7 001 150 bd 01 odd 1-2 11 - 8 010 300 bd 11 even 011 600 bd 100 1200 bd 101 2400 bd 110 4800 bd 111 9600 bd (4800 on PCjr) DX = port number (0-3) Return: AH = RS-232 status code bits 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: time out--if set, other bits invalid AL = modem status bits 0: delta Clear-To-Send 1: delta Data-Set-Ready 2: trailing edge of ring detected 3: change in receive line signal detected 4: Clear-To-Send 5: Data-Set-Ready 6: ring detected 7: receive line signal detected ----------------------------------------------------------- INT 14 - SERIAL I/O - TRANSMIT CHARACTER AH = 01h AL = character DX = port number (0-3) Return: AX = port status (see AH = 00h above) ----------------------------------------------------------- INT 14 - SERIAL I/O - RECEIVE CHARACTER AH = 02h DX = port number (0-3) Return: AL = character received AH = RS-232 status code (see AH = 00h above) ----------------------------------------------------------- INT 14 - SERIAL I/O - GET USART STATUS AH = 03h DX = port number (0-3) Return: AX = port status code (see AH = 00h above) ----------------------------------------------------------- INT 14 - SERIAL I/O - EXTENDED INITIALIZE (CONVERTIBLE???,PS) AH = 04h AL = break status 0 if break 1 if no break BH = parity 0 no parity 1 odd parity 2 even parity 3 stick parity odd 4 stick parity even BL = number of stop bits 0: one stop bit 1: two stop bits (1.5 if 5 bit word length) CH = word length 0: 5 bits 1: 6 bits 2: 7 bits 3: 8 bits CL = baud rate 0: 110 1: 150 2: 300 3: 600 4: 1200 5: 2400 6: 4800 7: 9600 8: 19200 DX = port number Return: AX = port status code (see AH = 00h above) ----------------------------------------------------------- INT 14 - SERIAL I/O - EXTENDED COMMUNICATION PORT CONTROL (CONVERTIBLE???,PS) AH = 05h AL = 0 read modem control register Return: BL = modem control register (see below) AH = status AL = 1 write modem control register BL = modem control register bit 0: data terminal ready bit 1: request to send bit 2: OUT1 bit 3: OUT2 bit 4: LOOP bits 5-7 reserved Return: AH = status DX = port number ----------------------------------------------------------- INT 15 - CASSETTE - TURN ON MOTOR (PC,Jr) AH = 00h Return: CF set on error, AH = 86h if no cassette present ----------------------------------------------------------- INT 15 - CASSETTE - TURN OFF MOTOR (PC,Jr) AH = 01h Return: CF set on error, AH = 86h if no cassette present ----------------------------------------------------------- INT 15 - CASSETTE - READ DATA BLOCKS (PC,Jr) AH = 02h CX = count of bytes ES:BX = pointer to data area Return: CF set on error AH = status 01h CRC error 02h bad tape signals 04h no data 80h invalid command 86h no cassette present DX = count of bytes read ES:BX = pointer past last byte read ----------------------------------------------------------- INT 15 - CASSETTE - WRITE DATA BLOCKS (PC,Jr) AH = 03h CX = count of bytes to write ES:BX = pointer to data area Return: CF set on error AH = status (see above) ES:BX = pointer past last byte written CX = 0 ----------------------------------------------------------- Int 15 - SYSTEM - FORMAT UNIT PERIODIC INTERRUPT (PS ESDI drives only) 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: called during ESDI drive formatting after each cylinder is completed ----------------------------------------------------------- INT 15 - TopView - "PAUSE" - GIVE UP CPU TIME AX = 1000h Return: after other processes run ----------------------------------------------------------- INT 15 - TopView - "GETMEM" - ALLOCATE "SYSTEM" MEMORY AX = 1001h BX = number of bytes to allocate Return: ES:DI = pointer to block of memory ----------------------------------------------------------- INT 15 - TopView - "PUTMEM" - DEALLOCATE "SYSTEM" MEMORY AX = 1002h ES:DI = pointer to previously allocated block Return: block freed ----------------------------------------------------------- INT 15 - TopView - "PRINTC" - DISPLAY CHARACTER/ATTRIBUTE ON SCREEN AX = 1003h BH = attribute BL = character DX = segment of object handle for window Note: BX=0 does not display anything, it only positions the hardware cursor ----------------------------------------------------------- INT 15 - TopView - UNIMPLEMENTED IN DV 2.00 AH = 10h AL = 04h thru 12h Return: pops up "Programming error" window in DV 2.00 ----------------------------------------------------------- INT 15 - TopView - "GETBIT" - DEFINE A 2ND-LEVEL INTERRUPT HANDLER AX = 1013h ES:DI = pointer to FAR service routine Return: BX = bit mask indicating which bit was allocated 0 if no more bits available ----------------------------------------------------------- INT 15 - TopView - "FREEBIT" - UNDEFINE A 2ND-LEVEL INTERRUPT HANDLER AX = 1014h BX = bit mask from INT 15/AX=1013h ----------------------------------------------------------- INT 15 - TopView - "SETBIT" - SCHEDULE ONE OR MORE 2ND-LEVEL INTERRUPTS AX = 1015h BX = bit mask for interrupts to post Return: indicated routines will be called at next ??? ----------------------------------------------------------- INT 15 - TopView - "ISOBJ" - VERIFY OBJECT HANDLE AX = 1016h ES:DI = possible object handle Return: BX = 0 if ES:DI is a valid object handle -1 if ES:DI is not ----------------------------------------------------------- INT 15 - TopView - UNIMPLEMENTED IN DV 2.00 AX = 1017h Return: pops up "Programming error" window in DV 2.00 ----------------------------------------------------------- INT 15 - TopView - "LOCATE" - FIND WINDOW AT A GIVEN SCREEN LOCATION AX = 1018h BH = column BL = row ES = segment of object handle??? (0 = use default) Return: ES = segment of object handle for window which is visible at the indicated position ----------------------------------------------------------- INT 15 - TopView - "SOUND" - MAKE TONE AX = 1019h BX = frequency in Hertz CX = duration in clock ticks (18.2 ticks/sec) Return: immediately, tone continues to completion Notes: if another tone is already playing, the new tone does not start until completion of the previous one. In DV 2.00, it is possible to enqueue about 32 tones before the process is blocked until a note completes. in DV 2.00, the lowest tone allowed is 20 Hz ----------------------------------------------------------- INT 15 - TopView - "OSTACK" - SWITCH TO TASK'S INTERNAL STACK AX = 101Ah Return: stack switched ----------------------------------------------------------- INT 15 - TopView - "BEGINC" - BEGIN CRITICAL REGION AX = 101Bh Return: task-switching temporarily disabled Note: will not task-switch until END CRITICAL REGION (AX = 101Ch) called ----------------------------------------------------------- INT 15 - TopView - "ENDC" - END CRITICAL REGION AX = 101Ch Return: task-switching enabled ----------------------------------------------------------- INT 15 - TopView - "STOP" - STOP TASK AX = 101Dh ES = segment of object handle for task to be stopped (== handle of main window for that task) Return: indicated task will no longer get CPU time ----------------------------------------------------------- INT 15 - TopView - "START" - START TASK AX = 101Eh ES = segment of object handle for task to be started (== handle of main window for that task) Return: indicated task is started up again ----------------------------------------------------------- INT 15 - TopView - "DISPEROR" - POP-UP ERROR WINDOW AX = 101Fh BX = bit fields bits 0-12: number of characters to display bits 13,14: which mouse button may be pressed to remove window 00 = either 01 = left 10 = right 11 = either (maybe should read "both" or "center"???) bit 15: beep if 1 DS:DI = pointer to text of message CH = width of error window (0 = default) CL = height of error window (0 = default) DX = segment of object handle Return: BX = ??? Note: window remains on-screen until ESC or indicated mouse button is pressed ----------------------------------------------------------- INT 15 - TopView - UNIMPLEMENTED IN DV 2.00 AX = 1020h Return: pops up "Programming error" window in DV 2.00 ----------------------------------------------------------- INT 15 - TopView - "PGMINT" - INTERRUPT ANOTHER TASK AX = 1021h BX = segment of object handle for task to interrupt DX:CX = address of FAR routine to jump to (next time task is run???) Return: nothing??? Note: the current ES, DS, SI, DI, and BP are passed to the FAR routine ----------------------------------------------------------- INT 15 - TopView - "GETVER" - GET VERSION AX = 1022h BX = 0 Return: BX nonzero, TopView or compatible loaded (BL = major version, BH = minor version) Notes: TaskView returns BX = 0001h, DESQview 2.0 returns BX = 0A01h ----------------------------------------------------------- INT 15 - TopView - "POSWIN" - POSITION WINDOW AX = 1023h BX = segment of object handle for parent window within which to position the window (0 = full screen) DL = bit flags bits 0,1: horizontal position 00 = current 01 = center 10 = left 11 = right bits 2,3: vertical position 00 = current 01 = center 10 = top 11 = bottom bit 4: don't redraw screen if set bits 5-7 not used ES = segment of object handle for window Return: ??? ----------------------------------------------------------- INT 15 - TopView - "GETBUF" - GET VIRTUAL SCREEN INFO AX = 1024h BX = segment of object handle for window (0 = use default) Return: ES:DI = address of virtual screen CX = size of virtual screen in bytes DL = 0 ??? 1 ??? ----------------------------------------------------------- INT 15 - TopView - "USTACK" - SWITCH BACK TO USER'S STACK AX = 1025h Return: stack switched back Note: call only after INT 15h/AX=101Ah ----------------------------------------------------------- INT 15 - DESQview (TopView???) - UNIMPLEMENTED IN DV 2.00 AH = 10h AL = 26h thru 2Ah Return: pops up "Programming error" window in DV 2.00 ----------------------------------------------------------- INT 15 - DESQview (TopView???) - "POSTTASK"??? - AWAKEN TASK AX = 102Bh BX = segment of object handle for task's OBJECTQ ??? Return: nothing Note: calls INT 15/AH=12/BX=0506 ----------------------------------------------------------- INT 15 - DESQview (TopView???) - START NEW APPLICATION IN NEW PROCESS AX = 102Ch BX = number of bytes to copy >416 changed to 367, then values <= 369 get some additional code ES:DI = pointer to contents of .PIF file ??? Return: BX = ??? ----------------------------------------------------------- INT 15 - DESQview (TopView???) - ??? AX = 102Dh BL = subfunction 00h 01h 02h Return: ??? ----------------------------------------------------------- INT 15 - TopView commands AH = 11h AL = various Note: in DESQview 2.00, these function calls are identical to AH=DEh, so see those below ----------------------------------------------------------- INT 15 - TopView - SEND MESSAGE - "HANDLE" - RETURN OBJECT HANDLE AH = 12h BH = 00h BL = which handle to return 00h handle in DWORD on top of stack 01h current task's window handle 02h given task's mailbox handle (task's handle on stack) 03h current task's mailbox handle 04h given task's keyboard handle (task's handle on stack) 05h current task's keyboard object handle 06h given task's OBJECTQ handle (task's handle on stack) 07h current task's OBJECTQ handle 08h \ thru > returns 0000:0000 10h / Return: DWORD on top of stack is object handle ----------------------------------------------------------- INT 15 - TopView - SEND MESSAGE - "NEW" - CREATE NEW OBJECT AH = 12h BH = 01h BL = object 00h handle is DWORD on top of stack 01h use task's window handle takes 8 DWORD parameters on stack 02h given task's mailbox (task's handle on top of stack) 03h current task's mailbox 04h given task's keyboard (task's handle on top of stack) 05h current task's keyboard object 08h WINDOW class takes 8 DWORD parameters on stack 09h MAILBOX class 0Ah KEYBOARD class 0Bh TIMER object (counts down 32-bit time in 10ms increments) 0Fh POINTER object 10h PANEL object Return: DWORD on top of stack is new object handle ----------------------------------------------------------- INT 15 - TopView - SEND MESSAGE - "FREE" - FREE AN OBJECT AH = 12h BH = 02h BL = object 00h handle in DWORD on top of stack window: close window and free timer: free timer panel: free panel object pointer: free pointer 01h task's window handle - kills task, never returns 02h given task's mailbox (task's handle on top of stack) 03h current task's mailbox 04h given task's keyboard (task's handle on top of stack) 05h current task's keyboard object ----------------------------------------------------------- INT 15 - TopView - SEND MESSAGE - "DIR" - GET PANEL FILE DIRECTORY AH = 12h BX = 0300h STACK: DWORD handle of panel object Return: ??? ----------------------------------------------------------- INT 15 - TopView - SEND MESSAGE - "ADDR" - GET OBJECT HANDLE AH = 12h BH = 03h BL = object 00h handle in DWORD on top of stack 02h sender of last msg read from mailbox (task's handle on stack) 03h sender of last msg read from current task's mailbox Return: DWORD on stack is handle ----------------------------------------------------------- INT 15 - TopView - SEND MESSAGE - "READ" - WAIT FOR TIMER TO EXPIRE AH = 12h BX = 0400h STACK: DWORD timer's handle Return: STACK: DWORD time in 1/100 sec since midnight when timer expires ----------------------------------------------------------- INT 15 - TopView - SEND MESSAGE - "READ" - GET NEXT RECORD AH = 12h BH = 04h BL = object 00h handle is DWORD on top of stack window: read next logical line timer: wait for timer to expire pointer: wait for next message 01h read the next logical line from task's default window 02h get next message from mailbox (task's handle on top of stack) 03h get next message from current task's mailbox 04h get the next input from keyboard (handle on top of stack) 05h get the next input from task's default keyboard 06h wait for input from any object in OBJECTQ (handle on stack) 07h wait for input from any object in task's default OBJECTQ Return: STACK: DWORD number of bytes DWORD address ----------------------------------------------------------- INT 15 - TopView - SEND MESSAGE - "APPLY" - WRITE PANEL TO WINDOW AH = 12h BX = 0400h STACK: DWORD handle of panel object ----------------------------------------------------------- INT 15 - TopView - SEND MESSAGE - "WRITE" - WRITE TO OBJECT AH = 12h BH = 05h BL = object 00h handle is DWORD on top of stack timer: start timer to end at a specified time pointer: move pointer icon to specified position 02h send message by value/status=0 to mbox (task's handle on stack) 03h send message by value/status=0 to current task's mailbox 04h add input buffer to KEYBOARD queue (handle on top of stack) 05h add input buffer to task's default KEYBOARD queue 06h add an object to OBJECTQ (handle on top of stack) 07h add an object to task's default OBJECTQ STACK: (if mailbox) DWORD length DWORD address (if keyboard) DWORD status (such as scan code) DWORD length DWORD address (if objectq) DWORD handle of object to add (if timer) DWORD 1/100ths seconds since midnight (actually only accurate to 1/18 sec) (if pointer) DWORD column relative to origin of window DWORD row relative to origin of window ------------------------------------------------------ INT 15 - TopView - SEND MESSAGE - "WRITE" - WRITE STRING TO WINDOW AH = 12h BH = 05h BL = object 00h DWORD on top of stack is window handle 01h write string to task's default window STACK: DWORD object handle if handle passed on stack DWORD total length of string (high word == 0) DWORD address of string to display Note: service routine will pop stack Return: indicated actions performed a. non-control characters are displayed b. CR/LF/BS/Tab cause the usual cursor movement c. ESC starts a data structure with additional commands Data Structure: MAGIC DB 1Bh MODE DB ? ; 00h, 01h, 10h, 14h-1Fh legal LENGTH DW ? ; length of remainder in bytes var-length fields follow, each an OPCODE followed by zero or more args MODE 00h (set or display values) "WINDOW STREAM" Opcodes:args 00h display 20h blanks with the default attribute 01h-1Fh display OPCODE blanks with the default attribute 20h display char with default attribute 20h times BYTE char to repeat 21h-3Fh display char with default attribute OPCODE-20h times BYTE char to repeat 40h display 20h blanks with specified attribute BYTE attribute of blanks 41h-5Fh display OPCODE-40h blanks with specified attribute BYTE attribute of blanks 60h display next 20h characters 20h BYTES characters to display 61h-7Fh display next OPCODE-60h characters N BYTES characters to display 80h-87h display N blanks with default attribute BYTE low 8 bits of 11-bit count (high 3 in low 3 bits of OPCODE) [000h means 800h] 88h-8Fh display N copies of the character BYTE low 8 bits of 11-bit count (high 3 in low 3 bits of OPCODE) [000h means 800h] BYTE character to repeat 90h-97h display N blanks with specified attribute BYTE low 8 bits of 11-bit length (high 3 in low 3 bits of OPCODE) [000h means 800h] BYTE attribute 98h-9FH display string at logical cursor pos BYTE low 8 bits of 11-bit length (high 3 in low 3 bits of OPCODE) [000h means 800h] N BYTES string to display A0h set logical cursor row BYTE row number (0 is top) A1h set logical cursor column BYTE column number (0 is leftmost) A2h ??? BYTE ??? A3h ??? BYTE ??? A4h set row of physical window position BYTE line A5h set column of physical window position BYTE column A6h set height of physical window BYTE #rows A7h set width of physical window BYTE #columns A8h set viewport row BYTE row A9h set viewport column BYTE column AAh set virtual screen height BYTE rows ABh set virtual screen width BYTE columns ACh-AEh unused AFh ??? BYTE ??? (ANDed with current value of something) B0h move logical cursor down BYTE #rows (signed, negative values move up) B1h move logical cursor right BYTE #cols (signed, negative values move left) B2h ??? BYTE ??? (signed) B3h ??? BYTE ??? (signed) B4h shift window down BYTE #lines (signed) B5h shift window right BYTE #columns (signed) B6h expand physical window vertically BYTE #lines (signed) B7h expand physical window horizontally BYTE #columns (signed) B8h adjust viewport row BYTE #rows (signed) B9h adjust viewport column BYTE #columns (signed) BAh adjust virtual screen height BYTE #rows to increase (signed) BBh adjust virtual screen width BYTE #cols to increase (signed) BCh-BFh unused C0h set logical cursor position BYTE row number (0 is top border) BYTE column number (0 is left border) C1h ??? BYTE ??? BYTE ??? C2h set window pos BYTE upper left row (no top border if 0) BYTE upper left column (no left border if 0) C3h set current window size BYTE #rows BYTE #cols C4h set upper left corner of viewport (portion of virtual screen displayed in window) BYTE row BYTE column C5h set size of virtual screen BYTE #rows BYTE #cols C6h unused C7h unused C8h set logical cursor relative to current position BYTE number of rows to move down (signed) BYTE number of columns to move right (signed) C9h ??? BYTE ??? BYTE ??? CAh set window pos relative to current position BYTE number of rows to shift down (signed) BYTE number of columns to shift right (signed) CBh set window size relative to current size BYTE number of rows to expand (signed) BYTE number of cols to expand (signed) CCh shift viewport relative to current position BYTE rows to shift (signed) BYTE cols to shift (signed) CDh resize virtual screen (guess) BYTE #rows to expand (signed) BYTE #cols to expand (signed) CEh clear ??? CFh set ??? D0h turn on ??? (default) D1h turn off ??? D2h turn on ??? D3h turn off ??? (default) D4h window is visible D5h window is hidden D6h window has frame D7h window unframed D8h turn on ??? (default) D9h turn off ??? DAh use logical attributes, which may be remapped attributes 1 normal text 2 highlighted normal text 3 help text 4 highlighted help text 5 error message 6 highlighted error message 7 emphasized text 8 marked text others??? DBh use physical attributes for characters DCh enable special actions for control characters (default) DDh disable special control char handling, all chars displayable by BIOS TTY call DEh write both character and attribute (default) DFh write character only, leave attribute untouched E0h repeat following commands BYTE number of times E1h end of commands to repeat, start repeating them E2h set color BYTE color E3h clear virtual screen E4h redraw window E5h ??? BYTE ??? E6h create new window and perform rest of manipulations in new window BYTE number of rows BYTE number of columns Return: DWORD object handle returned on stack at end E7h unused E8h ??? BYTE ??? BYTE ??? additional args??? E9h ??? BYTE ??? BYTE ??? additional args??? EAh ??? BYTE ??? BYTE ??? additional args??? EBh ??? BYTE ??? BYTE ??? additional args??? ECh ??? BYTE ??? BYTE count of remaining args \ counted string maybe??? N BYTES remaining args / EDh ??? BYTE ??? BYTE ??? var-length args EEh same as EDh, but ??? BYTE ??? BYTE ??? var-length args EFh set window name BYTE length of name N BYTES name F0h clear input field to blanks BYTE field number F1h fill input field with character BYTE field number BYTE char F2h set color of input field BYTE field number (1-N) BYTE attribute F3h set initial contents of input field BYTE field number (1-N) N BYTES enough chars to exactly fill field as defined by op FFh F4h position cursor to specific input field BYTE field number (1-N) F5h change field table entry BYTE field number 7-8 BYTEs field table entry (see FFh) F6h set field type??? (guess) BYTE field number BYTE type??? F7h ??? STRING??? (I saw 20h 20h 20h 20h) F8h ??? BYTE field number additional args??? F9h ??? BYTE field number additional args??? FAh ??? BYTE field number additional args??? FBh ??? BYTE field number additional args??? FCh set field table header??? (guess) BYTE field number BYTE ??? 6 BYTES ??? additional args??? FDh ??? no args??? FEh ??? (no args) FFh set up input fields table header BYTE number of fields BYTE screen type ??? (I see 47h, 52h, 53h, 55h, 57h, and 5Bh) WORD ??? (I see 0 always) BYTE color of field currently pointed to BYTE color of input fields which have been selected the field table entries, one for each field BYTE start row BYTE start column BYTE end row BYTE end column BYTE field type (A0h allows user entry, 00h/40h don't) 80h is a fill-in field C0h is a menu selection BYTE modifier if type is 80h, then bit flags to determine behavior bit 7 if set, beep when field is full bit 6 move to next field when current field is full bit 5 if set, enter text from right end (for numbers) bit 4 if set, force input to uppercase bit 3 if set, clear old contents on first keystroke bit 2,1,0 ??? if type is C0h, key to press to activate menu sel 00h if have to point-and-click BYTE ??? BYTE second key for activating menu selection if field type is C0h (0 = only single key). Only present if SCREEN TYPE is 5Bh MODE 01h "QUERY STREAM" (valid only for those opcodes listed here) A0h return logical cursor row in next byte A1h return logical cursor column in next byte A2h A3h A4h return row of physical window origin in next byte A5h return column of physical window origin in next byte A6h return height of physcial window in next byte A7h return width of physical window in next byte A8h return row of viewport origin in next byte A9h return column of viewport origin in next byte AAh return height of virtual screen in next byte ABh return width of virtual screen in next byte AFh return ??? in next byte C0h return current logical cursor position in next two bytes C1h return ??? in next two bytes C2h return current window position in next two bytes C3h return current window size in next two bytes C4h return current viewport origin in next two bytes C5h return current virtual screen size in next two bytes D0h \ overwritten with D0h if ??? on D1h / D1h if ??? off D2h \ overwritten with D2h if ??? on D3h / D3h if ??? off D4h \ overwritten with D4h if window visible D5h / D5h if window hidden D6h \ overwritten with D6h if window has frame D7h / D7h if window unframed D8h \ overwritten with D8h if ??? on D9h / D9h if ??? off DAh \ overwritten with DAh if using logical attributes DBh / DBh if using physical attributes DCh \ overwritten with DCh if TTY control char interpretation on DDh / DDh if TTY control char interpretation off DEh \ overwritten with DEh if writing both characters and attributes DFh / DFh if leaving attributes untouched E2h return current color in next byte ECh EDh EEh EFh return current window name BYTE max length of returned name N BYTES buffer to hold window name F3h return contents of input field BYTE field number N BYTES buffer to hold field contents (size exactly equal to field size) F5h get field table entry BYTE field number 7-8 BYTES buffer to hold field table entry F6h get type of a field??? (guess) BYTE field number BYTE type??? FCh get field table header??? (guess) BYTE field number BYTE ??? 6 BYTES ??? additional args??? MODE 10h "MANAGER STREAM" (valid only for opcodes listed here) 00h allow window to be moved horizontally 01h allow window to be moved vertically 02h allow window to change width 03h allow window to change height 04h allow window to be scrolled horizontally 05h allow window to be scrolled vertically 06h allow "Close Window" menu selection 07h allow window to be hidden 08h allow "Mark" menu 0Eh allow "Scissors" menu 10h allow DESQview main menu to be popped up 11h allow "Switch Windows" menu 12h allow "Open Window" menu 13h allow "Quit" menu selection 20h-33h opposite of 00h-13h, disallow specified action 40h notify if horizontal position of window changes 41h notify if vertical position of window changes 42h notify if width of window changes 43h notify if height of window changes 44h notify if window scrolled horizontally 45h notify if window scrolled vertically 46h notify if window is closed--program has to clean up and exit itself 47h notify if window is hidden 48h notify if "?" on main menu selected 49h notify if ??? 4Ah notify if window is swapped out or hidden 4Bh notify if ??? 4Ch notify if video mode changes 4Dh notify if "Scissors" menu "Cut" option selected 4Eh notify if "Scissors" menu "Copy" option selected 4Fh notify if "Scissors" menu "Paste" option selected 50h notify if DESQview main menu popped up 51h notify if "Switch" menu selected 60h-71h opposite of 40h-51h: don't notify on specified event 84h 85h 86h disable background operation 87h enable running in background 88h set minimum size of physical window BYTE rows BYTE columns 89h set maximum size of physical window BYTE rows BYTE cols 8Ah set primary asynchronous notification routine DWORD address of routine, 0000:0000 means none on entry ES:DI = handle of window, DS:SI is secondary routine routine should restore all registers before returning 8Bh set secondary async notification routine DWORD address of routine, passed to primary routine in DS:SI, rather than called directly AEh AFh ??? BYTE ??? BCh BDh opposite of BCh BEh BFh opposite of BEh C0h move current window in front of all other windows C1h ??? C2h move current window in front of all other windows C3h ??? (like C4h, but uses defaults) C4h ??? BYTE ??? BYTE ??? C5h hide current window C6h ??? C7h hide all windows for this process and switch to previous process C8h hide all windows for this process and switch to previous process C9h switch to previous process CAh move current window back behind other windows for this process CBh ??? CCh closes current 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 (don't know how yet) 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 (otherwise) DWORD bits to set ----------------------------------------------------------- INT 15 - TopView - SEND MESSAGE - "SUBFROM" - RESET OBJECT BITS AH = 12h BH = 0Bh BL = object 00h handle is DWORD on top of stack pointer: reset control flags 01h write attributes only to task's default window 02h send message/status by reference to box (task's handle on stack) 03h send message/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 (handle on top of stack) 07h remove specific object from task's default OBJECTQ STACK: 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 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 ----------------------------------------------------------- INT 15 - TopView - SEND MESSAGE - "CLOSE" - CLOSE OBJECT AH = 12h BH = 0Dh BL = object 00h handle is DWORD on top of stack timer: close 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 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 scan code for last key read from KEYBOARD (handle on stack) 05h get scan code for last key read 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 ----------------------------------------------------------- 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 Return: DWORD on top of stack is status ----------------------------------------------------------- INT 15 - TopView - SEND MESSAGE - "AT" - POSITION OBJECT CURSOR AH = 12h BH = 11h BL = object 00h handle is DWORD on top of stack 01h position logical cursor on task's default window ----------------------------------------------------------- INT 15 - TopView - SEND MESSAGE - "SETSCALE" - SET POINTER SCALE FACTOR AH = 12h BX = 1100h STACK: DWORD object handle for pointer object DWORD ??? DWORD ??? ----------------------------------------------------------- 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 count actually read DWORD address ----------------------------------------------------------- INT 15 - TopView - SEND MESSAGE - "GETSCALE" - GET POINTER SCALE FACTOR AH = 12h BX = 1200h STACK: DWORD object handle for pointer Return: STACK: DWORD ??? DWORD ??? ----------------------------------------------------------- INT 15 - TopView - SEND MESSAGE - "REDRAW" - REDRAW WINDOW AH = 12h BH = 13h BL = 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 ??? ----------------------------------------------------------- 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 04h intercept keystrokes from KEYBOARD to a window (handle on stack) 05h intercept keystrokes from task's default KEYBOARD to a window ----------------------------------------------------------- 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 pointer to 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 = pointer to 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 = pointer to 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 = pointer to global descriptor table offset 0h null descriptor (need not be initialized) 8h uninitialized, will be made into GDT descriptor 10h descriptor for source of move 18h descriptor for destination of move 20h uninitialized, used by BIOS 28h uninitialized, will be made into SS descriptor 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 ----------------------------------------------------------- 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 = pointer to 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 pointer to 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 pointer to 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 = 1 if BIOS doesn't support call ES:BX pointer to 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: BYTE length of name N BYTES name 2 BYTES keys to invoke program (second = 00h if only one key used) 3 BYTES ??? (I see 0 always) ----------------------------------------------------------- INT 15 - DESQview - UPDATE OPEN 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.00 AX = DE02h Return: nothing (NOP in DV 2.00) ----------------------------------------------------------- INT 15 - DESQview - UNIMPLEMENTED IN DV 2.00 AX = DE03h Return: nothing (NOP in DV 2.00) ----------------------------------------------------------- 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 ??? 1 ??? ----------------------------------------------------------- INT 15 - DESQview - UNIMPLEMENTED IN DV 2.00 AX = DE09h Return: nothing (NOP in DV 2.00) ----------------------------------------------------------- INT 15 - DESQview 2.0 - "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.0 - "APILEVEL" - DEFINE MINIMUM API LEVEL REQUIRED AX = DE0Bh BL = API level >2 pops up "You need a newer version" error window in DV 2.00 BH = ??? Return: ??? ----------------------------------------------------------- INT 15 - DESQview 2.0 - "GETMEM" - ALLOCATE "SYSTEM" MEMORY AX = DE0Ch BX = number of bytes Return: ES:DI = pointer to allocated block ----------------------------------------------------------- INT 15 - DESQview 2.0 - "PUTMEM" - DEALLOCATE "SYSTEM" MEMORY AX = DE0Dh ES:DI = pointer to previously allocated block Return: nothing ----------------------------------------------------------- INT 15 - DESQview 2.0 - FIND MAILBOX BY NAME AX = DE0Eh ES:DI = pointer to string CX = length of name Return: BX = 0 not found 1 found DS:SI = object handle??? ----------------------------------------------------------- INT 15 - DESQview 2.0 - ??? AX = DE0Fh Return: AX and BX destroyed (seems to be bug, weren't saved&restored) Note: sends a manager stream with opcodes AEh, BDh, and BFh to task's window ----------------------------------------------------------- INT 15 - DESQview 2.0 - "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.0 - 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 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 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 CL = minutes DH = seconds ----------------------------------------------------------- INT 1A - CLOCK - SET REAL TIME CLOCK (AT,XT286,CONV,PS) AH = 03h CH = hours CL = minutes DH = seconds 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 DH = month CL = year CH = century (19 or 20) ----------------------------------------------------------- INT 1A - CLOCK - SET DATE IN REAL TIME CLOCK (AT,XT286,CONV,PS) AH = 05h DL = day DH = month CL = year CH = century (19 or 20) Return: CMOS clock set ----------------------------------------------------------- INT 1A - CLOCK - SET ALARM (AT,XT286,CONV,PS) AH = 06h CH = hours CL = minutes DH = seconds 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 - SET UP SOUND MULTIPLEXOR (PCjr ONLY) 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 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 = pointer to 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 = pointer to 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 = pointer to string to parse ES:DI = pointer to memory 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 = pointer to first byte after parsed string ES:DI = 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 01h get version Return: BX = version (v2.00 returns 0002h, v2.01 returns 0201h) 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 ----------------------------------------------------------- INT 21 - DOS - GET CURRENT TIME AH = 2Ch Return: CH = hours CL = minutes DH = seconds DL = hundredths of seconds Note: time is updated approximately every 5/100 second ----------------------------------------------------------- INT 21 - DOS - SET CURRENT TIME AH = 2Dh CH = hours CL = minutes DH = seconds DL = hundredths of seconds Return: AL = 00h if no error = FFh if bad value sent to routine Note: DOS 3.3 also sets CMOS clock ----------------------------------------------------------- INT 21 - DOS - SET VERIFY FLAG AH = 2Eh DL = 0 AL = 1 VERIFY on 0 VERIFY off ----------------------------------------------------------- INT 21 - DOS 2+ - GET DISK TRANSFER AREA ADDRESS AH = 2Fh Return: ES:BX = address of DTA ----------------------------------------------------------- INT 21 - DOS 2+ - GET DOS VERSION AH = 30h Return: AL = Major Version number AH = Minor Version number BH = OEM number 00h IBM 16h DEC BL:CX = 24-bit user number ----------------------------------------------------------- INT 21 - DOS 2+ - TERMINATE BUT STAY RESIDENT AH = 31h AL = exit code DX = program size, in paragraphs ----------------------------------------------------------- INT 21 - DOS Internal - GET DRIVE PARAMETER BLOCK AH = 32h DL = drive number 0 = default, 1 = A, etc. Return: AL = 0FFh if invalid drive number, else DS:BX = address of drive parameter block. STRUCTURE OF DOS DRIVE PARAMETER BLOCK: DPBLOCK STRUCT ;Offset DISK_OFFSET DB ? ; 0 drive number (0 = A, etc.) UNIT_OFFSET DB ? ; 1 unit number within device driver SECTOR_SIZE DW ? ; 2 number of bytes per sector MAX_CLUSTER DB ? ; 4 largest sector number in cluster ; add one for number of sectors/cluster LOG2_SECTORS DB ? ; 5 log base two of the cluster size RESERVED DW ? ; 6 number of reserved (boot) sectors FAT_COUNT DB ? ; 8 number of copies of the FAT ROOT_COUNT DW ? ; 9 number of root directory entries DATA_START DW ? ; 11 first data sector on medium MAX_NUMBER DW ? ; 13 largest possible cluster number ; subtract one for number of data clusters FAT_SECTORS DB ? ; 15 number of sectors in one FAT copy ROOT_START DW ? ; 16 first sector of root directory DEVICE_ADDR DD ? ; 18 address of device driver for this drive DESCRIPTOR DB ? ; 22 media descriptor byte for medium VALID_BYTE DB ? ; 23 FFh indicates block must be rebuilt (DOS 3.x) 00h indicates block accessed NEXT_BLOCK DD ? ; 24 address of next device block in list FFFFh indicates last block ; from this point on, DOS 3 differs from DOS 2: IF DOS2 DIR_START DW ? ; 28 starting cluster of current directory ; zero indicates the root directory PATH_NAME DB 64 DUP (?) ; 30 ASCIZ current directory path string ELSE DOS3 ; on my XT, this was always: DW 0 ; probably unused, values left from before DW 0FFFFh ; block was built ENDIF DPBLOCK ENDS ----------------------------------------------------------- INT 21 - DOS 2+ - EXTENDED CONTROL-BREAK CHECKING AH = 33h AL = subfunction 00h Get State 01h Set DL = 0 for OFF or 1 for ON 02h internal, called by PRINT.COM (DOS 3.1) Return: DL = current BREAK setting if AL = 00h 0 BREAK=OFF 1 BREAK=ON AL = FFh if error ----------------------------------------------------------- INT 21 - DOS Internal - RETURN CritSectFlag POINTER AH = 34h Return: ES:BX points to DOS "Critical Section Flag" Notes: When byte pointed to is zero, DOS is supposed to be safe to interrupt. NOT RELIABLE according to Chris Dunford. Examination of DOS 2.10 code in this area indicates that the byte immediately FOLLOWING this "Critical Section Flag" must be 00 to permit the PRINT.COM interrupt to be called. For DOS 3.0 and 3.1 (except COMPAQ DOS 3.0), the byte BEFORE the "Critical Section Flag" must be zero, and for COMPAQ DOS 3.0, the byte 01AAh before it must be zero. ----------------------------------------------------------- INT 21 - DOS 2+ - GET INTERRUPT VECTOR AH = 35h AL = interrupt number Return: ES:BX = value of interrupt vector ----------------------------------------------------------- INT 21 - DOS 2+ - GET DISK SPACE AH = 36h DL = drive code (0 = default, 1 = A, 2 = B, etc.) Return: AX = number of sectors per cluster or 0FFFFh if invalid drive BX = number of available clusters CX = bytes per sector DX = total clusters Note: multiply AX x CX x BX for free space on disk multiply AX x CX x DX for total disk space ----------------------------------------------------------- INT 21 - DOS Internal - SWITCHAR/AVAILDEV AH = 37h AL = subfunction 0 Read switch character (returns current character in DL) 1 Set switch character (specify new character in DL) 2 (DOS 2.x only) Read device availability (as set by function AL=3) 3 (DOS 2.x only) Set device availability, where: DL = 0 means /DEV/ must preceed device names DL <> 0 means /DEV/ need not preceed device names Return: DL = Switch character (if AL=0 or 1) Device availability flag (if AL=2 or 3) AL=0FFh means the value in AL was not in the range 0-3. ----------------------------------------------------------- INT 21 - DOS 2+ - GET COUNTRY-DEPENDENT INFORMATION AH = 38h --DOS 2.x-- AL = 0 get current-country info DS:DX = segment:offset of buffer for returned info Return: BX = country code buffer at DS:DX filled as follows: bytes 0-1 = date format 0 = USA mm dd yy 1 = Europe dd mm yy 2 = Japan yy mm dd byte 2 = currency symbol byte 3 = 00h byte 4 = thousands separator char byte 5 = 00h byte 6 = decimal separator char byte 7 = 00h bytes 8-1Fh reserved --DOS 3.x-- AL = 0 for current country AL = 01h thru 0FEh for specific country with code <255 AL = 0FFh for specific country with code >= 255 BX = 16-bit country code DS:DX = segment:offset of buffer for returned info DX = 0FFFFh if setting country code, rather than getting info Return: (if DX <> 0FFFFh) BX = country code DS:DX filled in: bytes 0-1 = date format (see above) bytes 2-6 = currency symbol string, ASCIZ byte 7 = thousands seaprator char byte 8 = 00h byte 9 = decimal separator char byte 0Ah = 00h byte 0Bh = date separator char byte 0Ch = 00h byte 0Dh = time separator char byte 0Eh = 00h byte 0Fh = currency format bit 2 = set if currency symbol replaces decimal pt bit 1 = number of spaces between value and curr sym bit 0 = 0 if currency symbol precedes value 1 if currency symbol follows value byte 10h = number of digits after decimal in currency byte 11h = time format bit 0 = 0 if 12-hour clock 1 if 24-hour clock bytes 12h-15h = address of case map routine (FAR CALL, AL = char) byte 16h = data-list separator char byte 17h = 00h bytes 18h-21h reserved If error: CF set AX = error code ----------------------------------------------------------- INT 21 - DOS 2+ - CREATE A SUBDIRECTORY (MKDIR) AH = 39h DS:DX = address of ASCIZ pathname Return: CF = 1 if error AX = Error Code ----------------------------------------------------------- INT 21 - DOS 2+ - REMOVE A DIRECTORY ENTRY (RMDIR) AH = 3Ah DS:DX = address of ASCIZ pathname Return: CF = 1 if error AX = Error Code ----------------------------------------------------------- INT 21 - DOS 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR) AH = 3Bh DS:DX = address of ASCIZ directory name Return: CF = 1 if error AX = Error Code ----------------------------------------------------------- INT 21 - DOS 2+ - CREATE A FILE WITH HANDLE (CREAT) AH = 3Ch CX = attributes for file DS:DX = address of ASCIZ filename Return: CF = 1 if error AX = Error Code CF = 0 successful AX = file handle ----------------------------------------------------------- INT 21 - DOS 2+ - OPEN DISK FILE WITH HANDLE AH = 3Dh AL = access code 0 = Read Only 1 = Write Only 2 = Read/Write AL bits 7-3 = file-sharing modes (DOS 3.x) bit 7 = inheritance flag, set for no inheritance bits 4-6 = sharing mode 000 compatibility mode 001 exclusive (deny all) 010 write access denied (deny write) 011 read access denied (deny read) 100 full access permitted (deny none) bit 3 = reserved, should be zero DS:DX = address of ASCIZ filename Return: CF = 1 if error AX = Error Code CF = 0 successful AX = file handle ----------------------------------------------------------- INT 21 - DOS 2+ - CLOSE A FILE WITH HANDLE AH = 3Eh BX = file handle Return: CF = 1 if error AX = Error Code ----------------------------------------------------------- INT 21 - DOS 2+ - READ FROM FILE WITH HANDLE AH = 3Fh BX = file handle CX = number of bytes to read DS:DX = address of buffer Return: CF = 1 if error AX = Error Code CF = 0 successful AX = number of bytes read ----------------------------------------------------------- INT 21 - DOS 2+ - WRITE TO FILE WITH HANDLE AH = 40h BX = file handle CX = number of bytes to write DS:DX = pointer to buffer Return: CF = 1 if error AX = Error Code CF = 0 successful AX = number of bytes written Note: if CX is zero, no data is written, and the file is truncated or extended to the current position ----------------------------------------------------------- INT 21 - DOS 2+ - DELETE A FILE (UNLINK) AH = 41h DS:DX = pointer to ASCIZ name of file to delete Return: CF = 1 if error AX = Error Code ----------------------------------------------------------- INT 21 - DOS 2+ - MOVE FILE READ/WRITE POINTER (LSEEK) AH = 42h AL = method value 0 = offset from beginning of file 1 = offset from present location 2 = offset from end of file BX = file handle CX:DX = offset in bytes Return: CF = 1 if error AX = Error Code CF = 0 successful DX:AX = new offset ----------------------------------------------------------- INT 21 - DOS 2+ - GET/PUT FILE ATTRIBUTES (CHMOD) AH = 43h AL = 0 = get file attributes 1 = put file attributes CX = file attribute bits 0 = read only 1 = hidden file 2 = system file 3 = volume label 4 = subdirectory 5 = written since backup DS:DX = pointer to ASCIZ file name Return: CF = 1 if error AX = Error Code if any CX = file attributes on get ----------------------------------------------------------- INT 21 - DOS 2+ - IOCTL AH = 44h AL = 0 = Get device information (DX) 1 = Set device information (DH must be 0 on entry) DX BITS = 0 = console input device 1 = console output device 2 = null device 3 = clock device 5 = binary mode 6 = EOF 7 = device is character device if set if not, EOF = 0 if channel has been written bits 0-5 are block device number 12 = network device 14 = can process control strings (AL=2-5, can only be read) 15 reserved 2 = Read CX bytes to DS:DX from BX control channel Return: AX = number of bytes transferred 3 = Write CX bytes from DS:DX from BX control channel Return: AX = number of bytes transferred 4 = as 2 but for drive BL Return: AX = number of bytes transferred 5 = as 3 but for drive BL Return: AX = number of bytes transferred 6 = Get input status Return: AL = FFh for ready, 00h for not ready 7 = Get output status Return: AL = FFh for ready or 00h for not ready 8 = Is block device BL changeable? (DOS 3.x) Return: AX = 0 removable 1 fixed 9 = Is logical device BL local? (DOS 3.x) DX (attribute word) bit 12 (1000h) = 0 = yes 10 = Is handle BX local? (DOS 3) DX (attribute word) bit 15 (8000h) = 0 = yes 11 = Change sharing retry count to DX (def 3), (DOS 3.x) delay CX (def 1) 12 = General IOCTL (DOS 3.3 [3.2?]) BX = file handle (or BL = drive number with 0 = default) Return: CF = 1 if error AX = Error Code Note: only subfunctions 00h,06h,07h are available for files Return: CF = 1 if error AX = Error Code Note: only subfunctions 00h,06h,07h are available for files ----------------------------------------------------------- INT 21 - DOS 2+ - CREATE DUPLICATE HANDLE (DUP) AH = 45h BX = file handle to duplicate Return: CF = 1 if error AX = Error Code CF = 0 successful AX = new file handle ----------------------------------------------------------- INT 21 - DOS 2+ - FORCE DUPLICATE HANDLE (FORCDUP,DUP2) AH = 46h BX = Existing file handle CX = new file handle Return: CF = 1 if error AX = Error Code ----------------------------------------------------------- INT 21 - DOS 2+ - GET CURRENT DIRECTORY AH = 47h DL = drive (0=default, 1=A, etc.) DS:SI points to 64-byte buffer area Return: CF = 1 if error AX = Error Code ----------------------------------------------------------- INT 21 - DOS 2+ - ALLOCATE MEMORY AH = 48h BX = number of 16-byte paragraphs desired Return: CF = 1 if error AX = Error Code BX = Maximum available CF = 0 successful AX = segment of allocated memory block ----------------------------------------------------------- INT 21 - DOS 2+ - FREE MEMORY AH = 49h ES = Segment address of area to be freed Return: CF = 1 if error AX = Error Code ----------------------------------------------------------- INT 21 - DOS 2+ - ADJUST MEMORY BLOCK SIZE (SETBLOCK) AH = 4Ah ES = Segment address of block to change BX = New size in paragraphs Return: CF = 1 if error AX = Error Code BX = Maximum size possible for the block ----------------------------------------------------------- INT 21 - DOS 2+ - LOAD OR EXECUTE (EXEC) AH = 4Bh AL = subfunction 0 = load and execute program 2 = load (Internal) but do not execute 3 = load overlay; do not create PSP DS:DX = filename ES:BX = parameter block AL = 0 => WORD segment environment pointer DWORD command line pointer DWORD FCB 1 DWORD FCB 2 3 => WORD segment load address WORD segment relocation factor Return: CF = 1 if error AX = Error Code struct exec { /* structure of .EXE file header */ unsigned exec_magic; /* 0x4d, 0x5a signature */ unsigned exec_isr; /* image size remainder (mod 512) */ unsigned exec_size; /* file size in pages (512) */ unsigned exec_nrel; /* number of relocation items */ unsigned exec_hsize; /* header size in paragraphs */ unsigned exec_min; /* minimum extra paragraphs */ unsigned exec_max; /* maximum extra paragraphs */ unsigned exec_ss; /* stack segment */ unsigned exec_sp; /* stack offset */ unsigned exec_cksum; /* word checksum of entire file */ unsigned exec_pc; /* initial pc */ unsigned exec_cs; /* code segment */ unsigned exec_orel; /* offset of relocation table */ unsigned exec_ovno; /* overlay number */ }; ----------------------------------------------------------- INT 21 - DOS 2+ - QUIT WITH EXIT CODE (EXIT) AH = 4Ch AL = exit code Return: never returns ----------------------------------------------------------- INT 21 - DOS 2+ - GET EXIT CODE OF SUBPROGRAM (WAIT) AH = 4Dh Return: AL = exit code of subprogram (functions 31h or 4Ch) AH = circumstance which caused termination 0 = Terminate/abort 1 = Control-C 2 = Hard error 3 = Terminate and stay resident ----------------------------------------------------------- INT 21 - DOS 2+ - FIND FIRST ASCIZ (FIND FIRST) AH = 4Eh CX = search attributes DS:DX = pointer to ASCIZ filename Return: CF = 1 if error AX = Error Code if any [DTA] = data block undocumented fields PC-DOS 3.10 byte 00h: drive letter bytes 01h-0Bh: search template byte 0Ch: search attributes bytes 0Dh-0Eh: offset of entry within directory bytes 0Fh-14h: ??? DOS 2.x (and DOS 3.x except 3.1???) byte 00h: search attributes byte 01h: drive letter bytes 02h-0Ch: search template bytes 0Dh-0Eh: entry count within directory bytes 0Fh-12h: reserved bytes 13h-14h: cluster number of parent directory byte 15h: attribute of file found bytes 16h-17h: file time bytes 18h-19h: file date bytes 1Ah-1Dh: file size bytes 1Eh-3Ah: ASCIZ filename+extension ----------------------------------------------------------- INT 21 - DOS 2+ - FIND NEXT ASCIZ (FIND NEXT) AH = 4Fh [DTA] = data block from last AH = 4Eh/4Fh call Return: CF = 1 if error AX = Error Code [DTA] = data block, see AH = 4Eh above ----------------------------------------------------------- INT 21 - DOS Internal - SET PSP SEGMENT AH = 50h BX = Segment address of new PSP Note: under DOS 2.xx, this function cannot be invoked inside an INT 28h handler without a prior call to function 5Dh ----------------------------------------------------------- INT 21 - DOS Internal - GET PSP SEGMENT AH = 51h Return: BX = Current PSP Segment struct psp { char psp_int20[2]; /* 00h: exit */ unsigned psp_msize; /* 02h: memory size in paragraphs */ char psp_res0[1]; /* 04h: unused??? (0) */ char psp_dos[5]; /* 05h: far call to dos */ int (*psp_term)(); /* 0ah: terminate address */ unsigned psp_tseg; /* 0ch: terminate segment */ int (*psp_break)(); /* 0eh: break address */ unsigned psp_bseg; /* 10h: break segment */ int (*psp_error)(); /* 12h: error address */ unsigned psp_eseg; /* 14h: error segment */ unsigned psp_ppsp; /* 16h: parent psp segment */ char psp_ofile[20]; /* 18h: DOS 2+ open files, 0xff = unused */ unsigned psp_envp; /* 2ch: DOS 2+ environment segment */ char far *psp_oldstack; /* 2eh: far ptr to process's SS:SP??? */ int psp_nfiles; /* 32h: DOS 3.x max open files */ char *psp_aofile; /* 34h: DOS 3.x openfile table address */ unsigned psp_aoseg; /* 36h: DOS 3.x openfile table segment */ char psp_res3[24]; /* 38h: unused??? */ char psp_int21[3]; /* 50h: int 21, far return */ char psp_res4[2]; /* 53h: unused??? */ char psp_xfcb1[7]; /* 55h: FCB #1 extension */ char psp_fcb1[9]; /* 5ch: FCB #1 */ char psp_xfcb2[7]; /* 65h: FCB #2 extension */ char psp_fcb2[20]; /* 6ch: FCB #2 */ char psp_dma[128]; /* 80h: Command Tail / default DTA buffer */ }; Note: under DOS 2.xx this function cannot be invoked inside an INT 28h handler without a prior call to function 5Dh ----------------------------------------------------------- INT 21 - DOS Internal - GET LIST OF LISTS AH = 52h Return: ES:BX points to DOS list of lists List of Lists: Bytes Value -2&-1 Segment of first memory control block 0-3 Pointer to first DOS disk block (see function 36h) 4-7 Pointer to DOS file table 35h bytes per file, number of entries set with CONFIG.SYS FILES= 00-01 ??? I see 0 always 02-05 ??? 06-07 number of file handles referring to this file 08-0C ??? 0D-10 Pointer to device driver header if character device Pointer to DOS Device Control Block if block device (see func 32h for format) 11-25 ??? 26-30 filename in FCB format (no path, no period, blank-padded) 31-34 ??? I see 0 always 8-B Pointer to CLOCK$ device driver, whether installable or resident C-F Pointer to actual CON: device driver, whether installable or resident -----DOS 2.x 10 Number of logical drives in system 11-12 Maximum bytes/block of any block device 13-16 ??? 17 Beginning (not a pointer--the real beginning!) of NUL device driver. This is the first device on DOS's linked list of device drivers. -----DOS 3.x 10-11 Maximum bytes/block of any block device 12-15 Pointer to first disk buffer 16-19 Partially Undefined: Pointer to array of drive info: 51h bytes per drive, starting with A: ... 00-3F Current path as ASCIZ, starting with 'x:\' 40-43 ??? I see zeros always 44 ??? Flags? I see 40h, except entry after last valid entry = 00 45-48 Pointer to DOS Disk Block for this drive 49-4A ??? Current track or block? -1 if never accessed. 4B-4E ??? I see -1 always 4F-50 ??? I see 2 always 1A-1D Pointer to FCB table (if CONFIG.SYS contains FCBS=) 1E-1F Size of FCB table 20 Number of block devices 21 Value of LASTDRIVE command in CONFIG.SYS (default 5) 22 Beginning (not a pointer--the real beginning!) of NUL device driver. This is the first device on DOS's linked list of device drivers. ----------------------------------------------------------- INT 21 - DOS Internal - TRANSLATE BPB AH = 53h DS:SI points to BPB (Bios Parameter Block) ES:BP points to area for DOS Disk Block Translates BPB (Bios Parameter Block, see below) into a DOS Disk Block (see function call 32h). BPB Bytes Value 0-1 Bytes/sector. Get from DDB bytes 2-3. 2 Sectors/cluster. Get from: (DDB byte 4) + 1 3-4 Reserved sectors. Get from: DDB bytes 6-7 5 Number of FATs. Get from: DDB byte 8 6-7 Number of root dir entries. Get from: DDB bytes 9-A 8-9 Total # of sectors. Get from: ((DDB bytes D-E) - 1) * (sectors per cluster (BPB byte 2)) + (DDB Bytes B-C) A Media descriptor byte. Get from: DDB byte 16 B-C Number of sectors/FAT. Get from: DDB byte F ----------------------------------------------------------- INT 21 - DOS 2+ - GET VERIFY FLAG AH = 54h Return: AL = 0 if flag OFF AL = 1 if flag ON ----------------------------------------------------------- INT 21 - DOS Internal - CREATE PSP AH = 55h DX = Segment number to set up PSP at Note: Like func 26h but creates "child" PSP rather than copying existing one. ----------------------------------------------------------- INT 21 - DOS 2+ - RENAME A FILE AH = 56h DS:DX = pointer to ASCIZ old name ES:DI = pointer to ASCIZ new name Return: CF = 1 if error AX = Error Code Note: allows move between directories on same logical volume (DOS 3.x) allows renaming of directories ----------------------------------------------------------- INT 21 - DOS 2+ - GET/SET FILE'S DATE/TIME AH = 57h AL = function code 0 = get date and time 1 = set date and time CX = time to be set DX = date to be set BX = file handle Return: CF = 1 if error AX = Error Code CX = time of last write (if AL = 0) DX = date of last write (if AL = 0) ----------------------------------------------------------- INT 21 - DOS 3.x - GET/SET MEMORY ALLOCATION STRATEGY AH = 58h AL = function code 0 = get allocation strategy 1 = set allocation strategy BL = strategy code 0 first fit (use first memory block large enough) 1 best fit (use smallest memory block large enough) 2 last fit (use high part of last usable memory block) Return: CF = 1 error AX = Error Code CF = 0 successful AX = strategy code Note: the Set subfunction accepts any value in BL; 2 or greater means last fit. the Get subfunction returns the last value set, so programs should check whether the value is >= 2, not just equal to 2. ----------------------------------------------------------- INT 21 - DOS 3.x - GET EXTENDED ERROR CODE AH = 59h BX = version code (0000 for DOS 3.0,3.1,3.2) Return: AX = extended error code BH = class of error BL = suggested action code CH = locus (where error occurred) Error codes: 01 function number invalid 02 file not found 03 path not found 04 too many open files 05 access denied 06 invalid handle 07 memory control block destroyed 08 insufficient memory 09 memory block address invalid 0A environment invalid 0B format invalid 0C access code invalid 0D data invalid 0F invalid drive 10 attempted to remove current directory 11 not same device 12 no more files 13 disk write-protected 14 unknown unit 15 drive not ready 16 unknown command 17 data error (CRC) 18 bad request structure length 19 seek error 1A unknwon media type 1B sector not found 1C printer out of paper 1D write fault 1E read fault 1F general failure 20 sharing violation 21 lock violation 22 disk change invalid 23 FCB unavailable 24 sharing buffer overflow 25-31 reserved 32 Network request not supported (DOS 3.1 + MS Networks) 33 Remote computer not listening 34 Duplicate name on network 35 Network name not found 36 Network busy 37 Network device no longer exists 38 Network BIOS command limit exceeded 39 Network adapter hardware error 3A Incorrect response from network 3B Unexpected network error 3C Incompatible remote adapter 3D Print queue full 3E Queue not full 3F Not enough space to print file 40 Network name was deleted 41 Network: Access denied 42 Network device type incorrect 43 Network name not found 44 Network name limit exceeded 45 Network BIOS session limit exceeded 46 Temporarily paused 47 Network request not accepted 48 Print/disk redirection paused (DOS 3.1 + MS Networks) 49-4F reserved 50 file exists 51 reserved 52 cannot make directory 53 fail on INT 24h Error Classes: 01 out of resource 02 temporary situation 03 authorization (denied access) 04 internal 05 hardware failure 06 system failure 07 application program error 08 not found 09 bad format 0A locked 0B media error 0C already exists 0D unknown Suggested Action: 01 retry 02 delayed retry 03 prompt user 04 abort after cleanup 05 immediate abort 06 ignore 07 retry after user intervention Error Locus: 01 unknown or not appropriate 02 block device 03 network related 04 serial device 05 memory related ----------------------------------------------------------- INT 21 - DOS 3.x - CREATE UNIQUE FILE AH = 5Ah DS:DX = pointer to ASCIZ directory path name ending with a '\' CX = file attribute Return: CF = 1 if error AX = Error Code if any DS:DX = path name Note: The file created is not truly "temporary". It MUST be removed by the user. ----------------------------------------------------------- INT 21 - DOS 3.x - CREATE NEW FILE AH = 5Bh DS:DX = pointer to ASCIZ directory path name CX = file attribute Return: CF = 1 if error AX = Error Code if any DS:DX = path name Note: Unlike function 3Ch, function 5Bh will fail if the file already exists. ----------------------------------------------------------- INT 21 - DOS 3.x - LOCK/UNLOCK FILE ACCESS AH = 5Ch AL = 0 if lock 1 if unlock BX = file handle CX:DX = starting offset of region to lock SI:DI = size of region to lock Return: CF = 1 if error AX = Error Code ----------------------------------------------------------- INT 21 - DOS 3.x Internal - GET ADDRESS OF CRITICAL ERROR FLAG AX = 5D06h Return: DS:SI = pointer to critical error flag CX = ??? DX = ??? Note: this call also does a lot of other work in addition to returning the pointer Note: setting CritErr flag allows use of functions 50h/51h from INT 28h under DOS 2.x by forcing use of correct stack ----------------------------------------------------------- INT 21 - DOS 3.x Internal - ??? AH = 5Dh AL = subfunction 07h: ??? 08h: (used by COMMAND.COM) 09h: (used by COMMAND.COM) ----------------------------------------------------------- INT 21 - DOS 3.1 + Microsoft Networks - GET MACHINE NAME AX = 5E00h DS:DX -> buffer for ASCIZ name Return: CF = 1 if error AX = Error Code CH = 0 if name not defined CL = NETBIOS name number DS:DX -> pointer to identifier if CH <> 0 ----------------------------------------------------------- INT 21 - DOS 3.1 + Microsoft Networks - SET PRINTER SETUP AX = 5E02h BX = Redirection list index CX = length of setup string <= 64 DS:SI -> string buffer Return: CF = 1 if error AX = Error Code ----------------------------------------------------------- INT 21 - DOS 3.1 + Microsoft Networks - GET PRINTER SETUP AX = 5E03h BX = Redirection list index ES:DI -> string buffer Return: CF = 1 if error AX = Error Code CX = length of setup string <= 64 ----------------------------------------------------------- INT 21 - DOS 3.1 + Microsoft Networks - GET REDIRECTION LIST ENTRY AX = 5F02h BX = Redirection list index DS:SI -> 16 char local device name buffer ES:DI -> 128 char network name buffer Return: CF = 1 if error AX = Error Code BH = Device status flag (BIT 0 = 0 if valid) BL = device type (03 if printer, 04 if drive) CX = stored parameter value Note: DX and BP are destroyed by this call! ----------------------------------------------------------- INT 21 - DOS 3.1 + Microsoft Networks - REDIRECT DEVICE AX = 5F03h BL = device type 03 = printer device 04 = file device CX = stored parameter value DS:SI -> source device name ES:DI -> destination ASCIZ network path + ASCIZ password Return: CF = 1 if error AX = Error Code ----------------------------------------------------------- INT 21 - DOS 3.1 + Microsoft Networks - CANCEL REDIRECTION AX = 5F04h DS:SI -> device name or network path Return: CF = 1 if error AX = Error Code ----------------------------------------------------------- INT 21 - DOS 3.x Internal - RESOLVE PATH STRING TO FULLY QUALIFIED PATH STRING AH = 60h DI:SI = relative path strings ES:DI = buffer for fully qualified name Return: buffer filled with qualified name; may return error code, unknown. ----------------------------------------------------------- INT 21 - DOS 3.x Internal - UNUSED AH = 61h Return: AL = 0 ----------------------------------------------------------- INT 21 - DOS 3.x - GET PSP ADDRESS AH = 62h Return: BX = segment address of PSP ----------------------------------------------------------- INT 21 - DOS 2.25 only - GET LEAD BYTE TABLE AH = 63h AL = subfunction 0 = get system lead byte table 1 = set/clear interim console flag DL = 1/0 to set/clear interim console flag 2 = get interim console flag Return: DS:SI -> lead byte table (AL = 0) DL = interim console flag (AL = 2) ----------------------------------------------------------- INT 21 - DOS 3.3 Internal - ??? AH = 64h ----------------------------------------------------------- INT 21 - DOS 3.3 - GET EXTENDED COUNTRY INFORMATION AH = 65h AL = info ID (1 - 6) BX = code page (-1=global code page) DX = country ID (-1=current country) ES:DI = pointer to country information buffer CX = size of buffer Return: AX = error code if carry set, otherwise CX = size of country information returned ES:DI = pointer to country information: 1 BYTE info ID if info ID <> 1 1 DWORD pointer to information if info ID == 1 1 WORD size 1 WORD country ID 1 WORD code page 34 BYTE see function 38h ----------------------------------------------------------- INT 21 - DOS 3.3 - GET/SET GLOBAL CODE PAGE TABLE AH = 66h AL = 00h get global code page Return: AX = error code if carry flag set BX = active code page DX = system code page = 01h set global page BX = active code page 437 US 860 Portugal 863 Canada (French) 865 Norway/Denmark DX = system code page (active page at boot time) Return: AX = error code if carry flag set ----------------------------------------------------------- INT 21 - DOS 3.3 - SET HANDLE COUNT AH = 67h BX = desired number of handles (max 255) Return: Carry clear if ok Carry set if error (and error code in AX) ----------------------------------------------------------- INT 21 - DOS 3.3 - COMMIT FILE, WRITE ALL BUFFERED DATA TO DISK AH = 68h BX = file handle Return: carry flag set on error (and error code in AX) ----------------------------------------------------------- INT 21 - DoubleDos - INSTALLATION CHECK AX = E400h Return: AL <> 0 if DoubleDos is active ----------------------------------------------------------- INT 21 - DoubleDos - TURN OFF TASK SWITCHING AH = EAh Return: task switching turned off ----------------------------------------------------------- INT 21 - DoubleDos - TURN ON TASK SWITCHING AH = EBh Return: task switching turned on ----------------------------------------------------------- INT 21 - DoubleDos - GET VIRTUAL SCREEN ADDRESS AH = ECh Return: ES = segment of virtual screen Note: Screen address can change if task-switching is on!! ----------------------------------------------------------- INT 21 - DoubleDos - GIVE AWAY TIME TO OTHER TASKS AH = EEh AL = number of 55ms time slices to give away Return: returns after giving away time slices ----------------------------------------------------------- INT 21 - CED - INSTALLABLE COMMANDS AH = FFh AL = 0 add installable command BL = mode - bit 0 = 1 callable from DOS prompt bit 1 = 1 callable from application DS:SI pointer to CR-terminated command name ES:DI pointer to FAR routine entry point AL = 1 remove installable command DS:SI pointer to CR-terminated command name AL = 2 reserved, may be used to test for CED installation Return: CF set on error AX = 01h invalid function 02h command not found (subfunction 1 only) 08h insufficient memory (subfunction 0 only) 0Eh bad data (subfunction 0 only) AH = 0FFh if CED not installed ----------------------------------------------------------- INT 22 - DOS - TERMINATE ADDRESS FAR (DWORD) address of routine to be executed when program "returns to DOS". Should NEVER be called directly. ----------------------------------------------------------- INT 23 - DOS - CONTROL "C" EXIT ADDRESS Automatically called from keyboard scanner when CTRL-C or CTRL-BREAK is detected. Normally aborts program and returns to DOS, but may be changed. ----------------------------------------------------------- INT 24 - DOS - FATAL ERROR HANDLER ADDRESS Automatically called upon detection of unrecoverable I/O error. Normally points to routine in resident part of COMMAND.COM that prints "Abort, Retry, Ignore?" message and takes the reply, but may be overridden if desired. Provides the following values in registers on entry to interrupt handler: AH: bit 7 = 0 disk I/O error = 1 other error -- if block device, bad FAT -- if char device, code in DI bit 6 unused bit 5 = 1 if Ignore allowed, 0 if not (DOS 3.x) bit 4 = 1 if Retry allowed, 0 if not (DOS 3.x) bit 3 = 1 if Fail allowed, 0 if not (DOS 3.x) bit 2 \ disk area of error 00 = DOS area 01 = FAT bit 1 / 10 = root dir 11 = data area bit 0 = 1 if write, 0 if read AL = drive number if AH bit 7 = 1, otherwise undefined BP:SI = address of device header for which error occurred block device if high bit of BP:SI+4 = 1 low byte of DI: 00h write-protect error 01h unknown unit 02h drive not ready 03h unknown command 04h data error (bad CRC) 05h bad request structure length 06h seek error 07h unknown media type 08h sector not found 09h printer out of paper 0Ah write fault 0Bh read fault 0Ch general failure 0Dh (DOS 3.x) sharing violation 0Eh (DOS 3.x) lock violation 0Fh (DOS 3.x) invalid disk change 10h (DOS 3.x) FCB unavailable 11h (DOS 3.x) sharing buffer overflow Handler must return AL = 00 ignore error = 01 retry operation = 02 terminate program through INT 22h = 03 fail system call in progress (DOS 3.x) ----------------------------------------------------------- INT 25 - DOS - ABSOLUTE DISK READ (except COMPAQ DOS 3.31 >32M partition) AL = Drive number (0=A, 1=B, etc) DS:BX = Disk Transfer Address (buffer) CX = Number of sectors to read DX = First relative sector to read Return: CF = 1 if error AL = error code issued to INT 24h in low half of DI AH = 80h if attachment failed to respond 40h if seek operation failed 20h if controller failed 10h if data error (bad CRC) 08h if DMA failure 04h if requested sector not found 03h if write-protected disk 02h if bad address mark 01h if bad command Note: ORIGINAL FLAGS ON STACK! ----------------------------------------------------------- INT 25 - COMPAQ DOS 3.31 - ABSOLUTE DISK READ (>32M hard-disk partition) AL = Drive number (0=A, 1=B, etc) CX = FFFFh DS:BX = Packet address DWORD sector number WORD number of sectors to read DWORD transfer address Return: same as above??? Note: partition is potentially >32M (and requires this form of the call) if bit 1 of device attribute word in device driver is set ----------------------------------------------------------- INT 26 - DOS - ABSOLUTE DISK WRITE (except COMPAQ DOS 3.31 >32M partition) AL = Drive number (0=A, 1=B, etc) DS:BX = Disk Transfer Address (buffer) CX = Number of sectors to write DX = First relative sector to write Return: CF = 1 if error AL = error code issued to INT 24h in low half of DI AH = same error codes as for INT 25h Note: ORIGINAL FLAGS ON STACK! ----------------------------------------------------------- INT 26 - COMPAQ DOS 3.31 - ABSOLUTE DISK WRITE (>32M hard-disk partition) AL = Drive number (0=A, 1=B, etc) CX = FFFFh DS:BX = Packet address DWORD sector number WORD number of sectors to write DWORD transfer address Return: same as above??? Note: partition is potentially >32M (and requires this form of the call) if bit 1 of device attribute word in device driver is set ----------------------------------------------------------- INT 27 - DOS - TERMINATE BUT STAY RESIDENT CS = current program segment DX = last program byte + 1 Return: never ----------------------------------------------------------- INT 28 - DOS Internal - KEYBOARD BUSY LOOP This interrupt is called from inside the "get input from keyboard" routine in DOS, if and only if it is safe to use INT 21 to access the disk at that time. It is used primarily by the PRINT.COM routines and TSR programs, but any number of other routines could be chained to it by saving the original vector, and calling it with a FAR call (or just JMPing to it) at the end of the new routine. The INT 28h handler may invoke any INT 21h function except functions 00h through 0Ch (and 50h/51h under DOS 2.xx unless DOS CritErr flag is set). Until some program installs its own routine, this interrupt vector simply points to an IRET opcode. ----------------------------------------------------------- INT 29 - DOS Internal - FAST PUTCHAR This interrupt is called from the DOS output routines if output is going to a device rather than a file, and the device driver's attribute word has bit 3 (04h) set to "1". ----------------------------------------------------------- INT 2A - Microsoft Networks - NETWORK INSTALLATION CHECK AH = 00h Return: AH <> 0 if installed ----------------------------------------------------------- INT 2A - Microsoft Networks - CHECK DIRECT I/O AX = 0300h DS:SI -> ASCIZ disk device name Return: CF == 0 if allowed ----------------------------------------------------------- INT 2A - Microsoft Networks - EXECUTE NETBIOS AH = 04h AL = 0 for error retry, 1 for no retry ES:BX -> NCB Return: AX = 0 for no error AH = 1, AL = error code ----------------------------------------------------------- INT 2A - Microsoft Networks - GET NETWORK RESOURCE INFORMATION AX = 0500h Return: AX = reserved BX = number of network names CX = number of commands DX = number of sessions ----------------------------------------------------------- INT 2A - NETBIOS 1.10 - NETWORK PRINT-STREAM CONTROL AH = 06h ??? Return: ??? ----------------------------------------------------------- INT 2A - ??? AH = 20h AL = 01h ??? Return: ??? Note: intercepted by DESQview 2.0 ----------------------------------------------------------- INT 2A - Microsoft Networks? - ??? AH = 82h Return: ??? Note: Called by the INT 21h function dispatcher in DOS 3.10 ----------------------------------------------------------- INT 2B - Internal routine for MSDOS (IRET) ----------------------------------------------------------- INT 2C - Internal routine for MSDOS (IRET) ----------------------------------------------------------- INT 2D - Internal routine for MSDOS (IRET) ----------------------------------------------------------- INT 2E - DOS 2+ Internal - EXECUTE COMMAND DS:SI -> counted CR-terminated command string The top-level command.com executes the command; all registers are destroyed as in EXEC. ----------------------------------------------------------- INT 2F notes AH identifies which program is to handle the interrupt 00-7F reserved for DOS C0-FF reserved for applications AL is the function code ----------------------------------------------------------- INT 2F - Multiplexor - PRINT - INSTALLATION CHECK AX = 0100h Return: AL = FFh installed 01h not installed, not OK to install 00h not installed, OK to install ----------------------------------------------------------- INT 2F - Multiplexor - PRINT - SUBMIT FILE AX = 0101h DS:DX -> packet of one byte level and DWORD file pointer Return: CF = 1 if error AX = Error Code ----------------------------------------------------------- INT 2F - Multiplexor - PRINT - REMOVE FILE AX = 0102h DS:DX -> file name (wildcards allowed) Return: CF = 1 if error AX = Error Code ----------------------------------------------------------- INT 2F - Multiplexor - PRINT - REMOVE ALL FILES AX = 0103h Return: CF = 1 if error AX = Error Code ----------------------------------------------------------- INT 2F - Multiplexor - PRINT - HOLD QUEUE/GET STATUS AX = 0104h Return: CF = 1 if error AX = Error Code 01h function invalid 02h file not found 03h path not found 04h too many open files 05h access denied 08h queue full 09h spooler busy 0Ch name too long 0Fh drive invalid DX = Error count DS:SI -> print queue (null-string terminated list of 64-byte ASCIZ file names) ----------------------------------------------------------- INT 2F - Multiplexor - PRINT - RESTART QUEUE AX = 0105h Return: Flag CF = 1 if error AX = Error Code if any ----------------------------------------------------------- INT 2F - Multiplexor - ASSIGN - INSTALLATION CHECK AX = 0600h Return: AH <> 0 if installed ----------------------------------------------------------- INT 2F - Multiplexor - ASSIGN - GET MEMORY SEGMENT AX = 0601h ??? Return: ??? ----------------------------------------------------------- INT 2F - Multiplexor - SHARE - ??? AH = 10h AL = ??? Return: ??? ----------------------------------------------------------- INT 2F - Multiplexor - MSDOS Internal - ??? AH = 10h AL = 0 returns immediately nonzero sets flag in DOS, returns AX=0001 and CF=1 Note: this is without SHARE loaded, SHARE takes over this call ----------------------------------------------------------- INT 2F - Multiplexor - MSDOS Internal - ??? AH = 11h AL = 0 returns immediately nonzero sets flag in DOS, returns AX=0001 and CF=1 Note: identical to AH=10h in PC-DOS 3.10 without SHARE loaded ----------------------------------------------------------- INT 2F - Multiplexor - MSDOS Internal - ??? AH = 12h ??? Note: also reads value of word on top of stack immediately before invocation ----------------------------------------------------------- INT 2F - Multiplexor - APPEND - INSTALLATION CHECK AX = B700h Return: AH <> 0 if installed ----------------------------------------------------------- INT 2F - Multiplexor - APPEND - ??? AX = B701h ??? ----------------------------------------------------------- INT 2F - Multiplexor - APPEND - VERSION CHECK AX = B702h ??? ----------------------------------------------------------- INT 2F - Multiplexor - Network - INSTALLATION CHECK AX = B800h Return: AH <> 0 if installed ----------------------------------------------------------- INT 2F - Multiplexor - Network - GET CURRENT POST ADDRESS AX = B803h Return: ES:BX = post address ----------------------------------------------------------- INT 2F - Multiplexor - Network - SET NEW POST ADDRESS AX = B804h ES:BX = new post address ----------------------------------------------------------- INT 2F - Multiplexor - Network - VERSION CHECK AX = B809h ??? ----------------------------------------------------------- INT 30 -> (NOT A VECTOR!) FAR JuMP instruction for CP/M-style calls INT 31 ----------------------------------------------------------- INT 32 -> not used ----------------------------------------------------------- INT 33 - MS MOUSE - RESET DRIVER AND READ STATUS AX = 0000h Return: AX = status 0 hardware/driver not installed -1 hardware/driver installed BX = number of buttons -1 two buttons 0 other than two ----------------------------------------------------------- INT 33 - MS MOUSE - SHOW MOUSE CURSOR AX = 0001h ----------------------------------------------------------- INT 33 - MS MOUSE - HIDE MOUSE CURSOR AX = 0002h Note: multiple calls to hide the cursor will require multiple calls to function 01h to unhide it. ----------------------------------------------------------- INT 33 - MS MOUSE - RETURN POSITION AND BUTTON STATUS AX = 0003h Return: BX = button status bit 0 left button pressed if 1 bit 1 right button pressed if 1 CX = column DX = row ----------------------------------------------------------- INT 33 - MS MOUSE - POSITION MOUSE CURSOR AX = 0004h CX = column DX = row ----------------------------------------------------------- INT 33 - MS MOUSE - RETURN BUTTON PRESS DATA AX = 0005h BX = button 0 left 1 right Return: AX = button states bit 0 left button pressed if 1 bit 1 right button pressed if 1 BX = number of times specified button has been pressed since last call CX = column at time specified button was last pressed DX = row at time specified button was last pressed ----------------------------------------------------------- INT 33 - MS MOUSE - RETURN BUTTON RELEASE DATA AX = 0006h BX = button 0 left 1 right Return: AX = button states bit 0 left button pressed if 1 bit 1 right button pressed if 1 BX = number of times specified button has been released since last call CX = column at time specified button was last released DX = row at time specified button was last released ----------------------------------------------------------- INT 33 - MS MOUSE - DEFINE HORIZONTAL CURSOR RANGE AX = 0007h CX = minimum column DX = maximum column ----------------------------------------------------------- INT 33 - MS MOUSE - DEFINE VERTICAL CURSOR RANGE AX = 0008h CX = minimum row DX = maximum row ----------------------------------------------------------- INT 33 - MS MOUSE - DEFINE GRAPHICS CURSOR AX = 0009h BX = column of cursor hot spot in bitmap CX = row of cursor hot spot ES:DX = pointer to bitmap 16 words, each defining the sixteen pixels of a row low bit of each word is rightmost in row ----------------------------------------------------------- INT 33 - MS MOUSE - DEFINE TEXT CURSOR AX = 000Ah BX = hardware/software text cursor 0 software CX = screen mask DX = cursor mask 1 hardware CX = start scan line DX = end scan line Note: when the software cursor is selected, the char/attribute data at the current screen position is ANDed with the screen mask and then XORed with the cursor mask ----------------------------------------------------------- INT 33 - MS MOUSE - READ MOTION COUNTERS AX = 000Bh Return: CX = number of mickeys mouse moved horizontally since last call DX = number of mickeys mouse moved vertically Notes: a mickey is the smallest increment the mouse can sense positive values indicate up/right ----------------------------------------------------------- INT 33 - MS MOUSE - DEFINE INTERRUPT SUBROUTINE PARAMETERS AX = 000Ch CX = call mask bit 0 call if mouse moves bit 1 call if left button pressed bit 2 call if left button released bit 3 call if right button pressed bit 4 call if right button released ES:DX = address of FAR routine Note: when the subroutine is called, it is passed the following values: AX = condition mask (same bit assignments as call mask) BX = button state CX = cursor column DX = cursor row DI = horizontal mickey count SI = vertical mickey count ----------------------------------------------------------- INT 33 - MS MOUSE - LIGHT PEN EMULATION ON AX = 000Dh ----------------------------------------------------------- INT 33 - MS MOUSE - LIGHT PEN EMULATION OFF AX = 000Eh ----------------------------------------------------------- INT 33 - MS MOUSE - DEFINE MICKEY/PIXEL RATIO AX = 000Fh CX = number of mickeys per 8 pixels horizontally DX = number of mickeys per 8 pixels vertically ----------------------------------------------------------- INT 33 - MS MOUSE - DEFINE SCREEN REGION FOR UPDATING AX = 0010h ??? ----------------------------------------------------------- INT 33 - MS MOUSE - DEFINE DOUBLE-SPEED THRESHOLD AX = 0013h ??? ----------------------------------------------------------- INT 33 - MS MOUSE - EXCHANGE INTERRUPT SUBROUTINES AX = 0014h ??? ----------------------------------------------------------- INT 33 - MS MOUSE - RETURN DRIVER STORAGE REQUIREMENTS AX = 0015h Return: BX = size of buffer needed to store driver state ----------------------------------------------------------- INT 33 - MS MOUSE - SAVE DRIVER STATE AX = 0016h ES:DX = pointer to buffer ----------------------------------------------------------- INT 33 - MS MOUSE - RESTORE DRIVER STATE AX = 0017h ES:DX = pointer to buffer containing saved state ----------------------------------------------------------- INT 33 - MS MOUSE - DEFINE DISPLAY PAGE NUMBER AX = 001Dh ??? ----------------------------------------------------------- INT 33 - MS MOUSE - RETURN DISPLAY PAGE NUMBER AX = 001Eh Return: ??? ----------------------------------------------------------- INT 34 - Turbo C/Microsoft languages - Floating Point emulation ----------------------------------------------------------- INT 35 - Turbo C/Microsoft languages - Floating Point emulation This interrupt emulates opcode D9h ----------------------------------------------------------- INT 36 - Turbo C/Microsoft languages - Floating Point emulation ----------------------------------------------------------- INT 37 - Turbo C/Microsoft languages - Floating Point emulation This interrupt emulates opcode DBh ----------------------------------------------------------- INT 38 - Turbo C/Microsoft languages - Floating Point emulation ----------------------------------------------------------- INT 39 - Turbo C/Microsoft languages - Floating Point emulation This interrupt emulates opcode DDh ----------------------------------------------------------- INT 3A - Turbo C/Microsoft languages - Floating Point emulation This interrupt emulates opcode DEh ----------------------------------------------------------- INT 3B - Turbo C/Microsoft languages - Floating Point emulation ----------------------------------------------------------- INT 3C - Turbo C/Microsoft languages - Floating Point emulation This interrupt emulates instructions with an ES segment override ----------------------------------------------------------- INT 3D - Turbo C/Microsoft languages - Floating Point emulation This interrupt emulates a standalone FWAIT instruction ----------------------------------------------------------- INT 3E - Turbo C/Microsoft languages - Floating Point emulation ----------------------------------------------------------- INT 3F - Overlay manager interrupt (Microsoft LINK.EXE) ----------------------------------------------------------- INT 40 Hard disk - Relocated Floppy Handler (original INT 13h) ----------------------------------------------------------- INT 41 - FIXED DISK PARAMETERS (XT,AT,XT2,XT286,PS except ESDI disks) WORD cylinders BYTE heads WORD starting reduced write current cylinder (XT only, 0 for others) WORD starting write pre-comp cylinder BYTE maximum ECC burst length BYTE control byte bits 0-2: drive option (XT only, 0 for others) bit 3: set if more than 8 heads bit 4: always 0 bit 5: set if manufacturer's defect map on max cylinder+1 bit 6: disable ECC retries bit 7: disable access retries BYTE standard timeout (XT only, 0 for others) BYTE formatting timeout (XT only, 0 for others) BYTE timeout for checking drive (XT only, 0 for others) WORD landing zone (AT/PS2) BYTE sectors/track (AT/PS2) BYTE 0 ----------------------------------------------------------- INT 42 - EGA/VGA/PS - Relocated (by EGA) Video Handler (original INT 10h) ------------------------------------------------------ INT 42 - Z100 - ??? ----------------------------------------------------------- INT 43 - EGA/VGA/PS - User font table ----------------------------------------------------------- INT 44 - EGA/VGA/CONV/PS - EGA/PCjr fonts, characters 00h to 7Fh ----------------------------------------------------------- INT 44 - Z100 - ??? ----------------------------------------------------------- INT 45 - Z100 - ??? ----------------------------------------------------------- INT 46 - Secondary Fixed Disk Params (see INT 41h) (AT,XT286,PS except ESDI) ----------------------------------------------------------- INT 46 - Z100 - ??? ----------------------------------------------------------- INT 47 - reserved ----------------------------------------------------------- INT 48 - PCjr Cordless Keyboard Translation ----------------------------------------------------------- INT 49 - PCjr Non-keyboard Scan Code Translation Table ----------------------------------------------------------- INT 4A - AT/CONV/PS - User Alarm Invoked by BIOS when real-time clock alarm occurs ----------------------------------------------------------- INT 4B - reserved ----------------------------------------------------------- INT 4C - reserved ----------------------------------------------------------- INT 4D - reserved ----------------------------------------------------------- INT 4E - reserved ----------------------------------------------------------- INT 4F - reserved ----------------------------------------------------------- INT 50-57 - IRQ0-IRQ7 relocated by DESQview ----------------------------------------------------------- INT 58 - reserved ----------------------------------------------------------- INT 59 - GSS Computer Graphics Interface (GSS*CGI) DS:DX = Pointer to block of 5 array pointers Return: CF = 0 AX = return code CF = 1 AX = error code Note: INT 59 is the means by which GSS*CGI language bindings communicate with GSS*CGI device drivers and the GSS*CGI device driver controller. also used by the IBM Graphic Development Toolkit ----------------------------------------------------------- INT 5A - Cluster adapter BIOS entry address ??? ----------------------------------------------------------- INT 5B - reserved ----------------------------------------------------------- INT 5C - NETBIOS INTERFACE ES:BX -> pointer to Network Control Block Return: AL = Error Code (0 if none) struct ncb { unsigned char ncb_command; unsigned char ncb_retcode; unsigned char ncb_lsn; unsigned char ncb_num; char far *ncb_buffer; unsigned short ncb_length; char ncb_callname[16]; char ncb_name[16]; unsigned char ncb_rto; unsigned char ncb_sto; int (far *ncb_post)(); unsigned char ncb_lana_num; unsigned char ncb_cmd_cplt; char ncb_reserve[14]; }; Command codes: #define NCB_NOWAIT 0x80 #define NCB_RESET 0x32 #define NCB_CANCEL 0x35 #define NCB_ADAPTER_STATUS 0x33 #define NCB_UNLINK 0x70 #define NCB_ADD_NAME 0x30 #define NCB_ADD_GROUP_NAME 0x36 #define NCB_DELETE_NAME 0x31 #define NCB_CALL 0x10 #define NCB_LISTEN 0x11 #define NCB_HANG_UP 0x12 #define NCB_SEND 0x14 #define NCB_CHAIN_SEND 0x17 #define NCB_RECEIVE 0x15 #define NCB_RECEIVE_ANY 0x16 #define NCB_SESSION_STATUS 0x34 #define NCB_SEND_DATAGRAM 0x20 #define NCB_SEND_BROADCAST_DATAGRAM 0x22 #define NCB_RECEIVE_DATAGRAM 0x21 #define NCB_RECEIVE_BROADCAST_DATAGRAM 0x23 struct name { char nm_name[16]; unsigned char nm_num; unsigned char nm_status; }; struct astatus { unsigned char as_id[6]; unsigned char as_jumpers; unsigned char as_post; unsigned char as_major; unsigned char as_minor; unsigned short as_interval unsigned short as_crcerr; unsigned short as_algerr; unsigned short as_colerr; unsigned short as_abterr; unsigned long as_tcount; unsigned long as_rcount; unsigned short as_retran; unsigned short as_xresrc; char as_res0[8]; unsigned short as_ncbfree; unsigned short as_ncbmax; unsigned short as_ncbx; char as_res1[4]; unsigned short as_sespend; unsigned short as_msp; unsigned short as_sesmax; unsigned short as_bufsize; unsigned short as_names; struct name as_name[16]; }; Note: Sytek PCnet card uses DMA 3. ----------------------------------------------------------- INT 5C - TOPS INTERFACE ES:BX -> Network Control Block Note: TOPS card uses DMA 1, 3 or none. ----------------------------------------------------------- INT 5D - reserved ----------------------------------------------------------- INT 5E - reserved ----------------------------------------------------------- INT 5F - reserved ----------------------------------------------------------- INT 60 - reserved for user interrupt ----------------------------------------------------------- INT 61 - reserved for user interrupt ----------------------------------------------------------- INT 62 - reserved for user interrupt ----------------------------------------------------------- INT 63 - reserved for user interrupt ----------------------------------------------------------- INT 64 - reserved for user interrupt ----------------------------------------------------------- INT 65 - reserved for user interrupt ----------------------------------------------------------- INT 66 - reserved for user interrupt ----------------------------------------------------------- INT 67 - LIM EMS - GET MANAGER STATUS AH = 40h Return: AH = status 00h successful 80h internal error 81h hardware malfunction 84h undefined function requested by application Note: this call can be used only after establishing that the EMS driver is in fact present ----------------------------------------------------------- INT 67 - LIM EMS - GET PAGE FRAME SEGMENT AH = 41h Return: AH = 00h function successful BX = segment of page frame AH = error code (see AH=40h above) ----------------------------------------------------------- INT 67 - LIM EMS - GET NUMBER OF PAGES AH = 42h Return: AH = 00h function successful BX = number of unallocated pages DX = total number of pages AH = error code (see AH=40h above) ----------------------------------------------------------- INT 67 - LIM EMS - GET HANDLE AND ALLOCATE MEMORY AH = 43h BX = number of logical pages to allocate Return: AH = status 00h function successful DX = handle 80h internal error 81h hardware malfunction 84h undefined function requested 85h no more handles available 87h more pages requested than physically exist 88h more pages requested than currently available 89h zero pages requested ----------------------------------------------------------- INT 67 - LIM EMS - MAP MEMORY AH = 44h AL = physical page number (0-3) BX = logical page number DX = handle Return: AH = status 00h function successful 80h internal error 81h hardware malfunction 83h invalid handle 84h undefined function requested 8Ah invalid logical page number 8Bh illegal physical-page number ----------------------------------------------------------- INT 67 - LIM EMS - RELEASE HANDLE AND MEMORY AH = 45h DX = EMM handle Return: AH = status 00h successful 80h internal error 81h hardware malfunction 83h invalid handle 84h undefined function requested 86h error in save or restore of mapping context ----------------------------------------------------------- INT 67 - LIM EMS - GET EMM VERSION AH = 46h Return: AH = status 00h successful AL = EMM version number 80h internal error 81h hardware malfunction 84h undefined function requested ----------------------------------------------------------- INT 67 - LIM EMS - SAVE MAPPING CONTEXT AH = 47h DX = handle Return: AH = status 00h successful 80h internal error 81h hardware malfunction 83h invalid handle 84h undefined function requested 8Ch page-mapping hardware state save area is full 8Dh save of mapping context failed ----------------------------------------------------------- INT 67 - LIM EMS - RESTORE MAPPING CONTEXT AH = 48h DX = handle Return: AH = status 00h successful 80h internal error 81h hardware malfunction 83h invalid handle 84h undefined function requested 8Eh restore of mapping context failed ----------------------------------------------------------- INT 67 - LIM EMS - reserved AH = 49h Note: defined in EMS 3.0, but undocumented in EMS 3.2 ----------------------------------------------------------- INT 67 - LIM EMS - reserved AH = 4Ah Note: defined in EMS 3.0, but undocumented in EMS 3.2 ----------------------------------------------------------- INT 67 - LIM EMS - GET NUMBER OF EMM HANDLES AH = 4Bh Return: AH = status 00h successful BX = number of EMM handles 80h internal error 81h hardware malfunction 83h invalid handle 84h undefined function requested ----------------------------------------------------------- INT 67 - LIM EMS - GET PAGES OWNED BY HANDLE AH = 4Ch DX = EMM handle Return: AH = status 00h successful BX = number of logical pages 80h internal error 81h hardware malfunction 83h invalid handle 84h undefined function requested ----------------------------------------------------------- INT 67 - LIM EMS - GET PAGES FOR ALL HANDLES AH = 4Dh ES:DI = pointer to array to receive information Return: AH = status 00h successful BX = number of active EMM handles array filled with 2-word entries, consisting of a handle and the number of pages allocated to that handle 80h internal error 81h hardware malfunction 84h undefined function requested ----------------------------------------------------------- INT 67 - LIM EMS - GET OR SET PAGE MAP AH = 4Eh AL = 00h if getting mapping registers 01h if setting mapping registers 02h if getting and setting mapping registers at once 03h if getting size of page-mapping array DS:SI = pointer to array holding information (AL=01/02) ES:DI = pointer to array to receive information (AL=00/02) Return: AH = status 00h successful AL = bytes in page-mapping array (subfunction 03h only) array pointed to by ES:DI receives mapping info (AL=00/02) 80h internal error 81h hardware malfunction 84h undefined function requested 8Fh undefined subfunction parameter A3h contents of source array corrupted (EMS 4.0?) Note: this function was designed to be used by multitasking operating systems and should not ordinarily be used by appplication software. ----------------------------------------------------------- INT 67 - LIM EMS 4.0 - GET/SET PARTIAL PAGE MAP AH = 4Fh AL = subfunction 00h get partial page map DS:SI = pointer to structure containing list of segments whose mapping contexts are to be saved ES:DI = pointer to array to receive page map 01h set partial page map DS:SI = pointer to structure containing saved partial page map 02h get size of partial page map BX = number of mappable segments in the partial map to be saved Return: AH = status 00h successful 80h internal error 81h hardware malfunction 84h undefined function requested 8Bh one of specified segments is not mappable 8Fh undefined subfunction parameter A3h contents of partial page map corrupted or count of mappable segments exceeds total number of mappable segments in system AL = size of partial page map for subfunction 02h ----------------------------------------------------------- INT 67 - LIM EMS 4.0 - MAP/UNMAP MULTIPLE HANDLE PAGES AH = 50h AL = subfunction 00h 01h DX = handle CX = number of entries in array DS:SI = pointer to mapping array Return: AH = status 00h successful 80h internal error 81h hardware malfunction 83h invalid handle 84h undefined function requested 8Ah one or more logical pages are invalid 8Bh one or more physical pages are invalid 8Fh invalid subfunction ----------------------------------------------------------- INT 67 - LIM EMS 4.0 - REALLOCATE PAGES AH = 51h DX = handle BX = number of pages to be allocated to handle Return: BX = actual number of pages allocated to handle AH = status 00h successful 80h internal error 81h hardware malfunction 83h invalid handle 84h undefined function requested 87h more pages requested than present in system 88h more pages requested than currently available ----------------------------------------------------------- INT 67 - LIM EMS 4.0 - GET/SET HANDLE ATTRIBUTES AH = 52h AL = subfunction 00h get handle attributes 01h set handle attributes BL = new attribute (see returned AL) 02h get attribute capability DX = handle Return: AL = attribute (for subfunction 00h) 00h handle is volatile 01h handle is nonvolatile AL = attribute capability (for subfunction 02h) 00h only volatile handles supported 01h both volatile and non-volatile supported AH = status 00h successful 80h internal error 81h hardware malfunction 83h invalid handle 84h undefined function requested 8Fh undefined subfunction 90h undefined attribute type 91h feature not supported ----------------------------------------------------------- INT 67 - LIM EMS 4.0 - GET/SET HANDLE NAME AH = 53h AL = subfunction 00h get handle name ES:DI = pointer to 8-byte handle name array 01h set handle name DS:SI = pointer to 8-byte handle name DX = handle Return: AH = status 00h successful 80h internal error 81h hardware malfunction 83h invalid handle 84h undefined function requested 8Fh undefined subfunction A1h duplicate handle name ----------------------------------------------------------- INT 67 - LIM EMS 4.0 - GET HANDLE DIRECTORY AH = 54h AL = subfunction 00h get handle directory ES:DI = pointer to buffer for handle directory 01h search for named handle DS:SI = pointer to 8-byte name 02h get total number of handles Return: AL = number of entries in handle directory (subfunction 00h) DX = value of named handle (subfunction 01h) BX = total number of handles (subfunction 02h) AH = status 00h successful 80h internal error 81h hardware malfunction 84h undefined function requested 8Fh undefined subfunction A0h no such handle name A1h a handle found had no name ----------------------------------------------------------- INT 67 - LIM EMS 4.0 - ALTER PAGE MAP AND JUMP AH = 55h AL = subfunction 00h physical page numbers provided by caller 01h segment addresses provided by caller DX = handle DS:SI = pointer to structure containing map and jump address Return: (at target address unless error) AH = status 00h successful 80h internal error 81h hardware failure 83h invalid handle 84h undefined function requested 8Ah invalid logical page number encountered 8Bh invalid physical page number encountered 8Fh invalid subfunction ----------------------------------------------------------- INT 67 - LIM EMS 4.0 - ALTER PAGE MAP AND CALL AH = 56h AL = subfunction 00h physical page numbers provided by caller DX = handle DS:SI = pointer to structure containing page map and call address 01h segment addresses provided by caller DX = handle DS:SI = pointer to structure containing page map and call address 02h get page map stack space required Return: (if successful, the target address is called. Use a RETF to return and restore mapping context) BX = stack space required (subfunction 02h) AH = status 00h successful 80h internal error 81h hardware failure 83h invalid handle 84h undefined function requested 8Ah invalid logical page number encountered 8Bh invalid physical page number encountered 8Fh undefined subfunction ----------------------------------------------------------- INT 67 - LIM EMS 4.0 - MOVE/EXCHANGE MEMORY REGION AH = 57h AL = subfunction 00h move memory region 01h exchange memory region DS:SI = pointer to structure describing source and destination Return: AH = status 00h successful 80h internal error 81h hardware failure 83h invalid handle 84h undefined function requested 8Ah invalid logical page number encountered 8Fh undefined subfunction 92h successful, but a portion of the source region has been overwritten 93h length of source or destination region exceeds length of region allocated to either source or destination handle 94h conventional and expanded memory regions overlap 95h offset within logical page exceeds size of logical page 96h region length exceeds 1M 97h source and destination EMS regions have same handle and overlap 98h memory source or destination type undefined A2h attempted to wrap around 1M conventional address space ----------------------------------------------------------- INT 67 - LIM EMS 4.0 - GET MAPPABLE PHYSICAL ADDRESS ARRAY AH = 58h AL = subfunction 00h get mappable physical address array ES:DI = pointer to buffer to be filled with array 01h get number of entries in m.p.a. array Return: CX = number of entries in array AH = status 00h successful 80h internal error 81h hardware failure 84h undefined function requested 8Fh undefined subfunction ----------------------------------------------------------- INT 67 - LIM EMS 4.0 - GET EXPANDED MEMORY HARDWARE INFORMATION AH = 59h AL = subfunction 00h get hardware configuration array ES:DI = pointer to buffer to be filled with array 01h get unallocated raw page count Return: BX = unallocated raw pages (subfunction 01h) DX = total raw pages (subfunction 01h) AH = status 00h successful 80h internal error 81h hardware failure 84h undefined function requested 8Fh undefined subfunction A4h access denied by operating system Note: subfunction 00h is for use by operating systems only, and can be enabled or disabled at any time by the operating system ----------------------------------------------------------- INT 67 - LIM EMS 4.0 - ALLOCATE STANDARD/RAW PAGES AH = 5Ah AL = subfunction 00h allocate standard pages 01h allocate raw pages BX = number of pages to allocate Return: DX = handle AH = status 00h successful 80h internal error 81h hardware failure 84h undefined function requested 85h no more handles available 87h insufficient memory pages in system 88h insufficient memory pages available 8Fh undefined subfunction ----------------------------------------------------------- INT 67 - LIM EMS 4.0 - ALTERNATE MAP REGISTER SET AH = 5Bh AL = subfunction 00h get alternate map register set 01h set alternate map register set BL = new alternate map register set number ES:DI = pointer to map register context save area if BL=0 02h get alternate map save array size 03h allocate alternate map register set 04h deallocate alternate map register set BL = number of alternate map register set Return: BL = current active alternate map register set number if nonzero (AL=0) ES:DI = pointer to a map register context save area if BL=0 (AL=0) DX = array size in bytes (subfunction 02h) BL = number of alternate map register set; zero if not supported (AL=3) AH = status 00h successful 80h internal error 81h hardware malfunction 84h undefined function requested 8Fh undefined subfunction 9Ah specified alternate map register set not supported 9Bh all alternate map register sets currently allocated 9Ch alternate map register sets not supported 9Dh undefined or unallocated alternate map register set A3h source array corrupted A4h operating system denied access Note: this function is for use by operating systems only, and can be enabled or disabled at any time by the operating system ----------------------------------------------------------- INT 67 - LIM EMS 4.0 - ALTERNATE MAP REGISTER SET - DMA REGISTERS AH = 5Bh AL = subfunction 05h allocate DMA register set 06h enable DMA on alternate map register set BL = DMA register set number DL = DMA channel number 07h disable DMA on alternate map register set BL = DMA register set number 08h deallocate DMA register set BL = DMA register set number Return: BL = DMA register set number; zero if not supported (subfunction 05h) AH = status 00h successful 80h internal error 81h hardware malfunction 84h undefined function requested 8Fh undefined subfunction 9Ah specified DMA register set not supported 9Bh all DMA register sets currently allocated 9Ch alternate DMA sets not supported 9Dh undefined or unallocated DMA register set 9Eh dedicated DMA channels not supported 9Fh specified dedicated DMA channel not supported A3h source array corrupted A4h operating system denied access Note: this function is for use by operating systems only, and can be enabled or disabled at any time by the operating system ----------------------------------------------------------- INT 67 - LIM EMS 4.0 - PREPARE EXPANDED MEMORY HARDWARE FOR WARM BOOT AH = 5Ch Return: AH = status 00h successful 80h internal error 81h hardware malfunction 84h undefined function requested ----------------------------------------------------------- INT 67 - LIM EMS 4.0 - ENABLE/DISABLE OS FUNCTION SET FUNCTIONS AH = 5Dh AL = subfunction 00h enable OS Function Set 01h disable OS Function Set 02h return access key (resets memory manager, returns access key at next invocation) BX,CX = access key returned by first invocation Return: BX,CX = access key, returned only on first invocation of function AH = status 00h successful 80h internal error 81h hardware malfunction 84h undefined function requested 8Fh undefined subfunction A4h operating system denied access ----------------------------------------------------------- INT 67 - EEMS - GET PHYSICAL WINDOW ARRAY AH = 60h ES:DI pointer to buffer Return: AH = status AL = number of entries buffer at ES:DI filled ----------------------------------------------------------- INT 67 - EEMS - GENERIC ACCELERATOR CARD SUPPORT AH = 61h ??? Return: ??? Note: can be used by accelerator card manufacturer to flush RAM cache, ensuring that the cache accurately reflects what the processor would see without the cache. ----------------------------------------------------------- INT 67 - EEMS - GET ADDRESSES OF ALL PAGE FRAMES IN SYSTEM AH = 68h ES:DI -> buffer Return: AH = status AL = number of entries buffer at ES:DI filled Note: equivalent to LIM 4.0 function 58h ----------------------------------------------------------- INT 67 - EEMS - MAP PAGE INTO FRAME AH = 69h AL = frame number BX = page number DX = handle Return: AH = status Note: similar to EMS function 44h ----------------------------------------------------------- INT 67 - EEMS - PAGE MAPPING AH = 6Ah AL = subfunction 00h save partial page map CH = first page frame CL = number of frames ES:DI -> buffer which is to be filled 01h restore partial page map CH = first page frame CL = number of frames DI:SI -> previously saved page map 02h save and restore partial page map CH = first page frame CL = number of frames ES:DI = buffer for current page map DI:SI = new page map 03h get size of save array CH = first page frame CL = number of frames Return: AL = size of array in bytes 04h switch to standard map register setting 05h switch to alternate map register setting 06h deallocate pages mapped to frames in conventional memory CH = first page frame CL = number of frames Return: AH = status Note: similar to EMS function 4Eh, except that a subrange of pages can be specified ----------------------------------------------------------- INT 68 - unused ----------------------------------------------------------- INT 69 - unused ----------------------------------------------------------- INT 6A - unused ----------------------------------------------------------- INT 6B - unused ----------------------------------------------------------- INT 6C - system resume vector (CONVERTIBLE) - DOS 3.2 Realtime Clock update ----------------------------------------------------------- INT 6D - unused ----------------------------------------------------------- INT 6E - unused ----------------------------------------------------------- INT 6F - unused ----------------------------------------------------------- INT 70-77 - AT/XT286/PS50+ VECTORED HARDWARE LINES IRQ8 real-time clock IRQ9 LAN adapter 1 (rerouted to INT 0Ah by BIOS) IRQ10 reserved IRQ11 reserved IRQ12 (PS50+) mouse interrupt IRQ13 80287 error (rerouted to INT 2 by BIOS) IRQ14 fixed disk IRQ15 reserved ----------------------------------------------------------- INT 78 - not used ----------------------------------------------------------- INT 79 - not used ----------------------------------------------------------- INT 7A - not used ----------------------------------------------------------- INT 7B - not used ----------------------------------------------------------- INT 7C - not used ----------------------------------------------------------- INT 7D - not used ----------------------------------------------------------- INT 7E - not used ----------------------------------------------------------- INT 7F - not used ----------------------------------------------------------- INT 80 - reserved for BASIC ----------------------------------------------------------- INT 81 - reserved for BASIC ----------------------------------------------------------- INT 82 - reserved for BASIC ----------------------------------------------------------- INT 83 - reserved for BASIC ----------------------------------------------------------- INT 84 - reserved for BASIC ----------------------------------------------------------- INT 85 - reserved for BASIC ----------------------------------------------------------- INT 86 - Relocated (by NETBIOS) INT 18 ----------------------------------------------------------- INT 86-F0 - used by BASIC while in interpreter ----------------------------------------------------------- INT E0 - CP/M-86 function calls ----------------------------------------------------------- INT E4 - Logitech Modula v2.0 - MonitorEntry AX = 0005h BX = priority ----------------------------------------------------------- INT E4 - Logitech Modula v2.0 - MonitorExit AX = 0006h ----------------------------------------------------------- INT F1 - reserved for user interrupt ----------------------------------------------------------- INT F2 - reserved for user interrupt ----------------------------------------------------------- INT F3 - reserved for user interrupt ----------------------------------------------------------- INT F4 - reserved for user interrupt ----------------------------------------------------------- INT F5 - reserved for user interrupt ----------------------------------------------------------- INT F6 - reserved for user interrupt ----------------------------------------------------------- INT F7 - reserved for user interrupt ----------------------------------------------------------- INT F8 - 10 ms INTERVAL TIMER (TANDY???) ----------------------------------------------------------- INT F9 - reserved for user interrupt ----------------------------------------------------------- INT FA - USART READY (RS-232C) (TANDY???) ----------------------------------------------------------- INT FB - USART Rx READY (keyboard) (TANDY???) ----------------------------------------------------------- INT FC - reserved for user interrupt ----------------------------------------------------------- INT FD - reserved for user interrupt ----------------------------------------------------------- INT FE - destroyed by return from protected mode on PC/AT ----------------------------------------------------------- INT FF - destroyed by return from protected mode on PC/AT ----------------------------------------------------------- INT FF - Z100 - WARM BOOT