12134 lines
573 KiB
Prolog
12134 lines
573 KiB
Prolog
|
||
CHAPTER 1.
|
||
DOS TECHNICAL INFORMATION
|
||
Programming Technical Reference - IBM
|
||
Copyright 1988, Dave Williams
|
||
|
||
|
||
SOME HISTORY
|
||
|
||
Development of MSDOS/PCDOS began in October 1980, when IBM began searching
|
||
the market for an operating system for the yet-to-be-introduced IBM PC.
|
||
Microsoft had no real operating system to sell, but after some research licensed
|
||
Seattle Computer Products' 86-DOS, which had been written by a man named Tim
|
||
Paterson for use on the company's line of 8086, S100 bus micros. This was
|
||
hurriedly polished up and presented to IBM for evaluation. IBM had originally
|
||
intended to use Digital Research's CP/M operating system, which was the industry
|
||
standard at the time. Folklore reports everything from obscure legal
|
||
entanglements to outright snubbing of the IBM representatives by Digital,
|
||
irregardless, IBM found itself left with Microsoft's offering of "Microsoft Disk
|
||
Operating System 1.0". An agreement was reached between the two, and "IBM PC-DOS
|
||
1.0" was ready for the introduction of the IBM PC in October 1981. IBM subjected
|
||
the operating system to an extensive quality-assurance program, found well over
|
||
300 bugs, and decided to rewrite the programs. This is why PC-DOS is copyrighted
|
||
by both IBM and Microsoft.
|
||
|
||
It is sometimes amusing to reflect on the fact that the IBM PC was not
|
||
originally intended to run MSDOS. The target operating system at the end of the
|
||
development was for a (not yet in existence) 8086 version of CP/M. On the other
|
||
hand, when DOS was originally written the IBM PC did not yet exist! Although
|
||
PC-DOS was bundled with the computer, Digital Research's CP/M-86 would probably
|
||
have been the main operating system for the PC except for two things - Digital
|
||
Research wanted $495 for CP/M-86 (considering PC-DOS was essentially free) and
|
||
many software developers found it easier to port existing CP/M software to DOS
|
||
than to the new version of CP/M.
|
||
|
||
MSDOS and PC-DOS have been run on more than just the IBM-PC and clones. There
|
||
was an expansion board for the Apple ][ that allowed one to run (some) well -
|
||
behaved DOS programs. There are expansion boards for the Commodore Amiga 2000,
|
||
the Apple MacIntosh II, and the IBM RT PC allowing them to run DOS, and the IBM
|
||
3270 PC, which ran DOS on a 68000 microprocessor. The Atari STs can run an
|
||
emulator program and boot MSDOS.
|
||
|
||
|
||
Specific Versions of MS/PC-DOS:
|
||
|
||
DOS version nomenclature: major.minor.minor. The digit to the left of the
|
||
decimal point indicates a major DOS version change. 1.0 was the first version.
|
||
2.0 added subdirectories, etc. 3.0 added file handles and network support.
|
||
The first minor version indicates customization for a major application. For
|
||
example, 2.1 for the PCjr, 3.3 for the PS/2s. The second minor version does not
|
||
seem to have any particular meaning.
|
||
|
||
The main versions of DOS are:
|
||
|
||
PC-DOS 1.0 October 1981 original release
|
||
PC-DOS 1.1 June 1982 bugfix, double sided drive support
|
||
MS-DOS 1.25 June 1982 for early compatibles
|
||
PC-DOS 2.0 March 1983 for PC/XT, many UNIX-like functions
|
||
PC-DOS 2.1 October 1983 for PCjr, bugfixes for 2.0
|
||
MS-DOS 2.11 October 1983 compatible equivalent to 2.1
|
||
PC-DOS 3.0 August 1984 for PC/AT, network support
|
||
PC-DOS 3.1 November 1984 bugfix for 3.0
|
||
MS-DOS 2.25 October 1985 compatible; extended foreign language support
|
||
PC-DOS 3.2 July 1986 3.5 inch drive support for Convertible
|
||
PC-DOS 3.3 April 1987 for PS/2 series
|
||
|
||
|
||
Some versions of MS-DOS varied from PC-DOS in the availible external commands.
|
||
Some OEMs only licensed the basic operating system code (the xxxDOS and xxxBIO
|
||
programs, and COMMAND.COM) from Microsoft, and either wrote the rest themselves
|
||
or contracted them from outside software houses like Phoenix. Most of the
|
||
external programs for DOS 3.x are written in "C" while the 1.x and 2.x utilities
|
||
were written in assembly language. Other OEMs required customized versions of
|
||
DOS for their specific hardware configurations, such as Sanyo 55x and early
|
||
Tandy computers, which were unable to exchange their DOS with the IBM version.
|
||
|
||
At least two versions of DOS have been modified to be run entirely out of ROM.
|
||
The Sharp PC5000 had MSDOS 1.25 in ROM, and the Toshiba 1100 and some Tandy
|
||
models have MSDOS 2.11 in ROM.
|
||
|
||
|
||
THE OPERATING SYSTEM HIERARCHY
|
||
|
||
The Disk Operating System (DOS) and the ROM BIOS serve as an insulating layer
|
||
between the application program and the machine, and as a source of services
|
||
to the application program.
|
||
The system heirarchy may be thought of as a tree, with the lowest level being
|
||
the actual hardware. The 8088 or V20 processor sees the computer's address
|
||
space as a ladder two bytes wide and one million bytes long. Parts of this
|
||
ladder are in ROM, parts in RAM, and parts are not assigned. There are also
|
||
256 "ports" that the processor can use to control devices.
|
||
The hardware is normally addressed by the ROM BIOS, which will always know
|
||
where everything is in its particular system. The chips may usually also be
|
||
written to directly, by telling the processor to write to a specific address or
|
||
port. This sometimes does not work as the chips may not always be at the same
|
||
addresses or have the same functions from machine to machine.
|
||
|
||
|
||
|
||
DOS STRUCTURE
|
||
|
||
DOS consists of four components:
|
||
|
||
* The boot record
|
||
* The ROM BIOS interface (IBMBIO.COM or IO.SYS)
|
||
* The DOS program file (IBMDOS.COM or MSDOS.SYS)
|
||
* The command processor (COMMAND.COM or aftermarket replacement)
|
||
|
||
|
||
* The Boot Record
|
||
|
||
The boot record begins on track 0, sector 1, side 0 of every diskette formatted
|
||
by the DOS FORMAT command. The boot record is placed on diskettes to produce an
|
||
error message if you try to start up the system with a nonsystem diskette in
|
||
drive A. For hard disks, the boot record resides on the first sector of the DOS
|
||
partition. All media supported by DOS use one sector for the boot record.
|
||
|
||
|
||
* Read Only Memory (ROM) BIOS Interface
|
||
|
||
The file IBMBIO.COM or IO.SYS is the interface module to the ROM BIOS.
|
||
This file provides a low-level interface to the ROM BIOS device routines and
|
||
may contain extensions or changes to the system board ROMs. Some compatibles do
|
||
not have a ROM BIOS to extend, and load the entire BIOS from disk. (Sanyo 55x,
|
||
Viasyn)
|
||
|
||
|
||
* The DOS Program File
|
||
|
||
The actual DOS program is file IBMDOS.COM or MSDOS.SYS. It provides a high-
|
||
level interface for user (application) programs. This program consists of file
|
||
management routines, data blocking/deblocking for the disk routines, and a
|
||
variety of built-in functions easily accessible by user programs.
|
||
When a user program calls these function routines, they accept high-level
|
||
information by way of register and control block contents. For device
|
||
operations, the functions translate the requirement into one or more calls to
|
||
IBMBIO.COM or MSDOS.SYS to complete the request.
|
||
|
||
|
||
* The Command Interpreter
|
||
|
||
The Command interpreter, COMMAND.COM, consists of these parts:
|
||
|
||
Resident Portion:
|
||
|
||
The resident portion resides in memory immediately following IBMDOS.COM and its
|
||
data area. This portion contains routines to process interrupts 22h (Terminate
|
||
Address), 23h (Ctrl-Break Handler), and 24h (Critical Error Handler), as well as
|
||
a routine to reload the transient portion if needed. For DOS 3.x, this portion
|
||
also contains a routine to load and execute external commands, such as files
|
||
with exensions of COM or EXE.
|
||
|
||
When a program terminates, a checksum is used to determine if the application
|
||
program overlaid the transient portion of COMMAND.COM. If so, the resident
|
||
portion will reload the transient portion from the area designated by COMSPEC=
|
||
in the DOS environment. If COMMAND.COM cannot be found, the system will halt.
|
||
|
||
NOTE: DOS 3.3 checks for the presence of a hard disk, and will default to
|
||
COMSPEC=C:\. Previous versions default to COMSPEC=A:\. Under some DOS
|
||
versions, if COMMAND.COM is not immediately availible for reloading
|
||
(i.e., swapping to a floppy with COMMAND.COM on it) DOS may crash.
|
||
|
||
All standard DOS error handling is done within the resident portion of
|
||
COMMAND.COM. This includes displaying error messages and interpreting the
|
||
replies of Abort, Retry, Ignore, Fail.
|
||
|
||
|
||
An initialization routine is included in the resident portion and assumes
|
||
control during startup. This routine contains the AUTOEXEC.BAT file handler and
|
||
determines the segment address where user application programs may be loaded.
|
||
The initialization routine is then no longer needed and is overlaid by the first
|
||
program COMMAND.COM loads.
|
||
|
||
NOTE: AUTOEXEC.BAT may be a hidden file.
|
||
|
||
A transient portion is loaded at the high end of memory. This is the command
|
||
processor itself, containing all of the internal command processors and the
|
||
batch file processor. For DOS 2.x, this portion also contains a routine to load
|
||
and execute external commands, such as files with extensions of COM or EXE.
|
||
|
||
This portion of COMMAND.COM also produces the DOS prompt (such as "A>"), reads
|
||
the command from the standard input device (usually the keyboard or a batch
|
||
file), and executes the command. For external commands, it builds a command line
|
||
and issues an EXEC function call to load and transfer control to the program.
|
||
|
||
NOTE: COMMAND.COM may be a hidden file.
|
||
|
||
NOTE: For Dos 2.x, the transient portion of the command processor contains the
|
||
EXEC routine that loads and executes external commands. For DOS 3.x, the
|
||
resident portion of the command processor contains the EXEC routine.
|
||
|
||
|
||
|
||
DOS Initialization
|
||
|
||
The system is initialized by a software reset (Ctrl-Alt-Del), a hardware reset
|
||
(reset button), or by turning the computer on. The Intel 80x8x series processors
|
||
always look for their first instruction at the end of their address space
|
||
(0FFFF0h) when powered up or reset. This address contains a jump to the first
|
||
instruction for the ROM BIOS.
|
||
Built-in ROM programs (Power-On Self-Test, or POST, in the IBM) check machine
|
||
status and run inspection programs of various sorts. Some machines set up a
|
||
reserved RAM area with bytes indicating installed equipment (AT and PCjr).
|
||
The ROM routine looks for a disk drive at A: or an option ROM (usually a hard
|
||
disk) at absolute address C:800h. If no floppy drive or option ROM is found, the
|
||
BIOS calls int 19h (ROM BASIC if it is an IBM) or displays error message.
|
||
If a bootable disk is found, the ROM BIOS loads the first sector of information
|
||
from the disk and then jumps into the RAM location holding that code. This code
|
||
normally is a routine to load the rest of the code off the disk, or to "boot"
|
||
the system.
|
||
The following actions occur after a system initialization:
|
||
|
||
1. The boot record is read into memory and given control.
|
||
|
||
2. The boot record then checks the root directory to assure that the first
|
||
two files are IBMBIO.COM and IBMDOS.COM. These two files must be the
|
||
first two files, and they must be in that order (IBMBIO.COM first, with
|
||
its sectors in contiguous order).
|
||
NOTE: IBMDOS.COM need not be contiguous in version 3.x.
|
||
|
||
3. The boot record loads IBMBIO.COM into memory.
|
||
|
||
4. The initialization code in IBMBIO.COM loads IBMDOS.COM, determines
|
||
equipment status, resets the disk system, initializes the attached
|
||
devices, sets the system parameters and loads any installable device
|
||
drivers according to the CONFIG.SYS file in the root directory (if
|
||
present), sets the low-numbered interrupt vectors, relocates IBMDOS.COM
|
||
downward, and calls the first byte of DOS.
|
||
NOTE: CONFIG.SYS may be a hidden file.
|
||
|
||
5. DOS initializes its internal working tables, initializes the interrupt
|
||
vectors for interrupts 20h through 27h, and builds a Program Segment
|
||
Prefix for COMMAND.COM at the lowest available segment. For DOS versions
|
||
3.10 up, DOS initializes interrupt vectors for interrupts 0Fh through 3Fh.
|
||
|
||
6. IBMBIO.COM uses the EXEC function call to load and start the top-level
|
||
command processor. The default command processor is COMMAND.COM.
|
||
|
||
|
||
|
||
|
||
CHAPTER 2
|
||
|
||
Programming Technical Reference - IBM
|
||
Copyright 1988, Dave Williams
|
||
|
||
CPU Port Assignments, System Memory Map, BIOS Data Area, Interrupts 00h to 09h
|
||
|
||
|
||
SYSTEM MEMORY MAP - OVERALL
|
||
|
||
The IBM PC handles its address space in 64k segments, divided into 16k
|
||
fractions and then further as nescessary.
|
||
|
||
start start end
|
||
addr. addr. addr. usage
|
||
(dec) (hex)
|
||
|
||
00000 **** 640k *************** system data, drivers....
|
||
0000:0000 hardware interrupt vectors
|
||
0000:0040 BIOS interrupt vectors
|
||
0k start of RAM | 0000:0080 DOS interrupt vector table
|
||
16k 00000-03FFF | 0000:0300 Stack area during POST and bootstrap routine
|
||
32k 04000-07FFF | 0000:0400 BIOS Data Area
|
||
48k 08000-0BFFF | 0000:04F0 Intra-Application Communications Area
|
||
|
|
||
64k 10000-13FFF | 0000:0500 DOS reserved communication area
|
||
80k 14000-17FFF | xxxx:0000 IO.SYS - DOS interface to ROM I/O routines
|
||
96k 18000-1BFFF | xxxx:0000 MSDOS.SYS - DOS interrupt handlers, service
|
||
112k 1C000-1FFFF | routines (int 21 functions)
|
||
|
|
||
128k 20000-23FFF | xxxx:xxxx DOS buffers, control areas, and installed
|
||
144k 24000-27FFF | device drivers.
|
||
160k 28000-2BFFF | xxxx:0000 resident portion of COMMAND.COM, interrupt
|
||
176k 2C000-2FFFF | handlers for int 22h, 23h,24h, and code to
|
||
| reload the transient portion
|
||
192k 30000-33FFF | xxxx:0000 master environment block, default 64 bytes
|
||
208k 34000-37FFF | xxxx:0000 environment for next program
|
||
224k 38000-3BFFF | xxxx:0000 external commands or utilities (COM or EXE
|
||
240k 3C000-3FFFF | files)
|
||
|
|
||
256k 40000-43FFF | ----:---- application programs
|
||
272k 44000-47FFF | xxxx:0000 user stack for COM files (256 bytes)
|
||
288k 48000-4BFFF | xxxx:0000 transient portion of COMMAND.COM
|
||
304k 4C000-4FFFF |
|
||
|
|
||
320k 50000-53FFF |
|
||
336k 54000-57FFF |
|
||
352k 58000-5BFFF |
|
||
368k 5C000-5FFFF |
|
||
|
|
||
384k 60000-63FFF |
|
||
400k 64000-67FFF |
|
||
416k 68000-6BFFF |
|
||
432k 6C000-6FFFF |
|
||
|
|
||
448k 70000-73FFF |
|
||
464k 74000-77FFF |
|
||
480k 78000-7BFFF |
|
||
496k 7C000-7FFFF |
|
||
|
|
||
512k 80000-83FFF |
|
||
528k 84000-87FFF |
|
||
544k 88000-8BFFF | original IBM PC-1 BIOS limited memory to 544k
|
||
560k 8C000-8FFFF |
|
||
|
|
||
576k 90000-93FFF |
|
||
592k 94000-97FFF |
|
||
609k 98000-9BFFF |
|
||
624k 9C000-9FFFF | to 640k (top of RAM address space)
|
||
|
||
|
||
A0000 ***** 64k *************** EGA address
|
||
640k A0000-A95B0 MCGA 320x200 256 color video buffer
|
||
AF8C0 MCGA 640x480 2 color video buffer
|
||
-A3FFF
|
||
656k A4000-A7FFF
|
||
672k A8000-ABFFF
|
||
688k AC000-AFFFF
|
||
|
||
|
||
B0000 ***** 64k *************** mono and CGA address
|
||
704k B0000-B3FFF mono uses only 4k | The PCjr and early Tandy 1000
|
||
720k B4000-B7FFF | BIOSs revector direct writes to
|
||
736k B8000-BBFFF CGA uses entire 16k | the B8 area to the Video Gate
|
||
756k BC000-BFFFF | Array and reserved system RAM
|
||
|
||
|
||
C0000 ***** 64k *************** expansion ROM
|
||
768k C0000-C3FFF 16k EGA BIOS C000:001E EGA BIOS signature (the letters IBM)
|
||
784k C4000-C5FFF
|
||
C6000-C63FF 256 bytes Professional Graphics Display communication area
|
||
C6400-C7FFF
|
||
800k C8000-CBFFF 16k hard disk controller BIOS, drive 0 default
|
||
816k CC000-CDFFF 8k IBM PC Network NETBIOS
|
||
CE000-CFFFF
|
||
|
||
D0000 ***** 64k *************** expansion ROM | PCjr first ROM cartridge
|
||
832k D0000-D7FFF 32k IBM Cluster Adapter | address area.
|
||
DA000 voice communications |
|
||
848k D4000-D7FFF | Common expanded memory board
|
||
864k D8000-DBFFF | paging area.
|
||
880k DC000-DFFFF |
|
||
|
||
|
||
E0000 ***** 64k *************** expansion ROM | PCjr second ROM
|
||
896k E0000-E3FFF | cartridge address
|
||
912k E4000-E7FFF | area
|
||
928k E8000-EBFFF |
|
||
944k EC000-EFFFF |
|
||
|
||
|
||
F0000 ***** 64k *************** system | PCjr optional ROM
|
||
960k F0000-F3FFF reserved by IBM | cartridge address
|
||
976k F4000- | area (cartridge
|
||
F6000 ROM BASIC Begins | BASIC)
|
||
992k F8000-FB000 |
|
||
1008k FC000-FFFFF ROM BASIC and original |
|
||
BIOS (Compatibility BIOS |
|
||
in PS/2) |
|
||
1024k FFFFF end of memory (1024k) for 8088 machines
|
||
F000:FFF5 BIOS release date
|
||
F000:FFFE PC model identification
|
||
|
||
384k 100000-15FFFF 80286/AT extended memory area, 1Mb motherboard
|
||
15Mb 100000-FFFFFF 80286/AT extended memory address space
|
||
|
||
15Mb 160000-FDFFFF Micro Channel RAM expansion (15Mb extended memory)
|
||
128k FE0000-FFFFFF system board ROM (PS/2 Advanced BIOS)
|
||
|
||
|
||
|
||
PC Port Assignment, Intel 8088, 80C88, 8086, 80286, 80386 CPUs
|
||
|
||
hex addr. Function
|
||
|
||
0000-000F 8237 DMA controller
|
||
0010-001F 8237 DMA controller (AT, PS/2)
|
||
0020-0027 8259A interrupt controller
|
||
0020-003F 8259A interrupt controller (AT)
|
||
0040-005F 8253-5 programmable timers
|
||
(note: 0041 was memory refresh in PCs. Not used in PS/2)
|
||
0060-0067 8255 peripheral interface
|
||
0060-006F 8042 keyboard controller (AT)
|
||
0200-020F game-control adapter
|
||
0210-0217 expansion box (PC, XT)
|
||
0278-027F LPT3
|
||
02F8-02FF COM2
|
||
0300-031F prototype card
|
||
0320-032F hard disk controller
|
||
0378-037F LPT2
|
||
03BC-03BF LPT1
|
||
03D0-03DF CGA, MCGA, VGA adapter control
|
||
03F0-03F7 floppy disk controller
|
||
03F8-03FF COM1
|
||
|
||
note: These are functions common across the IBM range. The PCjr, PC
|
||
Convertible and PS/2 (both buses) have enhancements. In some cases, the
|
||
AT and PS/2 series ignore, duplicate, or reassign ports arbitrarily. If
|
||
your code incorporates specific port addresses for video or system board
|
||
control it would be wise to have your application determine the machine
|
||
type and video adapter and address the ports as required.
|
||
|
||
|
||
|
||
Reserved Memory Locations in the IBM PC
|
||
|
||
addr. size description
|
||
|
||
000h-3FFh DOS interrupt vector table
|
||
30:00h- used as a stack area during POST and bootstrap routines. This
|
||
3F:FFh stack area may be revectored by an application program.
|
||
The BIOS Data Area addr. from 400h to 4FFh
|
||
40:00 word COM1 port address | These addresses are zeroed out in the
|
||
40:02 word COM2 port address | OS/2 DOS Compatibility Box if any of
|
||
40:04 word COM3 port address | the OS/2 COM??.SYS drivers are loaded.
|
||
40:06 word COM4 port address |
|
||
40:08 word LPT1 port address
|
||
40:0A word LPT2 port address
|
||
40:0C word LPT3 port address
|
||
40:0E word LPT4 port address (not valid in PS/2 machines)
|
||
40:0E word PS/2 pointer to 1k extended BIOS Data Area at top of RAM
|
||
40:10 word equipment flag (see int 11h)
|
||
bits:
|
||
0 1 if floppy drive present (see bits 6&7) 0 if not
|
||
1 1 if 80x87 installed (not valid in PCjr)
|
||
2,3 system board RAM (not used on AT or PS/2)
|
||
00 16k
|
||
01 32k
|
||
10 48k
|
||
11 64k
|
||
4,5 initial video mode
|
||
00 no video adapter
|
||
01 40 column color (PCjr)
|
||
10 80 column color
|
||
11 MDA
|
||
6,7 number of diskette drives
|
||
00 1 drive
|
||
01 2 drives
|
||
10 3 drives
|
||
11 4 drives
|
||
8 0 DMA present
|
||
1 DMA not present (PCjr)
|
||
9,A,B number of RS232 serial ports
|
||
C game adapter (joystick)
|
||
0 no game adapter
|
||
1 if game adapter
|
||
D serial printer (PCjr only)
|
||
0 no printer
|
||
1 serial printer present
|
||
E,F number of parallel printers installed
|
||
note 1) The IBM PC and AT store the settings of the system board
|
||
switches or CMOS RAM setup information (as obtained by the BIOS
|
||
in the Power-On Self Test (POST)) at addresses 40:10h and
|
||
40:13h. 00000001b indicates "on", 00000000b is "off".
|
||
2) CMOS RAM map, PC/AT:
|
||
offset contents
|
||
00h Seconds
|
||
01h Second Alarm
|
||
02h Minutes
|
||
03h Minute Alarm
|
||
04h Hours
|
||
05h Hour Alarm
|
||
06h Day of the Week
|
||
07h Day of the Month
|
||
08h Month
|
||
09h Year
|
||
0Ah Status Register A
|
||
0Bh Status Register B
|
||
0Ch Status Register C
|
||
0Dh Status Register D
|
||
0Eh Diagnostic Status Byte
|
||
0Fh Shutdown Status Byte
|
||
10h Disk Drive Type for Drives A: and B:
|
||
The drive-type bytes use bits 0:3 for the first
|
||
drive and 4:7 for the other
|
||
Disk drive types:
|
||
00h no drive present
|
||
01h double sided 360k
|
||
02h high capacity (1.2 meg)
|
||
03h-0Fh reserved
|
||
11h (AT):Reserved (PS/2):drive type for hard disk C:
|
||
12h (PS/2):drive type for hard disk D:
|
||
(AT, XT/286):hard disk type for drives C: and D:
|
||
Format of drive-type entry for AT, XT/286:
|
||
0 number of cyls in drive (0-1023 allowed)
|
||
2 number of heads per drive (0-15 allowed)
|
||
3 starting reduced write compensation (not
|
||
used on AT)
|
||
5 starting cylinder for write compensation
|
||
7 max. ECC data burst length, XT only
|
||
8 control byte
|
||
Bit
|
||
7 disable disk-access retries
|
||
6 disable ECC retries
|
||
5-4 reserved, set to zero
|
||
3 more than 8 heads
|
||
2-0 drive option on XT (not used by AT)
|
||
9 timeout value for XT (not used by AT)
|
||
12 landing zone cylinder number
|
||
14 number of sectors per track (default 17,
|
||
0-17 allowed)
|
||
13h Reserved
|
||
14h Equipment Byte (corresponds to sw. 1 on PC and XT)
|
||
15h-16h Base Memory Size (low,high)
|
||
17h-18h Expansion Memory Size (low,high)
|
||
19h-20h Reserved
|
||
(PS/2) POS information Model 50 (60 and 80 use a 2k
|
||
CMOS RAM that is not accessible through software)
|
||
21h-2Dh Reserved (not checksumed)
|
||
2Eh-2Fh Checksum of Bytes 10 Through 20 (low,high)
|
||
30h-31h Exp. Memory Size as Det. by POST (low,high)
|
||
32h Date Century Byte
|
||
33h Information Flags (set during power-on)
|
||
34h-3Fh Reserved
|
||
3) The alarm function is used to drive the BIOS wait function (int
|
||
15h function 90h).
|
||
4) To access the configuration RAM write the byte address (00-3Fh)
|
||
you need to access to I/O port 70h, then access the data via I/O
|
||
port 71h.
|
||
5) CMOS RAM chip is a Motorola 146818
|
||
6) The equipment byte is used to determine the configuration for the
|
||
power-on diagnostics.
|
||
7) Bytes 00-0Dh are defined by the chip for timing functions, bytes
|
||
0Eh-3Fh are defined by IBM.
|
||
40:12 byte number of errors detected by infrared keyboard link (PCjr only)
|
||
40:13 word availible memory size in Kbytes (less display RAM in PCjr)
|
||
this is the value returned by int 12h
|
||
40:17 byte keyboard flag byte 0 (see int 9h)
|
||
bit 7 insert mode on 3 alt pressed
|
||
6 capslock on 2 ctrl pressed
|
||
5 numlock on 1 left shift pressed
|
||
4 scrollock on 0 right shift pressed
|
||
40:18 byte keyboard flag byte 1 (see int 9h)
|
||
bit 7 insert pressed 3 ctrl-numlock (pause) toggled
|
||
6 capslock pressed 2 PCjr keyboard click active
|
||
5 numlock pressed 1 PCjr ctrl-alt-capslock held
|
||
4 scrollock pressed 0
|
||
40:19 byte storage for alternate keypad entry (not normally used)
|
||
40:1A word pointer to keyboard buffer head character
|
||
40:1C word pointer to keyboard buffer tail character
|
||
40:1E 32bytes 16 2-byte entries for keyboard circular buffer, read by int 16h
|
||
40:3E byte drive seek status - if bit=0, next seek will recalibrate by
|
||
repositioning to Track 0.
|
||
bit 3 drive D bit 2 drive C
|
||
1 drive B 0 drive A
|
||
40:3F byte diskette motor status
|
||
bit 7 1, write in progress 3 1, D: motor on (floppy 3)
|
||
6 2 1, C: motor on (floppy 2)
|
||
5 1 1, B: motor on
|
||
4 0 1, A: motor on
|
||
40:40 byte motor off counter
|
||
starts at 37 and is decremented 1 by each system clock tick.
|
||
motor is shut off when count = 0.
|
||
40:41 byte status of last diskette operation where:
|
||
bit 7 timeout failure bit 3 DMA overrun
|
||
6 seek failure 2 sector not found
|
||
5 controller failure 1 address not found
|
||
4 CRC failure 0 bad command
|
||
40:42 7 bytes NEC status
|
||
40:49 byte current CRT mode (hex value)
|
||
00h 40x25 BW (CGA) 01h 40x25 color (CGA)
|
||
02h 80x25 BW (CGA) 03h 80x25 color (CGA)
|
||
04h 320x200 color (CGA) 05h 320x200 BW (CGA)
|
||
06h 640x200 BW (CGA) 07h monochrome (MDA)
|
||
extended video modes (EGA/MCGA/VGA or other)
|
||
08h lores,16 color 09h med res,16 color
|
||
0Ah hires,4 color 0Bh n/a
|
||
0Ch med res,16 color 0Dh hires,16 color
|
||
0Eh hires,4 color 0Fh hires,64 color
|
||
40:4A word number of columns on screen, coded as hex number of columns
|
||
20 col = 14h (video mode 8, low resolution 160x200 CGA graphics)
|
||
40 col = 28h
|
||
80 col = 46h
|
||
40:4C word screen buffer length in bytes
|
||
(number of bytes used per screen page, varies with video mode)
|
||
40:4E word current screen buffer starting offset (active page)
|
||
40:50 8 words cursor position pages 1-8
|
||
the first byte of each word gives the column (0-19, 39, or 79)
|
||
the second byte gives the row (0-24)
|
||
40:60 byte end line for cursor (normally 1)
|
||
40:61 byte start line for cursor (normally 0)
|
||
40:62 byte current video page being displayed (0-7)
|
||
40:63 word base port address of 6845 CRT controller or equivalent
|
||
for active display 3B4h=mono, 3D4h=color
|
||
40:65 byte current setting of the CRT mode register
|
||
40:66 byte current palette mask setting (CGA)
|
||
40:67 5 bytes temporary storage for SS:SP during shutdown (cassette interface)
|
||
40:6C word timer counter low word
|
||
40:6E word timer counter high word
|
||
40:69 byte HD_INSTALL (Columbia PCs) (not valid on most clone computers)
|
||
bit 0 = 0 8 inch external floppy drives
|
||
1 5-1/4 external floppy drives
|
||
1,2 = highest drive address which int 13 will accept
|
||
(since the floppy drives are assigned 0-3, subtract
|
||
3 to obtain the number of hard disks installed)
|
||
|
||
4,5 = # of hard disks connected to expansion controller
|
||
6,7 = # of hard disks on motherboard controller
|
||
(if bit 6 or 7 = 1, no A: floppy is present and
|
||
the maximum number of floppies from int 11 is 3)
|
||
40:70 byte 24 hour timer overflow 1 if timer went past midnight
|
||
it is reset to 0 each time it is read by int 1Ah
|
||
40:71 byte BIOS break flag (bit 7 = 1 means break key hit)
|
||
40:72 word reset flag (1234 = soft reset, memory check will be bypassed)
|
||
PCjr keeps 1234h here for softboot when a cartridge is installed
|
||
40:74 byte status of last hard disk operation; PCjr special diskette control
|
||
40:75 byte # of hard disks attached (0-2) ; PCjr special diskette control
|
||
40:76 byte hd control byte; temporary holding area for 6th param table entry
|
||
40:77 byte port offset to current hd adapter ; PCjr special diskette control
|
||
40:78 4 bytes timeout value for LPT1,LPT2,LPT3,LPT4
|
||
40:7C 4 bytes timeout value for COM1,COM2,COM3,COM4 (0-FFh seconds, default 1)
|
||
40:80 word pointer to start of circular keyboard buffer, default 03:1E
|
||
40:82 word pointer to end of circular keyboard buffer, default 03:3E
|
||
40:84 byte rows on the screen (EGA only)
|
||
40:84 byte PCjr interrupt flag; timer channel 0 (used by POST)
|
||
40:85 word bytes per character (EGA only)
|
||
40:85 2 bytes (PCjr only) typamatic char to repeat
|
||
40:86 2 bytes (PCjr only) typamatic initial delay
|
||
40:87 byte mode options (EGA only)
|
||
Bit 1 0 = EGA is connected to a color display
|
||
1 = EGA is monochrome.
|
||
Bit 3 0 = EGA is the active display,
|
||
1 = "other" display is active.
|
||
Mode combinations:
|
||
Bit3 Bit1 Meaning
|
||
0 0 EGA is active display and is color
|
||
0 1 EGA is active display and is monochrome
|
||
1 0 EGA is not active, a mono card is active
|
||
1 1 EGA is not active, a CGA is active
|
||
40:87 byte (PCjr only) current Fn key code
|
||
40:88 byte feature bit switches (EGA only) 0=on, 1=off
|
||
bit 3 = switch 4
|
||
bit 2 = switch 3
|
||
bit 1 = switch 2
|
||
bit 0 = switch 1
|
||
40:88 byte (PCjr only) special keyboard status byte
|
||
bit 7 function flag 3 typamatic (0=enable,1=disable)
|
||
6 Fn-B break 2 typamatic speed (0=slow,1=fast)
|
||
5 Fn pressed 1 extra delay bef.typamatic (0=enable)
|
||
4 Fn lock 0 write char, typamatic delay elapsed
|
||
40:89 byte PCjr, current value of 6845 reg 2 (horiz.synch) used by
|
||
ctrl-alt-cursor screen positioning routine in ROM
|
||
40:8A byte PCjrCRT/CPU Page Register Image, default 3Fh
|
||
40:8B byte last diskette data rate selected
|
||
40:8C byte hard disk status returned by controller
|
||
40:8D byte hard disk error returned by controller
|
||
40:8E byte hard disk interrupt (bit 7=working int)
|
||
40:90 4 bytes media state drive 0, 1, 2, 3
|
||
40:94 2 bytes track currently seeked to drive 0, 1
|
||
40:96 byte keyboard flag byte 3 (see int 9h)
|
||
40:97 byte keyboard flag byte 2 (see int 9h)
|
||
40:98 dword pointer to users wait flag
|
||
40:9C dword users timeout value in microseconds
|
||
40:A0 byte real time clock wait function in use
|
||
40:A1 byte LAN A DMA channel flags
|
||
40:A2 2 bytes status LAN A 0,1
|
||
40:A4 dword saved hard disk interrupt vector
|
||
40:A8 dword EGA pointer to parameter table
|
||
40:B4 byte keyboard NMI control flags (Convertible)
|
||
40:B5 dword keyboard break pending flags (Convertible)
|
||
40:B9 byte port 60 single byte queue (Convertible)
|
||
40:BA byte scan code of last key (Convertible)
|
||
40:BB byte pointer to NMI buffer head (Convertible)
|
||
40:BC byte pointer to NMI buffer tail (Convertible)
|
||
40:BD 16bytes NMI scan code buffer (Convertible)
|
||
40:CE word day counter (Convertible and after)
|
||
to -04:8F end of BIOS Data Area
|
||
40:90-40:EF reserved by IBM
|
||
04:F0 16 bytes Intra-Application Communications Area (for use by applications
|
||
04:FF to transfer data or parameters to each other)
|
||
|
||
05:00 byte DOS print screen status flag
|
||
00h not active or successful completion
|
||
01h print screen in progress
|
||
0FFh error during print screen operation
|
||
05:01 Used by BASIC
|
||
05:02-03 PCjr POST and diagnostics work area
|
||
05:04 byte Single drive mode status byte
|
||
00 logical drive A
|
||
01 logical drive B
|
||
05:05-0E PCjr POST and diagnostics work area
|
||
05:0F BASIC: SHELL flag (set to 02h if there is a current SHELL)
|
||
05:10 word BASIC: segment address storage (set with DEF SEG)
|
||
05:12 4 bytes BASIC: int 1Ch clock interrupt vector segment:offset storage
|
||
05:16 4 bytes BASIC: int 23h ctrl-break interrupt segment:offset storage
|
||
05:1A 4 bytes BASIC: int 24h disk error interrupt vector segment:offset storage
|
||
05:1B-1F Used by BASIC for dynamic storage
|
||
05:20-21 Used by DOS for dynamic storage
|
||
05:22-2C Used by DOS for diskette parameter table. See int 1Eh for values
|
||
05:30-33 Used by MODE command
|
||
05:34-FF Unknown - Reserved for DOS
|
||
|
||
|
||
At Absolute Addresses:
|
||
|
||
0008:0047 IO.SYS or IBMBIO.COM IRET instruction. This is the dummy routine that
|
||
interrupts 01h, 03h, and 0Fh are initialized to during POST.
|
||
C000:001E EGA BIOS signature (the letters IBM)
|
||
F000:FFF5 BIOS release date
|
||
F000:FFFE PC model identification
|
||
date model byte submodel byte revision
|
||
04/24/81 FF = PC-0 (16k) -- --
|
||
10/19/81 FF = PC-1 (64k) -- --
|
||
08/16/82 FF = PC, XT, XT/370 -- --
|
||
(256k motherboard)
|
||
10/27/82 FF = PC, XT, XT/370 -- --
|
||
(256k motherboard)
|
||
11/08/82 FE = XT, Portable PC -- --
|
||
XT/370, 3270PC
|
||
01/10/86 FB = XT 00 01
|
||
01/10/86 FB = XT-2 (early)
|
||
05/09/86 FB = XT-2 (640k) 00 02
|
||
06/01/83 FD = PCjr -- --
|
||
01/10/84 FC = AT -- --
|
||
06/10/85 FC = AT 00 01
|
||
11/15/85 FC = AT 01 00
|
||
04/21/86 FC = XT/286 02 00
|
||
09/13/85 F9 = Convertible 00 00
|
||
09/02/86 FA = PS/2 Model 30 00 00
|
||
11/15/86 FC = AT, Enhanced 8mHz
|
||
02/13/87 FC = PS/2 Model 50 04 00
|
||
02/13/87 FC = PS/2 Model 60 05 00
|
||
1987 F8 = PS/2 Model 80 00 00
|
||
2D = Compaq PC (4.77) -- --
|
||
9A = Compaq Plus (XT) -- --
|
||
|
||
00FC 7531/2 Industrial AT
|
||
06FC 7552 Gearbox
|
||
|
||
|
||
|
||
|
||
The IBM PC System Interrupts (Overview)
|
||
|
||
The interrupt table is stored in the very lowest location in memory, starting
|
||
at 0000:0000h. The locations are offset from segment 0, ie location 0000h has
|
||
the address for int 0, etc. Each address is four bytes long and its location in
|
||
memory can be found by multiplying the interrupt number by 4. For example, int
|
||
7 could be found by (7x4=28) or 1Bh (0000:001Bh).
|
||
These interrupt vectors normally point to ROM tables or are taken over by DOS
|
||
when an application is run. Some applications revector these interrupts to
|
||
their own code to change the way the system responds to the user.
|
||
|
||
Interrupt Address Function
|
||
Number (Hex)
|
||
0 00-03 CPU Divide by Zero
|
||
1 04-07 CPU Single Step
|
||
2 08-0B CPU Nonmaskable
|
||
3 0C-0F CPU Breakpoint
|
||
4 10-13 CPU Overflow
|
||
5 14-17 BIOS Print Screen
|
||
6 18-1B hdw Reserved
|
||
7 1C-1F hdw Reserved
|
||
8 20-23 hdw Time of Day
|
||
9 24-27 hdw Keyboard
|
||
A 28-2B hdw Reserved
|
||
B 2C-2F hdw Communications [8259]
|
||
C 30-33 hdw Communications
|
||
D 34-37 hdw Disk
|
||
E 38-3B hdw Diskette
|
||
F 3C-3F hdw Printer
|
||
10 40-43 BIOS Video
|
||
11 44-47 BIOS Equipment Check
|
||
12 48-4B BIOS Memory
|
||
13 4C-4F BIOS Diskette/Disk
|
||
14 50-53 BIOS Serial Communications
|
||
15 54-57 BIOS Cassette, System Services
|
||
16 58-5B BIOS Keyboard
|
||
17 5C-5F BIOS Parallel Printer
|
||
18 60-63 BIOS Resident BASIC
|
||
19 64-67 BIOS Bootstrap Loader
|
||
1A 68-6B BIOS Time of Day
|
||
1B 6C-6F BIOS Keyboard Break
|
||
1C 70-73 BIOS Timer Tick
|
||
1D 74-77 BIOS Video Initialization
|
||
1E 78-7B BIOS Diskette Parameters
|
||
1F 7C-7F BIOS Video Graphics Characters, second set
|
||
20 80-83 DOS General Program Termination
|
||
21 84-87 DOS DOS Services Function Request
|
||
22 88-8B DOS Called Program Termination Address
|
||
23 8C-8F DOS Control Break Termination Address
|
||
24 90-93 DOS Critical Error Handler
|
||
25 94-97 DOS Absolute Disk Read
|
||
26 98-9B DOS Absolute Disk Write
|
||
27 9C-9F DOS Terminate and Stay Resident
|
||
28-3F A0-FF DOS Reserved for DOS
|
||
40-43 100-115 BIOS Reserved for BIOS
|
||
44 116-119 BIOS First 128 Graphics Characters
|
||
45-47 120-131 BIOS Reserved for BIOS
|
||
48 132-135 BIOS PCjr Cordless Keyboard Translation
|
||
49 136-139 BIOS PCjr Non-Keyboard Scancode Translation Table
|
||
50-5F 140-17F BIOS Reserved for BIOS
|
||
60-67 180-19F Reserved for User Software Interrupts
|
||
68-7F 1A0-1FF Reserved by IBM
|
||
80-85 200-217 ROM BASIC
|
||
86-F0 218-3C3 Used by BASIC Interpreter When BASIC is Running
|
||
F1-FF 3C4-3FF Reserved by IBM
|
||
|
||
|
||
For consistency in this volume, all locations and offsets are in hexadecimal
|
||
unless otherwise specified. All hex numbers are prefaced with a leading zero
|
||
if they begin with an alphabetic character, and are terminated with a
|
||
lowercase H (h). The formats vary according to common usage.
|
||
|
||
|
||
The IBM-PC System Interrupts (in detail)
|
||
|
||
|
||
Interrupt 00h Divide by Zero (processor error). Automatically called at end
|
||
(0:0000h) of DIV or IDIV operation that results in error. Normally set by
|
||
DOS to display an error message and abort the program.
|
||
|
||
|
||
Interrupt 01h Single step - Taken after every instruction when CPU Trap Flag
|
||
(0:0004h) indicates single-step mode (bit 8 of FLAGS is 1). This is what
|
||
makes the T command of DEBUG work for single stepping. Is not
|
||
generated after MOV to segment register or POP of segment
|
||
register. (unless you have a very early 8088 with the microcode
|
||
bug).
|
||
|
||
|
||
Interrupt 02h Non-maskable interrupt - Vector not disabled via CLI. Used by
|
||
(0:0008h) parity check routine in POST, 8087 coprocessor, PCjr infrared
|
||
keyboard link.
|
||
|
||
|
||
Interrupt 03h Breakpoint - Taken when CPU executes the 1-byte int 3 (0CCh).
|
||
(0:000Ch) Generated by opcode 0CCh. Similar to 8080's RST instruction.
|
||
Generally used to set breakpoints for DEBUG.
|
||
|
||
|
||
Interrupt 04h Divide overflow - Generated by INTO instruction if OF flag is
|
||
(0:0010h) set. If flag is not set, INTO is effectively a NOP. Used to trap
|
||
any arithmetic errors when program is ready to handle them rather
|
||
than immediately when they occur.
|
||
|
||
|
||
Interrupt 05h Print Screen - service dumps the screen to the printer. Invoked
|
||
(0:0014h) by int 9 for shifted key 55 (PrtSc). Automatically called by
|
||
keyboard scan when PrtSc 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 are at address 0050:0000.
|
||
entry AH 05h
|
||
return absolute address 50:0
|
||
00h print screen has not been called, or upon return from a call
|
||
there were no errors.
|
||
01h print screen is already in progress.
|
||
0FFh error encountered during printing.
|
||
note 1) Uses BIOS services to read the screen
|
||
2) Output is directed to LPT1
|
||
3) Revectored into GRAPHICS.COM if GRAPHICS.COM is loaded
|
||
|
||
|
||
Interrupt 06h Reserved by IBM
|
||
(0:0018h)
|
||
|
||
|
||
Interrupt 07h Reserved by IBM
|
||
(0:00C0h)
|
||
|
||
|
||
Interrupt 08h Timer - 55ms timer "tick" taken 18.2 times per second. Updates
|
||
(0:0020h) (IRQ0) BIOS clock and turns off diskette drive motors after 2
|
||
seconds of inactivity.
|
||
entry AH 08h
|
||
return absolute addresses:
|
||
40:6C number of interrupts since power on (4 bytes)
|
||
40:70 number of days since power on (1 byte)
|
||
40:67 day counter on all products after AT
|
||
40:40 motor control count - gets decremented and shuts off diskette
|
||
motor if zero
|
||
note Int 1Ch invoked as a user interrupt.
|
||
|
||
|
||
Interrupt 09h Keyboard - taken whenever a key is pressed or released.
|
||
(0:0024h) (IRQ1) Stores characters/scan-codes in status at [0040:0017,18]
|
||
entry AH 09h
|
||
return at absolute memory addresses:
|
||
40:17 bit
|
||
0 right shift key depressed
|
||
1 left shift key depressed
|
||
2 control key depressed
|
||
3 alt key depressed
|
||
4 ScrollLock state has been toggled
|
||
5 NumLock state has been toggled
|
||
6 CapsLock state has been toggled
|
||
7 insert state is active
|
||
40:18 bit
|
||
0 left control key depressed
|
||
1 left alt key depressed
|
||
2 SysReq key depressed
|
||
3 Pause key has been toggled
|
||
4 ScrollLock key is depressed
|
||
5 NumLock key is depressed
|
||
6 CapsLock key is depressed
|
||
7 Insert key is depressed
|
||
40:96 bit
|
||
0 last code was the E1h hidden code
|
||
1 last code was the E0h hidden code
|
||
2 right control key down
|
||
3 right alt key down
|
||
4 101 key Enhanced keyboard installed
|
||
5 force NumLock if rd ID & kbx
|
||
6 last character was first ID character
|
||
7 doing a read ID (must be bit 0)
|
||
40:97 bit
|
||
0 ScrollLock indicator
|
||
1 NumLock indicator
|
||
2 CapsLock indicator
|
||
3 circus system indicator
|
||
4 ACK received
|
||
5 resend received flag
|
||
6 mode indicator update
|
||
7 keyboard transmit error flag
|
||
40:1E keyboard buffer (20h bytes)
|
||
40:1C buffer tail pointer
|
||
40:72 1234h if ctrl-alt-del pressed on keyboard
|
||
AL scan code
|
||
note 1) Int 05h invoked if PrtSc key pressed
|
||
2) Int 1Bh invoked if Ctrl-Break key sequence pressed
|
||
3) Int 15h, AH=85h invoked on AT and after if SysReq key is pressed
|
||
4) Int 15h, AH=4Fh invoked on machines after AT
|
||
|
||
|
||
Interrupt 0Ah EGA Vertical Retrace
|
||
(0:0028h) (IRQ2) used by EGA vertical retrace, hard disk
|
||
|
||
|
||
Interrupt 0Bh Communications Controller (serial port) hdw. entry
|
||
(0:002Ch) (IRQ3) Serial Port 2 (com2)
|
||
note IRQ 3 may be used by SDLC (synchronous data-link control) or
|
||
bisynchronous communications cards instead of a serial port.
|
||
|
||
|
||
Interrupt 0Ch Communications Controller (serial port) hdw. entry
|
||
(0:0030h) (IRQ4) Serial Port 1 (com1)
|
||
note IRQ 4 may be used by SDLC (synchronous data-link control) or
|
||
bisynchronous communications cards instead of a serial port.
|
||
|
||
|
||
Interrupt 0Dh Alternate Printer, PC/AT 80287
|
||
(0:0034h) (IRQ5) used by hard disk, 60 Hz RAM refresh, LPT2 on AT, XT/286,
|
||
and PS/2, dummy CRT vertical retrace on PCjr
|
||
|
||
|
||
Interrupt 0Eh Diskette - indicates that a seek is in progress
|
||
(0:0038h) (IRQ6) (sets bit 8 of 40:3E)
|
||
|
||
|
||
Interrupt 0Fh Reserved by IBM
|
||
(0:003Ch) (IRQ7) IRQ7 used by PPI interrupt (LPT1, LPT2)
|
||
|
||
CHAPTER 3 THE PC ROM BIOS
|
||
|
||
Programming Technical Reference - IBM
|
||
Copyright 1988, Dave Williams
|
||
|
||
Interrupt 10h Video I/O - services to handle video output
|
||
(0:0040h) The ROM video routines in the original PC BIOS are designed for
|
||
use with the Color Graphics Adapter and incorporate code to test
|
||
for the horizontal retrace before writing. The check is
|
||
performed no matter what actual display adapter is installed.
|
||
The ROM character table for the first 128 characters is located
|
||
at 0FA6Eh in the PC. Int 01Fh can be used to point to a second
|
||
table of 128 characters.
|
||
CS, SS, DS, ES, BX, CX, DX are preserved during call. All
|
||
others are destroyed.
|
||
|
||
Function 00h Determine or Set Video State
|
||
entry AH 00h set video mode
|
||
AL display mode: CGA|PCjr|MDA|MCGA|EGA|VGA|8514
|
||
00h 40x25 B/W text CGA|PCjr| | |EGA| |
|
||
16 color 01h 40x25 color text CGA|PCjr| | |EGA| |
|
||
02h 80x25 B/W text CGA|PCjr| | |EGA| |
|
||
16 color 03h 80x25 color text CGA|PCjr| | |EGA|VGA|
|
||
4 color 04h 320x200 color graphics CGA|PCjr| | |EGA| |
|
||
4 tone gray 05h 320x200 B/W graphics CGA|PCjr| | |EGA| |
|
||
2 color 06h 640x200 B/W graphics CGA|PCjr| | |EGA| |
|
||
monochrome 07h 80x25 monochrome text | |MDA| |EGA| |
|
||
16 color 08h 160x200 color graphics CGA|PCjr| | | | |
|
||
16 color 09h 320x200 color graphics |PCjr| | | |VGA|
|
||
4 color 0Ah 640x200 color graphics |PCjr| | | | |
|
||
N/A 0Bh BIOS font load | | | |EGA|VGA|
|
||
N/A 0Ch BIOS font load | | | |EGA|VGA|
|
||
16 color 0Dh 320x200 graphics | | | |EGA|VGA|
|
||
16 color 0Eh 640x200 graphics | | | |EGA|VGA|
|
||
monochrome 0Fh 640x350 graphics | | | |EGA|VGA|
|
||
16 & 64 color 10h 640x350 color hi-res | | | |EGA|VGA|
|
||
2 color 11h 640x480 graphics | | |MCGA| |VGA|
|
||
16 color 12h 640x480 graphics | | | | |VGA|
|
||
256 color 13h 320x200 graphics | | |MCGA| |VGA|8514
|
||
14h-20h used by EGA and VGA graphics modes
|
||
18h 132x44 8x8 char mono | Tseng Labs EVA
|
||
19h 132x25 8x14 char mono | Tseng Labs EVA
|
||
1Ah 132x28 8x13 char mono | Tseng Labs EVA
|
||
monochrome 21h Hercules Graphics, Graphics Page 1
|
||
monochrome 22h Hercules Graphics, Graphics Page 2
|
||
22h 132x44 | Tseng, Ahead
|
||
23h 132x25 | Tseng Labs EVA
|
||
132x25 | Ahead Systems EGA2001
|
||
132x25 | ATI EGA Wonder
|
||
24h 132x28 | Tseng Labs EVA
|
||
25h 80x60 640x480 | Tseng Labs EVA
|
||
16 color 640x480 | VEGA VGA
|
||
26h 80x60 | Tseng Labs EVA
|
||
80x60 640x480 | Ahead Systems EGA2001
|
||
16 color 27h 720x512 | VEGA VGA
|
||
monochrome 132x25 | ATI EGA Wonder
|
||
28h unknown | VEGA VGA
|
||
16 color 29h 800x600 | VEGA VGA
|
||
256 color 2Dh 640x350 | VEGA VGA
|
||
256 color 2Eh 640x480 | VEGA VGA
|
||
256 color 2Fh 720x512 | VEGA VGA
|
||
256 color 30h 800x600 | VEGA VGA
|
||
unknown | AT&T 6300
|
||
16 color 36h 960x720 | VEGA VGA
|
||
16 color 37h 1024x768 | VEGA VGA
|
||
monochrome 132x44 | ATI EGA Wonder
|
||
2 color 40h 640x400 | AT&T 6300
|
||
80x43 | VEGA VGA
|
||
16 color 41h 640x200 | AT&T 6300
|
||
132x25 | VEGA VGA
|
||
16 color 42h 640x400 | AT&T 6300
|
||
132x43 | VEGA VGA
|
||
43h unsupported 640x200 of 640x400 viewport AT&T 6300
|
||
80x60 | VEGA VGA
|
||
44h disable VDC and DEB output | AT&T 6300
|
||
100x60 | VEGA VGA
|
||
48h 80x50 640x400 | AT&T 6300
|
||
4Dh 120x25 | VEGA VGA
|
||
4Eh 120x43 | VEGA VGA
|
||
4Fh 132x25 | VEGA VGA
|
||
monochrome 50h 132x25 | Ahead Systems EGA2001
|
||
16 color 640x480 | Paradise EGA-480
|
||
monochrome 80x43 | VEGA VGA
|
||
640x480 mono? | Taxan 565 EGA
|
||
51h 80x30 | Paradise EGA-480
|
||
monochrome 132x25 | VEGA VGA
|
||
640x480 ? | ATI EGA Wonder
|
||
monochrome 52h 132x44 | Ahead Systems EGA2001
|
||
monochrome 132x43 | VEGA VGA
|
||
752x410 ? | ATI EGA Wonder
|
||
53h 800x560 ? | ATI EGA Wonder
|
||
54h 132x43 | Paradise EGA-480
|
||
16 color 132x43 | Paradise VGA
|
||
16 color 132x43 | Paradise VGA on multisync
|
||
132x43 | Taxan 565 EGA
|
||
55h 132x25 | Paradise EGA-480
|
||
16 color 132x25 | Paradise VGA
|
||
16 color 132x25 | Paradise VGA on multisync
|
||
132x25 | Taxan 565 EGA
|
||
56h 132x43 | NSI Smart EGA+
|
||
132x43 | Paradise VGA
|
||
132x43 | Paradise VGA on multisync
|
||
monochrome 132x43 | Taxan 565 EGA
|
||
57h 132x25 | NSI Smart EGA+
|
||
132x25 | Paradise VGA
|
||
132x25 | Paradise VGA on multisync
|
||
monochrome 132x25 | Taxan 565 EGA
|
||
58h 100x75 800x600 16/256k | Paradise VGA
|
||
59h 100x75 800x600 | Paradise VGA
|
||
5Eh 640x400 | Paradise VGA,VEGA VGA
|
||
5Fh 640x480 | Paradise VGA
|
||
60h 80x??? ???x400 | Corona/Cordata BIOS v4.10+
|
||
752x410 | VEGA VGA
|
||
60h 400 line graphics+80 col text |(Corona/Cordata)
|
||
61h 400 line graphics | Corona/Cordata BIOS v4.10+
|
||
720x540 | VEGA VGA
|
||
62h 800x600 | VEGA VGA
|
||
16 color 71h 100x35 800x600 | NSI Smart EGA+
|
||
74h 640x400 graphics | 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 | DEC VAXmate AT&T mode
|
||
unknown 640x225 | Z-100
|
||
unknown 640x400 | Z-100
|
||
|
||
note 1) If the high bit in AL is set, the display buffer is not cleared when a
|
||
new mode is selected. This may be used to mix modes on the display;
|
||
for example, characters of two difference sizes might be displayed
|
||
2) Modes 8-10 are available on the PCjr, Tandy 1000, and PS/2
|
||
3) IBM claims 100% software and hardware emulation of the CGA with the
|
||
MCGA chipset. All registers may be read and written as CGA. All
|
||
characters are double-scanned to give 80x25 with 400 line resolution.
|
||
The attributes for setting border color may be set on MCGA, but the
|
||
borders will remain the default color (they cannot actually be set)
|
||
4) The IBM Color Graphics Adapter (CGA) is too slow for the screen to
|
||
be updated before the vertical retrace of the monitor is completed.
|
||
If the video RAM is addressed directly, the screen will have "snow"
|
||
or interference. IBM's default is to turn the adapter off when it is
|
||
being updated, ie "flickering" when the display is scrolled.
|
||
5) The vertical retrace signal may be ignored when using the MCGA adapter.
|
||
The MCGA will not generate snow when written to. There is no flicker
|
||
with the MCGA.
|
||
6) The PCjr Video Gate Array uses a user-defined block of main system RAM
|
||
from 4 to 32k in size instead of having dedicated memory for the
|
||
display. Vertical retrace may be ignored when writing to the PCjr.
|
||
There is no flicker with the PCjr display.
|
||
7) The Hercules Graphics Card has 750x348 resolution
|
||
8) The Hercules Graphics Card takes 32k beginning at B:000 (same as MDA)
|
||
9) The CGA, MCGA, and VGA adapters use hardware address B:800
|
||
10) The BIOS clears the screen when the mode is set or reset.
|
||
11) For AT&T VDC overlay modes, BL contains the DEB mode, which may be 06h,
|
||
40h, or 44h
|
||
|
||
|
||
Function 01h Set Cursor Type - set the size of the cursor or turn it off
|
||
entry AH 01h
|
||
CH bit values:
|
||
bits 0-4 top line for cursor in character cell
|
||
bits 5-6 blink attribute
|
||
00 normal
|
||
01 invisible (no cursor)
|
||
10 slow (not used on original IBM PC)
|
||
11 fast
|
||
CL bit values:
|
||
bits 0-4 bottom line for cursor in character cell
|
||
return none
|
||
note 1) The ROM BIOS default cursors are: start end
|
||
monochrome mode 07h: 11 12
|
||
text modes 00h-03h: 6 7
|
||
2) The blinking in text mode is caused by hardware and cannot be turned
|
||
off, though some kludges can temporarily fake a nonblinking cursor
|
||
3) The cursor is automatically turned off in graphics mode
|
||
4) Another method of turning off the cursor in text mode is to position it
|
||
to a nondisplayable address, such as (X,Y)=(0,25)
|
||
5) Buggy on EGA systems - BIOS remaps cursor shape in 43 line modes, but
|
||
returns unmapped cursor shape
|
||
|
||
|
||
Function 02h Set Cursor Position - reposition the cursor to (X,Y)
|
||
entry AH 02h
|
||
BH video page
|
||
00h graphics mode
|
||
03h modes 2 and 3
|
||
07h modes 0 and 1
|
||
DH row (Y=0-24)
|
||
DL column (X=0-79 or 0-39)
|
||
return none
|
||
note 1) (0,0) is upper left corner of the screen
|
||
|
||
|
||
Function 03h Read Cursor Position - return the position of the cursor
|
||
entry AH 03h
|
||
BH page number
|
||
00h in graphics modes
|
||
03h in modes 2 & 3
|
||
07h in modes 0 & 1
|
||
return CH top line for cursor (bits 4-0)
|
||
CL bottom line for cursor (bits 4-0)
|
||
DH row number (Y=0-24)
|
||
DL column number (X=0-79 or 0-39)
|
||
|
||
|
||
Function 04h Read Light Pen - fetch light pen information
|
||
entry AH 04h
|
||
return AH 00h light pen not triggered
|
||
AH 01h light pen is triggered, values in resgisters
|
||
BX pixel column (X=0-319 or 0-639) graphics mode
|
||
CH raster line (Y=0-199) old graphics modes
|
||
CX (EGA) raster line (0-nnn) new graphics modes
|
||
DH row of current position (Y=0-24) text mode
|
||
DL column of current position (X=0-79 or 0-39) text mode
|
||
note Not supported on PS/2
|
||
|
||
|
||
Function 05h Select Active Page - set page number for services 6 and 7
|
||
entry AH 05h
|
||
AL number of new active page
|
||
0-7 modes 00h and 01h (CGA)
|
||
0-3 modes 02h and 03h (CGA)
|
||
0-7 modes 02h and 03h (EGA)
|
||
0-7 mode 0Dh (EGA)
|
||
0-3 mode 0Eh (EGA)
|
||
0-1 mode 0Fh (EGA)
|
||
0-1 mode 10h (EGA)
|
||
for PCjr only:
|
||
AL 80h to read CRT/CPU page registers
|
||
81h to set CPU page register to value in BL
|
||
82h to set CRT page register to value in BH
|
||
83h to set both CPU and page registers
|
||
(and Corona/Cordata BIOS v4.10+)
|
||
BH CRT page number for subfunctions 82h and 83h
|
||
BL CPU page register for subfunctions 81h and 83h
|
||
return standard PC none
|
||
PCjr if called with AH bit 7=1 then
|
||
BH CRT page register
|
||
BL CPU page register
|
||
DX segment of graphics bitmap buffer (video modes 60h,61h; AL0Fh)
|
||
note 1) Mono adapter has only one display page
|
||
2) CGA has four 80x25 text pages or eight 40x25 text pages
|
||
3) A separate cursor is maintained for each display page
|
||
4) Switching between pages does not affect their contents
|
||
5) Higher page numbers indicate higher memory positions
|
||
|
||
|
||
Function 06h Scroll Page Up - scroll up or clear a display "window"
|
||
entry AH 06h
|
||
AL number of lines blanked at bottom of page
|
||
0 = blank entire window
|
||
BH attributes to be used on blank line
|
||
CH row (Y) of upper left corner or window
|
||
CL column (X) of upper left corner of window
|
||
DH row (Y) of lower right corner of window
|
||
DL column (X) of lower right corner of window
|
||
return none
|
||
note 1) Push BP before scrolling, pop after
|
||
2) If in CGA text mode, affects current page only
|
||
|
||
|
||
Function 07h Scroll Page Down - scroll down or clear a display "window"
|
||
entry AH 07h
|
||
AL number of lines to be blanked at top of page
|
||
0 = blank entire window
|
||
BH attributes to be used on blank line
|
||
CH row (Y) of upper left corner or window
|
||
CL column (X) of upper left corner of window
|
||
DH row (Y) of lower right corner of window
|
||
DL column (X) of lower right corner of window
|
||
return none
|
||
note 1) Push BP before scrolling, pop after
|
||
2) If in CGA text mode, affects current page only
|
||
|
||
|
||
Function 08h Read Character Attribute - of character at current cursor pos.
|
||
entry AH 08h
|
||
BH display page number - text mode
|
||
return AH character attribute - text mode
|
||
AL ASCII code of character at current cursor position
|
||
|
||
|
||
Function 09h Write Character and Attribute - at current cursor position
|
||
entry AH 09h
|
||
AL ASCII code of character to display
|
||
BH display page number - text mode
|
||
BL attribute/color of character
|
||
CX number of characters to write
|
||
return none
|
||
note 1) CX should not exceed actual rows availible, or results may be erratic
|
||
2) Setting CX to zero will cause runaway
|
||
3) All values of AL result in some sort of display; the various control
|
||
characters are not recognized as special and do not change the current
|
||
cursor position
|
||
4) Does not change cursor position when called - the cursor must be
|
||
advanced with int 10 function 0Ah.
|
||
5) If used to write characters in graphics mode with bit 7 of AH set to 1
|
||
the character will by XORed with the current display contents.
|
||
6) In graphics mode the bit patterns for ASCII character codes 80h-0FFh
|
||
are obtained from a table. On the standard PC and AT, the location is at
|
||
interrupt vector 01Fh (0000:007C). For ASCII characters 00h-07Fh, the
|
||
table is at an address in ROM. On the PCjr the table is at interrupt
|
||
vector 44h (0000:00110) and is in addressable RAM (may be replaced by
|
||
the user)
|
||
7) All characters are displayed, including CR, LF, and BS
|
||
|
||
|
||
Function 0Ah Write Character - display character(s) (use current attribute)
|
||
entry AH 0Ah
|
||
AL ASCII code of character to display
|
||
BH display page - text mode
|
||
BL color of character (graphics mode, PCjr only)
|
||
CX number of times to write character
|
||
return none
|
||
note 1) CX should not exceed actual rows availible, or results may be erratic
|
||
2) All values of AL result in some sort of display; the various control
|
||
characters are not recognized as special and do not change the current
|
||
cursor position
|
||
3) If used to write characters in graphics mode with bit 7 of AH set to 1
|
||
the character will by XORed with the current display contents.
|
||
4) In graphics mode the bit patterns for ASCII character codes 80h-0FFh
|
||
are obtained from a table. On the standard PC and AT, the location is at
|
||
interrupt vector 01Fh (0000:007C). For ASCII characters 00h-07Fh, the
|
||
table is at an address in ROM. On the PCjr the table is at interrupt
|
||
vector 44h (0000:00110) and is in addressable RAM (may be replaced by
|
||
the user)
|
||
5) In EGA in graphics modes, replication count in CX works correctly only
|
||
if all characters written are contained on the same row
|
||
6) All characters are displayed, including CR, LF, and BS
|
||
|
||
|
||
Function 0Bh Set Color Palette - set palette for graphics or text border
|
||
entry AH 0Bh
|
||
BH 00h select border (text mode)
|
||
BL color 0-15, 16-31 for high-intensity characters
|
||
BH 01h set graphics palette with value in BL
|
||
(CGA) BL 0 green/red/yellow
|
||
1 cyan/magenta/white
|
||
(EGA) (graphics modes)
|
||
BH 0
|
||
BL has border color (0-15) & high intensity bkgr'd color (16-31)
|
||
BH 1
|
||
BL contains palette being selected (0-1)
|
||
return none
|
||
note 1) Valid in CGA mode 04h, PCjr modes 06h, 08h-0Ah
|
||
2) Although the registers in the MCGA may be set as if to change the
|
||
border, the MCGA will not display a border no matter what register
|
||
settings are used.
|
||
|
||
|
||
Function 0Ch Write Dot - plot one graphics pixel
|
||
entry AH 0Ch
|
||
AL dot color code (0/1 in mode 6, 0-3 in modes 4 and 5)
|
||
(set bit 7 to XOR the dot with current color)
|
||
0-3 mode 04h, 05h
|
||
0-1 mode 06h
|
||
BH page number (ignored if adapter supports only one page)
|
||
CX column (X=0000h - 027Fh)
|
||
(0 - 319 in modes 4,5,13, 0 - 639 in modes 6,14,15,16)
|
||
DX row (Y=0000h - 00C7h) (0 - 199 CGA)
|
||
return none
|
||
note Video graphics modes 4-6 only
|
||
|
||
|
||
Function 0Dh Read Dot - determine the color of one graphics pixel
|
||
entry AH 0Dh
|
||
CX column (X=0000h - 027Fh) (0-319 or 639)
|
||
DX row (Y=0000h - 00C7h) (0-199)
|
||
return AL color of dot
|
||
note Only valid in graphics mode
|
||
|
||
|
||
Function 0Eh Write TTY - write one character and update cursor. Also handles
|
||
CR (0Dh), beep (07h), backspace (10h), and scrolling
|
||
entry AH 0Eh
|
||
AL ASCII code of character to be written
|
||
BH page number (text)
|
||
BL foreground color (video modes 6 & 7 only) (graphics)
|
||
return none
|
||
note 1) The ASCII codes for bell, backspace, carriage return, and linefeed are
|
||
recognized and appropriate action taken. All other characters are
|
||
written to the screen and the cursor is advanced to the next position
|
||
2) Text can be written to any CGA page regardless of current active page
|
||
3) Automatic linewrap and scrolling are provided through this function
|
||
4) This is the function used by the DOS CON console driver.
|
||
5) This function does not explicitly allow the use of attributes to the
|
||
characters written. Attributes may be provided by first writing an ASCII
|
||
27h (blank) with the desired attributes using function 09h, then
|
||
overwriting with the actual character using this function. While clumsy
|
||
this allows use of the linewrap and scrolling services provided by
|
||
this function
|
||
|
||
|
||
Function 0Fh Return Current Video State - mode and size of the screen
|
||
entry AH 0Fh
|
||
return AH number of character columns on screen
|
||
AL mode currently set (see AH=00h for display mode codes)
|
||
BH current active display page
|
||
note If mode was set with bit 7 set ("no blanking"), the returned mode will
|
||
also have bit 7 set
|
||
|
||
|
||
Function 10h Set Palette Registers
|
||
PCjr, Tandy 1000, EGA, MCGA, VGA
|
||
entry AH 10h
|
||
AL 00h set individual palette register
|
||
01h set border color palette register
|
||
02h set all palette registers and overscan
|
||
03h toggle blink/intensity bit (EGA, MCGA, VGA)
|
||
04h unknown
|
||
05h unknown
|
||
06h unknown
|
||
07h read individual palette register (VGA)
|
||
08h read overscan (order color) (VGA)
|
||
09h read all palette registers and overscan register (VGA)
|
||
10h set individual video DAC color register (MCGA, VGA)
|
||
11h unknown
|
||
12h set block of video DAC color registers (MCGA, VGA)
|
||
13h set video DAC color page (VGA)
|
||
14h unknown
|
||
15h read individual video DAC color register (MCGA, VGA)
|
||
16h unknown
|
||
17h read block of video DAC color registers (MCGA, VGA)
|
||
18h unknown
|
||
19h unknown
|
||
1Ah read video DAC color-page state (VGA)
|
||
1Bh perform gray-scale summing (VGA)
|
||
BH color value
|
||
BL if AL=00h palette register to set (00h-0Fh)
|
||
if AL=03h 0 to enable intensity
|
||
1 to enable blinking
|
||
ES:DX if AL=02h pointer to 16-byte table of register values
|
||
followed by the overscan value:
|
||
bytes 0-15 values for palette registers 0-15
|
||
byte 16 value for border register
|
||
return none
|
||
note DAC is Digital to Analog Convertor circuit in MCGA/VGA chips
|
||
|
||
|
||
Function 11h Character Generator Routine (EGA and after)
|
||
entry 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
|
||
AL 04h load 8x16 text characters (MCGA, VGA)
|
||
AL 14h set 8x16 text characters (MCGA, VGA)
|
||
The routines called with AL=1x are designed to be called only
|
||
immediately after a mode set and are similar to the routines
|
||
called with AL=0x, 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:
|
||
reg09h bytes/char-1; max scan line (mode 7 only)
|
||
reg0Ah bytes/char-2; cursor start
|
||
reg0Bh 0 ; cursor end
|
||
reg12h ((rows+1)*(bytes/char))-1
|
||
; vertical display end
|
||
reg14h 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 (MCGA, VGA)
|
||
AL 30h return information
|
||
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 text alternate (9 by 14) pointer
|
||
return ES:BP specified pointer value
|
||
CX bytes/character
|
||
DL character rows on screen
|
||
|
||
|
||
|
||
Function 12h Alternate Select (EGA and after)
|
||
entry AH 12h
|
||
AL 00h unknown
|
||
01h unknown
|
||
02h select 400 line mode (VGA)
|
||
BL 10h return EGA information
|
||
20h select alternate print screen routine
|
||
30h select vertical resolution for text modes (VGA)
|
||
31h enable/disable default palette loading (MCGA, VGA)
|
||
32h enable/disable video addressing (MCGA, VGA)
|
||
33h enable/disable default gray scale summing (MCGA, VGA)
|
||
34h enable/diable text cursor emulation (VGA)
|
||
35h display-switch interface
|
||
return BH 00h if color mode is in effect
|
||
01h if mono mode is in effect
|
||
BL 00h if 64k EGA memory
|
||
01h if 128k EGA memory
|
||
02h if 192k EGA memory
|
||
03h if 256k EGA memory
|
||
CH feature bits
|
||
CL switch settings
|
||
|
||
|
||
Function 13h Write String, Don't Move Cursor (AT, XT/286, PS/2)
|
||
entry AH 13h
|
||
AL 00h
|
||
BH display page number
|
||
BL attribute
|
||
CX length of string
|
||
DX starting cursor position
|
||
ES:BP pointer to start of string
|
||
return none
|
||
|
||
|
||
Function 13h Write String, Move Cursor (AT, XT/286, PS/2)
|
||
entry AH 13h
|
||
AL 01h
|
||
BH display page number
|
||
BL attribute
|
||
DX starting cursor position
|
||
CX length of string
|
||
ES:BP pointer to start of string
|
||
return none
|
||
|
||
|
||
Function 13h Write String of Alternating Characters and Attributes;
|
||
Don't Move Cursor (AT, XT/286, PS/2)
|
||
entry AH 13h
|
||
AL 02h
|
||
bit 0: set in order to move cursor after write
|
||
bit 1: set if string contains alternating chars and attributes
|
||
BH display page number
|
||
BL attribute if AL bit 1 clear
|
||
CX length of string
|
||
DH row of starting cursor position
|
||
DL column of starting cursor position
|
||
ES:BP pointer to start of string
|
||
return none
|
||
|
||
|
||
Function 13h Write String of Alternating Characters and Attributes;
|
||
Move Cursor (AT, XT/286, PS/2)
|
||
entry AH 13h
|
||
AL 03h
|
||
bit 0: set in order to move cursor after write
|
||
bit 1: set if string contains alternating characters and attributes
|
||
BH display page number
|
||
BL attribute if AL bit 1 clear
|
||
CX length of string
|
||
DH,DL row,column of starting cursor position
|
||
ES:BP pointer to start of string
|
||
return none
|
||
note Recognizes CR, LF, BS, and bell
|
||
|
||
|
||
Function 14h Load LCD Character Font (Convertible)
|
||
entry AH 14h
|
||
AL 00h load user specified font
|
||
|
||
BH number of bytes per character
|
||
BL 00h load main font (block 0)
|
||
01h load alternate font (block 1)
|
||
|
||
AL 01h load system ROM default font
|
||
BL 00h load main font (block 0)
|
||
01h load alternate font (block 1)
|
||
|
||
AL 02h set mapping of LCD high intensity attribute
|
||
BL 00h ignore high intensity attribute
|
||
01h map high intensity to underscore
|
||
02h map high intensity to reverse video
|
||
03h map high intensity to seleected alternate font
|
||
ES:DI pointer to character font
|
||
CX number of characters to store
|
||
DX character offset into RAM font area
|
||
|
||
|
||
Function 15h Return Physical Display Parameters (Convertible)
|
||
return AX Alternate display adapter type
|
||
ES:DI pointer to parameter table:
|
||
word # information
|
||
01h monitor model number
|
||
02h vertical pixels per meter
|
||
03h horizontal pixels per meter
|
||
04h total number of vertical pixels
|
||
05h total number of horizontal pixels
|
||
06h horizontal pixel separation in micrometers
|
||
07h vertical pixel separation in micrometers
|
||
|
||
|
||
Function 1Ah Display Combination Code (PS/2)
|
||
Using the compatibility BIOS of the PS/2 Models 50, 60, 80 there
|
||
is a way to determine which video controller and attached
|
||
display are on the system. The Display Combination Code (DCC)
|
||
is a Video BIOS function that provides the capability.
|
||
entry AH 1Ah
|
||
AL 00h read display combination code
|
||
01h write display combination code
|
||
return AL 1Ah indicates Compatibility BIOS is supported,
|
||
any other value is invalid
|
||
BH alternate display device
|
||
where:
|
||
00h no display
|
||
01h IBM monochrome display and printer adapter
|
||
02h IBM color/graphics monitor adapter
|
||
03h reserved
|
||
04h IBM EGA (color display)
|
||
05h IBM EGA (monochrome)
|
||
06h IBM PGA
|
||
07h VGA (analog monochrome display)
|
||
08h VGA (analog color display)
|
||
09h reserved
|
||
0Ah reserved
|
||
0Bh IBM PS/2 Model 30 (analog monochrome display)
|
||
0Ch IBM PS/2 Model 30 (analog color display)
|
||
BL active display device
|
||
|
||
|
||
Function 1Bh Functionality/State Information (MCGA, VGA)
|
||
entry AH 1Bh
|
||
return unknown
|
||
|
||
|
||
Function 1Ch Save/Restore Video State (VGA)
|
||
entry AH 1Ch
|
||
AL 00h return state buffer size
|
||
01h save video state
|
||
02h restore video state
|
||
return unknown
|
||
note VGA only
|
||
|
||
|
||
Function 70h Get Video RAM Address (Tandy 1000)
|
||
entry AH 70h
|
||
return AX segment addresses of the following
|
||
BX offset address of green plane
|
||
CX segment address of green plane
|
||
DX segment address of red/blue plane
|
||
note (red offset = 0, blue offset = 4000)
|
||
|
||
|
||
Function 71h Get INCRAM Addresses (Tandy 1000)
|
||
entry AH 71h
|
||
return AX segment address of the following
|
||
BX = segment address of INCRAM
|
||
CX = offset address of INCRAM
|
||
|
||
|
||
Function 72h Scroll Screen Right (Tandy 1000)
|
||
entry AH 72h
|
||
AL number of columns blanked at left of page
|
||
00h blank window
|
||
BH attributes to be used on blank columns
|
||
CH,CL row, column address of upper left corner
|
||
DH,DL row, column address of lower right corner
|
||
|
||
|
||
Function 73h Scroll Screen Left (Tandy 1000)
|
||
entry AH 73h
|
||
AL number of columns blanked at right of page
|
||
00h blank window
|
||
BH attributes to be used on blank columns
|
||
CH,CL row, column address of upper left corner
|
||
DH,DL row, column address of lower right corner
|
||
|
||
|
||
Function 81h DESQview video - Get something?
|
||
entry AH 81h
|
||
DX 4456h ('DV')
|
||
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
|
||
|
||
|
||
Function 82h DESQview - Get Current Window Info
|
||
entry AH 82h
|
||
DX 4456h ('DV')
|
||
return AH unknown
|
||
AL current window number
|
||
BH unknown
|
||
BL direct screen writes
|
||
0 program does not do direct writes
|
||
1 program does direct writes, so shadow buffer not usable
|
||
CH unknown
|
||
CL current video mode
|
||
DS segment in DESQview for data structure
|
||
in DV 2.00,
|
||
byte DS:[0] = window number
|
||
word DS:[1] = segment of other data structure
|
||
word DS:[3] = segment of window's object handle
|
||
ES 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
|
||
|
||
|
||
Function 0F0h Microsoft Mouse driver EGA support - Read One Register
|
||
entry AH 0F0h
|
||
BL register number
|
||
DX group index
|
||
Pointer/data chips
|
||
00h CRT Controller (25 reg) 3B4h mono modes, 3D4h color modes
|
||
08h Sequencer (5 registers) 3C4h
|
||
10h Graphics Controller (9 registers) 3CEh
|
||
18h Attribute Controller (20 registers) 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
|
||
return BL data
|
||
|
||
|
||
Function 0F1h Microsoft Mouse driver EGA support - Write One Register
|
||
entry AH 0F1h
|
||
DX group index (see function F0h)
|
||
BL register number
|
||
BH value to write
|
||
return BL data
|
||
|
||
|
||
Function 0F2h Microsoft Mouse driver EGA support - Read Register Range
|
||
entry AH 0F2h
|
||
CH starting register number
|
||
CL number of registers (>1)
|
||
DX group index
|
||
00h CRTC (3B4h mono modes, 3D4h color modes)
|
||
08h Sequencer 3C4h
|
||
10h Graphics Controller 3CEh
|
||
18h Attribute Controller 3C0h
|
||
ES:BX pointer to buffer, CL bytes
|
||
|
||
|
||
Function 0F3h Microsoft Mouse driver EGA support - Write Register Range
|
||
entry AH 0F3h
|
||
CH starting register
|
||
CL number of registers (>1)
|
||
DX group index
|
||
00h CRTC (3B4h mono modes, 3D4h color modes)
|
||
08h Sequencer 3C4h
|
||
10h Graphics Controller 3CEh
|
||
18h Attribute Controller 3C0h
|
||
ES:BX pointer to buffer, CL bytes
|
||
|
||
|
||
Function 0F4h Microsoft Mouse driver EGA support - Read Register Set
|
||
entry AH 0F4h
|
||
CX number of registers (>1)
|
||
ES:BX pointer to table of records in this format:
|
||
bytes 1-2 group index
|
||
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 register number (0 for single registers)
|
||
byte 4 register value
|
||
|
||
|
||
Function 0F5h Microsoft Mouse driver EGA support - Read Register Set
|
||
entry AH 0F5h
|
||
CX number of registers (>1)
|
||
ES:BX pointer to 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 register number (0 for single registers)
|
||
byte 4 register value
|
||
|
||
|
||
Function 0F6h Microsoft Mouse driver EGA support
|
||
Revert to Default Registers
|
||
entry AH 0F6h
|
||
return unknown
|
||
|
||
|
||
Function 0F7h Microsoft Mouse driver EGA support
|
||
Define Default Register Table
|
||
entry AH 0F7h
|
||
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
|
||
|
||
|
||
Function 0FAh Microsoft Mouse driver EGA support - Interrogate Driver
|
||
entry AH 0FAh
|
||
BX 00h
|
||
return BX 00h 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
|
||
|
||
|
||
Function 0FEh Get Alternate Screen Buffer Address (text mode only)
|
||
(Topview/DesQview/Taskview)
|
||
entry AH 0FEh
|
||
ES:DI segment:offset of assumed video buffer
|
||
return: ES:DI segment:offset of actual video buffer
|
||
note 1) This alternate video buffer can be written to directly, in the same
|
||
manner as writing to B:000 or B:800. The MT program will manage the
|
||
actual display.
|
||
2) There is no need to synchronize vertical retrace when writing to the
|
||
alternate buffer; this is managed by the MT program
|
||
3) If TopView or DESQview is not running, ES:DI is returned unchanged.
|
||
4) TopView requires that function 0FFh be called every time you write into
|
||
the buffer to tell TopView that something changed
|
||
|
||
|
||
Function 0FFh Update Real Display (text mode only) (TopView)
|
||
Update Video Buffer (Topview/DesQview/Taskview)
|
||
entry AH 0FFh
|
||
CX number of sequential characters that have been modified
|
||
DI offset of first character that has been modified
|
||
ES segment of video buffer
|
||
return unknown
|
||
note 1) DesQview supports this call, but does not require it
|
||
2) Avoid CX=0
|
||
|
||
|
||
|
||
|
||
Interrupt 11h Equipment Check
|
||
(0:0044h) fetch a code describing active peripherals.
|
||
entry AH 11h
|
||
return AX Equipment listing word Bits are:
|
||
0 number of floppy drives
|
||
0 no drives
|
||
1 bootable diskette installed
|
||
1 math chip
|
||
0 no math coprocessor (80x87) present
|
||
1 math coprocessor (80x87) present
|
||
(PS/2) 2 0 mouse not installed
|
||
1 mouse installed
|
||
(PC) 2,3 system board RAM
|
||
0,0 16k (PC-0, PC-1)
|
||
1,1 64k (PC-2, XT)
|
||
note 1) not commonly used. Set both bits to 1
|
||
2) both bits always 1 in AT
|
||
4,5 initial video mode
|
||
0,0 no video installed (use with dumb terminal)
|
||
0,1 40x25 color (CGA)
|
||
1,0 80x25 color (CGA)
|
||
1,1 80x25 monochrome (MDA or Hercules)
|
||
6,7 number of diskette drives (only if bit 0 1)
|
||
0,0 1 drives
|
||
0,1 2 drives
|
||
1,0 3 drives
|
||
1,1 4 drives
|
||
8 0 DMA present
|
||
1 no DMA on system (PCjr, some Tandy 1000s)
|
||
9,A,B number of RS232 serial ports (0-3)
|
||
0,0,0 none
|
||
0,0,1 1
|
||
0,1,0 2
|
||
0,1,1 3
|
||
1,0,0 4
|
||
C 0 no game I/O attached
|
||
1 game I/O attached (default for PCjr)
|
||
D serial accessory installation
|
||
0 no serial accessories installed
|
||
1 Convertible - internal modem installed
|
||
1 PCjr - serial printer attached
|
||
E,F number of parallel printers
|
||
0,0 none
|
||
0,1 one (LPT1, PRN)
|
||
1,0 two (LPT2)
|
||
1,1 three (LPT3)
|
||
note Models before PS/2 would allow a fourth
|
||
parallel printer. Remapping of the BIOS in the
|
||
PS/2s does not allow the use of LPT4.
|
||
|
||
|
||
|
||
Interrupt 12h Memory Size
|
||
(0:0048h) get system memory
|
||
return AX number of contiguous 1K RAM blocks
|
||
note 1) This service does not depend on the setting of the motherboard switches
|
||
2) This is the same value stored in absolute address 04:13h
|
||
|
||
|
||
|
||
Interrupt 13h Disk I/O - access the disk drives (floppy and hard disk)
|
||
(0:004Ch) does not try rereading disk if an error is returned
|
||
|
||
|
||
Function 00h Reset - reset the disk controller chip
|
||
entry AH 00h
|
||
DL drive (if bit 7 is set both hard disks and floppy disks reset)
|
||
return AH status
|
||
note 1) Forces controller chip to recalibrate read/write heads
|
||
2) Some systems (Sanyo 55x) this resets all drives
|
||
|
||
|
||
Function 01h Get Status of disk system
|
||
entry AH 01h
|
||
DL drive (hard disk if bit 7 set)
|
||
return AL status of most recent operation
|
||
00h successful completion
|
||
01h bad command
|
||
02h address mark not found
|
||
03h tried to write on write-protected disk
|
||
04h sector not found
|
||
05h reset failed (hard disk)
|
||
06h diskette removed or changed
|
||
07h bad parameter table (hard disk)
|
||
08h DMA overrun
|
||
09h attempt to 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/EEC on read
|
||
11h data ECC corrected
|
||
20h controller failure
|
||
40h seek failed
|
||
80h timeout
|
||
0AAh drive not ready (hard disk)
|
||
0BBh undefined error (hard disk)
|
||
0CCh write fault (hard disk)
|
||
0E0h status error (hard disk)
|
||
0FFh sense operation failed (hard disk)
|
||
|
||
|
||
Function 02h Read Sectors - read one or more sectors from diskette
|
||
entry AH 02h
|
||
AL number of sectors to read
|
||
BX address of buffer (ES=segment)
|
||
CH track number (0-39 or 0-79 for floppies)
|
||
(for hard disk, bits 8,9 in high bits of CL)
|
||
CL sector number (1 to 18, not value checked)
|
||
DH head number (0 or 1)
|
||
DL drive (0=A, 1=B, etc.) (bit 7=0) (drive 0-7)
|
||
ES:BX address to store/fetch data (buffer to fill)
|
||
[0000:0078] dword pointer to diskette parms
|
||
return CF clear (0) for successful
|
||
set (1) failure
|
||
AH status (00h, 02h, 03h, 04h, 08h, 09h, 10h, 0Ah, 20h,
|
||
40h, 80h)
|
||
AL number of sectors transferred
|
||
note 1) Number of sectors begins with 1, not 0
|
||
2) Trying to read zero sectors is considered a programming error; results
|
||
are not defined
|
||
|
||
|
||
Function 03h Write Sectors - write from memory to disk
|
||
entry AH 03h
|
||
AL number of sectors to write (1-8)
|
||
CH track number (for hard disk, bits 8,9 in high bits of CL)
|
||
CL beginning sector number
|
||
(if hard disk, high two bits are high bits of track #)
|
||
DH head number
|
||
DL drive number (0-7)
|
||
ES:BX address of buffer for data
|
||
return CF set if error
|
||
AH status (see above)
|
||
AL number of sectors written
|
||
note 1) Number of sectors begins with 1, not 0
|
||
2) Trying to write zero sectors is considered a programming error; results
|
||
are not defined
|
||
|
||
|
||
Function 04h Verify - verify that a write operation was successful
|
||
entry AH 04h
|
||
AL number of sectors to verify (1-8)
|
||
CH track number (for hard disk, bits 8,9 in high bits of CL)
|
||
CL beginning sector number
|
||
DH head number
|
||
DL drive number (0-7)
|
||
return CF set on error
|
||
AH status (see above)
|
||
AL number of sectors verified
|
||
|
||
|
||
Function 05h Format Track - write sector ID bytes for 1 track
|
||
entry AH 05h
|
||
AL number of sectors to create on this track
|
||
CH track (or cylinder) number
|
||
CL sector number
|
||
DH head number (0, 1)
|
||
DL drive number (0-3)
|
||
ES:BX pointer to 4-byte address field (C-H-R-N)
|
||
byte 1 = (C) cylinder or track
|
||
byte 2 = (H) head
|
||
byte 3 = (R) sector
|
||
byte 4 = (N) bytes/sector (0 = 128, 1 = 256, 2 = 512, 3 = 1024)
|
||
return CF set if error occurred
|
||
AH status code (see above)
|
||
note Not valid for ESDI hard disks on PS/2
|
||
|
||
|
||
Function 06h Hard Disk - format track and set bad sector flags
|
||
(PC2, PC-XT, and Portable)
|
||
entry AH 06h
|
||
AL interleave value (XT only)
|
||
CH cylinder number (bits 8,9 in high bits of CL)
|
||
CL sector number
|
||
DH head
|
||
DL drive
|
||
ES:BX 512 byte format buffer
|
||
the first 2*(sectors/track) bytes contain f,n for each sector
|
||
f 00Fh for good sector
|
||
80h for bad sector
|
||
n sector number
|
||
return AH status code
|
||
|
||
|
||
Function 07h Hard Disk - format the drive starting at the desired track
|
||
(PC2, PC-XT and Portable)
|
||
entry AH 07h
|
||
AL interleave value (XT only) (01h-10h)
|
||
CH cylinder number (bits 8,9 in high bits of CL) (00h-03FFh)
|
||
CL sector number
|
||
DH head number (0-7)
|
||
DL drive number (80h-87h, 80h=C, 81h=D,...)
|
||
ES:BX format buffer, size = 512 bytes
|
||
the first 2*(sectors/track) bytes contain f,n for each sector
|
||
f=00h for good sector
|
||
80h for bad sector
|
||
n=sector number
|
||
return AH status code (see above)
|
||
|
||
|
||
Function 08h Read Drive Parameters (XT, CONV, AT, XT/286, PS/2)
|
||
entry AH 08h
|
||
DL drive number (0-2)
|
||
return CF set on error
|
||
AH status code (see above)
|
||
BL drive type (see AH=17h below) (AT/PS2 floppies only)
|
||
CH maximum useable value for cylinder number
|
||
CL maximum useable value for sector number or cylinder number
|
||
DH maximum usable value for head number
|
||
DL number of consecutive acknowledging drives (0-2)
|
||
ES:DI drive parameter table
|
||
|
||
|
||
Function 09h Initialize Two Fixed Disk Base Tables (XT, AT, XT/286, PS/2)
|
||
(install nonstandard drive)
|
||
entry AH 09h
|
||
return CF set on error
|
||
AH status code (see above)
|
||
data block definitions:
|
||
+0 maximum number of cylinders (dw)
|
||
+2 maximum number of heads (db)
|
||
+3 starting reduced write current cylinder (dw - XT only)
|
||
+5 starting write precomp cylinder (dw)
|
||
+7 maximum ECC data burst length (db - XT only)
|
||
+8 control byte: Bits
|
||
0,1,2 <20> drive option
|
||
3,4,5 - always zero
|
||
6 - disable ECC retries
|
||
7 - disable access retries
|
||
note 1) Int 41h points to table for drive 0
|
||
2) Int 46h points to table for drive 1
|
||
3) 41h used by XT, 41h and 46h used by AT
|
||
|
||
|
||
Function 0Ah Read Long (Hard disk) (XT, AT, XT/286, PS/2)
|
||
entry AH 0Ah
|
||
CH cylinder number (bits 8,9 in high bits of CL)
|
||
CL sector number
|
||
DL drive ID
|
||
DH head number
|
||
ES:BX pointer to buffer to fill
|
||
return CF set on error
|
||
AH status code (see above)
|
||
AL number of sectors actually transferred
|
||
note 1) A "long" sector includes a 4 byte EEC (Extended Error Correction) code
|
||
2) Used for diagnostics only on PS/2 systems
|
||
|
||
|
||
Function 0Bh Write Long (XT, AT, XT/286, PS/2)
|
||
entry AH 0Bh
|
||
CH cylinder (bits 8,9 in high bits of CL)
|
||
CL sector number
|
||
DH head number
|
||
DL drive ID
|
||
ES:BX pointer to buffer containing data
|
||
return CF set on error
|
||
AH status code (see above)
|
||
AL number of sectors actually transferred
|
||
note 1) A "long" sector includes a 4 byte EEC (Extended Error Correction) code
|
||
2) Used for diagnostics only on PS/2 systems
|
||
|
||
|
||
Function 0Ch Seek To Cylinder (except PC, PCjr)
|
||
entry AH 0Ch
|
||
CH cylinder number (bits 8,9 in high bits of CL)
|
||
DH head number
|
||
DL drive ID
|
||
return CF set on error
|
||
AH status code (see above)
|
||
note 1) Positions heads over a particular cylinder
|
||
|
||
|
||
Function 0Dh Alternate Disk Reset (except PC, PCjr)
|
||
entry AH 0Dh
|
||
DL drive ID
|
||
return CF set on error
|
||
AH status code (see above)
|
||
note Not for PS/2 ESDI hard disks
|
||
|
||
|
||
Function 0Eh Read Sector Buffer (XT, Portable PS/2)
|
||
entry AH 0Eh
|
||
AL number of sectors
|
||
CH cylinder (bits 8,9 in top two bits of CL)
|
||
CL sector number
|
||
DH head number
|
||
DL drive number
|
||
ES:BX pointer to buffer
|
||
return CF set on error
|
||
AH status code (see above)
|
||
AL number of sectors actually transferred
|
||
note 1) Transfers controller's sector buffer. No data is read from the drive
|
||
2) Used for diagnostics only on PS/2 systems
|
||
|
||
|
||
Function 0Fh Write sector buffer (XT, Portable)
|
||
entry AH 0Fh
|
||
AL number of sectors
|
||
CH cylinder (bits 8,9 in top two bits of CL)
|
||
CL sector number
|
||
DH head number
|
||
DL drive number
|
||
ES:BX pointer to buffer
|
||
return CF set if error
|
||
AH status code
|
||
AL number of sectors actually transferred
|
||
note 1) Should be called before formatting to initialize the controller's
|
||
sector buffer.
|
||
2) Used for diagnostics only on PS/2 systems
|
||
|
||
|
||
Function 10h Test For Drive Ready
|
||
entry AH 10h
|
||
DL drive ID
|
||
return CF set on error
|
||
AH status code (see above)
|
||
|
||
|
||
Function 11h Recalibrate Drive
|
||
entry AH 11h
|
||
DL drive ID
|
||
return CF set on error
|
||
AH status code (see above)
|
||
|
||
|
||
Function 12h Controller RAM Diagnostic (XT, Portable, PS/2)
|
||
entry AH 12h
|
||
return CF set on error
|
||
AH status code (see AH=1 above)
|
||
note Used for diagnostics only on PS/2 systems
|
||
|
||
|
||
Function 13h Drive Diagnostic (XT, Portable)
|
||
entry AH 13h
|
||
return CF set on error
|
||
AH status code (see above)
|
||
note Used for diagnostics only on PS/2 systems
|
||
|
||
|
||
Function 14h Controller Internal Diagnostic (AT, XT/286)
|
||
entry AH 14h
|
||
return CF set on error
|
||
AH status code (see above)
|
||
note 1) OEM is Western Digital 1003-WA2 hard/floppy combination controller
|
||
in AT and XT/286.
|
||
2) Used for diagnostics only in PS/2 systems
|
||
|
||
|
||
Function 15h Get Disk Type (except PC and XT)
|
||
entry AH 15h
|
||
DL drive ID
|
||
return AH disk type
|
||
00h no drive is present
|
||
01h diskette, no change detection present
|
||
02h diskette, change detection present
|
||
03h fixed disk
|
||
CX:DX number of 512-byte sectors when AH = 03h
|
||
|
||
|
||
Function 16h Change of Disk Status (diskette) (except PC and XT)
|
||
entry AH 16h
|
||
return AH disk change status
|
||
00h no disk change
|
||
01h disk changed
|
||
DL drive that had disk change
|
||
|
||
|
||
Function 17h Set Disk Type for Format (diskette) (except PC and XT)
|
||
entry AH 17h
|
||
AL 00h no disk
|
||
01h 360kb diskette in 360Kb drive
|
||
02h 360kb diskette in 1.2M drive
|
||
03h 1.2M diskette in 1.2M drive
|
||
04h 720kb diskette in 720Kb drive
|
||
DL drive number
|
||
return AH status of operation
|
||
note This function is probably enhanced for the PS/2 series to detect
|
||
1.44 in 1.44 and 720k in 1.44.
|
||
|
||
|
||
Function 18h Set Media Type For Format (diskette) (AT, XT/286, PS/2)
|
||
entry AH 18h
|
||
CH lower 8 bits of number of tracks
|
||
CL high 2 bits of number of tracks (6,7) sectors per track
|
||
(bits 0-5)
|
||
DL drive number
|
||
return AH 00h if requested combination supported
|
||
01h if function not available
|
||
0Ch if not suppported or drive type unknown
|
||
80h if there is no media in the drive
|
||
ES:DI pointer to 11-byte parm table
|
||
|
||
|
||
Function 19h Park Hard Disk Heads (XT/286, PS/2)
|
||
entry AH 19h
|
||
DL drive
|
||
return CF set on error
|
||
AH error code
|
||
|
||
|
||
Function 1Ah ESDI Hard Disk - Format (PS/2)
|
||
entry 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 pointer to 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
|
||
|
||
|
||
|
||
|
||
|
||
Interrupt 14h Initialize and Access Serial Port For Int 14
|
||
(0:0050h) the following status is defined:
|
||
|
||
serial status byte:
|
||
bits 0 delta clear to send
|
||
1 delta data set ready
|
||
2 trailing edge ring detector
|
||
3 delta receive line signal det.
|
||
4 clear to send
|
||
5 data set ready
|
||
6 ring indicator
|
||
7 receive line signal detect
|
||
|
||
line status byte:
|
||
bits 0 data ready
|
||
1 overrun error
|
||
2 parity error
|
||
3 framing error
|
||
4 break detect
|
||
5 transmit holding reg. empty
|
||
6 transmit shift register empty
|
||
7 time out note: if bit 7 set then other bits are invalid
|
||
|
||
All routines have AH=function number and DX=RS232 card number (0 based).
|
||
AL=character to send or received character on exit, unless otherwise noted.
|
||
|
||
entry AH 00h Initialize And Access Serial Communications Port
|
||
bit pattern: BBBPPSLL
|
||
BBB = baud rate: 110,150,300,600,1200,2400,4800,9600
|
||
PP = parity: 01 = odd, 11 = even
|
||
S = stop bits: 0 = 1, 1 = 2
|
||
LL = word length: 10 = 7-bits, 11 = 8-bits
|
||
AL parms for initialization:
|
||
bit pattern:
|
||
0 word length
|
||
1 word length
|
||
2 stop bits
|
||
3 parity
|
||
4 parity
|
||
5 baud rate
|
||
6 baud rate
|
||
7 baud rate
|
||
word length 10 7 bits
|
||
11 8 bits
|
||
stop bits 0 1 stop bit
|
||
1 2 stop bits
|
||
parity 00 none
|
||
01 odd
|
||
11 even
|
||
baud rate 000 110 baud
|
||
001 150 baud
|
||
010 300 baud
|
||
011 600 baud
|
||
100 1200 baud
|
||
101 2400 baud
|
||
110 4800 baud
|
||
111 9600 baud (4800 on PCjr)
|
||
DX port number
|
||
return AH line status
|
||
AL modem status
|
||
|
||
|
||
Function 01h Send Character in AL to Comm Port DX (0 or 1)
|
||
entry AH 01h
|
||
AL character
|
||
DX port number (0 or 1)
|
||
return AH RS232 status code
|
||
bit 0 data ready
|
||
1 overrun error
|
||
2 parity error
|
||
3 framing error
|
||
4 break detected
|
||
5 transmission buffer register empty
|
||
6 transmission shift register empty
|
||
7 timeout
|
||
AL modem status
|
||
bit
|
||
0 delta clear-to-send
|
||
1 delta data-set-ready
|
||
2 trailing edge ring detected
|
||
3 change, receive line signal detected
|
||
4 clear-to-send
|
||
5 data-set-ready
|
||
6 ring received
|
||
7 receive line signal detected
|
||
|
||
|
||
Function 02h Wait For A Character From Comm Port DX
|
||
entry AH 02h
|
||
return AL character received
|
||
AH error code (see above)(00h for no error)
|
||
|
||
|
||
Function 03h Fetch the Status of Comm Port DX (0 or 1)
|
||
entry AH 03h
|
||
return AH set bits (01h) indicate comm-line status
|
||
bit 7 timeout
|
||
bit 6 empty transmit shift register
|
||
bit 5 empty transmit holding register
|
||
bit 4 break detected ("long-space")
|
||
bit 3 framing error
|
||
bit 2 parity error
|
||
bit 1 overrun error
|
||
bit 0 data ready
|
||
AL set bits indicate modem status
|
||
bit 7 received line signal detect
|
||
bit 6 ring indicator
|
||
bit 5 data set ready
|
||
bit 4 clear to send
|
||
bit 3 delta receive line signal detect
|
||
bit 2 trailing edge ring detector
|
||
bit 1 delta data set ready
|
||
bit 0 delta clear to send
|
||
|
||
|
||
Function 04h Extended Initialize (PC Convertible)
|
||
entry AH 04h
|
||
AL break status
|
||
01h if break
|
||
00h if no break
|
||
BH parity
|
||
00h no parity
|
||
01h odd parity
|
||
02h even parity
|
||
03h stick parity odd
|
||
04h stick parity even
|
||
BL number of stop bits
|
||
00h one stop bit
|
||
01h 2 stop bits (1<EFBFBD> if 5 bit word length)
|
||
CH word length
|
||
00h 5 bits
|
||
01h 6 bits
|
||
02h 7 bits
|
||
03h 8 bits
|
||
CL baud rate
|
||
00h 110
|
||
01h 150
|
||
02h 300
|
||
03h 600
|
||
04h 1200
|
||
05h 2400
|
||
06h 4800
|
||
07h 9600
|
||
08h 19200
|
||
return AL modem status
|
||
AH line control status
|
||
|
||
|
||
Function 05h Extended Communication Port Control (PS/2)
|
||
entry AH 05h
|
||
AL 00h read modem control register
|
||
return BL modem control reg (see AL=1)
|
||
AL 01h write modem control register
|
||
BL modem control register: (for AL=00 and AL=01) bits
|
||
0 data terminal ready
|
||
1 request to send
|
||
2 out1
|
||
3 out2
|
||
4 loop
|
||
5,6,7 reserved
|
||
return AH status
|
||
|
||
|
||
Interrupt 15h Cassette I/O
|
||
(0:0054h) Renamed "System Services" on PS/2 line
|
||
|
||
|
||
Function 00h Turn Cassette Motor On (PC, PCjr only)
|
||
entry AH 00h
|
||
return AH 86h no cassette present
|
||
CF set on error
|
||
note NOP for systems where cassette not supported
|
||
|
||
|
||
Function 01h Turn Cassette Motor Off (PC, PCjr only)
|
||
entry AH 01h
|
||
return AH 86h no cassette present
|
||
CF set on error
|
||
note NOP for systems where cassette not supported
|
||
|
||
|
||
Function 02h Read Blocks From Cassette (PC, PCjr only)
|
||
entry AH 02h
|
||
CX count of bytes to read
|
||
ES:BX pointer to data buffer
|
||
return CF set on error
|
||
AH error code
|
||
01h CRC error
|
||
02h bad tape signals
|
||
03h no data found on tape
|
||
04h no data
|
||
80h invalid command
|
||
86h no cassette present
|
||
DX count of bytes actually read
|
||
ES:BX pointer past last byte written
|
||
note 1) NOP for systems where cassette not supported
|
||
2) Cassette operations normally read 256 byte blocks
|
||
|
||
|
||
Function 03h Write Data Blocks to Cassette (PC, PCjr only)
|
||
entry AH 03h
|
||
CX count of bytes to write
|
||
ES:BX pointer to data buffer
|
||
return CF set on error
|
||
AH error code (see 02h)
|
||
CX 0
|
||
ES:BX pointer to last byte written+1
|
||
note 1) NOP for systems where cassette not supported
|
||
2) The last block is padded to 256 bytes with zeroes if needed
|
||
3) No errors are returned by this service
|
||
|
||
|
||
Function 0Fh ESDI Format Unit Periodic Interrupt (PS/2 50, 60, 80)
|
||
entry AH 0Fh
|
||
AL phase code
|
||
00h reserved
|
||
01h surface analysis
|
||
02h formatting
|
||
return CF clear if formatting should continue
|
||
set if it should terminate
|
||
note Called during ESDI drive formatting after each cylinder is completed
|
||
|
||
|
||
Function 10h TopView API Function Calls (TopView)
|
||
entry AX 00h PAUSE Give Up CPU Time
|
||
return 00h after other processes run
|
||
01h GETMEM allocate "system" memory
|
||
BX number of bytes to allocate
|
||
return ES:DI pointer to block of memory
|
||
02h PUTMEM deallocate "system" memory
|
||
ES:DI pointer to previously allocated block
|
||
return block freed
|
||
03h PRINTC display character/attribute on screen
|
||
BH attribute
|
||
BL character
|
||
DX segment of object handle for window
|
||
note BX=0 does not display anything, it only
|
||
positions the hardware cursor
|
||
10h unknown
|
||
AL 04h thru 12h
|
||
return TopView - unimplemented in DV 2.0x
|
||
pops up "Programming error" window in DV 2.0x
|
||
11h unknown
|
||
12h unknown
|
||
13h GETBIT define a 2nd-level interrupt handler
|
||
ES:DI pointer to FAR service routine
|
||
return BX bit mask indicating which bit was
|
||
allocated
|
||
0 if no more bits available
|
||
14h FREEBIT undefine a 2nd-level interrupt handler
|
||
BX bit mask from int 15/AH 13h
|
||
15h SETBIT schedule one or more 2nd-level interrupts
|
||
BX bit mask for interrupts to post
|
||
return indicated routines will be called at next ???
|
||
16h ISOBJ verify object handle
|
||
ES:DI possible object handle
|
||
return BX -1 if ES:DI is a valid object handle
|
||
0 if ES:DI is not
|
||
17h TopView - unimplemented in DV 2.00
|
||
return pops up "Programming Error" window in DV 2.00
|
||
18h LOCATE Find Window at a Given Screen Location
|
||
BH column
|
||
BL row
|
||
ES segment of object handle for ???
|
||
(0 = use default)
|
||
return ES segment of object handle for window
|
||
which is visible at the indicated
|
||
position
|
||
19h SOUND Make Tone
|
||
BX frequency in Hertz
|
||
CX duration in clock ticks (18.2 ticks/sec)
|
||
return immediately, tone continues to completion
|
||
note 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
|
||
1Ah OSTACK Switch to Task's Internal Stack
|
||
return stack switched
|
||
1Bh BEGINC Begin Critical Region
|
||
return task-switching temporarily disabled
|
||
note Will not task-switch until END CRITICAL REGION
|
||
(AH=1Ch) is called
|
||
1Ch ENDC End Critical Region
|
||
return task-switching enabled
|
||
1Dh STOP STOP TASK
|
||
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
|
||
note At least in DV 2.00, this function is ignored
|
||
unless the indicated task is the current task.
|
||
1Eh START Start Task
|
||
ES segment of object handle for task to be started
|
||
(== handle of main window for that task)
|
||
return Indicated task is started up again
|
||
1Fh DISPEROR Pop-Up Error Window
|
||
BX bit fields:
|
||
0-12 number of characters to display
|
||
13,14 which mouse button may be pressed to
|
||
remove window
|
||
00 either
|
||
01 left
|
||
10 right
|
||
11 either
|
||
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 status:
|
||
1 left button pressed
|
||
2 right button pressed
|
||
27 ESC key pressed
|
||
note Window remains on-screen until ESC or indicated
|
||
mouse button is pressed
|
||
20h TopView - unimplemented in DV 2.0x
|
||
return pops up "Programming Error" window in DV 2.0x
|
||
21h PGMINT Interrupt Another Task
|
||
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
|
||
22h GETVER Get Version
|
||
BX 00h
|
||
return BX nonzero, TopView or compatible loaded
|
||
BH minor version
|
||
BL major version
|
||
notes TaskView returns BX = 0001h
|
||
DESQview 2.0 returns BX = 0A01h
|
||
23h POSWIN Position Window
|
||
BX segment of object handle for parent window
|
||
within which to position the window (0 = full
|
||
screen)
|
||
CH # columns to offset from position in DL
|
||
CL # rows to offset from position in DL
|
||
DL bit flags
|
||
0,1 horizontal position
|
||
00 current
|
||
01 center
|
||
10 left
|
||
11 right
|
||
2,3 vertical position
|
||
00 current
|
||
01 center
|
||
10 top
|
||
11 bottom
|
||
4 don't redraw screen if set
|
||
5-7 not used
|
||
ES segment of object handle for window to be
|
||
positioned
|
||
return nothing
|
||
24h GETBUF Get Virtual Screen Information
|
||
BX segment of object handle for window (0=default)
|
||
return CX size of virtual screen in bytes
|
||
DL 0 or 1, unknown
|
||
ES:DI address of virtual screen
|
||
25h USTACK Switch Back to User's Stack
|
||
return stack switched back
|
||
note Call only after int 15h,fn1Ah
|
||
26h
|
||
thru 2Ah DesQview (TopView?) - unimplemented in DV 2.0x
|
||
return pops up "Programming Error" window in DV 2.0x
|
||
2Bh POSTTASK Awaken Task DesQview 2.0 (TopView?)
|
||
BX segment of object handle for task
|
||
return nothing
|
||
2Ch Start New Application in New Process
|
||
DesQview 2.0 (TopView?)
|
||
ES:DI pointer to contents of .PIF/.DVP file
|
||
BX size of .PIF/.DVP info
|
||
return BX segment of object handle for new task
|
||
2Dh Keyboard Mouse Control DesQview 2.0
|
||
BL subfunction
|
||
00h determine whether using keyboard mouse
|
||
01h turn keyboard mouse on
|
||
02h turn keyboard mouse off
|
||
return (calling BL was 00h)
|
||
BL 0 using real mouse
|
||
1 using keyboard mouse
|
||
|
||
|
||
|
||
|
||
|
||
Function 20h PRINT.COM (DOS internal) (AT, XT-286, PS/2 50+)
|
||
entry AH 20h
|
||
AL subfunction
|
||
00h unknown (PRINT)
|
||
01h unknown (PRINT)
|
||
10h sets up SysReq routine on AT, XT/286, PS/2
|
||
11h completion of SysReq routine (software only)
|
||
note 1) AL=0 or 1 sets or resets some flags which affect what PRINT does when
|
||
it tries to access the disk
|
||
|
||
|
||
Function 21h Power-On Self Test (POST) Error Log (PS/2 50+)
|
||
entry AH 21h
|
||
AL 00h read POST log
|
||
01h write POST log
|
||
BH device ID
|
||
BL 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.
|
||
|
||
|
||
Function 40h Read/Modify Profiles (Convertible)
|
||
entry AH 40h
|
||
AL 00h read system profile in CX,BX
|
||
01h write system profile from CX, BX
|
||
02h read internal modem profile in BX
|
||
03h write internal modem profile from BX
|
||
BX profile info
|
||
return BX internal modem profile (from 02h)
|
||
CX,BX system profile (from 00h)
|
||
|
||
|
||
Function 41h Wait On External Event (Convertible)
|
||
entry AH 41h
|
||
AL condition type
|
||
bits 0-2: condition to wait for
|
||
0 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
|
||
condition codes:
|
||
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
|
||
BL timeout value times 55 milliseconds
|
||
0 if no time limit
|
||
DX I/O port address (if AL bit 4 = 1)
|
||
ES:DI pointer to user byte (if AL bit 4 = 0)
|
||
|
||
|
||
Function 42h Request System Power Off (Convertible)
|
||
entry AH 42h
|
||
AL 00h to use system profile
|
||
01h to force suspend regardless of profile
|
||
|
||
|
||
Function 43h Read System Status (Convertible)
|
||
entry AH 43h
|
||
return AL status bits:
|
||
0 LCD detached
|
||
1 reserved
|
||
2 RS232/parallel powered on
|
||
3 internal modem powered on
|
||
4 power activated by alarm
|
||
5 standby power lost
|
||
6 external power in use
|
||
7 battery low
|
||
|
||
|
||
Function 44h (De)activate Internal Modem Power (Convertible)
|
||
entry AH 44h
|
||
AL 00h to power off
|
||
01h to power on
|
||
|
||
|
||
Function 4Fh Keyboard Intercept (except PC, PCjr, and XT)
|
||
entry AH 4Fh
|
||
AL scan code, CF set
|
||
return AL scan code, CF set if processing desired
|
||
note Called by int 9 handler to translate scan codes
|
||
|
||
|
||
Function 80h Device Open (AT, XT/286, PS/2)
|
||
entry AH 80h
|
||
BX device ID
|
||
CX process ID
|
||
return CF set on error
|
||
AH status
|
||
|
||
|
||
Function 81h Device Close (AT, XT/286, PS/2)
|
||
entry AH 81h
|
||
BX device ID
|
||
CX process ID
|
||
return CF set on error
|
||
AH status
|
||
|
||
|
||
Function 82h Program Termination (AT, XT/286, PS/2)
|
||
AH 82h
|
||
BX device ID
|
||
return: CF set on error
|
||
AH status
|
||
note Closes all devices opened with function 80h
|
||
|
||
|
||
Function 83h Event Wait (AT, XT/286, Convertible, PS/2)
|
||
entry AH 83h
|
||
AL 00h to set interval
|
||
10h to cancel
|
||
CX,DX number of microseconds to wait (granularity is 976 microseconds)
|
||
ES:BX pointer to memory flag (bit 7 is set when interval expires)
|
||
(pointer is to caller's memory)
|
||
return CF set (1) if function already busy
|
||
|
||
|
||
Function 84h Read Joystick Input Settings (AT, XT/286, PS/2)
|
||
entry AH 84h
|
||
DX 00h to read the current switch settings (return in AL)
|
||
01h to read the resistive inputs
|
||
return AX A(X) value
|
||
BX A(Y) value
|
||
CX B(X) value
|
||
DX B(Y) value
|
||
AL switch settings (bits 7-4)
|
||
|
||
|
||
Function 85h System Request (SysReq) Key Pressed (except PC, PCjr, XT)
|
||
entry AH 85h
|
||
return AL 00h key pressed
|
||
01h key released
|
||
note Called by keyboard decode routine
|
||
|
||
|
||
Function 86h Elapsed Time Wait (except PC, PCjr, XT)
|
||
AH 86h
|
||
CX,DX number of microseconds to wait
|
||
return CF clear after wait elapses
|
||
CF set immediately due to error
|
||
note Only accurate to 977 microseconds
|
||
|
||
|
||
Function 87h Extended Memory Block Move (286/386 machines only)
|
||
AH 87h
|
||
CX number of words to move
|
||
ES:SI pointer to Global Descriptor Table (GDT)
|
||
offset 00h null descriptor
|
||
08h 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
|
||
|
||
|
||
Function 88h Extended Memory Size Determine (AT, XT/286, PS/2)
|
||
entry AH 88h
|
||
return AX # of contiguous 1K blocks of memory starting at address 1024k
|
||
|
||
|
||
Function 89h Switch Processor to Protected Mode (AT, XT/286, PS/2)
|
||
entry AH 89h
|
||
BH interrupt number of IRQ 8 (IRQ 9Fh use next 7 interrupts)
|
||
BL interrupt number of IRQ 0 (IRQ 17h use next 7 interrupts)
|
||
CX offset into protected mode CS to jump to
|
||
DS:SI pointer to Global Descriptor Table for protected mode
|
||
offset 00h null descriptor
|
||
08h GDT descriptor
|
||
10h IDT descriptor
|
||
18h DS
|
||
20h ES
|
||
28h SS
|
||
30h CS
|
||
38h uninitialized, used to build descriptor for
|
||
BIOS CS
|
||
return AH 0FFh error enabling address line 20
|
||
CF set on error
|
||
|
||
|
||
Function 90h Device Busy Loop (except PC, PCjr, XT)
|
||
entry AH 90h
|
||
AL type code:
|
||
00h disk
|
||
01h diskette
|
||
02h keyboard
|
||
03h PS/2 pointing device
|
||
80h network (ES:BX = ncb)
|
||
0FCh disk reset
|
||
0FDh diskette motor start
|
||
0FEh printer
|
||
ES:BX pointer to request block for type codes 80h through 0BFh
|
||
return CF 1 (set) if wait time satisfied
|
||
0 (clear) if driver must perform wait
|
||
note Used by NETBIOS
|
||
Type codes are allocated as follows:
|
||
00h-7Fh non-reentrant devices; OS must arbitrate access
|
||
80h-BFh reentrant devices; ES:BX points to a unique control block
|
||
C0h-FFh wait-only calls, no complementary int 15,fn91h call
|
||
|
||
|
||
Function 91h Set Flag and Complete Interrupt (except PC, PCjr, XT)
|
||
entry AH 91h
|
||
AL type code (see AH=90h above)
|
||
ES:BX pointer to request block for type codes 80h through 0BFh
|
||
return AH 0
|
||
note Used by NETBIOS
|
||
|
||
|
||
Function 0C0h Get System Configuration (XT after 1/10/86, PC Convertible,
|
||
XT/286, AT, PS/2)
|
||
entry AH 0C0h
|
||
return CF 1 if BIOS doesn't support call
|
||
ES:BX pointer to ROM system descriptor table
|
||
dword number of bytes following
|
||
byte ID byte: PC FF
|
||
XT FE or FB
|
||
PCjr FD
|
||
byte secondary ID distingushes between AT and XT/286, etc.
|
||
byte BIOS revision level, 0 for 1st release, 1 for 2nd, etc.
|
||
byte feature information
|
||
80h DMA channel 3 used by hard disk BIOS
|
||
40h 2nd 8259 installed
|
||
20h realtime clock installed
|
||
10h int 15h,fn 04h called upon int 09h
|
||
08h wait for external event supported
|
||
04h extended BIOS area allocated at 640k
|
||
03h reserved
|
||
02h bus is Micro Channel instead of PC
|
||
01h reserved
|
||
00h reserved
|
||
word unknown (set to 0)
|
||
word unknown (set to 0)
|
||
note Int 15h is also used for the Multitask Hook on PS/2 machines. No
|
||
register settings availible yet.
|
||
The 1/10/86 XT BIOS returns an incorrect value for the feature byte.
|
||
|
||
|
||
|
||
Function 0C1h System - Return Extended-BIOS Data-Area Segment Address (PS/2)
|
||
entry AH 0C1h
|
||
return CF set on error
|
||
ES segment of data area
|
||
|
||
|
||
Function 0C2h Pointing Device BIOS Interface (DesQview 2.x) (PS/2)
|
||
entry AH 0C2h
|
||
AL 00h enable/disable
|
||
BH 00h disable
|
||
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=1:1 scaling, 1=2:1 scaling
|
||
bit 5: device enabled
|
||
bit 6: 0=stream mode, 1=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 AL 00h
|
||
return CF set on error
|
||
AH status
|
||
00h successful
|
||
01h invalid function
|
||
02h invalid input
|
||
03h interface error
|
||
04h need to resend
|
||
05h no device handler installed
|
||
note The values in BH for those functions that take it as input are stored
|
||
in different locations for each subfunction
|
||
|
||
|
||
Function 0C3h Enable/Disable Watchdog Timeout (PS/2 50+)
|
||
entry AH 0C3h
|
||
AL 00h disable
|
||
01h enable
|
||
BX timer counter
|
||
return CF set on error
|
||
note The watchdog timer generates an NMI
|
||
|
||
|
||
Function 0C4h Programmable Option Select (PS/2 50+)
|
||
entry AH 04Ch
|
||
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)
|
||
|
||
|
||
Function 0DEh DesQview Services (DesQview)
|
||
entry AH 0DEh
|
||
AL 00h Get Program Name
|
||
return AX offset into DESQVIEW.DVO of current
|
||
program's record:
|
||
byte length of name
|
||
n bytes name
|
||
2 bytes keys to invoke program (second
|
||
= 00h if only one key used)
|
||
word ? (I see 0 always)
|
||
byte end flag: 00h for all but last
|
||
entry, which is 0FFh
|
||
01h Update "Open Window" Menu
|
||
return none
|
||
note Reads DESQVIEW.DVO, disables Open menu if file
|
||
not in current directory
|
||
02h unimplemented in DV 2.0x
|
||
return nothing (NOP in DV 2.0x)
|
||
03h unimplemented in DV 2.0x
|
||
return nothing (NOP in DV 2.0x)
|
||
04h Get Available Common Memory
|
||
return BX bytes of common memory available
|
||
CX largest block available
|
||
DX total common memory in bytes
|
||
05h Get Available Conventional Memory
|
||
return BX K of memory available
|
||
CX largest block available
|
||
DX total conventional memory in K
|
||
06h Get Available Expanded Memory
|
||
return BX K of expanded memory available
|
||
CX largest block available
|
||
DX total expanded memory in K
|
||
07h APPNUM Get Current Program's Number
|
||
return AX number of program as it appears on the
|
||
"Switch Windows" menu
|
||
08h GET (unknown)
|
||
return AX 0 unknown
|
||
1 unknown
|
||
09h unimplemented in DV 2.00
|
||
return nothing (NOP in DV 2.00)
|
||
0Ah DBGPOKE Display Character on Status Line
|
||
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)
|
||
note 1) Displays character on bottom line of *physical*
|
||
screen, regardless of current size of window
|
||
(even entirely hidden)
|
||
2) Does not know about graphics display modes,
|
||
just pokes the characters into display memory
|
||
0Bh APILEVEL Define Minimum API Level Required
|
||
BL API level
|
||
>2 pops up "You need a newer version" error
|
||
window in DV 2.00
|
||
BH unknown
|
||
return AX maximum API level?
|
||
0Ch GETMEM Allocate "System" Memory
|
||
BX number of bytes
|
||
return ES:DI pointer to allocated block
|
||
0Dh PUTMEM Deallocate "System" Memory
|
||
ES:DI pointer to previously allocated block
|
||
return nothing
|
||
0Eh Find Mailbox by Name (DV 2.0+)
|
||
ES:DI pointer to name to find
|
||
CX length of name
|
||
return BX 0 not found
|
||
1 found
|
||
DS:SI object handle
|
||
0Fh Enable DesQview Extensions (DV 2.0+)
|
||
return AX and BX destroyed (seems to be bug, weren't
|
||
saved & restored)
|
||
note 1) Sends a manager stream with opcodes AEh, BDh,
|
||
and BFh to task's window
|
||
2) Enables an additional mouse mode
|
||
10h PUSHKEY PUT KEY INTO KEYBOARD INPUT STREAM (DV 2.0+)
|
||
BH scan code
|
||
BL character
|
||
return BX unknown (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
|
||
11h ENABLE/DISABLE AUTO JUSTIFICATION OF WINDOW (DV 2.0+)
|
||
BL 0 viewport will not move automatically
|
||
nonzero viewport will move to keep cursor
|
||
visible
|
||
return none
|
||
12h unknown (DV 2.0+)
|
||
BX 0 clear something?
|
||
nonzero set something?
|
||
return none
|
||
|
||
|
||
|
||
|
||
|
||
Interrupt 16h Keyboard I/O
|
||
(0:0058h) access the keyboard
|
||
|
||
|
||
Function 00h Get Keyboard Input - read the next character in keyboard buffer,
|
||
if no key ready, wait for one.
|
||
entry AH 00h
|
||
return AH scan code
|
||
AL ASCII character
|
||
|
||
|
||
Function 01h Check Keystroke Buffer - Do Not Clear
|
||
entry AH 01h
|
||
return ZF 0 (clear) if character in buffer
|
||
1 (set) if no character in buffer
|
||
AH scan code of character (if ZF=0)
|
||
AL ASCII character if applicable
|
||
note Keystroke is not removed from buffer
|
||
|
||
|
||
Function 02h Shift Status - fetch bit flags indicating shift status
|
||
entry AH 02h
|
||
return AL bit codes (same as [0040:0017])
|
||
bit 7 Insert state
|
||
bit 6 CapsLock state
|
||
bit 5 NumLock state
|
||
bit 4 ScrollLock state
|
||
bit 3 Alt key
|
||
bit 2 Control key
|
||
bit 1 Left shift (left caps-shift key)
|
||
bit 0 Right shift (right caps-shift key)
|
||
note other codes found at [0040:0018]
|
||
bit 7 Insert shift (Ins key)
|
||
bit 6 Caps shift (CapsLock key)
|
||
bit 5 Num shift (NumLock key)
|
||
bit 4 Scroll shift (ScrollLock key)
|
||
bit 3 Hold state (Ctrl-NumLock is in effect)
|
||
|
||
|
||
Function 03h Keyboard - Set Repeat Rate (PCjr, AT, XT/286, PS/2)
|
||
entry AH 03h
|
||
AL 00h reset typematic (PCjr)
|
||
01h increase initial delay (PCjr)
|
||
02h increase continuing delay (PCjr)
|
||
03h increase both delays (PCjr)
|
||
04h turn off typematic (PCjr)
|
||
05h set typematic rate (AT, PS/2)
|
||
BH 00h-03h for delays of 250ms, 500ms, 750ms, or 1s
|
||
BL 00h-1Fh for typematic rates of 30cps down to 2cps
|
||
|
||
|
||
Function 04h Keyboard Click Toggle (PCjr and Convertible)
|
||
entry AH 04h
|
||
AL 00h for click off
|
||
01h for click on
|
||
|
||
|
||
Function 05h Keyboard Buffer Write (AT or PS/2 with enhanced kbd)
|
||
(XT/286, PS/2, AT with "Enhanced" keyboard)
|
||
entry AH 05h
|
||
CH scan code
|
||
CL ASCII character
|
||
return AL 01h if buffer full
|
||
|
||
|
||
Function 10h Get Enhanced Keystroke And Read (F11, F12 Enhanced Keyb'd)
|
||
(XT/286, PS/2, AT with "Enhanced" keyboard)
|
||
entry AH 10h
|
||
return AH scan code
|
||
AL ASCII character if applicable
|
||
|
||
|
||
Function 11h Check Enhanced Keystroke (F11-F12 on enhanced keyboard)
|
||
(XT/286, PS/2, AT with "Enhanced" keyboard)
|
||
entry AH 11h
|
||
return ZF 0 (clear) if key pressed
|
||
1 if buffer empty
|
||
AH scan code (when ZF=0)
|
||
AL ASCII character if applicable (when ZF=0)
|
||
note Keystroke is not removed from buffer
|
||
|
||
|
||
Function 12h Extended Get Shift Status (F11, F12 Enhanced keyboard)
|
||
entry AH 12h
|
||
return AL bit
|
||
0 right Shift key depressed
|
||
1 left Shift key depressed
|
||
2 Control key depressed
|
||
3 Alt key depressed
|
||
4 ScrollLock state active
|
||
5 NumLock state active
|
||
6 CapsLock state active
|
||
7 insert state is active
|
||
AH 0 left Control key pressed
|
||
1 left Alt key depressed
|
||
2 right Control key pressed
|
||
3 right Alt key depressed
|
||
4 Scroll Lock key depressed
|
||
5 NumLock key depressed
|
||
6 CapsLock key depressed
|
||
7 SysReq key depressed
|
||
|
||
|
||
Function 0F0h Set CPU speed (Compaq 386)
|
||
entry AH 0F0h set speed
|
||
return unknown
|
||
note used by Compaq DOS MODE command.
|
||
parameters not availible
|
||
|
||
|
||
|
||
|
||
Interrupt 17h Printer
|
||
(0:005Ch) access the parallel printer(s)
|
||
AH is changed. All other registers left alone.
|
||
|
||
Function 00h Print Character/send AL to printer DX (0, 1, or 2)
|
||
entry AH 00h
|
||
AL character
|
||
DX printer to be used (0,1,2)
|
||
return AH status byte
|
||
bit
|
||
0 time out
|
||
1 unused
|
||
2 unused
|
||
3 I/O error
|
||
4 selected
|
||
5 out of paper
|
||
6 acknowledge
|
||
7 not busy
|
||
|
||
|
||
Function 01h Initialize Printer - set init line low, send 0Ch to printer DX
|
||
entry AH 01h
|
||
DX printer port to be initialized (0,1,2)
|
||
return status as below
|
||
|
||
|
||
Function 02h Printer Status - read status of printer DX into AH
|
||
entry AH 02h
|
||
DX printer port to be used (0,1,2)
|
||
return AH bit flags bit 7 0 = printer is busy
|
||
bit 6 ACKnowledge line state
|
||
bit 5 out-of-paper line state
|
||
bit 4 printer selected line state
|
||
bit 3 I/O error
|
||
bit 2 unused
|
||
bit 1 unused
|
||
bit 0 time-out error
|
||
|
||
|
||
|
||
|
||
Interrupt 18h ROM BASIC
|
||
(0:0060h) Execute ROM BASIC at address 0F600h:0000h
|
||
note 1) Often reboots a compatible
|
||
|
||
|
||
|
||
|
||
Interrupt 19h Bootstrap Loader
|
||
(0:0064h) Reads track 0, sector 1 into address 0000h:7C00h, then transfers
|
||
control to that address. If no diskette drive available,
|
||
transfers to ROM-BASIC or displays loader error message.
|
||
Causes reboot of disk system if invoked while running.
|
||
(no memory test performed).
|
||
|
||
|
||
|
||
|
||
Interrupt 1Ah Time of Day
|
||
(0:0068h) access the PC internal clock
|
||
|
||
Function 00h Read System Time Counter
|
||
entry AH 00h
|
||
return CX high word of clock count
|
||
DX low word of clock count
|
||
AL 00h if clock was read or written (via AH=0,1) within the current
|
||
24-hour period. Otherwise, AL > 0
|
||
|
||
|
||
Function 01h Set Clock - set # of 55ms clock ticks in system time counter
|
||
entry AH 01h
|
||
CX:DX high word/low word count of timer ticks
|
||
return none
|
||
note 1) The clock ticks are incremented by timer interrupt at 18.2065 times
|
||
per second or 54.9254milliseconds/count. Therefore:
|
||
counts per second = 18 (12h)
|
||
counts per minute = 1092 (444h)
|
||
counts per hour = 65543 (10011h)
|
||
counts per day = 1573040 (1800B0h)
|
||
2) counter is zeroed when system is rebooted
|
||
|
||
2) IBM and Microsoft recommend using int 21 Fn 4Ch. Using int 20 is
|
||
officially frowned upon since the introduction of DOS 2.0
|
||
|
||
|
||
Function 02h Read Real Time Clock Time (AT and after)
|
||
entry AH 02h
|
||
return CH hours in BCD
|
||
CL minutes in BCD
|
||
DH seconds in BCD
|
||
DL 1 (set) if daylight savings time option
|
||
CF 1 (set) if clock not operating
|
||
|
||
|
||
Function 03h Set Real Time Clock Time (AT and after)
|
||
entry AH 03h
|
||
CH hours in BCD
|
||
CL minutes in BCD
|
||
DH seconds in BCD
|
||
DL 0 (clear) if standard time
|
||
1 (set) if daylight savings time option
|
||
return none
|
||
|
||
|
||
Function 04h Read Real Time Clock Date (AT and after)
|
||
entry AH 04h
|
||
return CH century in BCD (19 or 20)
|
||
CL year in BCD
|
||
DH month in BCD
|
||
DL day in BCD
|
||
CF 1 (set) if clock not operating
|
||
|
||
|
||
Function 05h Set Real Time Clock Date (AT and after)
|
||
entry AH 05h
|
||
CH century in BCD (19 or 20)
|
||
CL year in BCD
|
||
DH month in BCD
|
||
DL day in BCD
|
||
return none
|
||
|
||
|
||
Function 06h Set Real Time Clock Alarm (AT and after)
|
||
entry AH 06h
|
||
CH hours in BCD
|
||
CL minutes in BCD
|
||
DH seconds in BCD
|
||
return CF set if alarm already set or clock inoperable
|
||
note Int 4Ah occurs at specified alarm time every 24hrs until reset
|
||
|
||
|
||
Function 07h Reset Real Time Clock Alarm (AT and after)
|
||
entry AH 07h
|
||
return none
|
||
|
||
|
||
Function 08h Set Real Time Clock Activated Power On Mode (Convertible)
|
||
entry AH 08h
|
||
CH hours in BCD
|
||
CL minutes in BCD
|
||
DH seconds in BCD
|
||
|
||
|
||
Function 09h Read Real Time Clock Alarm Time and Status
|
||
(Convertible and PS/2 Model 30)
|
||
entry AH 09h
|
||
return CH hours in BCD
|
||
CL minutes in BCD
|
||
DH seconds in BCD
|
||
DL alarm status:
|
||
00h if alarm not enabled
|
||
01h if alarm enabled but will not power up system
|
||
02h if alarm will power up system
|
||
|
||
|
||
Function 0Ah Read System-Timer Day Counter (XT-2 [640k motherboard], PS/2)
|
||
entry AH 0Ah
|
||
return CF set on error
|
||
CX count of days since Jan 1,1980
|
||
|
||
Function 0Bh Set System-Timer Day Counter (XT-2 [640k motherboard], PS/2)
|
||
entry AH 0Bh
|
||
CX count of days since Jan 1,1980
|
||
return CF set on error
|
||
|
||
|
||
Function 80h Set Up Sound Multiplexor (PCjr) (Tandy 1000?)
|
||
entry AH 80h
|
||
AL 00h source is 8253 channel 2
|
||
01h source is cassette input
|
||
02h source is I/O channel "audio in"
|
||
03h source is TI sound generator chip
|
||
|
||
|
||
|
||
|
||
Interrupt 1Bh Control-Break
|
||
(0:006Ch) This interrupt is called when the keyboard scanner of the IBM
|
||
machines detects Ctrl and Break pressed at the same time.
|
||
|
||
note 1) If the break occurred while processing an interrupt, one or more
|
||
end of interrupt commands must be send to the 8259 Programmable
|
||
Interrupt Controller.
|
||
2) All I/O devices should be reset in case an operation was underway at
|
||
the time.
|
||
3) It is normally pointed to an IRET during system initialization so that
|
||
it does nothing, but some programs change it to return a ctrl-C scan
|
||
code and thus invoke int 23h.
|
||
|
||
|
||
|
||
|
||
Interrupt 1Ch Timer Tick
|
||
(0:0070h)
|
||
note 1) Taken 18.2065 times per second
|
||
2) Normally vectors to dummy IRET unless PRINT.COM has been installed.
|
||
3) If an application moves the interrupt pointer, it is the responsibility
|
||
of that application to save and restore all registers that may be
|
||
modified.
|
||
|
||
|
||
|
||
|
||
Interrupt 1Dh Vector of Video Initialization Parameters.
|
||
(0:0074h) This doubleword address points to 3 sets of 16-bytes containing
|
||
data to initialize for video modes for video modes 0 & 1 (40
|
||
column), 2 & 3 (80 column), and 4, 5 & 6 (graphics) on the
|
||
Motorola 6845 CRT controller chip.
|
||
6845 registers:
|
||
R0 horizontal total (horizontal sync in characters)
|
||
R1 horizontal displayed (characters per line)
|
||
R2 horizontal sync position (move display left or right)
|
||
R3 sync width (vertical and horizontal pulse: 4-bits each)
|
||
R4 vertical total (total character lines)
|
||
R5 vertical adjust (adjust for 50 or 60 Hz refresh)
|
||
R6 vertical displayed (lines of chars displayed)
|
||
R7 vertical sync position (lines shifted up or down)
|
||
R8 interlace (bits 4 and 5) and skew (bits 6 and 7)
|
||
R9 max scan line addr (scan lines per character row)
|
||
R10 cursor start (starting scan line of cursor)
|
||
R11 cursor stop (ending scan line of cursor)
|
||
R12 video memory start address high byte (6-bits)
|
||
R13 video memory start address low byte (8-bits)
|
||
R14 cursor address high byte (6-bits)
|
||
R15 cursor address low byte (8-bits)
|
||
|
||
6845 Video Init Tables:
|
||
table for modes 0 and 1 \
|
||
table for modes 2 and 3 \ each table is 16 bytes long and
|
||
table for modes 4,5, and 6 / contains values for 6845 registers
|
||
table for mode 7 /
|
||
4 words: size of video RAM for modes 0/1, 2/3, 4/5, and 6/7
|
||
8 bytes: number of columns in each mode
|
||
8 bytes: video controller mode byte for each mode
|
||
note 1) There are 4 separate tables, and all 4 must be initialized if all
|
||
video modes will be used.
|
||
2) The power-on initialization code of the computer points this vector
|
||
to the ROM BIOS video routines.
|
||
3) IBM recommends that is this table needs to be modified, it should be
|
||
copied into RAM and only the nescessary changes made.
|
||
|
||
|
||
|
||
|
||
Interrupt 1Eh Vector of Diskette Controller Parameters
|
||
(0:0078h) Dword address points to data base table that is used by BIOS.
|
||
Default location is at 0F000:0EFC7h. 11-byte table format:
|
||
bytes:
|
||
00h 4-bit step rate, 4-bit head unload time
|
||
01h 7-bit head load time, 1-bit DMA flag
|
||
02h 54.9254 ms counts - delay till motor off (37-38 typ)
|
||
03h sector size:
|
||
00h 128 bytes
|
||
01h 256 bytes
|
||
02h 512 bytes
|
||
03h 1024 bytes
|
||
04h last sector on track (8 or 9 typical)
|
||
05h gap between sectors on read/write (42 typical)
|
||
06h data length for DMA transfers (0FFh typical)
|
||
07h gap length between sectors for format (80 typical)
|
||
08h sector fill byte for format (0F6h typical)
|
||
09h head settle time (in milliseconds) (15 to 25 typical)
|
||
DOS 1.0 0
|
||
DOS 2.10 15
|
||
DOS 3.1 1
|
||
10h motor start time (in 1/8 second intervals) (2 to 4 typ.)
|
||
DOS 2.10 2
|
||
note 1) This vector is pointed to the ROM BIOS diskette tables on system
|
||
initialization
|
||
2) IBM recommends that is this table needs to be modified, it should be
|
||
copied into RAM and only the nescessary changes made.
|
||
|
||
|
||
|
||
|
||
Interrupt 1Fh Pointer to Graphics Character Extensions (Graphics Set 2)
|
||
(0:007Ch) This is the pointer to data used by the ROM video routines to
|
||
display characters above ASCII 127 while in CGA medium and high
|
||
res graphics modes.
|
||
|
||
note 1) Doubleword address points to 1K table composed of 28 8-byte character
|
||
definition bit-patterns. First byte of each entry is top row, last byte
|
||
is bottom row.
|
||
2) The first 128 character patterns are located in system ROM.
|
||
3) This vector is set to 000:0 at system initialization
|
||
4) Used by DOS' external GRAFTABL command
|
||
|
||
|
||
Interrupt 20h PROGRAM TERMINATE
|
||
(0:0080h)
|
||
Issue int 20h to exit from a program. This vector transfers to the logic in
|
||
DOS to restore the terminate address, the Ctrl-Break address,and the critical
|
||
error exit address to the values they had on entry to the program. All the file
|
||
buffers are flushed and all handles are closed. You should close all files
|
||
changed in length (see function calls 10h and 3Eh) before issuing this
|
||
interrupt. If the changed file is not closed, its length, time, and date are
|
||
not recorded correctly in the directory.
|
||
For a program to pass a completion code or an error code when terminating, it
|
||
must use either function call 4Ch (Terminate a Process) or 31h (Terminate
|
||
Process and Stay Resident). These two methods are preferred over using
|
||
int 20h and the codes returned by them can be interrogated in batch processing.
|
||
Important: Before you issue an interrupt 20h, your program must ensure that
|
||
the CS register contains the segment of its program segment prefix.
|
||
|
||
Interrupt 20h DOS - Terminate Program
|
||
entry no parameters
|
||
return none
|
||
|
||
Interrupt 20h Minix - Send/Receive Message
|
||
entry 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)
|
||
and the call parameters
|
||
|
||
|
||
CHAPTER 4
|
||
|
||
Programming Technical Reference - IBM
|
||
Copyright 1988, Dave Williams
|
||
|
||
|
||
DOS INTERRUPTS AND FUNCTION CALLS
|
||
CONTENTS
|
||
|
||
DOS Registers ........................................................... 4-
|
||
Interrupts .............................................................. 4-
|
||
20h Program Terminate ........................................... 4-
|
||
21h Function Request ............................................ 4-
|
||
Function Calls .............................................. 4-
|
||
Listing of Function Calls ................................... 4-
|
||
00h Program Terminate ................................... 4-
|
||
01h Keyboard Input ...................................... 4-
|
||
02h Display Output ...................................... 4-
|
||
03h Auxiliary Input ..................................... 4-
|
||
04h Auxiliary Output .................................... 4-
|
||
05h Printer Output ...................................... 4-
|
||
06h Direct Console I/O .................................. 4-
|
||
07h Direct Console Input Without Echo ................... 4-
|
||
08h Console Input Without Echo ...........................4-
|
||
09h Print String .........................................4-
|
||
0Ah Buffered Keyboard Input ..............................4-
|
||
0Bh Check Standard Input Status ..........................4-
|
||
0Ch Clear Keyboard Buffer and Invoke a Kbd Function ..... 4-
|
||
0Dh Disk Reset .......................................... 4-
|
||
0Eh Select Disk ......................................... 4-
|
||
0Fh Open File ........................................... 4-
|
||
10h Close File .......................................... 4-
|
||
11h Search for First Entry .............................. 4-
|
||
12h Search for Next Entry ............................... 4-
|
||
13h Delete File ......................................... 4-
|
||
14h Sequential Read ..................................... 4-
|
||
15h Sequential Write .................................... 4-
|
||
16h Create File ......................................... 4-
|
||
17h Rename File ......................................... 4-
|
||
18h ** Unknown .......................................... 4-
|
||
19h Current Disk ........................................ 4-
|
||
1Ah Set Disk Transfer Address ........................... 4-
|
||
1Bh Allocation Table Information ........................ 4-
|
||
1Ch Allocation Table Information for Specific Device .... 4-
|
||
1Dh ** Unknown .......................................... 4-
|
||
1Eh ** Unknown .......................................... 4-
|
||
1Fh ** Read DOS Disk Block (default drive) .............. 4-
|
||
20h ** Unknown .......................................... 4-
|
||
21h Random Read ......................................... 4-
|
||
22h Random Write ........................................ 4-
|
||
23h File Size ........................................... 4-
|
||
24h Set Relative Record Field ........................... 4-
|
||
25h Set Interrupt Vector ................................ 4-
|
||
26h Create New Program Segment .......................... 4-
|
||
27h Random Block Read ................................... 4-
|
||
28h Random Block Write .................................. 4-
|
||
29h Parse Filename ...................................... 4-
|
||
2Ah Get Date ............................................ 4-
|
||
2Bh Get Date ............................................ 4-
|
||
2Ch Get Time ............................................ 4-
|
||
2Dh Set Time ............................................ 4-
|
||
2Eh Set/Reset Verify Switch ............................. 4-
|
||
2Fh Get Disk Transfer Address (DTA) ..................... 4-
|
||
30h Get DOS Version Number .............................. 4-
|
||
31h Terminate Process and Stay Resident ................. 4-
|
||
32h ** Read DOS Disk Block .............................. 4-
|
||
33h Ctrl-Break Check .................................... 4-
|
||
34h ** Return INDOS Flag ................................ 4-
|
||
35h Get Vector .......................................... 4-
|
||
36h Get Disk Free Space ................................. 4-
|
||
37h ** Get/Set Switch Character (SWITCHAR) .............. 4-
|
||
38h Return Country Dependent Information ................ 4-
|
||
39h Create Subdirectory (MKDIR) ......................... 4-
|
||
3Ah Remove Subdirectory (RMDIR) ......................... 4-
|
||
3Bh Change Durrent Directory (CHDIR) .................... 4-
|
||
3Ch Create a File (CREAT) ............................... 4-
|
||
3Dh Open a File ......................................... 4-
|
||
3Eh Close a File Handle ................................. 4-
|
||
3Fh Read From a File or Device .......................... 4-
|
||
40h Write to a File or Device ........................... 4-
|
||
41h Delete a File from a Specified Directory (UNLINK) ... 4-
|
||
42h Move File Read/Write Pointer (LSEEK) ................ 4-
|
||
43h Change File Mode (CHMOD) ............................ 4-
|
||
44h I/O Control for Devices (IOCTL) ..................... 4-
|
||
45h Duplicate a File Handle (DUP) ....................... 4-
|
||
46h Force a Duplicate of a Handle (FORCDUP) ............. 4-
|
||
47h Get Current Directory ............................... 4-
|
||
48h Allocate Memory ..................................... 4-
|
||
49h Free Allocated Memory ............................... 4-
|
||
4Ah Modify Allocated Memory Blocks (SETBLOCK) ........... 4-
|
||
4Bh Load or Execute a Program (EXEC) .................... 4-
|
||
4Ch Terminate a Process (EXIT) .......................... 4-
|
||
4Dh Get Return Code of a Subprocess (WAIT) .............. 4-
|
||
4Eh Find First Matching File (FIND FIRST) ............... 4-
|
||
4Fh Find Next Matching File (FIND NEXT) ................. 4-
|
||
50h ** Set PSP .......................................... 4-
|
||
51h ** Get PSP .......................................... 4-
|
||
52h ** IN-VARS .......................................... 4-
|
||
53h ** Translate BPB .................................... 4-
|
||
54h Get Verify Setting .................................. 4-
|
||
55h ** Create Child PSP ................................. 4-
|
||
56h Rename a File ....................................... 4-
|
||
57h Get or Set Timestamp of a File ...................... 4-
|
||
58h ** Get/Set Allocation Strategy (DOS 3.x) ............ 4-
|
||
59h Get Extended Error Code ............................. 4-
|
||
5Ah Create Unique Filename .............................. 4-
|
||
5Bh Create a New File ................................... 4-
|
||
5Ch Lock/Unlock File Access ............................. 4-
|
||
5Dh ** Network - Partial ................................ 4-
|
||
5Eh ** Network Printer .................................. 4-
|
||
5Fh ** Network Redirection .............................. 4-
|
||
60h ** Parse Pathname ................................... 4-
|
||
61h ** Unknown .......................................... 4-
|
||
62h Get Program Segment Prefix (PSP) Address ............ 4-
|
||
63h ** Get Lead Byte Table (DOS 2.25) ................... 4-
|
||
64h ** Unknown .......................................... 4-
|
||
65h ** Get Extended Country Information (DOS 3.3) ....... 4-
|
||
66h ** Get/Set Global Code Page Table (DOS 3.3) ......... 4-
|
||
67h ** Set Handle Count (DOS 3.3) ....................... 4-
|
||
68h ** Commit File (DOS 3.3) ............................ 4-
|
||
Calling the DOS Services .................................... 4-
|
||
22h Terminate Address ........................................... 4-
|
||
23h Ctrl-Break Exit Address ..................................... 4-
|
||
24h Critical Error Handler Vector ............................... 4-
|
||
25h Absolute Disk Read .......................................... 4-
|
||
26h Absolute Disk Write ......................................... 4-
|
||
27h Terminate and Stay Resident ................................. 4-
|
||
28h ** DOS Idle Interrupt ....................................... 4-
|
||
29h ** Quick Screen Output ...................................... 4-
|
||
2Ah Microsoft Networks Session Layer Interrupt .................. 4-
|
||
2Bh ** Unknown .................................................. 4-
|
||
2Ch ** Unknown .................................................. 4-
|
||
2Dh ** Unknown .................................................. 4-
|
||
2Eh ** Alternate EXEC ........................................... 4-
|
||
2Fh Multiplex Interrupt ......................................... 4-
|
||
|
||
|
||
|
||
|
||
DOS REGISTERS
|
||
|
||
DOS uses the following registers, pointers, and flags when it executes
|
||
interrupts and function calls:
|
||
|
||
GENERAL REGISTERS register definition
|
||
AX accumulator (16 bit)
|
||
AH accumulator high-order byte (8 bit)
|
||
AL accumulator low order byte (8 bit)
|
||
BX base (16 bit)
|
||
BH base high-order byte (8 bit)
|
||
BL base low-order byte (8 bit)
|
||
CX count (16 bit)
|
||
CH count high order byte (8 bit)
|
||
CL count low order byte (8 bit)
|
||
DX data (16 bit)
|
||
DH date high order byte (8 bit)
|
||
DL data low order byte (8 bit)
|
||
|
||
FLAGS AF, CF, DF, IF, OF, PF, SF, TF, ZF
|
||
|
||
POINTERS register definition
|
||
SP stack pointer (16 bit)
|
||
BP base pointer (16 bit)
|
||
IP instruction pointer (16 bit)
|
||
|
||
SEGMENT REGISTERS register definition
|
||
CS code segment (16 bit)
|
||
DS data segment (16 bit)
|
||
SS stack segment (16 bit)
|
||
ES extra segment (16 bit)
|
||
|
||
INDEX REGISTERS register definition
|
||
DI destination index (16 bit)
|
||
SI stack index (16 bit)
|
||
|
||
|
||
INTERRUPTS
|
||
|
||
Microsoft recommends that a program wishing to examine or set the contents of
|
||
any interrupt vector use the DOS function calls 35h and 25h provided for those
|
||
purposes and avoid referencing the interrupt vector locations directly.
|
||
DOS reserves interrupt numbers 20h to 3Fh for its own use. This means absolute
|
||
memory locations 80h to 0FFh are reserved by DOS. The defined interrupts are as
|
||
follows with all values in hexadecimal.
|
||
|
||
|
||
Interrupt 21h FUNCTION CALL REQUEST
|
||
(0:0084h)
|
||
DOS provides a wide variety of function calls for character device I/O, file
|
||
management, memory management, date and time functions,execution of other
|
||
programs, and more. They are grouped as follows:
|
||
|
||
call description
|
||
00h program terminate
|
||
01h-0Ch character device I/O, CP/M compatibility format
|
||
0Dh-24h file management, CP/M compatibility format
|
||
25h-26h nondevice functions, CP/M compatibility format
|
||
27h-29h file management, CP/M compatibility format
|
||
2Ah-2Eh nondevice functions, CP/M compatibility format
|
||
2Fh-38h extended functions
|
||
39h-3Bh directory group
|
||
3Ch-46h extended file management
|
||
47h directory group
|
||
48h-4Bh extended memory management
|
||
54h-57h extended functions
|
||
5Eh-5Fh networking
|
||
60h-62h extended functions
|
||
63h-66h enhanced foreign language support
|
||
|
||
|
||
List of DOS services: * = undocumented
|
||
00h terminate program
|
||
01h get keyboard input
|
||
02h display character to STDIO
|
||
03h get character from STDAUX
|
||
04h output character to STDAUX
|
||
05h output character to STDPRN
|
||
06h direct console I/O - keyboard to screen
|
||
07h get char from std I/O without echo
|
||
08h get char from std I/O without echo, checks for ^C
|
||
09h display a string to STDOUT
|
||
0Ah buffered keyboard input
|
||
0Bh check STDIN status
|
||
0Ch clear keyboard buffer and invoke keyboard function
|
||
0Dh flush all disk buffers
|
||
0Eh select disk
|
||
0Fh open file with File Control Block
|
||
10h close file opened with File Control Block
|
||
11h search for first matching file entry
|
||
12h search for next matching file entry
|
||
13h delete file specified by File Control Block
|
||
14h sequential read from file specified by File Control Block
|
||
15h sequential write to file specified by File Control Block
|
||
16h find or create firectory entry for file
|
||
17h rename file specified by file control block
|
||
18h* unknown
|
||
19h return current disk drive
|
||
1Ah set disk transfer area (DTA)
|
||
1Bh get current disk drive FAT
|
||
1Ch get disk FAT for any drive
|
||
1Dh* unknown
|
||
1Eh* unknown
|
||
1Fh* read DOS disk block, default drive
|
||
20h* unknown
|
||
21h random read from file specified by FCB
|
||
22h random write to file specified by FCB
|
||
23h return number of records in file specified by FCB
|
||
24h set relative file record size field for file specified by FCB
|
||
25h set interrupt vector
|
||
26h create new Program Segment Prefix (PSP)
|
||
27h random file block read from file specified by FCB
|
||
28h random file block write to file specified by FCB
|
||
29h parse the command line for file name
|
||
2Ah get the system date
|
||
2Bh set the system date
|
||
2Ch get the system time
|
||
2Dh set the system time
|
||
2Eh set/clear disk write VERIFY
|
||
2Fh get the Disk Transfer Address (DTA)
|
||
30h get DOS version number
|
||
31h TSR, files opened remain open
|
||
32h* read DOS Disk Block
|
||
33h get or set Ctrl-Break
|
||
34h* INDOS Critical Section Flag
|
||
35h get segment and offset address for an interrupt
|
||
36h get free disk space
|
||
37h* get/set option marking character (SWITCHAR)
|
||
38h return country-dependent information
|
||
39h create subdirectory
|
||
3Ah remove subdirectory
|
||
3Bh change current directory
|
||
3Ch create and return file handle
|
||
3Dh open file and return file handle
|
||
3Eh close file referenced by file handle
|
||
3Fh read from file referenced by file handle
|
||
40h write to file referenced by file handle
|
||
41h delete file
|
||
42h move file pointer (move read-write pointer for file)
|
||
43h set/return file attributes
|
||
44h device IOCTL (I/O control) info
|
||
45h duplicate file handle
|
||
46h force a diuplicate file handle
|
||
47h get current directory
|
||
48h allocate memory
|
||
49h release allocated memory
|
||
4Ah modify allocated memory
|
||
4Bh load or execute a program
|
||
4Ch terminate prog and return to DOS
|
||
4Dh get return code of subprocess created by 4Bh
|
||
4Eh find first matching file
|
||
4Fh fine next matching file
|
||
50h* set new current Program Segment Prefix (PSP)
|
||
51h* puts current PSP into BX
|
||
52h* pointer to the DOS list of lists
|
||
53h* translates BPB (Bios Parameter Block, see below)
|
||
54h get disk verification status (VERIFY)
|
||
55h* create PSP: similar to function 26h
|
||
56h rename a file
|
||
57h get/set file date and time
|
||
58h get/set allocation strategy (DOS 3.x)
|
||
59h get extended error information
|
||
5Ah create a unique filename
|
||
5Bh create a DOS file
|
||
5Ch lock/unlock file contents
|
||
5Dh* network
|
||
5Eh* network printer
|
||
5Fh* network redirection
|
||
60h* parse pathname
|
||
61h* unknown
|
||
62h get program segment prefix (PSP)
|
||
63h* get lead byte table (DOS 2.25)
|
||
64h* unknown
|
||
65h* get extended country information (DOS 3.3)
|
||
66h* get/set global code page table (DOS 3.3)
|
||
67h* set handle count (DOS 3.3)
|
||
68h* commit file (DOS 3.3)
|
||
|
||
|
||
CALLING THE DOS SERVICES
|
||
|
||
The DOS services are invoked by placing the number of the desired function in
|
||
register AH, subfunction in AL, setting the other registers to any specific
|
||
requirements of the function, and invoking int 21h.
|
||
|
||
On return, the requested service will be performed if possible. Most codes
|
||
will return an error; some return more information. Details are contained in
|
||
the listings for the individual functions. Extended error return may be
|
||
obtained by calling function 59h (see 59h).
|
||
|
||
Register settings listed are the ones used by DOS. Some functions will return
|
||
with garbage values in unused registers. Do not test for values in unspecified
|
||
registers; your program may exhibit odd behavior.
|
||
|
||
DS:DX pointers are the data segment register (DS) indexed to the DH and DL
|
||
registers (DX). DX always contains the offset address, DS contains the segment
|
||
address.
|
||
|
||
The File Control Block services (FCB services) were part of DOS 1.0. Since
|
||
the release of DOS 2.0, Microsoft has recommended that these services not be
|
||
used. A set of considerably more enhanced services (handle services) were
|
||
introduced with DOS 2.0. The handle services provide support for wildcards and
|
||
subdirectories, and enhanced error detection via function 59h.
|
||
|
||
The data for the following calls was compiled from various Intel, Microsoft,
|
||
IBM, and other publications. There are many subtle differences between MSDOS
|
||
and PCDOS and between the individual versions. Differences between the
|
||
versions are noted as they occur.
|
||
|
||
There are various ways of calling the DOS functions. For all methods, the
|
||
function number is loaded into register AH, subfunctions and/or parameters are
|
||
loaded into AL or other registers, and call int 21 by one of the following
|
||
methods:
|
||
A) call interrupt 21h directly
|
||
B) perform a long call to offset 50h in the program's PSP.
|
||
1) This method will not work under DOS 1.x
|
||
C) place the function number in CL and perform an intrasegment call to
|
||
location 05h in the current code segment. This location contains a long
|
||
call to the DOS function dispatcher.
|
||
1) IBM recommends this method be used only when using existing programs
|
||
written for different calling conventions. This method should be avoided
|
||
unless you some specific use for it
|
||
2) AX is always destroyed by this method
|
||
3) This method is valid only for functions 00h-24h.
|
||
|
||
INT 21H DOS services
|
||
Function (hex)
|
||
|
||
* Indicates Functions not documented in the IBM DOS Technical Reference.
|
||
Note some functions have been documented in other Microsoft or licensed OEM
|
||
documentation.
|
||
|
||
|
||
00h Terminate Program
|
||
Ends program, updates, FAT, flushes buffers, restores registers
|
||
entry AH 00h
|
||
CS segment address of PSP
|
||
return none
|
||
note 1) Program must place the segment address of the PSP control block in CS
|
||
before calling this function.
|
||
2) The terminate, ctrl-break,and critical error exit addresses (0Ah, 0Eh,
|
||
12h) are restored to the values they had on entry to the terminating
|
||
program, from the values saved in the program segment prefix at
|
||
locations PSP:000Ah, PSP:000Eh, and PSP:0012h.
|
||
3) All file buffers are flushed and the handles opened by the process are
|
||
closed.
|
||
4) Any files that have changed in length and are not closed are not
|
||
recorded properly in the directory.
|
||
5) Control transfers to the terminate address.
|
||
6) This call performs exactly the same function as int 20h.
|
||
7) All memory used by the program is returned to DOS.
|
||
|
||
|
||
01h Get Keyboard Input
|
||
Waits for char at STDIN (if nescessary), echoes to STDOUT
|
||
entry AH 01h
|
||
return AL char from STDIN (8 bits)
|
||
note 1) Checks char for Ctrl-C, if char is Ctrl-C, executes int 23h.
|
||
2) For function call 06h, extended ASCII codes require two function calls.
|
||
The first call returns 00h as an indicator that the next call will be an
|
||
extended ASCII code.
|
||
3) Input and output are redirectable. If redirected, there is no way to
|
||
detect EOF.
|
||
|
||
|
||
02h Display Output
|
||
Outputs char in DL to STDOUT
|
||
entry AH 02h
|
||
DL 8 bit data (usually ASCII character)
|
||
return none
|
||
note 1) If char is 08 (backspace) the cursor is moved 1 char to the left
|
||
(nondestructive backspace).
|
||
2) If Ctrl-C is detected after input, int 23h is executed.
|
||
3) Input and output are redirectable. If redirected, there is no way to
|
||
detect disk full.
|
||
|
||
|
||
03h Auxiliary Input
|
||
Get (or wait until) character from STDAUX
|
||
entry AH 03h
|
||
return AL char from auxiliary device
|
||
note 1) AUX, COM1, COM2 is unbuffered and not interrupt driven
|
||
2) This function call does not return status or error codes. For greater
|
||
control it is recommended that you use ROM BIOS routine (int 14h) or
|
||
write an AUX device driver and use IOCTL.
|
||
3) At startup, PC-DOS initializes the first auxiliary port (COM1) to 2400
|
||
baud, no parity, one stop bit, and an 8-bit word. MSDOS may differ.
|
||
4) If Ctrl-C is has been entered from STDIN, int 23h is executed.
|
||
|
||
|
||
04h Auxiliary Output
|
||
Write character to STDAUX
|
||
entry AH 04h
|
||
DL char to send to AUX
|
||
return none
|
||
note 1) This function call does not return status or error codes. For greater
|
||
control it is recommended that you use ROM BIOS routine (int 14h) or
|
||
write an AUX device driver and use IOCTL.
|
||
2) If Ctrl-C is has been entered from STDIN, int 23h is executed.
|
||
3) Default is COM1 unless redirected by DOS.
|
||
4) If the device is busy, this function will wait until it is ready.
|
||
|
||
|
||
05h Printer Output
|
||
Write character to STDPRN
|
||
entry AL 05h
|
||
DL character to send
|
||
return none
|
||
note 1) If Ctrl-C is has been entered from STDIN, int 23h is executed.
|
||
2) Default is PRN or LPT1 unless redirected with the MODE command.
|
||
3) If the printer is busy, this function will wait until it is ready.
|
||
|
||
|
||
06h Direct Console I/O
|
||
Get character from STDIN; echo character to STDOUT
|
||
entry AH 06h
|
||
DL 0FFh for console input, or 00h-0FEh for console output
|
||
return ZF zero flag set (1) = no character
|
||
zero flag clear (0) = character recieved
|
||
AL character
|
||
note 1) Extended ASCII codes require two function calls. The first call returns
|
||
00h to indicate the next call will return an extended code.
|
||
2) If DL is not 0FFh, DL is assumed to have a valid character that is
|
||
output to STDOUT.
|
||
3) This function does not check for Ctrl-C or Ctrl-PrtSc.
|
||
4) Does not echo input to screen
|
||
5) If I/O is redirected, EOF or disk full cannot be detected.
|
||
|
||
|
||
07h Direct Console Input Without Echo (does not check BREAK)
|
||
Get or wait for char at STDIN, returns char in AL
|
||
entry AH 07h
|
||
return AL character from standard input device
|
||
note 1) Extended ASCII codes require two function calls. The first call returns
|
||
00h to indicate the next call will return an extended code.
|
||
2) No checking for Ctrl-C or Ctrl-PrtSc is done.
|
||
3) Input is redirectable.
|
||
|
||
|
||
08h Console Input Without Echo (checks BREAK)
|
||
Get or Wait for char at STDIN, return char in AL
|
||
entry AH 08h
|
||
return AL char from standard input device
|
||
note 1) Char is checked for ctrl-C. If ctrl-C is detected, executes int 23h.
|
||
2) For function call 08h, extended ASCII characters require two function
|
||
calls. The first call returns 00h to signify an extended ASCII code.
|
||
The next call returns the actual code.
|
||
3) Input is redirectable. If redirected, there is no way to check EOF.
|
||
|
||
|
||
09h Print String
|
||
Outputs Characters in the Print String to the STDOUT
|
||
entry AH 09h
|
||
DS:DX pointer to the Character String to be displayed
|
||
return none
|
||
note 1) The character string in memory must be terminated by a $ (24h)
|
||
The $ is not displayed.
|
||
2) Output to STDOUT is the same as function call 02h.
|
||
|
||
|
||
0Ah Buffered Keyboard Input
|
||
Reads characters from STDIN and places them in the buffer beginning
|
||
at the third byte.
|
||
entry AH 0Ah
|
||
DS:DX pointer to an input buffer
|
||
return none
|
||
note 1) Min buffer size = 1, max = 255
|
||
2) Char is checked for ctrl-C. If ctrl-C is detected, executes int 23h.
|
||
3) Format of buffer DX:
|
||
byte contents
|
||
1 Maximum number of chars the buffer will take, including CR.
|
||
Reading STDIN and filling the buffer continues until a carriage
|
||
return (<Enter> or 0Dh) is read. If the buffer fills to one less
|
||
than the maximum number the buffer can hold, each additional
|
||
number read is ignored and ASCII 7 (BEL) is output to the
|
||
display until a carriage return is read. (you must set this
|
||
value)
|
||
2 Actual number of characters received, excluding the carriage
|
||
return, which is always the last character. (the function sets
|
||
this value)
|
||
3-n Characters received are placed into the buffer starting here.
|
||
Buffer must be at least as long as the number in byte 1.
|
||
4) Input is redirectable. If redirected, there is no way to check EOF.
|
||
5) The string may be edited with the standard DOS editing commands as it
|
||
is being entered.
|
||
6) Extended ASCII characters are stored as 2 bytes, the first byte being
|
||
zero.
|
||
|
||
|
||
0Bh Check Standard Input (STDIN) status
|
||
Checks for character availible at STDIN
|
||
entry AH 0Bh
|
||
return AL 0FFh if a character is availible from STDIN
|
||
00h if no character is availible from STDIN
|
||
note 1) Checks for Ctrl-C. If Ctrl-C is detected, int 23h is executed
|
||
2) Input can be redirected.
|
||
3) Checks for character only, it is not read into the application
|
||
|
||
|
||
0Ch Clear Keyboard Buffer & Invoke a Keyboard Function (FCB)
|
||
Dumps buffer, executes function in AL (01h,06h,07h,08h,0Ah only)
|
||
entry AH 0Ch
|
||
AL function number (must be 01h, 06h, 07h, 08h, or 0Ah)
|
||
return AL 00h buffer was flushed, no other processing performed
|
||
other any other value has no meaning
|
||
note 1) Forces system to wait until a character is typed.
|
||
2) Flushes all typeahead input, then executes function specified by AL (by
|
||
moving it to AH and repeating the int 21 call).
|
||
3) If AL contains a value not in the list above, the keyboard buffer is
|
||
flushed and no other action is taken.
|
||
|
||
|
||
0Dh Disk Reset
|
||
Flushes all currently open file buffers to disk
|
||
entry AH 0Dh
|
||
return none
|
||
note 1) Does not close files. Does not update directory entries; files changed
|
||
in size but not closed are not properly recorded in the directory
|
||
2) Sets DTA address to DS:0080h
|
||
3) Should be used before a disk change, Ctrl-C handlers, and to flush
|
||
the buffers to disk.
|
||
|
||
|
||
0Eh Select Disk
|
||
Sets the drive specified in DL (if valid) as the default drive
|
||
entry AL 0Eh
|
||
DL new default drive number (0=A:,1=B:,2=C:,etc.)
|
||
return AL total number of logical drives (not nescessarily physical)
|
||
note 1) For DOS 1.x and 2.x, the minimum value for AL is 2.
|
||
2) For DOS 3.x, the minimum value for AL is 5.
|
||
3) The drive number returned is not nescessarily a valid drive.
|
||
4) For DOS 1.x: 16 logical drives are availible. A-P.
|
||
For DOS 2.x: 63 logical drives are availible. (Letters are only used for
|
||
the first 26 drives. If more than 26 logical drives are
|
||
used, further drive letters will be other ASCII characters
|
||
ie {,], etc.
|
||
For DOS 3.x: 26 logical drives are availible. A-Z.
|
||
|
||
|
||
0Fh Open Disk File (FCB)
|
||
Searches current directory for specified filename and opens it
|
||
entry AH 0Fh
|
||
DS:DX pointer to an unopened FCB
|
||
return AL 00h if file found
|
||
0FFh if file not not found
|
||
note 1) If the drive code was 0 (default drive) it is changed to the actual
|
||
drive used (1=A:,2=B:,3=C:, etc). This allows changing the default drive
|
||
without interfering with subsequent operations on this file.
|
||
2) The current block field (FCB bytes C-D, offset 0Ch) is set to zero.
|
||
3) The size of the record to be worked with (FCB bytes E-F, offset 0Eh) is
|
||
set to the system default of 80h. The size of the file (offset 10h) and
|
||
the date (offset 14h) are set from information obtained in the root
|
||
directory. You can change the default value for the record size (FCB
|
||
bytes E-F) or set the random record size and/or current record field.
|
||
Perform these actions after the open but before any disk operations.
|
||
4) The file is opened in compatibility mode.
|
||
5) Microsoft recommends handle function call 3Dh be used instead.
|
||
6) This call is also used by the APPEND command in DOS 3.2+
|
||
7) Before performing a sequential disk operation on the file, you must
|
||
set the Current Record field (offset 20h). Before performing a random
|
||
disk operation on the file, you must set the Relative Record field
|
||
(offset 21h). If the default record size of 128 bytes is incorrect, set
|
||
it to the correct value.
|
||
|
||
|
||
10h Close File (FCB)
|
||
Closes a File After a File Write
|
||
entry AH 10h
|
||
DS:DX pointer to an opened FCB
|
||
return AL 00h if the file is found and closed
|
||
0FFh if the file is not found in the current directory
|
||
note 1) This function call must be done on open files that are no longer needed,
|
||
and after file writes to insure all directory information is updated.
|
||
2) If the file is not found in its correct position in the current
|
||
directory, it is assumed that the diskette was changed and AL returns
|
||
0FFh. This error return is reportedly not completely reliable with DOS
|
||
version 2.x.
|
||
3) If found, the directory is updated to reflect the status in the FCB, the
|
||
buffers to that file are flushed, and AL returns 00h.
|
||
|
||
|
||
11h Search For First Matching Entry (FCB)
|
||
Searches current disk & directory for first matching filename
|
||
entry AH 11h
|
||
DS:DX pointer to address of FCB
|
||
return AL 00h successful match
|
||
0FFh no matching filename found
|
||
note 1) The FCB may contain the wildcard character ? under Dos 2.x, and ? or *
|
||
under 3.x.
|
||
2) The original FCB at DS:DX contains information to continue the search
|
||
with function 12h, and should not be modified.
|
||
3) If a matching filename is found, AL returns 00h and the locations at the
|
||
Disk Transfer Address are set as follows:
|
||
a) If the FCB provided for searching was an extended FCB, then the first
|
||
byte at the disk transfer address is set to 0FFh followed by 5 bytes
|
||
of zeroes, then the attribute byte from the search FCB, then the
|
||
drive number used (1=A, 2=B, etc) then the 32 bytes of the directory
|
||
entry. Thus, the disk transfer address contains a valid unopened FCB
|
||
with the same search attributes as the search FCB.
|
||
b) If the FCB provided for searching was a standard FCB, then the first
|
||
byte is set to the drive number used (1=A,2=b,etc), and the next 32
|
||
bytes contain the matching directory entry. Thus, the disk transfer
|
||
address contains a valid unopened normal FCB.
|
||
4) If an extended FCB is used, the following search pattern is used:
|
||
a) If the FCB attribute byte is zero, only normal file entries are
|
||
found. Entries for volume label, subdirectories, hidden or system
|
||
files, are not returned.
|
||
b) If the attribute byte is set for hidden or system files, or
|
||
subdirectory entries, it is to be considered as an inclusive search.
|
||
All normal file entries plus all entries matching the specified
|
||
attributes are returned. To look at all directory entries except the
|
||
volume label, the attribute byte may be set to hidden + system +
|
||
directory (all 3 bits on).
|
||
c) If the attribute field is set for the volume label, it is considered
|
||
an exclusive search, and ONLY the volume label entry is returned.
|
||
5) This call is also used by the APPEND command in DOS 3.2+
|
||
|
||
|
||
12h Search For Next Entry Using FCB (FCB)
|
||
Search for next matching filename
|
||
entry AH 12h
|
||
DS:DX pointer to the unopened FCB specified from the previous Search
|
||
First (11h) or Search Next (12h)
|
||
return AL 00h if matching filename found
|
||
0FFh if matching filename was not found
|
||
note 1) After a matching filename has been found using function call 11h,
|
||
function 12h may be called to find the next match to an ambiguous
|
||
request. For DOS 2.x, ?'s are allowed in the filename. For DOS 3.x,
|
||
global (*) filename characters are allowed.
|
||
2) The DTA contains info from the previous Search First or Search Next.
|
||
3) All of the FCB except for the name/extension field is used to keep
|
||
information nescessary for continuing the search, so no disk operations
|
||
may be performed with this FCB between a previous function 11h or 12h
|
||
call and this one.
|
||
4) If the file is found, an FCB is created at the DTA address and set up to
|
||
open or delete it.
|
||
|
||
|
||
13h Delete File Via FCB (FCB)
|
||
Deletes file specified in FCB from current directory
|
||
entry AH 13h
|
||
DS:DX pointer to address of FCB
|
||
return AL 00h file deleted
|
||
0FFh if file not found or was read-only
|
||
note 1) All matching current directory entries are deleted. The global filename
|
||
character "?" is allowed in the filename.
|
||
2) Will not delete files with read-only attribute set
|
||
3) Close open files before deleting them.
|
||
4) Requires Network Access Rights
|
||
|
||
|
||
14h Sequential Disk File Read (FCB)
|
||
Reads record sequentially from disk via FCB
|
||
entry AH 14h
|
||
DS:DX pointer to an opened FCB
|
||
return AL 00h successful read
|
||
01h end of file (no data read)
|
||
02h Data Transfer Area too small for record size specified
|
||
or segment overflow
|
||
03h partial record read, EOF found
|
||
note 1) The record size is set to the value at offset 0Eh in the FCB.
|
||
2) The record pointed to by the Current Block (offset 0Ch) and the Current
|
||
Record (offset 20h) fields is loaded at the DTA, then the Current Block
|
||
and Current Record fields are incremented.
|
||
3) The record is read into memory at the current DTA address as specified
|
||
by the most recent call to function 1Ah. If the size of the record and
|
||
location of the DTA are such that a segment overflow or wraparound would
|
||
occur, the error return is set to AL=02h
|
||
4) If a partial record is read at the end of the file, it is passed to the
|
||
requested size with zeroes and the error return is set to AL=03h.
|
||
|
||
|
||
15h Sequential Disk Write (FCB)
|
||
Writes record specified by FCB sequentially to disk
|
||
entry AH 15h
|
||
DS:DX pointer to address of FCB
|
||
return AL 00h successful write
|
||
01h diskette full, write canceled
|
||
02h disk transfer area (DTA) too small or segment wrap
|
||
note 1) The data to write is obtained from the disk transfer area
|
||
2) The record size is set to the value at offset 0Eh in the FCB.
|
||
3) This service cannot write to files set as read-only
|
||
4) The record pointed to by the Current Block (offset 0Ch) and the Current
|
||
Record (offset 20h) fields is loaded at the DTA, then the Current Block
|
||
and Current Record fields are incremented.
|
||
5) If the record size is less than a sector, the data in the DTA is written
|
||
to a buffer; the buffer is written to disk when it contains a full
|
||
sector of data, the file is closed, or a Reset Disk (function 0Dh) is
|
||
issued.
|
||
6) The record is written to disk at the current DTA address as specified
|
||
by the most recent call to function 1Ah. If the size of the record and
|
||
location of the DTA are such that a segment overflow or wraparound would
|
||
occur, the error return is set to AL=02h
|
||
|
||
|
||
16h Create A Disk File (FCB)
|
||
Search and open or create directory entry for file
|
||
entry AH 16h
|
||
DS:DX pointer to an FCB
|
||
return AL 00h successful creation
|
||
0FFh no room in directory
|
||
note 1) If a matching directory entry is found, the file is truncated to zero
|
||
bytes.
|
||
2) If there is no matching filename, a filename is created.
|
||
3) This function calls function 0Fh (Open File) after creating or
|
||
truncating a file.
|
||
4) A hidden file can be created by using an extended FCB with the attribute
|
||
byte (offset FCB-1) set to 2.
|
||
|
||
|
||
17h Rename File Specified by File Control Block (FCB) (FCB)
|
||
Renames file in current directory
|
||
entry AH 17h
|
||
DS:DX pointer to an FCB (see note 4)
|
||
return AL 00h successfully renamed
|
||
0FFh file not found or filename already exists
|
||
note 1) This service cannot rename read-only files
|
||
2) The "?" wildcard may be used.
|
||
3) If the "?" wildcard is used in the second filename, the corresponding
|
||
letters in the filename of the directory entry are not changed.
|
||
4) The FCB must have a drive number, filename, and extension in the usual
|
||
position, and a second filename starting 6 bytes after the first, at
|
||
offset 11h.
|
||
5) The two filenames cannot have the same name.
|
||
6) FCB contains new name starting at byte 17h.
|
||
|
||
|
||
18h Internal to DOS
|
||
* Unknown
|
||
entry AH 18h
|
||
return AL 0
|
||
|
||
|
||
19h Get Current Disk Drive
|
||
Return designation of current default disk drive
|
||
entry AH 19h
|
||
return AL current default drive (0=A, 1=B,etc.)
|
||
note Some other DOS functions use 0 for default, 1=A, 2=B, etc.
|
||
|
||
|
||
1Ah Set Disk Transfer Area Address (DTA)
|
||
Sets DTA address to the address specified in DS:DX
|
||
entry AH 1Ah
|
||
DS:DX pointer to buffer
|
||
return none
|
||
note 1) The default DTA is 128 bytes at offset 80h in the PSP. DOS uses the
|
||
DTA for all file I/O.
|
||
2) Registers are unchanged.
|
||
3) No error codes are returned.
|
||
2) Disk transfers cannot wrap around from the end of the segment to the
|
||
beginning or overflow into another segment.
|
||
|
||
|
||
1Bh Get Current Drive File Allocation Table Information
|
||
Returns information from the FAT on the current drive
|
||
entry AH 1Bh
|
||
exit AL number of sectors per allocation unit (cluster)
|
||
DS:BX address of the current drive's media descriptor byte
|
||
CX number of bytes per sector
|
||
DX number of allocation units (clusters) for default drive
|
||
note 1) Save DS before calling this function.
|
||
2) This call returned a pointer to the FAT in DOS 1.x. Beginning with
|
||
DOS 2.00, it returns a pointer only to the table's ID byte.
|
||
3) IBM recommends programmers avoid this call and use int 25h instead.
|
||
|
||
|
||
1Ch Get File Allocation Table Information for Specific Device
|
||
Returns information on specified drive
|
||
entry AH 1Ch
|
||
DL drive number (1=A, 2=B, 3=C, etc)
|
||
return AL number of sectors per allocation unit (cluster)
|
||
DS:BX address of media descriptor byte for drive in DL
|
||
CX sector size in bytes
|
||
DX number of allocation units (clusters)
|
||
note 1) DL = 0 for default.
|
||
2) Save DS before calling this function.
|
||
3) Format of media-descriptor byte:
|
||
bits: 0 0 (clear) not double sided
|
||
1 (set) double sided
|
||
1 0 (clear) not 8 sector
|
||
1 (set) 8 sector
|
||
2 0 (clear) nonremovable device
|
||
1 (set) removable device
|
||
3-7 always set (1)
|
||
4) This call returned a pointer to the FAT in DOS 1.x. Beginning with
|
||
DOS 2.00, it returns a pointer only to the table's ID byte.
|
||
5) IBM recommends programmers avoid this call and use int 25h instead.
|
||
|
||
|
||
1Dh Not Documented by Microsoft
|
||
* Unknown
|
||
entry AH 1Dh
|
||
return AL 0
|
||
|
||
|
||
1Eh Not Documented by Microsoft
|
||
* Unknown
|
||
entry AH 1Eh
|
||
return AL 0
|
||
note Apparently does nothing
|
||
|
||
|
||
1Fh Get Default Drive Parameter Block
|
||
* Same as function call 32h (below), except that the table is accessed from
|
||
the default drive
|
||
entry AH 1Fh
|
||
other registers unknown
|
||
return AL 00h no error
|
||
0FFh error
|
||
DS:BX points to DOS Disk Parameter Block for default drive.
|
||
note 1) Unknown vector returned in ES:BX.
|
||
2) For DOS 2.x and 3.x, this just invokes function 32h (undocumented,
|
||
Read DOS Disk Block) with DL=0
|
||
|
||
|
||
20h Unknown
|
||
* Internal - does nothing?
|
||
entry AH 20h
|
||
return AL 0
|
||
|
||
|
||
21h Random Read from File Specified by File Control Block (FCB)
|
||
Reads one record as specified in the FCB into the current DTA.
|
||
entry AH 21h
|
||
DS:DX address of the opened FCB
|
||
return AL 00h successful read operation
|
||
01h end of file (EOF), no data read
|
||
02h DTA too small for the record size specified
|
||
03h end of file (EOF), partial data read
|
||
note 1) The current block and current record fields are set to agree with the
|
||
random record field. Then the record addressed by these fields is read
|
||
into memory at the current Disk Transfer Address.
|
||
2) The current file pointers are NOT incremented this function.
|
||
3) If the DTA is larger than the file, the file is padded to the requested
|
||
length with zeroes.
|
||
|
||
|
||
22h Random Write to File Specified by FCB (FCB)
|
||
Writes one record as specified in the FCB to the current DTA
|
||
entry AH 22h
|
||
DS:DX address of the opened FCB
|
||
return AL 00h successful write operation
|
||
01h disk full; no data written (write was canceled)
|
||
02h DTA too small for the record size specified (write was
|
||
canceled)
|
||
note 1) This service cannot write to read-only files.
|
||
2) The record pointed to by the Current Block (offset 0Ch) and the Current
|
||
Record (offset 20h) fields is loaded at the DTA, then the Current Block
|
||
and Current Record fields are incremented.
|
||
3) If the record size is less than a sector, the data in the DTA is written
|
||
to a buffer; the buffer is written to disk when it contains a full
|
||
sector of data, the file is closed, or a Reset Disk (function 0Dh) is
|
||
issued.
|
||
4) The current file pointers are NOT incremented this function.
|
||
5) The record is written to disk at the current DTA address as specified
|
||
by the most recent call to function 1Ah. If the size of the record and
|
||
location of the DTA are such that a segment overflow or wraparound would
|
||
occur, the error return is set to AL=02h
|
||
|
||
|
||
23h Get File Size (FCB)
|
||
Searches current subdirectory for matching file, returns size in FCB
|
||
entry AH 23h
|
||
DS:DX address of an unopened FCB
|
||
return AL 00h file found
|
||
0FFh file not found
|
||
note 1) Record size field (offset 0Eh) must be set before invoking this function
|
||
2) The disk directory is searched for the matching entry. If a matching
|
||
entry is found, the random record field is set to the number of records
|
||
in the file. If the value of the Record Size field is not an even
|
||
divisor of the file size, the value set in the relative record field is
|
||
rounded up. This gives a returned value larger than the actual file size
|
||
3) This call is used by the APPEND command in DOS 3.2+
|
||
|
||
|
||
24h Set Relative Record Field (FCB)
|
||
Set random record field specified by an FCB
|
||
entry AH 24h
|
||
DS:DX address of an opened FCB
|
||
return Random Record Field of FCB is set to be same as Current Block
|
||
and Current Record.
|
||
note 1) You must invoke this function before performing random file access.
|
||
2) The relative record field of FCB (offset 21h) is set to be same as the
|
||
Current Block (offset 0Ch) and Current Record (offset 20h).
|
||
3) No error codes are returned.
|
||
4) The FCB must already be opened.
|
||
|
||
|
||
25h Set Interrupt Vector
|
||
Sets the address of the code DOS is to perform each time the specified
|
||
interrupt is invoked.
|
||
entry AH 25h
|
||
AL int number to reassign the handler to
|
||
DS:DX address of new interrupt vector
|
||
return none
|
||
note 1) Registers are unchanged.
|
||
2) No error codes are returned.
|
||
3) The interrupt vector table for the interrupt number specified in AL
|
||
is set to the address contained in DS:DX. Use function 35h (Get Vector)
|
||
to get the contents of the interrupt vector and save it for later use.
|
||
4) When you use function 25 to set an interrupt vector, DOS 3.2 doesn't
|
||
point the actual interrupt vector to what you requested. Instead, it
|
||
sets the interrupt vector to point to a routine inside DOS, which does
|
||
this:
|
||
1. Save old stack pointer
|
||
2. Switch to new stack pointer allocated from DOS's stack pool
|
||
3. Call your routine
|
||
4. Restore old stack pointer
|
||
The purpose for this was to avoid possible stack overflows when there
|
||
are a large number of active interrupts. IBM was concerned (this was an
|
||
IBM change, not Microsoft) that on a Token Ring network there would be
|
||
a lot of interrupts going on, and applications that hadn't allocated
|
||
very much stack space would get clobbered.
|
||
|
||
|
||
26h Create New Program Segment Prefix (PSP)
|
||
This service copies the current program-segment prefix to a new memory
|
||
location for the creation of a new program or overlay. Once the new PSP is
|
||
in place, a DOS program can read a DOS COM or overlay file into the memory
|
||
location immediately following the new PSP and pass control to it.
|
||
entry AH 26h
|
||
DX segment number for the new PSP
|
||
return none
|
||
note 1) Microsoft recommends you use the newer DOS service 4Bh (EXEC) instead.
|
||
2) The entire 100h area at location 0 in the current PSP is copied into
|
||
location 0 of the new PSP. The memory size information at location 6
|
||
in the new segment is updated and the current termination, ctrl-break,
|
||
and critical error addresses from interrupt vector table entries for
|
||
ints 22h, 23h, and 24 are saved in the new program segment starting at
|
||
0Ah. They are restored from this area when the program terminates.
|
||
3) Current PSP is copied to specified segment
|
||
|
||
|
||
27h Random Block Read From File Specified by FCB (FCB)
|
||
Similar to 21h (Random Read) except allows multiple files to be read.
|
||
entry AH 27h
|
||
CX number of records to be read
|
||
DS:DX address of an opened FCB
|
||
return AL 00h successful read
|
||
01h end of file, no data read
|
||
02h DTA too small for record size specified (read canceled)
|
||
03h end of file
|
||
CX actual number of records read (includes partial if AL=03h)
|
||
note 1) The record size is specified in the FCB. The service updates the Current
|
||
Block (offset 0Ch) and Current Record (offset 20h) fields to the next
|
||
record not read.
|
||
2) If CX contained 0 on entry, this is a NOP.
|
||
3) If the DTA is larger than the file, the file is padded to the requested
|
||
length with zeroes.
|
||
4) This function assumes that the FCB record size field (0Eh) is correctly
|
||
set. If not set by the user, the default is 128 bytes.
|
||
5) The record is written to disk at the current DTA address as specified
|
||
by the most recent call to function 1Ah. If the size of the record and
|
||
location of the DTA are such that a segment overflow or wraparound would
|
||
occur, the error return is set to AL=02h
|
||
|
||
|
||
28h Random Block Write to File Specified in FCB (FCB)
|
||
Similar to 27h (Random Write) except allows multiple files to be read.
|
||
entry AH 28h
|
||
CX number of records to write
|
||
DS:DX address of an opened FCB
|
||
return AL 00h successful write
|
||
01h disk full, no data written
|
||
02h DTA too small for record size specified (write canceled)
|
||
CX number of records written
|
||
note 1) The record size is specified in the FCB.
|
||
2) This service allocates disk clusters as required.
|
||
3) This function assumes that the FCB Record Size field (offset 0Eh) is
|
||
correctly set. If not set by the user, the default is 128 bytes.
|
||
4) The record size is specified in the FCB. The service updates the Current
|
||
Block (offset 0Ch) and Current Record (offset 20h) fields to the next
|
||
record not read.
|
||
5) The record is written to disk at the current DTA address as specified
|
||
by the most recent call to function 1Ah. If the size of the record and
|
||
location of the DTA are such that a segment overflow or wraparound would
|
||
occur, the error return is set to AL=02h
|
||
6) If called with CX=0, no records are written, but the FCB's File Size
|
||
entry (offset 1Ch) is set to the size specified by the FCB's Relative
|
||
Record field (offset 21h).
|
||
|
||
|
||
29h Parse the Command Line for Filename (FCB)
|
||
Parses a text string into the fields of a File Control Block
|
||
entry AH 29h
|
||
DS:SI pointer to string to parse
|
||
ES:DI pointer to memory buffer to fill with unopened FCB
|
||
AL bit mask to control parsing
|
||
bit 0 = 0: parsing stops if file seperator found
|
||
1: causes service to scan past leading chars such as
|
||
blanks. Otherwise assumes the filename begins in
|
||
the first byte
|
||
1 = 0: drive number in FCB set to default (0) if string
|
||
contains no drive number
|
||
1: drive number in FCB not changed
|
||
2 = 0: filename in FCB set to 8 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 3 blanks if no extension in
|
||
string
|
||
1: extension left unchanged
|
||
4-7 must be zero
|
||
return AL 00h no wildcards in name or extension
|
||
01h wildcards appeared in name or extension
|
||
0FFh invalid drive specifier
|
||
DS:SI pointer to the first character after the parsed string
|
||
ES:DI pointer to the unopened FCB
|
||
note 1) If the * wildcard characters are found in the command line, this service
|
||
will replace all subsequent chars in the FCB with question marks.
|
||
2) This service uses the characters as filename separators
|
||
DOS 1 : ; . , + / [ ] = " TAB SPACE
|
||
DOS 2,3 : ; . , + = TAB SPACE
|
||
3) This service uses the characters
|
||
: ; . , + < > | / \ [ ] = " TAB SPACE
|
||
or any control characters as valid filename separators
|
||
4) A filename cannot contain a filename terminator. If one is encountered,
|
||
all processing stops. The handle functions will allow use of some of
|
||
these characters.
|
||
5) If no valid filename was found on the command line, ES:DI +1 points
|
||
to a blank (ASCII 32).
|
||
6) This function cannot be used with filespecs which include a path
|
||
7) Parsing is in the form D:FILENAME.EXT. If one is found, a corresponding
|
||
unopened FCB is built at ES:DI
|
||
|
||
|
||
2Ah Get Date
|
||
Returns day of the week, year, month, and date
|
||
entry AH 2Ah
|
||
return CX year (1980-2099)
|
||
DH month (1-12)
|
||
DL day (1-31)
|
||
AL weekday 00h Sunday
|
||
01h Monday
|
||
02h Tuesday
|
||
03h Wednesday
|
||
04h Thursday
|
||
05h Friday
|
||
06h Saturday
|
||
note 1) Date is adjusted automatically if clock rolls over to the next day,
|
||
and takes leap years and number of days in each month into account.
|
||
2) Although DOS cannot set an invalid date, it can read one, such as
|
||
1/32/80, etc.
|
||
3) DesQview also accepts CX = 4445h and DX = 5351h, i.e. 'DESQ' as valid
|
||
4) DOS will accept CH=0 (midnight) as a valid time, but if a file's time
|
||
is set to exactly midnight the time will not be displayed by the DIR
|
||
command.
|
||
|
||
|
||
2Bh Set Date
|
||
set current system date
|
||
entry AH 2Bh
|
||
CX year (1980-2099)
|
||
DH month (1-12)
|
||
DL day (1-31)
|
||
return AL 00h no error (valid date)
|
||
0FFh invalid date specified
|
||
note 1) On entry, CX:DX must have a valid date in the same format as returned
|
||
by function call 2Ah
|
||
2) DOS 3.3 also sets CMOS clock
|
||
|
||
|
||
2Ch Get Time
|
||
Get current system time from CLOCK$ driver
|
||
entry AH 2Ch
|
||
return CH hours (0-23)
|
||
CL minutes (0-59)
|
||
DH seconds (0-59)
|
||
DL hundredths of a second (0-99)
|
||
note 1) Time is updated every 5/100 second.
|
||
2) The date and time are in binary format
|
||
|
||
|
||
2Dh Set Time
|
||
Sets current system time
|
||
entry AH 2Dh
|
||
CH hours (0-23)
|
||
CL minutes (0-59)
|
||
DH seconds (0-59)
|
||
DL hundredths of seconds (0-99)
|
||
return AL 00h if no error
|
||
0FFh if bad value sent to routine
|
||
note 1) DOS 3.3 also sets CMOS clock
|
||
2) CX and DX must contain a valid time in binary
|
||
|
||
|
||
2Eh Set/Reset Verify Switch
|
||
Set verify flag
|
||
entry AH 2Eh
|
||
AL 00 to turn verify off (default)
|
||
01 to turn verify on
|
||
return none
|
||
note 1) This is the call invoked by the DOS VERIFY command
|
||
2) Setting of the verify switch can be obtained by calling call 54h
|
||
3) This call is not supported on network drives
|
||
4) DOS checks this flag each time it accesses a disk
|
||
|
||
|
||
2Fh Get Disk Transfer Address (DTA)
|
||
Returns current disk transfer address used by all DOS read/write operations
|
||
entry AH 2Fh
|
||
return ES:BX address of DTA
|
||
note 1) The DTA is set by function call 1Ah
|
||
2) Default DTA address is a 128 byte buffer at offset 80h in that program's
|
||
Program Segment Prefix
|
||
|
||
|
||
30h Get DOS Version Number
|
||
Return DOS version and/or user number
|
||
entry AH 30h
|
||
return AH minor version number (i.e., DOS 2.10 returns AX = 0A02h)
|
||
AL major version number
|
||
BH OEM ID number
|
||
00h IBM
|
||
16h DEC
|
||
BL:CX 24-bit user serial number
|
||
note 1) If AL returns a major version number of zero, the DOS version is
|
||
below 1.28 for MSDOS and below 2.00 for PCDOS.
|
||
2) IBM PC-DOS always returns 0000h in BX and CX.
|
||
|
||
|
||
31h Terminate Process and Stay Resident
|
||
KEEP, or TSR
|
||
entry AH 31h
|
||
AL exit code
|
||
DX program memory requirement in 16 byte paragraphs
|
||
return AX return code (retrieveable by function 4Dh)
|
||
note 1) Files opened by the application are not closed when this call is made
|
||
2) Memory can be used more efficiently if the block containing the copy of
|
||
the DOS environment is deallocated before terminating. This can be done
|
||
by loading ES with the segment contained in 2Ch of the PSP and issuing
|
||
function call 49h (Free Allocated Memory).
|
||
3) Unlike int 27h, more than 64k may be made resident with this call
|
||
|
||
|
||
32h Read DOS Disk Block
|
||
* Retrieve the pointer to the drive parameter block for a drive
|
||
entry AH 32h
|
||
DL drive (0=default, 1=A:, etc.).
|
||
return AL 00h if drive is valid
|
||
0FFh if drive is not valid
|
||
DS:BX points to DOS Drive Parameter Table. Format of block:
|
||
Bytes Type Value
|
||
00h byte Drive: 0=A:, 1=B:, etc.
|
||
01h byte Unit within drive (0, 1, 2, etc.)
|
||
02h-03h word Bytes per sector
|
||
04h byte Sectors per cluster - 1
|
||
05h byte Cluster to sector shift (i.e., how far to shift-
|
||
left the bytes/sector to get bytes/cluster)
|
||
06h-07h word Number of reserved (boot) sectors
|
||
08h byte Number of FATs
|
||
09h-0Ah word Number of root directory entries
|
||
0Bh-0Ch word Sector # of 1st data. Should be same as # of
|
||
sectors/track.
|
||
0Dh-0Eh word # of clusters + 1 (=last cluster #)
|
||
0Fh byte Sectors for FAT
|
||
10h-11h word First sector of root directory
|
||
12h-15h dword Address of device driver header for this drive
|
||
16h byte Media Descriptor Byte for this drive
|
||
17h byte Zero if disk has been accessed
|
||
18h-1Bh dword address of next DOS Disk Block (0FFFFh means
|
||
last in chain)
|
||
22h byte Current Working Directory (2.0 only) (64 bytes)
|
||
note 1) Use [BX+0D] to find no. of clusters (>1000H, 16-bit FAT; if not, 12-bit
|
||
(exact dividing line is probably a little below 1000h to allow for
|
||
bad sectors, EOF markers, etc.)
|
||
2) Short article by C.Petzold, PC Magazine Vol.5,no.8, and the article
|
||
"Finding Disk Parameters" in the May 1986 issue of PC Tech Journal.
|
||
3) This call is mostly supported in OS/2 1.0's DOS Compatibility Box. The
|
||
dword at 12h will not return the address of the next device driver when
|
||
in the Compatibility Box.
|
||
|
||
|
||
33h Control-Break Check
|
||
Get or set control-break checking at CON
|
||
entry AH 33h
|
||
AL 00h to test for break checking
|
||
01h to set break checking
|
||
DL 00h to disable break checking
|
||
01h to enable break checking
|
||
02h internal, called by PRINT.COM (DOS 3.1)
|
||
return DL 00h if break=off
|
||
01h if break=on
|
||
AL 0FFh error
|
||
|
||
|
||
34h Return INDOS Flag
|
||
* Returns ES:BX pointing to Critical Section Flag, byte indicating whether
|
||
it is safe to interrupt DOS.
|
||
entry AH 34h
|
||
return ES:BX points to DOS "critical section flag"
|
||
note 1) If byte is 0, it is safe to interrupt DOS. This was mentioned in some
|
||
documentation by Microsoft on a TSR standard, and PC Magazine reports
|
||
it functions reliably under DOS versions 2.0 through 3.3. Chris
|
||
Dunford (of CED fame) and a number of anonymous messages on the BBSs
|
||
indicate it may not be totally reliable.
|
||
2) The byte at ES:BX+1 is used by the Print program for this same purpose,
|
||
so it's probably safer to check the WORD at ES:BX.
|
||
3) Reportedly, examination of DOS 2.10 code in this area indicates that the
|
||
byte immediately following this "critical section flag" must be 00h 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; for Compaq DOS 3.0, the byte 01AAh before it must be zero.
|
||
4) In DOS 3.10 this reportedly changed to word value, with preceding byte.
|
||
5) This call is supported in OS/2 1.0's DOS Compatibility Box
|
||
6) Gordon Letwin of Microsoft discussed this call on ARPAnet in 1984. He
|
||
stated:
|
||
a) this is not supported under any version of the DOS
|
||
b) it usually works under DOS 2, but there may be circumstances
|
||
when it doesn't (general disclaimer, don't know of a specific
|
||
circumstance)
|
||
c) it will usually not work under DOS 3 and DOS 3.1; the DOS is
|
||
considerably restructured and this flag takes on additional
|
||
meanings and uses
|
||
d) it will fail catastrophically under DOS 4.0 and forward.
|
||
Obviously this information is incorrect since the call works fine
|
||
through DOS 3.3. Microsoft glasnost?
|
||
|
||
|
||
35h Get Vector
|
||
Get interrupt vector
|
||
entry AH 35h
|
||
AL interrupt number (hexadecimal)
|
||
return ES:BX address of interrupt vector
|
||
note Use function call 25h to set the interrupt vectors
|
||
|
||
|
||
36h Get Disk Free Space
|
||
get information on specified drive
|
||
entry AH 36h
|
||
DL drive number (0=default, 1=A:, 2=B:, etc)
|
||
return AX number of sectors per cluster
|
||
0FFFFh means drive specified in DL is invalid
|
||
BX number of availible clusters
|
||
CX bytes per sector
|
||
DX clusters per drive
|
||
note 1) Mult AX * CX * BX for free space on disk
|
||
2) Mult AX * CX * DX for total disk space
|
||
3) Function 36h returns an incorrect value after an ASSIGN command. Prior
|
||
to ASSIGN, the DX register contains 0943h on return, which is the free
|
||
space in clusters on the HC diskette. After ASSIGN, even with no
|
||
parameters, 0901h is returned in the DX register; this is an incorrect
|
||
value. Similar results occur with DD diskettes on a PC-XT or a PC-AT.
|
||
This occurs only when the disk is not the default drive. Results are as
|
||
expected when the drive is the default drive. Therefore, the
|
||
circumvention is to make the desired drive the default drive prior to
|
||
issuing this function call.
|
||
4) Int 21h, function call 36h returns an incorrect value after an ASSIGN
|
||
command. Prior to ASSIGN, the DX register contains 0943h on return,
|
||
which is the free space in clusters on the HC diskette. After ASSIGN,
|
||
even with no parameters, 0901h is returned in the DX register; this is
|
||
an incorrect value. Similar results occur with DD diskettes on a PC-XT
|
||
or a PC-AT. This occurs only when the disk is not the default drive.
|
||
Results are as expected when the drive is the default drive. Therefore,
|
||
the circumvention is to make the desired drive the default drive prior
|
||
to issuing this function call.
|
||
5) This function supercedes functions 1Bh and 1Ch.
|
||
|
||
|
||
37h SWITCHAR / AVAILDEV
|
||
* Get/set option marking character (is usually "/"), and device type
|
||
entry AH 37h
|
||
AL 00h read switch character (returns current character in DL)
|
||
01h set character in DL as new switch character
|
||
(DOS 2.x) 02h read device availability (as set by function AL=3) into
|
||
DL. A 0 means devices that devices must be accessed in
|
||
file I/O calls by /dev/device. A non-zero value means
|
||
that devices are accessible at every level of the
|
||
directory tree (e.g., PRN is the printer and not a file
|
||
PRN).
|
||
AL=2 to return flag in DL, AL=3 to set from DL (0 = set,
|
||
1 = not set).
|
||
(DOS 2.x) 03h get device availability, where:
|
||
DL 00h means /dev/ must precede device names
|
||
01h means /dev/ need not precede device names
|
||
return DL switch character (if AL=0 or 1)
|
||
device availability flag (if AL=2 or 3)
|
||
AL 0FFh the value in AL was not in the range 0-3.
|
||
note 1) Functions 2 & 3 appear not to be implemented for DOS 3.x.
|
||
2) It is documented on page 4.324 of the MS-DOS (version 2) Programmer's
|
||
Utility Pack (Microsoft - published by Zenith).
|
||
3) Works on all versions of IBM PC-DOS from 2.0 through 3.3.1.
|
||
4) The SWITCHAR is the character used for "switches" in DOS command
|
||
arguments (defaults to '/', as in "DIR/P"). '-' is popular to make a
|
||
system look more like UNIX; if the SWITCHAR is anything other than '/',
|
||
then '/' may be used instead of '\' for pathnames
|
||
5) Ignored by XCOPY, PKARC, LIST
|
||
6) SWITCHAR may not be set to any character used in a filename
|
||
7) In DOS 3.x you can still read the "AVAILDEV" byte with subfunction 02h
|
||
but it always returns 0FFh even if you try to change it to 0 with
|
||
subfunction 03h.
|
||
8) AVAILDEV=0 means that devices must be referenced in an imaginary
|
||
subdirectory "\dev" (similar to UNIX's /dev/*); a filename "PRN.DAT"
|
||
can be created on disk and manipulated like any other. If AVAILDEV != 0
|
||
then device names are recognized anywhere (this is the default):
|
||
"PRN.DAT" is synonymous with "PRN:".
|
||
9) These functions reportedly are not supported in the same fashion in
|
||
various implementations of DOS.
|
||
|
||
|
||
38h Return Country Dependent Information (PCDOS 2.0, 2.1, MSDOS 2.00 only)
|
||
get country-dependent information
|
||
entry AH 38h
|
||
AL function code (must be 0 in DOS 2.x)
|
||
DS:DX pointer to 32 byte memory area
|
||
return AX error code if CF set
|
||
DS:DX country data if CF not set
|
||
word date/time format
|
||
0 = USA standard H:M:S M/D/Y
|
||
1 = European standard H:M:S D/M/Y
|
||
2 = Japanese standard H:M:S D:M:Y
|
||
byte ASCIIZ string currency symbol followed by byte of zeroes
|
||
byte ASCIIZ string thousands separator followed by byte of
|
||
zeroes
|
||
byte ASCIIZ string decimal separator followed by byte of
|
||
zeroes
|
||
24 bytes reserved
|
||
|
||
|
||
38h Get Country Dependent Information (PCDOS 3.x+, MSDOS 2.01+)
|
||
get country-dependent information
|
||
entry AH 38h
|
||
AL function code
|
||
00h to get current country information
|
||
code country code to get information for, for countries
|
||
with codes less than 255
|
||
0FFh to get country information for countries with a code
|
||
greater than 255
|
||
BX 16 bit country code if AL=0FFh
|
||
DS:DX pointer to the memory buffer where the data will be returned
|
||
return CF 0 (clear) function completed
|
||
1 (set) error
|
||
AX error code if CF set
|
||
2 invalid country code (no table for it)
|
||
BX country code (usually international telephone code)
|
||
DS:DX country data if CF not set
|
||
word date/time format
|
||
0 = USA standard H:M:S M/D/Y
|
||
1 = European standard H:M:S D/M/Y
|
||
2 = Japanese standard H:M:S D:M:Y
|
||
5 bytes currency symbol null terminated
|
||
2 bytes thousands separator null terminated
|
||
2 bytes decimal separator null terminated
|
||
2 bytes date separator null terminated
|
||
2 bytes time separator null terminated
|
||
byte bit field currency format
|
||
bit 0 = 0 if currency symbol precedes the value
|
||
1 if currency symbol is after the value
|
||
bit 1 = 0 no spaces between value and currency symbol
|
||
1 one space between value and currency symbol
|
||
bits 2-7 not defined by Microsoft
|
||
byte number of significant decimal digits in currency
|
||
(number of places to right of decimal point)
|
||
byte time format
|
||
bit 0 = 0 12 hour clock
|
||
bit 0 = 1 24 hour clock
|
||
2 words case map call address
|
||
entry AL ASCII code of character to be converted to
|
||
uppercase
|
||
return AL ASCII code of the uppercase input character
|
||
2 bytes data list separator null terminated
|
||
5 words reserved
|
||
note 1) When an alternate keyboard handler is invoked, the keyboard routine is
|
||
loaded into user memory starting at the lowest portion of availible
|
||
user memory. The BIOS interrupt vector that services the keyboard is
|
||
redirected to the memory area where the new routine resides. Each new
|
||
routine takes up about 1.6K of memory and has lookup tables that return
|
||
values unique to each language. (KEYBxx in the DOS book)
|
||
Once the keyboard interrupt vector is changed by the DOS keyboard
|
||
routine, the new routine services all calls unless the system is
|
||
returned to the US format by the ctrl-alt-F1 keystroke combination. This
|
||
does not change the interrupt vector back to the BIOS location; it
|
||
merely passes the table lookup to the ROM locations.
|
||
2) Ctrl-Alt-F1 will only change systems with US ROMS to the US layout.
|
||
Some systems are delivered with non-US keyboard handler routines in ROM
|
||
3) Case mapping call: the segment/offset of a FAR procedure that performs
|
||
country-specific lower-to-upper case mapping on ASCII characters 80h to
|
||
0FFh. It is called with the character to be mapped in AL. If there is
|
||
an uppercase code for the letter, it is returned in AL, if there is no
|
||
code or the function was called with a value of less than 80h AL is
|
||
returned unchanged.
|
||
|
||
|
||
38h Set Country Dependent Information
|
||
set country-dependent information
|
||
entry AH 38h
|
||
AL code country code to set information for, for countries
|
||
with codes less than 255
|
||
0FFh to set country information for countries with a code
|
||
greater than 255
|
||
BX 16 bit country code if AL=0FFh
|
||
DX 0FFFFh
|
||
return CF clear successful
|
||
set if error
|
||
AX error code if CF flag set
|
||
|
||
|
||
39h Create Subdirectory (MKDIR)
|
||
Makes a subdirectory along the indicated path
|
||
entry AH 39h
|
||
DS:DX address of ASCIIZ pathname string
|
||
return flag CF 0 successful
|
||
1 error
|
||
AX error code if any (3, 5)
|
||
note 1) The ASCIIZ string may contain drive and subdirectory.
|
||
2) Drive may be any valid drive (not nescessarily current drive)
|
||
3) The pathname cannot exceed 64 characters
|
||
|
||
|
||
3Ah Remove Subdirectory (RMDIR)
|
||
remove a directory entry
|
||
entry AH 3Ah
|
||
DS:DX address of ASCIIZ pathname string
|
||
return CF clear successful
|
||
set AX error code if any (3, 5, 16)
|
||
note 1) The ASCIIZ string may contain drive and subdirectory.
|
||
2) Drive may be any valid drive (not nescessarily current drive)
|
||
3) The pathname cannot exceed 64 characters
|
||
|
||
|
||
3Bh Change Current Directory
|
||
(CHDIR)
|
||
entry AH 3Bh
|
||
DS:DX address of ASCIIZ string
|
||
return flag CF 0 successful
|
||
1 error
|
||
AX error code if any (3)
|
||
note 1) The pathname cannot exceed 64 characters
|
||
2) The ASCIIZ string may contain drive and subdirectory.
|
||
3) Drive may be any valid drive (not nescessarily current drive)
|
||
|
||
|
||
3Ch Create A File (CREAT)
|
||
create a file with handle
|
||
entry AH 3Ch
|
||
CX attributes for file
|
||
00h normal
|
||
01h read only
|
||
02h hidden
|
||
03h system
|
||
DS:DX address of ASCIIZ filename string
|
||
return flag CF 0 successful creation
|
||
1 error
|
||
AX 16 bit file handle
|
||
or error code (3, 4, 5)
|
||
note 1) The ASCIIZ string may contain drive and subdirectory.
|
||
2) Drive may be any valid drive (not nescessarily current drive)
|
||
3) If the volume label or subdirectory bits are set in CX, they are ignored
|
||
4) The file is opened in read/write mode
|
||
5) If the file does not exist, it is created. If one of the same name
|
||
exists, it is truncated to a length of 0.
|
||
|
||
|
||
3Dh Open A File
|
||
Open disk file with handle
|
||
entry AH 3Dh
|
||
AL access code byte
|
||
(DOS 2.x) bits 0-2 file attribute
|
||
000 read only
|
||
001 write only
|
||
010 read/write
|
||
bits 3-7 should be set to zero
|
||
(DOS 3.x) bits 0-2 file attribute
|
||
000 read only
|
||
001 write only
|
||
010 read/write
|
||
bit 3 reserved
|
||
0 should be set to zero
|
||
bits 4-6 sharing mode (network)
|
||
000 compatibility mode (the way FCBs open files)
|
||
001 read/write access denied (exclusive)
|
||
010 write access denied
|
||
011 read access denied
|
||
100 full access permitted
|
||
bit 7 inheritance flag
|
||
0 file inherited by child process
|
||
1 file private to child process
|
||
DS:DX address of ASCIIZ pathname string
|
||
return flag CF set on error
|
||
AX error code
|
||
1 error
|
||
AX 16 bit file handle
|
||
or error code (1, 2, 4, 5, 0Ch)
|
||
note 1) Opens any normal, system, or hidden file
|
||
2) Files that end in a colon are not opened
|
||
3) The rear/write pointer is set at the first byte of the file and the
|
||
record size of the file is 1 byte (the read/write pointer can be changed
|
||
through function call 42h). The returned file handle must be used for
|
||
all subsequent input and output to the file.
|
||
4) If the file handle was inherited from a parent process or was
|
||
duplicated by DUP or FORCEDUP, all sharing and access restrictions are
|
||
also inherited.
|
||
5) A file sharing error (error 1) causes an int 24h to execute with an
|
||
error code of 2
|
||
|
||
|
||
3Eh Close A File Handle
|
||
Close a file and release handle for reuse
|
||
entry AH 3Eh
|
||
BX file handle
|
||
return flag CF 0 successful close
|
||
1 error
|
||
AX error code if error (6)
|
||
note 1) When executed, the file is closed, the directory is updated, and all
|
||
buffers for that file are flushed. If the file was changed, the time
|
||
and date stamps are changed to current
|
||
2) If called with the handle 00000, it will close STDIN (normally the
|
||
keyboard).
|
||
|
||
|
||
3Fh Read From A File Or Device
|
||
Read from file with handle
|
||
entry AH 3Fh
|
||
BX file handle
|
||
CX number of bytes to read
|
||
DS:DX address of buffer
|
||
return flag CF 0 successful read
|
||
1 error
|
||
AX 0 pointer was already at end of file
|
||
or number of bytes read
|
||
or error code (5, 6)
|
||
note 1) This function attempts to transfer the number of bytes specified in CX
|
||
to a buffer location. It is not guaranteed that all bytes will be read.
|
||
If AX < CX a partial record was read.
|
||
2) If performed from STDIN (file handle 0000), the input can be redirected
|
||
3) If used to read the keyboard, it will only read to the first CR
|
||
4) The file pointer is incremented to the last byte read.
|
||
|
||
|
||
40h Write To A File Or Device
|
||
Write to file with handle
|
||
entry AH 40h
|
||
BX file handle
|
||
CX number of bytes to write
|
||
DS:DX address of buffer
|
||
return flag CF 0 successful write
|
||
1 error
|
||
AX number of bytes written
|
||
or error code (5, 6)
|
||
note 1) This call attempts to transfer the number of bytes indicated in CX
|
||
from a buffer to a file. If CX and AX do not match after the write,
|
||
an error has taken place; however no error code will be returned for
|
||
this problem. This is usually caused by a full disk.
|
||
2) If the write is performed to STDOUT (handle 0001), it may be redirected
|
||
3) To truncate the file at the current position of the file pointer, set
|
||
the number of bytes in CX to zero before calling int 21h. The pointer
|
||
can be moved to any desired position with function 42h.
|
||
4) This function will not write to a file or device marked read-only.
|
||
|
||
|
||
41h Delete A File From A Specified Subdirectory
|
||
(UNLINK)
|
||
entry AH 41h
|
||
DS:DX pointer to ASCIIZ filespec to delete
|
||
return CF 0 successful
|
||
1 error
|
||
AX error code if any (2, 5)
|
||
note 1) This function will not work on a file marked read-only
|
||
2) Wildcards are not accepted
|
||
|
||
|
||
42h Move a File Read/Write Pointer
|
||
(LSEEK)
|
||
entry AH 42h
|
||
AL method code
|
||
00h offset from beginning of file
|
||
01h offset from present location
|
||
02h offset from end of file
|
||
BX file handle
|
||
CX most significant half of offset
|
||
DX least significant half of offset
|
||
return AX low offset of new file pointer
|
||
DX high offset of new file pointer
|
||
CF 0 successful move
|
||
1 error
|
||
AX error code (1, 6)
|
||
note 1) If pointer is at end of file, reflects file size in bytes.
|
||
2) The value in DX:AX is the absolute 32 bit byte offset from the beginning
|
||
of the file
|
||
|
||
|
||
43h Get/Set file attributes
|
||
(CHMOD)
|
||
entry AH 43h
|
||
AL 00h get file attributes
|
||
01h set file attributes
|
||
CX file attributes to set
|
||
bit 0 read only
|
||
1 hidden file
|
||
2 system file
|
||
3 volume label
|
||
4 subdirectory
|
||
5 written since backup
|
||
DS:DX pointer to full ASCIIZ file name
|
||
return CF set if error
|
||
AX error code (1, 2, 3, 5)
|
||
CX file attributes on get
|
||
attributes:
|
||
01h read only
|
||
02h hidden
|
||
04h system
|
||
0FFh archive
|
||
|
||
|
||
44h I/O Control for Devices (IOCTL)
|
||
Get or set device information
|
||
entry AH 44h
|
||
AL 00h get device information (from DX)
|
||
BX file or device handle
|
||
return DX device info
|
||
If bit 7 set: (character device)
|
||
bit 0: console input device
|
||
1: console output device
|
||
2: NUL device
|
||
3: CLOCK$ device
|
||
4: device is special
|
||
5: binary (raw) mode
|
||
6: Not EOF
|
||
12: network device (DOS 3.x)
|
||
14: can process IOCTL control
|
||
strings (func 2-5)
|
||
If bit 7 clear: (file)
|
||
bits 0-5 are block device number
|
||
6: file has not been written
|
||
12: Network device (DOS 3.x)
|
||
15: file is remote (DOS 3.x)
|
||
01h set device information (DH must be zero for this call)
|
||
DX bits:
|
||
0 1 console input device
|
||
1 1 console output device
|
||
2 1 null device
|
||
3 1 clock device
|
||
4 1 reserved
|
||
5 0 binary mode - don't check for control chars
|
||
1 cooked mode - check for control chars
|
||
6 0 EOF - End Of File on input
|
||
7 device is character device if set, if not, EOF
|
||
is 0 if channel has been written, bits 0-5 are
|
||
block device number
|
||
12 network device
|
||
14 1 can process control strings (AL 2-5, can only be
|
||
read, cannot be set)
|
||
15 n reserved
|
||
02h read CX bytes to device in DS:DX from BX control chan
|
||
03h Write Device Control String
|
||
BX device handle
|
||
CX number of bytes to write
|
||
DS:DX pointer to buffer
|
||
return AX number of bytes written
|
||
04h read from block device (drive number in BL)
|
||
BL drive number (0=default)
|
||
CX number of bytes to read
|
||
DS:DX pointer to buffer
|
||
return AX number of bytes read
|
||
|
||
05h write to block device (drive number in BL)
|
||
AX number of bytes transfered
|
||
06h get input handle status
|
||
07h get output handle status
|
||
AX 0FFh for ready
|
||
00h for not ready
|
||
08h removable media bit (DOS 3.x)
|
||
return AX 00h device is removable
|
||
01h device is nonremovable
|
||
0Fh invalid drive specification
|
||
09h test local or network device in BL (DOS 3.x)
|
||
BL drive number (0=default)
|
||
return DX attribute word, bit 12 set if device is
|
||
remote
|
||
0Ah is handle in BX local or remote? (DOS 3.x)
|
||
BX file handle
|
||
return DX (attribute word) bit 15 set if file is remote
|
||
0Bh change sharing retry count to DX (default=3), (DOS 3.x)
|
||
CX delay (default 1)
|
||
DX retry count (default 3)
|
||
0Ch general IOCTL (DOS 3.3 [3.2?]) allows a device driver to
|
||
prepare, select, refresh, and query Code Pages
|
||
0Dh Block Device Request (DOS 3.3+)
|
||
BL drive number (0=default)
|
||
CH major subfunction
|
||
CL minor subfunction
|
||
40h set device parameters
|
||
41h write logical device track
|
||
42h format and verify logical device track
|
||
60h get device parameters
|
||
61h read logical device track
|
||
62h verify logical device track
|
||
DS:DX pointer to parameter block
|
||
0Eh GET LOGICAL DEVICE (DOS 3.3+)
|
||
BL drive number (0=default)
|
||
return AL=0 block device has only one logical drive
|
||
assigned 1..n the last letter used to reference
|
||
the device (1=A:,etc)
|
||
0Fh Set Logical Device (DOS 3.3+)
|
||
BL drive number: 0=default, 1=A:, 2=B:, etc.
|
||
BX file handle
|
||
CX number of bytes to read or write
|
||
DS:DX data or buffer
|
||
DX data
|
||
return AX number of bytes transferred
|
||
or error code (call function 59h for extended error codes)
|
||
or status
|
||
00h not ready
|
||
0FFh ready
|
||
CF set if error
|
||
|
||
|
||
45h Duplicate a File Handle (DUP)
|
||
Create duplicate handle
|
||
entry AH 45h
|
||
BX file handle to duplicate
|
||
return CF clear AX duplicate handle
|
||
set AX error code (4, 6)
|
||
note 1) If you move the pointed of one handle, the pointer of the other will
|
||
also be moved.
|
||
2) The handle in BX must be open
|
||
|
||
|
||
46h Force Duplicate of a Handle (FORCEDUP or CDUP)
|
||
forces handle in CX to refer to the same file at the same position as BX
|
||
entry AH 46h
|
||
BX existing file handle
|
||
CX new file handle
|
||
return CF clear both handles now refer to existing file
|
||
set error
|
||
AX error code (4, 6)
|
||
note 1) If CX was an open file, it is closed first
|
||
2) If you move the read/write pointer of either file, both will move
|
||
3) The handle in BX must be open
|
||
|
||
|
||
47h Get Current Directory
|
||
places full pathname of current directory/drive into a buffer
|
||
entry AH 47h
|
||
DL drive (0=default, 1=A:, etc.)
|
||
DS:SI points to 64-byte buffer area
|
||
return CF clear DS:DI pointer to ASCIIZ pathname of current directory
|
||
set AX error code (0Fh)
|
||
note String does not begin with a drive identifier or a backslash
|
||
|
||
|
||
48h Allocate Memory
|
||
allocates requested number of 16-byte paragraphs of memory
|
||
entry AH 48h
|
||
BX number of 16-byte paragraphs desired
|
||
return CF clear AX segment address of allocated space
|
||
BX maximum number paragraphs available
|
||
set AX error code (7, 8)
|
||
note BX indicates maximum memory availible only if allocation fails
|
||
|
||
|
||
49h Free Allocated Memory
|
||
frees specified memory blocks
|
||
entry AH 49h
|
||
ES segment address of area to be freed
|
||
return CF clear successful
|
||
set AX error code (7, 9)
|
||
note 1) This call is only valid when freeing memory obtained by function 48h.
|
||
2) A program should not try to release memory not belonging to it.
|
||
|
||
|
||
4Ah Modify Allocated Memory Blocks (SETBLOCK)
|
||
expand or shrink memory for a program
|
||
entry AH 4AH
|
||
BX new size in 16 byte paragraphs
|
||
ES segment address of block to change
|
||
return CF clear nothing
|
||
set AX error code (7, 8, 9)
|
||
or BX max number paragraphs available
|
||
note 1) Max number paragraphs availible is returned only if the call fails
|
||
2) Memory can be expanded only if there is memory availible
|
||
|
||
|
||
4Bh Load or Execute a Program
|
||
(EXEC)
|
||
entry AH 4Bh
|
||
AL 00h load and execute program. A PSP is built for the program
|
||
the ctrl-break and terminate addresses are set to the
|
||
new PSP.
|
||
*01h load but don't execute (note 1)
|
||
*02h load (internal) but do not execute
|
||
03h load overlay (do not create PSP, do not begin execution)
|
||
DS:DX points to the ASCIIZ string with the drive, path, and filename
|
||
to be loaded
|
||
ES:BX points to a parameter block for the load
|
||
(AL=00h) word segment address of environment string to be
|
||
passed
|
||
dword pointer to the command line to be placed at
|
||
PSP+80h
|
||
dword pointer to default FCB to be passed at PSP+5Ch
|
||
dword pointer to default FCB to be passed at PSP+5Ch
|
||
(AL=03h) word segment address where file will be loaded
|
||
word relocation factor to be applied to the image
|
||
return CF clear successful
|
||
set error
|
||
AX error code (1, 2, 8, 0Ah, 0Bh)
|
||
note 1) If you make this call with AL=1 the program will be loaded as if you
|
||
made the call with AL=0 except that the program will not be executed.
|
||
Additionally, with AL=1 the stack segment and pointer along with the
|
||
program's CS:IP entry point are returned to the program which made the
|
||
4B01h call. These values are put in the four words at ES:BX+0eh. On
|
||
entry to the call ES:BX points to the environment address, the command
|
||
line and the two default FCBs. This form of EXEC is used by DEBUG.COM.
|
||
2) Application programs may invoke a secondary copy of the command
|
||
processor (normally COMMAND.COM) by using the EXEC function. Your
|
||
program may pass a DOS command as a parameter that the secondary
|
||
command processor will execute as though it had been entered from the
|
||
standard input device.
|
||
The procedure is:
|
||
A. Assure that adequate free memory (17k for 2.x and 3.0, 23k for 3.1
|
||
up) exists to contain the second copy of the command processor and
|
||
the command it is to execute. This is accomplished by executing
|
||
function call 4Ah to shrink memory allocated to that of your current
|
||
requirements. Next, execute function call 48h with BX=0FFFFh. This
|
||
returns the amount of memory availible.
|
||
B. Build a parameter string for the secondary command processor in the
|
||
form:
|
||
1 byte length of parameter string
|
||
xx bytes parameter string
|
||
1 byte 0Dh (carriage return)
|
||
For example, the assembly language statement below would build the
|
||
string to cause execution of the command FOO.EXE:
|
||
DB 19, "/C C:FOO" , 13
|
||
C. Use the EXEC function call (4Bh), function value 0 to cause execution
|
||
of the secondary copy of the command processor. (The drive,
|
||
directory, and name of the command processor can be gotten from the
|
||
COMSPEC variable in the DOS environment passed to you at PSP+2Ch.)
|
||
D. Remember to set offset 2 of the EXEC control block to point to the
|
||
string built above.
|
||
3) All open files of a process are duplicated in the newly created
|
||
process after an EXEC, except for files originally opened with the
|
||
inheritance bit set to 1.
|
||
4) The environment is a copy of the original command processor's
|
||
environment. Changes to the EXECed environment are not passed back to
|
||
the original. The environment is followed by a copy of the DS:DX
|
||
filename passed to the child process. A zero value will cause the
|
||
child process to inherit the environment of the calling process. The
|
||
segment address of the environment is placed at offset 2Ch of the
|
||
PSP of the program being invoked.
|
||
5) This function uses the same resident part of COMMAND.COM, but makes a
|
||
duplicate of the transient part.
|
||
6) How EXEC knows where to return to: Basically the vector for int 22h
|
||
holds the terminate address for the current process. When a process
|
||
gets started, the previous contents of int 22h get tucked away in the
|
||
PSP for that process, then int 22h gets modified. So if Process A
|
||
EXECs process B, while Process B is running, the vector for int 22h
|
||
holds the address to return to in Process A, while the save location in
|
||
Process B's PSP holds the address that process A will return to when
|
||
*it* terminates. When Process B terminates by one of the usual legal
|
||
means, the contents of int 22h are (surmising) shoved onto the stack,
|
||
the old terminate vector contents are copied back to int 22h vector from
|
||
Process B's PSP, then a RETF or equivalent is executed to return control
|
||
to process A.
|
||
|
||
|
||
4Ch Terminate a Process (EXIT)
|
||
Quit with exit code
|
||
entry AH 4Ch
|
||
AL exit code in AL when called, if any, is passed to next process
|
||
return none
|
||
note 1) Control passes to DOS or calling program
|
||
2) return code from AL can be retrieved by ERRORLEVEL or function 4Dh
|
||
3) all files opened by this process are closed, buffers are flushed, and
|
||
the disk directory is updated
|
||
4) Restores Terminate vector from PSP:000Ah
|
||
Ctrl-C vector from PSP:000Eh
|
||
Critical Error vector from PSP:0012h
|
||
|
||
|
||
4Dh Get Return Code of a Subprocess (WAIT)
|
||
gets return code from functions 31h and 4Dh (ERRORLEVEL)
|
||
entry AH 4Dh
|
||
return AL exit code of subprogram (functions 31h or 4Ch)
|
||
AH circumstance which caused termination
|
||
00h normal termination
|
||
01h control-break
|
||
02h critical device error
|
||
03h terminate and stay resident (function 31h)
|
||
note The exit code is only returned once
|
||
|
||
|
||
4Eh Find First Matching File (FIND FIRST)
|
||
Find first ASCIIZ
|
||
entry AH 4Eh
|
||
CX search attributes
|
||
DS:DX pointer to ASCIIZ filename (with attributes)
|
||
return CF set AX error code (2, 12h)
|
||
clear data block written at current DTA
|
||
format of block is:
|
||
documented by Micro- |00h 1 byte attribute byte of search
|
||
soft as "reserved for |01h 1 byte drive used in search
|
||
DOS' use on subsquent |02h 11 bytes the search name used
|
||
Find Next calls" |0Ch 2 bytes word value of last entry
|
||
function 4Fh |0Fh 4 bytes dword pointer to this DTA
|
||
|13h 2 bytes word directory start
|
||
15h 1 byte file attribute
|
||
16h 2 bytes file time
|
||
18h 2 bytes file date
|
||
1Ah 2 bytes low word of file size
|
||
1Ch 2 bytes high word of file size
|
||
1Eh 13 bytes name and extension of file found, plus
|
||
1 byte of 0s. All blanks are removed
|
||
from the name and extension, and if an
|
||
extension is present it is preceded by a
|
||
period.
|
||
note 1) Will not find volume label
|
||
2) This function does not support network operations
|
||
3) Wildcards are allowed in the filespec
|
||
4) If the attribute is zero, only ordinary files are found. If the volume
|
||
label bit is set, only volume labels will be found. Any other attribute
|
||
will return that attribute and all normal files together.
|
||
5) To look for everything except the volume label, set the hidden, system,
|
||
and subdirectory bits all to 1
|
||
|
||
|
||
4Fh Find Next Matching File (FIND NEXT)
|
||
Find next ASCIIZ
|
||
entry AH 4Fh
|
||
return CF clear data block written at current DTA
|
||
set AX error code (2, 12h)
|
||
note 1) If file found, DTA is formatted as in call 4Eh
|
||
2) Volume label searches using 4Eh/4Fh reportedly aren't 100% reliable
|
||
under DOS 2.x. The calls sometime report there's a volume label and
|
||
point to a garbage DTA, and if the volume label is the only item they
|
||
often won't find it
|
||
3) This function does not support network operations
|
||
4) Use of this call assumes that the original filespec contained wildcards
|
||
|
||
|
||
50h Set PSP
|
||
* Set new Program Segment Prefix; current process ID
|
||
entry AH 50h
|
||
BX segment address of new PSP
|
||
return none - swaps PSP's regarded as current by DOS
|
||
note 1) By putting the PSP segment value into BX and issuing call 50h DOS stores
|
||
that value into a variable and uses that value whenever a file call is
|
||
made.
|
||
2) Note that in the PSP (or PDB) is a table of 20 (decimal) open file
|
||
handles. The table starts at offset 18h into the PSP. If there is an
|
||
0FFh in a byte then that handle is not in use. A number in one of the
|
||
bytes is an index into an internal FB table for that handle. For
|
||
instance the byte at offset 18h is for handle 0, at offset 19h handle
|
||
1, etc. up to 13h. If the high bit is set then the file associated by
|
||
the handle is not shared by child processes EXEC'd with call 4Bh.
|
||
3) Function 50h is dangerous in background operations prior to DOS 3.x as
|
||
it uses the wrong stack for saving registers. (same as functions
|
||
0..0Ch in DOS 2.x)
|
||
4) Under DOS 2.x, this function cannot be invoked inside an int 28h handler
|
||
without setting the Critical Error flag
|
||
5) Open File information, etc. is stored in the PSP DOS views as current.
|
||
If a program (eg. a resident program) creates a need for a second PSP,
|
||
then the second PSP should be set as current to make sure DOS closes
|
||
that as opposed to the first when the second application finishes.
|
||
6) See PC Mag Vol.5, No 9, p.314 for discussion.
|
||
|
||
|
||
51h Get Program Segment Prefix
|
||
* Returns the PSP address of currently executing program
|
||
entry AH 51h
|
||
return BX address of currently executing program
|
||
note 1) Used in DOS 2.x, 3.x uses 62h
|
||
2) Function 51h is dangerous in background operations prior to DOS 3.x as
|
||
it uses the wrong stack for saving registers. (same as functions
|
||
0..0Ch in DOS 2.x)
|
||
3) 50h and 51h might be used if you have more than one process in a PC.
|
||
For instance if you have a resident program that needs to open a file
|
||
you could first call 51h to save the current id and then call 50h to set
|
||
the ID to your PSP.
|
||
4) Under DOS 2.x, this function cannot be invoked inside an int 28h handler
|
||
|
||
|
||
52h IN-VARS
|
||
* returns a pointer to a set of DOS data variables MCB chain, pointer to
|
||
first device driver and a pointer to disk parameter blocks (first one)
|
||
entry AH 52h
|
||
return ES:BX pointer to the DOS list of lists, for disk information. Does not
|
||
access the disk, so information in tables might be incorrect if
|
||
disk has been changed. Returns a pointer to the following array
|
||
of longword pointers:
|
||
Bytes Value
|
||
-2h,-1h segment of first memory control block
|
||
0h-3h pointer to first DOS disk block (see function 36h)
|
||
4h-7h partially unknown. Pointer to a device driver. Maybe
|
||
first resident driver?
|
||
8h-0Bh pointer to CLOCK$ device driver, whether installable or
|
||
resident
|
||
0Ch-0Fh 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 unknown
|
||
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)
|
||
10h-11h maximum bytes/block of any block device (0200h)
|
||
12h-15h unknown. Pointer to current directory block?
|
||
16h-19h partially undefined: Pointer to array of drive info:
|
||
51h bytes per drive, starting with A: ...
|
||
00h-3Fh current path as ASCIIZ, starting with 'x:\'
|
||
40h-43h unknown zeros always
|
||
44h unknown flags? Usually 40h, except for
|
||
entry after last valid entry = 00h
|
||
45h-48h pointer to DOS disk block for this drive
|
||
49h-4Ah unknown. Current track or block?
|
||
-1 if never accessed
|
||
4Bh-4Eh unknown -1 always
|
||
4Fh-52h unknown 2 always
|
||
1Ah-1Dh unknown. Pointer to data area, maybe including cluster
|
||
allocation table?
|
||
1Eh-1Fh unknown. Zero always
|
||
20h Number of block devices
|
||
21h value of LASTDRIVE command in CONFIG.SYS (default 5)
|
||
22h Beginning (not a pointer. The real beginning!) of NUL
|
||
device driver. This is the first device on DOS's linked
|
||
list of device drivers.
|
||
note This call is not supported in OS/2 1.0's DOS Compatibility Box
|
||
|
||
|
||
53h Translate BPB
|
||
* Translates BPB (BIOS Parameter Block, see below) into a DOS Disk Block (see
|
||
function call 32h).
|
||
entry AH 53h
|
||
DS:SI pointer to BPB
|
||
ES:BP pointer to area for DOS Disk Block.
|
||
Layout of Disk Block:
|
||
bytes value
|
||
00h-01h bytes per sector, get from DDB bytes 02h-03h.
|
||
02h sectors per cluster, get from (DDB byte 4) + 1
|
||
03h-04h reserved sectors, get from DDB bytes 06h-07h
|
||
05h number of FATs, get from DDB byte 08h
|
||
06h-07h number of root dir entries, get from DDB bytes 09h-0Ah
|
||
08h-09h total number of sectors, get from:
|
||
((DDB bytes 0Dh-0Eh) - 1) * (sectors per cluster (BPB
|
||
byte 2)) + (DDB bytes 0Bh-0Ch)
|
||
0Ah media descriptor byte, get from DDB byte 16h
|
||
0Bh-0Ch number of sectors per FAT, get from DDB byte 0Fh
|
||
return unknown
|
||
|
||
|
||
54h Get Verify Setting
|
||
Get verify flag status
|
||
entry AH 54h
|
||
return AL 00h if flag off
|
||
01h if flag on
|
||
note Flag can be set with function 2Eh
|
||
|
||
|
||
55h Create "Child" PSP
|
||
* Create PSP: similar to function 26h (which creates a new Program Segment
|
||
Prefix at segment in DX) except creates a "child" PSP rather than copying
|
||
the existing one.
|
||
entry AH 55h
|
||
DX segment number at which to create new PSP.
|
||
return unknown
|
||
note 1) This call is similar to call 26h which creates a PSP except that unlike
|
||
call 26h the segment address of the parent process is obtained from the
|
||
current process ID rather than from the CS value on the stack (from the
|
||
INT 21h call). DX has the new PSP value and SI contains the value to be
|
||
placed into PSP:2 (top of memory).
|
||
2) Function 55 is merely a substitute for function 26h. It will copy the
|
||
current PSP to the segment address DX with the addition that SI is
|
||
assumed to hold the new memory top segment. This means that function
|
||
26h sets SI to the segment found in the current PSP and then calls
|
||
function 55h.
|
||
|
||
|
||
56h Rename a File
|
||
if the first file exists, it is renamed to the name in ES:DI
|
||
entry AH 56h
|
||
DS:DX pointer to ASCIIZ old pathname
|
||
ES:DI pointer to ASCIIZ new pathname
|
||
return CF clear successful rename
|
||
set AX error code (2, 3, 5, 11h)
|
||
note 1) Works with files in same drive only
|
||
2) Global characters not allowed in filename
|
||
3) The name of a file is its full pathname. The file's full pathname can
|
||
be changed, while leaving the actual FILENAME.EXT unchanged. Changing
|
||
the pathname allows the file to be "moved" from subdirectory to
|
||
subdirectory on a logical drive without actually copying the file.
|
||
4) DOS 3.x allows renaming of directories
|
||
|
||
|
||
|
||
57h Get/Set a File's Date and Time
|
||
read or modify time and date stamp on a file's directory entry
|
||
entry AH 57h
|
||
AL function code
|
||
00h get date and time
|
||
01h set date and time
|
||
CX time to be set
|
||
DX date to be set
|
||
BX file handle
|
||
return CF clear CX time of last write (if AL = 0)
|
||
DX date of last write (if AL = 0)
|
||
set AX error code (1, 6)
|
||
note Date/time formats are:
|
||
CX bits 0Bh-0Fh hours (0-23) DX bits 09h-0Fh year (relative to 1980)
|
||
05h-0Ah minutes (0-59) 05h-08h month (0-12)
|
||
00h-04h #2 sec. incr. (0-29) 00h-04h day of the month (0-31)
|
||
|
||
|
||
58h Get/Set Allocation Strategy
|
||
DOS 3.x
|
||
entry AH 58h
|
||
AL 0 set current strategy
|
||
1 set new current strategy
|
||
BX new strategy if AH=1
|
||
0 first fit - chooses the lowest block in memory which
|
||
will fit (this is the default). (use first memory block
|
||
large enough)
|
||
1 best fit - chooses the smallest block which will fill
|
||
the request.
|
||
2 last fit - chooses the highest block which will fit.
|
||
return CF clear (0) successful
|
||
set (1) error (1)
|
||
AX error code
|
||
AX strategy code (CF=0)
|
||
note 1) Documented in Zenith DOS version 3.1, some in Advanced MSDOS
|
||
2) 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 greater than or equal to 2.
|
||
|
||
|
||
59h Get Extended Error Code (DOS 3.x)
|
||
returns additional error information when requested
|
||
The Get Extended Error function call (59h) is intended to provide a common
|
||
set of error codes and to supply more extensive information about the error
|
||
to the application. The information returned from function call 59h, in
|
||
addition to the error code, is the error class, the locus, and the
|
||
recommended action. The error class provides information about the error
|
||
type (hardware, internal, system, etc.). The locus provides information
|
||
about the area involved in the failure (serial device, block device,
|
||
network, or memory). The recommended action provides a default action for
|
||
programs that do not understand the specific error code.
|
||
Newly written programs should use the extended error support both from
|
||
interrupt 24h hard error handlers and after any int 21h function calls. FCB
|
||
function calls report an error by returning 0FFh in AL. Handle function
|
||
calls report an error by setting the carry flag and returning the error
|
||
code in AX. Int 21h handle function calls for DOS 2.x continue to return
|
||
error codes 0-18. Int 24h handle function calls continue to return error
|
||
codes 0-12. But the application can obtain any of the error codes used in
|
||
the extended error codes table by issuing function call 59h. Handle
|
||
function calls for DOS 3.x can return any of the error codes. However, it
|
||
is recommended that the function call be followed by function call 59h to
|
||
obtain the error class, the locus, and the recommended action.
|
||
The Get Extended Error function (59h) can always be called, regardless of
|
||
whether the previous DOS call was old style (error code in AL) or new style
|
||
(carry bit). It can also be used inside an int 24h handler.
|
||
You can either check AL or the carry bit to see if there was no error,
|
||
and call function 59h only if there was an error, or take the simple
|
||
approach of always calling 59h and letting it tell you if there was an
|
||
error or not. When you call function 59h it will return with AX=0 if the
|
||
previous DOS call was successful.
|
||
entry AH 59h
|
||
BX version code (0000 for DOS 3.0 and 3.1)
|
||
return AX extended error code:
|
||
01h Invalid function number
|
||
02h File not found
|
||
03h Path not found
|
||
04h Too many open files, no file handles left
|
||
05h Access denied
|
||
06h Invalid handle
|
||
07h Memory control blocks destroyed
|
||
08h Insufficient memory
|
||
09h Invalid memory block address
|
||
0Ah Invalid environment
|
||
0Bh Invalid format
|
||
0Ch Invalid access code
|
||
0Dh Invalid data
|
||
0Eh Reserved
|
||
0Fh Invalid drive was specified
|
||
10h Attempt to remove the current directory
|
||
11h Not same device
|
||
12h No more files
|
||
13h Attempt to write on write-protected diskette
|
||
14h Unknown unit
|
||
15h Drive not ready
|
||
16h Unknown command
|
||
17h Bad CRC check
|
||
18h Bad request structure length
|
||
19h Seek error
|
||
1Ah Unknown media type
|
||
1Bh Sector not found
|
||
1Ch Printer out of paper
|
||
1Dh Write fault
|
||
1Eh Read fault
|
||
1Fh General Failure
|
||
20h Sharing violation
|
||
21h Lock violation
|
||
22h Invalid disk change
|
||
23h FCB unavailible
|
||
24h Sharing buffer overflow
|
||
25h Reserved
|
||
26h "
|
||
27h "
|
||
28h "
|
||
29h "
|
||
2Ah "
|
||
2Bh "
|
||
2Ch "
|
||
2Dh "
|
||
2Eh "
|
||
2Fh "
|
||
30h "
|
||
31h Reserved
|
||
32h Network: request not supported (DOS 3.1 + MS Networks)
|
||
33h Remote computer not listening
|
||
34h Duplicate name on network
|
||
35h Network: name not found
|
||
36h Network: busy
|
||
37h Network: device no longer exists
|
||
38h NETBIOS command limit exceeded
|
||
39h Network: adapter hardware error
|
||
3Ah Incorrect response from network
|
||
3Bh Unexpected network error
|
||
3Ch Incompatible remote adapter
|
||
3Dh Print queue full
|
||
3Eh Not enough space for print file
|
||
3Fh Print file was deleted
|
||
40h Network: name was deleted
|
||
41h Network: Access denied
|
||
42h Network: device type incorrect
|
||
43h Network: name not found
|
||
44h Network: name limit exceeded
|
||
45h NETBIOS session limit exceeded
|
||
46h Temporarily paused
|
||
47h Network: request not accepted
|
||
48h Print or disk redirection paused (DOS 3.1 + MS Networks)
|
||
49h Reserved
|
||
4Ah "
|
||
4Bh "
|
||
4Ch "
|
||
4Dh "
|
||
4Eh "
|
||
4Fh Reserved
|
||
50h File exists
|
||
51h Reserved
|
||
52h Cannot make directory entry
|
||
53h Fail on interrupt 24h
|
||
54h Too many redirections
|
||
55h Duplicate redirection
|
||
56h Invalid password
|
||
57h Invalid parameter
|
||
58h Network: device fault
|
||
BH class of error:
|
||
01h Out of resource
|
||
02h Temporary situation
|
||
03h Authorization (denied access)
|
||
04h Internal
|
||
05h Hardware failure
|
||
06h System failure
|
||
07h Application program error
|
||
08h Not found
|
||
09h Bad format
|
||
0Ah Locked
|
||
0Bh Media error (wrong volume ID, disk failure)
|
||
0Ch Already exists
|
||
0Dh Unknown
|
||
BL suggested action code:
|
||
01h Retry
|
||
02h Delayed retry
|
||
03h Prompt user
|
||
04h Abort after cleanup
|
||
05h Immediate abort
|
||
06h Ignore
|
||
07h Retry after user intervention
|
||
CH locus (where error occurred):
|
||
01h Unknown or not appropriate
|
||
02h Block device
|
||
03h Network related
|
||
04h Serial device
|
||
05h Memory related
|
||
note 1) Not all DOS functions use the carry flag to indicate an error. Carry
|
||
should be tested only on those functions which are documented to use it.
|
||
2) None of the DOS functions which existed before 2.0 use the carry
|
||
indicator. Many of them use register AL as an error indication instead,
|
||
usually by putting 0FFh in AL on an error. Most, but not all, the "new"
|
||
(2.x, 3.x) functions do use carry, and most, but not all, of the "old"
|
||
(1.x) functions use AL.
|
||
3) On return, CL, DI, DS, DX, ES, BP, and SI are destroyed - save before
|
||
calling this function if required.
|
||
4) DOS 2.x Error Codes: If you are using function calls 38h-57h with DOS
|
||
2.x, to check if an error has occurred, check for the following error
|
||
codes in the AX register:
|
||
call error code call error code call error code
|
||
38h 2 41h 2,3,5 4Ah 7,8,9
|
||
39h 3,5 42h 1,6 4Bh 1,2,3,5,8,10,11
|
||
3Ah 3,5,15 43h 1,2,3,5 4Eh 2,3,18
|
||
3Bh 3 44h 1,3,5,6 4Fh 18
|
||
3Ch 3,4,5 45h 4,6 56h 2,3,5,17
|
||
3Dh 2,3,4,5,12 46h 4,6 57h 1,6
|
||
3Eh 6 47h 15
|
||
3Fh 5,6 48h 7,8
|
||
40h 5,6 49h 7,9
|
||
5) note that extended error codes 13h through 1Fh correspond to error
|
||
codes 00h through 0Ch returned by int 24h
|
||
|
||
|
||
5Ah Create Temporary File
|
||
Create unique filename (for temporary use) (DOS 3.x)
|
||
entry AH 5Ah
|
||
DS:DX pointer to ASCIIZ directory pathname ending with a backslash (\)
|
||
CX file attribute
|
||
return CF clear DS:DX new ASCIIZ path name
|
||
AX handle
|
||
set AX error code (3 or 5)
|
||
note 1) The file created is not truly "temporary". It must be removed by the
|
||
user.
|
||
2) If the filename created already exists in the current directory, this
|
||
function will call itself again with another unique filename until
|
||
a unique filename is found
|
||
|
||
|
||
5Bh Create a New File
|
||
(DOS 3.x)
|
||
entry AH 5Bh
|
||
DS:DX pointer to directory ASCIIZ path name
|
||
CX file attribute
|
||
return CF clear AX file handle
|
||
DS:DX new ASCIIZ path name
|
||
set AX error code (3, 4, 5, 50h)
|
||
note 1) Unlike function 3Ch, function 5Bh will fail if the file already exists.
|
||
2) The new file is opened in read/write mode
|
||
|
||
|
||
5Ch Lock/Unlock File Access
|
||
(DOS 3.x)
|
||
entry AH 5Ch
|
||
AL 00h to lock file
|
||
01h to unlock file
|
||
BX file handle
|
||
CX:DX starting offset of region to lock
|
||
SI:DI size of region to lock
|
||
return CF clear successful
|
||
set AX error code (1, 6, 21h)
|
||
note 1) Close all files before exiting or undefined results may occur
|
||
2) Programs spawned with EXEC inherit all the parent's file handles but
|
||
not the file locks
|
||
|
||
|
||
5Dh Set Extended Error Information
|
||
* DOS Internal - partial (DOS 3.x)
|
||
entry AH 5dh
|
||
AL subfunction
|
||
06h get address of critical error flag
|
||
return DS:SI pointer to critical error flag
|
||
08h (unknown - used by command.com)
|
||
09h (unknown - used by command.com)
|
||
0Ah set error info (Error, Class, Action, and Locus)
|
||
DS:DX address of 11-word error information
|
||
words 0 to 7: values of AX,BX,CX,DX,SI,DI,DS,
|
||
ES that function 59h will return
|
||
words 8 to 10: zero (reserved)
|
||
return: CX unknown
|
||
DX unknown
|
||
DS:SI (for 06h) pointer to critical error flag
|
||
note 1) This call seems to have many different functions
|
||
2) Function 0Ah; DOS 3.1+
|
||
3) Function 06h; setting CritErr flag allows use of functions 50h/51h from
|
||
int 28h under DOS 2.x by forcing use of correct stack
|
||
|
||
|
||
5Eh Network Printer (Partially documented by Microsoft)
|
||
DOS 3.1+ with Networks software
|
||
entry AH 5Eh
|
||
AL 00 Get Machine Name
|
||
DS:DX pointer to buffer for ASCIIZ name
|
||
return CH 0 if name not defined
|
||
CL NETBIOS name number if CH <> 0
|
||
DS:DX pointer to identifier if CH <> 0
|
||
note the ASCIIZ name is a 15 byte string padded
|
||
to length with zeroes
|
||
01 Set Machine Name
|
||
DS:DX pointer to ASCIIZ name
|
||
CH unknown
|
||
CL name number
|
||
02 Set Printer Control String
|
||
BX redirection list index
|
||
CX length of setup string (max 64 bytes)
|
||
DS:SI pointer to string buffer
|
||
03 Get Printer Control String
|
||
BX redirection list index
|
||
ES:DI pointer to string buffer
|
||
return CX length of setup string (max 64 bytes)
|
||
return CF clear successful
|
||
set error
|
||
AX error code (1 for all listed subfunctions)
|
||
note 1) Used in IBM's & Microsoft's Network programs
|
||
2) Partial documentation in Fall 1985 Byte
|
||
3) These services require that the network software be installed
|
||
4) Partial documentation in Advanced MS-DOS
|
||
5) SHARE must be loaded or results can be unpredictable on 00h, or fail
|
||
with 02h or 03h
|
||
|
||
|
||
5Fh Network Redirection
|
||
(DOS 3.1 + Microsoft Networks)
|
||
entry AH 5Fh
|
||
AL *00h Unknown
|
||
*01h Unknown
|
||
02h Get Redirection List Entry
|
||
BX redirection list index
|
||
DS:SI pointer to 16 byte buffer for local device name
|
||
ES:DI pointer to 128 byte buffer for network name
|
||
return BH device status flag (bit 0 = 0 if valid)
|
||
(bit 0 = 1 if invalid)
|
||
BL device type
|
||
03 printer device
|
||
04 drive device
|
||
CX stored parameter value
|
||
DS:SI pointer to 16 byte local device name
|
||
ES:DI pointer to 128 byte network name
|
||
note DX and BP are destroyed by this call!
|
||
03h Redirect Device
|
||
BL device type
|
||
03 printer device
|
||
04 file device
|
||
CX stored parameter value
|
||
DS:SI pointer to source device name
|
||
ES:DI pointer to destination ASCIIZ network path +
|
||
ASCIIZ password
|
||
04h Cancel Redirection
|
||
DS:SI pointer to ASCIIZ device name or network path
|
||
return CF clear successful
|
||
set if error
|
||
AX error code
|
||
return as above
|
||
note 1) Used in IBM's Network program
|
||
2) Partial documentation in Fall 1985 Byte
|
||
3) These services require that the network software be installed
|
||
4) Partial documentation in Advanced MS-DOS
|
||
5) SHARE must be loaded or the call will fail
|
||
6) The network device name requires a password
|
||
|
||
|
||
60h Parse pathname (DOS 3.x)
|
||
* Translate - perform name processing on a string (internal to DOS)
|
||
entry AH 60h
|
||
DS:SI pointer to source string (null terminated)
|
||
ES:DI pointer to destination string buffer.
|
||
return ES:DI buffer filled with qualified name
|
||
CF 0 no error
|
||
1 error
|
||
AX error code
|
||
note 1) Documented in Zenith 3.05 Tech Ref
|
||
2) All name processing is performed on the input string: string
|
||
substitution is performed on the components, current drive/directories
|
||
are prepended, . and .. are removed.
|
||
3) Example: If current drive/directory is c:\test, myfile.x is translated
|
||
to c:\test\myfile.x; ..\source\sample.asm is tranlated to c:\source\
|
||
sample.asm
|
||
4) It is the caller's responsibility to make sure DS:SI does not point to
|
||
a null string. If it does, SI is incremented, a null byte is stored at
|
||
ES:DI, and the routine returns.
|
||
|
||
|
||
61h No Information Availible (DOS 3.x)
|
||
* internal to DOS - parameters not known
|
||
entry AH 61h
|
||
return AL 0
|
||
note Supposedly documented in Zenith DOS 3.05 Tech Ref
|
||
|
||
|
||
62h Get Program Segment Prefix (PSP)
|
||
Get PSP address (DOS 3.x)
|
||
entry AH 62h
|
||
return BX segment address of PSP
|
||
|
||
|
||
63h Get Lead Byte Table (MS-DOS 2.25 only)
|
||
added in MS-DOS version 2.25 for additional foreign character set support.
|
||
entry AH 63h
|
||
AL subfunction
|
||
00h get system lead byte table address
|
||
01h set/clear interim console flag
|
||
DL 0 to clear interim console flag
|
||
1 to set interim console flag
|
||
02h get interim console flag
|
||
return DS:SI pointer to lead byte table (AL = 00h)
|
||
DL interim console flag (AL = 02h)
|
||
note Function 63h destroys all registers on return.
|
||
|
||
|
||
64h Internal
|
||
unknown (DOS 3.3+)
|
||
entry AH 64h
|
||
|
||
|
||
65h Get Extended Country Information (DOS 3.3+)
|
||
returns information about the selected country formats, code pages, and
|
||
conversion tables
|
||
entry AH 65h
|
||
AL info ID (1 - 6)
|
||
BX code page (-1 = global code page)
|
||
CX size of buffer
|
||
DX country ID (-1 = current country)
|
||
ES:DI pointer to country information buffer
|
||
return AX error code if carry set, otherwise
|
||
CX size of country information returned
|
||
CF set on error
|
||
ES:DI pointer to country information:
|
||
1 byte info ID
|
||
if info ID <> 1
|
||
dword pointer to information
|
||
if info ID = 1
|
||
word size
|
||
word country ID
|
||
word code page
|
||
34 bytes (see function 38h)
|
||
|
||
|
||
66h Get/Set Global Code Page Table (DOS 3.3+)
|
||
query/reset code page defaults
|
||
entry AH 66h
|
||
AL 00h Get Global Code Page
|
||
01h Set Global Page
|
||
BX active code page
|
||
DX system code page (active page at boot time)
|
||
return CF clear successful
|
||
set AX error code
|
||
if 00h BX active code page
|
||
DX system code page (active page at boot time)
|
||
note BX = active code page: 437 = US, 860 = Portugal, 863 = Canada (French)
|
||
865 = Norway/Denmark
|
||
|
||
|
||
67h Set Handle Count (DOS 3.3+)
|
||
supports more than 20 open files per process
|
||
entry AH 67h
|
||
BX desired number of handles (max 255)
|
||
return CF clear if OK
|
||
CF set if error
|
||
AX error code
|
||
|
||
|
||
68h Commit File (DOS 3.3+)
|
||
Write all buffered data to disk
|
||
entry AH 68h
|
||
BX file handle
|
||
return CF set AX error code
|
||
clear successful
|
||
note Faster and more secure method of closing a file in a network than
|
||
current close commands
|
||
|
||
|
||
69h Disk Serial Number DOS 4.0 (US)
|
||
Places and reads "Volume Serial Number" on disks formatted with 4.0+
|
||
entry unknown
|
||
return unknown
|
||
note A call for DOS function 69h (AL=0, possibly a subfunction) uses DS:DX
|
||
as a pointer to a table. On return, the table is filled in as follows:
|
||
word unknown (zeroes on my system)
|
||
dword disk serial number (binary)
|
||
char[11] volume label or "NO NAME " if none
|
||
char[8] FAT type
|
||
The FAT type field returns "FAT16 " on hard disk formatted with DOS
|
||
3.3 and "FAT12 " on a 360K floppy.
|
||
|
||
|
||
6Ah unknown (DOS 4.0?)
|
||
|
||
|
||
6Bh unknown (DOS 4.0?)
|
||
|
||
|
||
6Ch Extended Open/Create DOS 4.0 (US)
|
||
Combines functions available with Open, Create, Create New, and Commit
|
||
entry AH 6Ch
|
||
AL 00h reserved [which means there might be other subfunctions?]
|
||
BX mode format 0WF0 0000 ISSS 0AAA
|
||
AAA is access code (read, write, read/write)
|
||
SSS is sharing mode
|
||
I 0 pass handle to child
|
||
1 no inherit [interesting!]
|
||
F 0 use int 24h for errors
|
||
1 disable int 24h for all
|
||
I/O on this handle; use own
|
||
error routine
|
||
W 0 no commit
|
||
1 auto commit on all writes
|
||
CX create attribute
|
||
DL action if file exists/does not exists
|
||
bits 7-4 action if file does not exist
|
||
0000 fail
|
||
0001 create
|
||
bits 3-0 action if file exists
|
||
0000 fail
|
||
0001 open
|
||
0010 replace/open
|
||
DH 0
|
||
DS:SI pointer to ASCIIZ file name
|
||
return CF set on error
|
||
AX error code
|
||
clear
|
||
AX file handle
|
||
CX action taken
|
||
01h file opened
|
||
02h created/opened
|
||
03h replaced/opened
|
||
|
||
|
||
89h DOS_Sleep
|
||
* not documented by Microsoft
|
||
entry AH 89h
|
||
return unknown
|
||
note 1) Function included in Microsoft C 4.0 startup code MSDOS.INC
|
||
2) Debugging shows that the first instruction on entry to DOS compares AH
|
||
with 64h (at least in DOS 3.2) and aborts the call if AH > 64.
|
||
3) Possibly used in European MSDOS 4.0?
|
||
|
||
|
||
Aftermarket Application Installed Function Calls:
|
||
|
||
|
||
0B6h, 0B8h, 0BBh, 0BCh, B0Eh, 0BFh, 0C0h, 0C1h, 0C2h, 0C3h, 0C4h, 0C5h, 0C6h,
|
||
0C7h, 0C8h, 0C9h, 0CAh, 0CBh, 0CCh, 0CDh, 0CEh, 0CFh, 0D0h, 0D1h, 0D2h, 0D3h,
|
||
0D4h, 0D5h, 0D6h, 0D7h, 0DAh, 0DBh
|
||
Used by Novell NetWare
|
||
|
||
|
||
0DCh Novell NetWare
|
||
Get Station Number
|
||
entry AH 0DCh
|
||
return AL station number
|
||
00h if NetWare not loaded or this machine is a non-
|
||
dedicated server
|
||
|
||
|
||
0DDh Novell NetWare
|
||
|
||
|
||
0DEh Novell NetWare
|
||
Set Broadcast Mode
|
||
|
||
0DFh Novell NetWare
|
||
|
||
|
||
0E0h Novell NetWare
|
||
|
||
|
||
0E1h Novell NetWare
|
||
Broadcast Messages
|
||
entry AH E1h
|
||
AL 00h send broadcast message
|
||
01h get broadcase message
|
||
02h-09h unknown
|
||
|
||
0E2h Novell NetWare
|
||
|
||
|
||
0E3h Novell NetWare
|
||
Connection Control
|
||
entry AH E3h
|
||
AL 00h-14h unknown
|
||
15h get object connection numbers
|
||
16h get connection information
|
||
32h-47h unknown
|
||
|
||
|
||
E4h DoubleDOS
|
||
check status
|
||
entry AX 00h
|
||
return AL <> 0 if DoubleDOS is active
|
||
|
||
0E4h Novell NetWare
|
||
|
||
|
||
0E5h, 0E6h, 0E7h, 0E8h, 0E9h
|
||
Novell NetWare
|
||
|
||
|
||
0EAh DoubleDOS
|
||
turn off task switching
|
||
entry AX EAh
|
||
return task switching turned off
|
||
|
||
|
||
0EAh Novell NetWare
|
||
|
||
|
||
0EBh DoubleDOS
|
||
turn on task switching
|
||
entry AH EBh
|
||
return Task switching turned on
|
||
|
||
|
||
0EBh Novell NetWare
|
||
|
||
|
||
0ECh DoubleDOS
|
||
get virtual screen address
|
||
entry AH ECh
|
||
return ES segment of virtual screen
|
||
note Screen address can change if task switching is on!
|
||
|
||
|
||
0ECh Novell NetWare
|
||
|
||
|
||
0EDh Novell NetWare
|
||
|
||
|
||
0EEh DoubleDOS
|
||
give away time to other tasks
|
||
entry AH EEh
|
||
AL number of 55ms time slices to give away
|
||
return Returns after giving away time slices
|
||
|
||
|
||
0EEh Novell NetWare
|
||
Get Node Address
|
||
entry AH EEh
|
||
return CX:BX:AX = six-byte address
|
||
|
||
|
||
0EFh, 0F0h, 0F1h, 0F2h, 0F3h Reportedly used by Novell NetWare.
|
||
No parameters known
|
||
|
||
|
||
0FFh CED (CJ Dunford's DOS macro and command-line editor)
|
||
CED installable commands
|
||
entry AH 0FFh
|
||
AL 00h add installable command
|
||
01h remove installable command
|
||
02h reserved, may be used to test for CED installation
|
||
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
|
||
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
|
||
|
||
Chapter 5
|
||
|
||
Programming Technical Reference - IBM
|
||
Copyright 1988, Dave Williams
|
||
|
||
Interrupts 22h Through 86h
|
||
|
||
|
||
Interrupt 22h Terminate Address
|
||
(0:0088h)
|
||
This interrupt transfers control to the far (dword) address at this interrupt
|
||
location when an application program terminates. The default address for this
|
||
interrupt is 0:0088h through 0:008Bh. This address is copied into the program's
|
||
Program Segment Prefix at bytes 0Ah through 0Dh at the time the segment is
|
||
created and is restored from the PSP when the program terminates. The calling
|
||
program is normally COMMAND.COM or an application. Do not issue this interrupt
|
||
directly, as the EXEC function call does this for you. If an application
|
||
spawns a child process, it must set the Terminate Address prior to issuing the
|
||
EXEC function call, otherwise when the second program terminated it would
|
||
return to the calling program's Terminate Address rather than its own. This
|
||
address may be set with int 21, function 25h.
|
||
|
||
|
||
|
||
Interrupt 23h Ctrl-Break Exit Address
|
||
(0:008Ch)
|
||
If the user enters a Ctrl-Break during STDIN, STDOUT, STDPRN, or STDAUX, int
|
||
23h is executed. If BREAK is on, int 23h is checked on MOST function calls
|
||
(notably 06h). If the user written Ctrl-Break routine saves all registers, it
|
||
may end with a return-from-interrupt instruction (IRET) to continue program
|
||
execution. If the user-written interrupt program returns with a long return, the
|
||
carry flag is used to determine whether the program will be aborted. If the
|
||
carry flag is set, the program is aborted, otherwise execution continues (as
|
||
with a return by IRET). If the user-written Ctrl-Break interrupt uses function
|
||
calls 09h or 0Ah, then ctrl-C/CR/LF are output. If execution is continued with
|
||
an IRET, I/O continues from the start of the line. When the interrupt occurs,
|
||
all registers are set to the value they had when the original function call to
|
||
DOS was made. There are no restrictions on what the Ctrl-Break handler is
|
||
allowed to do, including DOS function calls, as long as the registers are
|
||
unchanged if an IRET is used. If the program creates a new segment and loads a
|
||
second program which itself changes the Ctrl-Break address, the termination of
|
||
the second program and return to the first causes the Ctrl-Break address to
|
||
be restored from the PSP to the value it had before execution of the second
|
||
program.
|
||
|
||
|
||
|
||
Interrupt 24h Critical Error Handler
|
||
(0:0090h)
|
||
When a critical error occurs within DOS, control is transferred to an error
|
||
handler with an int 24h. This may be the standard DOS error handler (ABORT,
|
||
RETRY, IGNORE) or a user-written routine.
|
||
On entry to the error handler, AH will have its bit 7=0 (high order bit)
|
||
if the error was a disk error (probably the most common error), bit 7=1 if
|
||
not.
|
||
BP:SI contains the address of a Device Header Control Block from which
|
||
additional information can be retrieved (see below).
|
||
The register is set up for a retry operation and an error code is in the
|
||
lower half of the DI register with the upper half undefined. These are the
|
||
error codes:
|
||
|
||
The user stack is in effect and contains the following from top to bottom:
|
||
|
||
IP DOS registers from issuing int 24h
|
||
CS int 24h
|
||
flags
|
||
AX user registers at time of signal
|
||
BX int 21h request
|
||
CX
|
||
DX
|
||
SI
|
||
DI
|
||
BP
|
||
DS
|
||
ES
|
||
IP from original int 21h
|
||
CS
|
||
flags
|
||
|
||
To reroute the critical error handler to a user-writen critical error handler,
|
||
the following should be done:
|
||
|
||
Before an int 24h occurs:
|
||
1) The user application initialization code should save the int 24h vector and
|
||
replace the vector with one pointing to the user error routine.
|
||
|
||
When the int 24h occurs:
|
||
2) When the user error routine received control it should push the flag
|
||
registers onto the stack and execute a far call to the original int 24h
|
||
vector saved in step 1.
|
||
3) DOS gives the appropriate prompt, and waits for user input (Abort, Retry,
|
||
Ignore, Fail). After the user input, DOS returns control to the user error
|
||
routine instruction following the far call.
|
||
4) The user error routine can now do any tasks nescessary. To return to the
|
||
original application at the point the error occurred, the error routine needs
|
||
to execute an IRET instruction. Otherwise, the user error routine should
|
||
remove the IP, CS, and flag registers from the stack. Control can then be
|
||
passed to the desired point.
|
||
|
||
|
||
Int 24h provides the following values in registers on entry to interrupt
|
||
handler:
|
||
|
||
entry AH status byte
|
||
bit 7 0 disk I/O hard error
|
||
1 other error - if block device, bad FAT
|
||
- if char device, code in DI
|
||
6 unused
|
||
5 0 if IGNORE is not allowed
|
||
1 if IGNORE is allowed
|
||
4 0 if RETRY is not allowed
|
||
1 if RETRY is allowed
|
||
3 0 if FAIL is not allowed
|
||
1 if FAIL is allowed
|
||
2 \ disk area of error 00 = DOS area 01 = FAT
|
||
1 / 10 = root dir 11 = data area
|
||
0 0 if read operation
|
||
1 if write operation
|
||
AL drive number if AH bit 7 = 1, otherwise undefined
|
||
If it is as hard error on disk (AH bit 7=0), register AL
|
||
contains the failing drive number (0=A:, 1=B:, etc.).
|
||
BP:SI address of a Device Header Control Block for which error
|
||
occurred block device if high bit of BP:SI+4 = 1
|
||
low byte of DI: error code (note: high byte is undefined)
|
||
error code description
|
||
00h attempt to write on write-protected diskette
|
||
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
|
||
0Fh invalid disk change (DOS 3.x)
|
||
|
||
handler must return
|
||
|
||
The registers are set such that if an IRET is executed, DOS responds according
|
||
to (AL) as follows:
|
||
AL 00h ignore the error
|
||
01h retry the operation
|
||
02h terminate via int 22h
|
||
03h fail the system call that is in progress (DOS 3.2+)
|
||
note 1) Be careful when choosing to ignore a response because this causes DOS to
|
||
beleive that an operation has completed successfully when it may not
|
||
have.
|
||
2) If the error was a character device, the contents of AL are invalid.
|
||
|
||
|
||
|
||
OTHER ERRORS
|
||
|
||
If AH bit 7=1, the error occurred on a character device, or was the result of
|
||
a bad memory image of the FAT. The device header passed in BP:SI can be examined
|
||
to determine which case exists. If the attribute byte high-order bit indicates
|
||
a block device, then the error was a bad FAT. Otherwise, the error is on a
|
||
character device.
|
||
If a character device is involved, the contents of AL are unpredictable, the
|
||
error code is in DI as above.
|
||
|
||
Notes:
|
||
1. Before giving this routine control for disk errors, DOS performs several
|
||
retries. The number of retries varies according to the DOS version.
|
||
2. For disk errors, this exit is taken only for errors occurring during an
|
||
int 21h function call. It is not used for errors during an int 25h or 26h.
|
||
3. This routine is entered in a disabled state.
|
||
4. All registers must be preserved.
|
||
5. This interrupt handler should refrain from using DOS function calls. If
|
||
necessary, it may use calls 01h through 12h. Use of any other call destroys
|
||
the DOS stack and leaves DOS in an unpredictable state.
|
||
6. The interrupt handler must not change the contents of the device header.
|
||
7. If the interrupt handler handles errors itself rather than returning to DOS,
|
||
it should restore the application program's registers from the stack,
|
||
remove all but the last three words on the stack, then issue an IRET. This
|
||
will return to the program immediately after the int 21h that experienced
|
||
the error. Note that if this is done DOS will be in an unstable state until
|
||
a function call higher than 12h is issued, therefore not recommended.
|
||
8. For DOS 3.x, IGNORE requests (AL=0) are converted to FAIL for critical
|
||
errors that occur on FAT or DIR sectors.
|
||
9. For DOS 3.10 up, IGNORE requests (AL=0) are converted to FAIL requests
|
||
for network critical errors (50-79).
|
||
|
||
The device header pointed to by BP:SI is as follows:
|
||
|
||
DWORD Pointer to next device (0FFFFh if last device)
|
||
|
||
WORD Attributes:
|
||
|
||
Bit 15 1 if character device.
|
||
If bit 15 is 1:
|
||
Bit 0 = 1 if current standard input
|
||
Bit 1 = 1 if current standard output
|
||
Bit 2 = 1 if current NULL device
|
||
Bit 3 = 1 if current CLOCK device
|
||
0 if block device
|
||
Bit 14 is the IOCTL bit
|
||
WORD pointer to device driver strategy entry point
|
||
WORD pointer to device driver interrupt entry point
|
||
8-BYTE character device named field for block devices. The first byte is the
|
||
number of units.
|
||
To tell if the error occurred on a block or character device, look at bit 15
|
||
in the attribute field (WORD at BP:SI+4).
|
||
If the name of the character device is desired, look at the eight bytes
|
||
starting at BP:SI+10.
|
||
|
||
|
||
HANDLING OF INVALID RESPONSES (DOS 3.x)
|
||
|
||
A) If IGNORE (AL=0) is specified by the user and IGNORE is not allowed
|
||
(bit 5=0), make the response FAIL (AL=3).
|
||
B) If RETRY (AL=1) is specified by the user and RETRY is not allowed
|
||
(bit 4=0), make the response FAIL (AL=3).
|
||
C) If FAIL (AL=3) is specified by the user and FAIL is not allowed (bit
|
||
3=0), make the response ABORT. (AL=2)
|
||
|
||
|
||
|
||
|
||
Interrupt 25h Absolute Disk Read
|
||
Interrupt 26h Absolute Disk Write
|
||
(0:0094h, 0:0098h)
|
||
These transfer control directly to the device driver. On return, the original
|
||
flags are still on the stack (put there by the INT instruction). This is
|
||
necessary because return information is passed back in the current flags.
|
||
The number of sectors specified is transferred between the given drive and the
|
||
transfer address. Logical sector numbers are obtained by numbering each sector
|
||
sequentially starting from track 0, head 0, sector 1 (logical sector 0) and
|
||
continuing along the same head, then to the next head until the last sector on
|
||
the last head of the track is counted. Thus, logical sector 1 is track 0, head
|
||
0, sector 2; logical sector 2 is track 0, head 0, sector 3; and so on. Numbering
|
||
then continues wih sector 1 on head 0 of the next track. Note that although the
|
||
sectors are sequentially numbered (for example, sectors 2 and 3 on track 0 in
|
||
the example above), they may not be physically adjacent on disk, due to
|
||
interleaving. Note that the mapping is different from that used by DOS 1.10 for
|
||
dual-sided diskettes.
|
||
|
||
The request is as follows:
|
||
|
||
int 25 for Absolute Disk Read,
|
||
int 26 for Absolute Disk Write
|
||
entry AL drive number (0=A:, 1=B:, etc)
|
||
CX number of sectors to read
|
||
DS:BX disk transfer address (buffer)
|
||
DX first relative sector to read - beginning logical sector number
|
||
return CF set if error
|
||
AL error code issued to int 24h in low half of DI
|
||
AH 01h bad command
|
||
02h bad address mark
|
||
03h write-protected disk
|
||
04h requested sector not found
|
||
08h DMA failure
|
||
10h data error (bad CRC)
|
||
20h controller failed
|
||
40h seek operation failed
|
||
80h attachment failed to respond
|
||
note 1) Original flags on stack! Be sure to pop the stack to prevent
|
||
uncontrolled growth
|
||
2) Ints 25 and 26 will try rereading a disk if they get an error the first
|
||
time.
|
||
3) All registers except the segment registers are destroyed by these calls
|
||
|
||
|
||
|
||
Interrupt 27h Terminate And Stay Resident
|
||
(0:009Ch) (obsolete)
|
||
This vector is used by programs that are to remain resident when COMMAND.COM
|
||
regains control.
|
||
After initializing itself, the program must set DX to its last address plus
|
||
one relative to the program's initial DS or ES value (the offset at which other
|
||
programs can be loaded), then execute interrupt 27h. DOS then considers the
|
||
program as an extension of itself, so the program is not overlaid when other
|
||
programs are executed. This is useful for loading programs such as utilities
|
||
and interrupt handlers that must remain resident.
|
||
|
||
entry CS current program segment
|
||
DX last program byte + 1
|
||
return none
|
||
note 1) This interrupt must not be used by .EXE programs that are loaded into
|
||
the high end of memory.
|
||
2) This interrupt restores the interrupt 22h, 23h, and 24h vectors in the
|
||
same manner as interrupt 20h. Therefore, it cannot be used to install
|
||
permanently resident Ctrl-Break or critical error handler routines.
|
||
3) The maximum size of memory that can be made resident by this method is
|
||
64K.
|
||
4) Memory can be more efficiently used if the block containing a copy of
|
||
the environment is deallocated before terminating. This can be done by
|
||
loading ES with the segment contained in 2Ch of the PSP, and issuing
|
||
function call 49h (Free Allocated Memory).
|
||
5) DOS function call 4Ch allows a program to pass a completion code to DOS,
|
||
which can be interpreted with processing (see function call 31h).
|
||
6) Terminate and stay resident programs do not close files.
|
||
7) Int 21, function 31h is the preferred method to cause a program to
|
||
remain resident because this allows return information to be passed and
|
||
allows a program larger than 64K to remain resident.
|
||
|
||
|
||
|
||
Interrupt 28h (not documented by Microsoft)
|
||
* DOS Idle Interrupt
|
||
This interrupt is continuously called by DOS itself whenever it is in a wait
|
||
state (i.e., when it is waiting for keyboard input) during a function call of
|
||
01h through 0Ch. DOS uses 3 separate internal stacks: one for calls 01h through
|
||
0Ch; another for calls 0Dh and above; and a third for calls 01h through 0Ch when
|
||
a Critical Error is in progress. When int 28h is called, any calls above 0Ch can
|
||
be executed without destroying the internal stack used by DOS at the time.
|
||
It is used primarily by the PRINT.COM routines, but any number of other
|
||
routines can 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.
|
||
Int 28h is being issued it is usually safe to do DOS calls. You won't get int
|
||
28hs if a program is running that doesn't do its keyboard input through DOS. You
|
||
should rely on the timer interrupt for these.
|
||
Int 28h is not called at all when any non-trivial foreground task is running.
|
||
As soon as a foreground program has a file open, INT28 no longer gets called.
|
||
Could make a good driver for for abackground program that really works as long
|
||
as there is nothing else going on in the machine.
|
||
|
||
entry no parameters availible
|
||
return none
|
||
note 1) The int 28h handler may invoke any int 21h function except functions
|
||
00h through 0Ch (and 50h/51h under DOS 2.x).
|
||
2) Apparently int 28h is also called during screen writes
|
||
3) Until some program installs its own routine, this interrupt vector
|
||
simply points to an IRET opcode.
|
||
4) Supported in OS/2 1.0's DOS Compatibility Box
|
||
|
||
|
||
Interrupt 29h (not documented by Microsoft)
|
||
* Internal - Quick Screen Output
|
||
|
||
This method is extremely fast (much faster than DOS 21h subfunctions 2 and 9,
|
||
for example), and it is portable, even to "non-compatible" MS-DOS computers.
|
||
|
||
entry AL character to output to screen
|
||
return unknown
|
||
note 1) Documented by Digital Research's DOS Reference as provided with the
|
||
DEC Rainbow
|
||
2) If ANSI.SYS is installed, character output is filtered through it.
|
||
3) Works on the IBM PC and compatibles, Wang PC, HP-150 and Vectra, DEC
|
||
Rainbow, NEC APC, Texas Instruments PC and others
|
||
4) This interrupt is called from the DOS's 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".
|
||
5) This call has been tested with MSDOS 2.11, PCDOS 2.1, PCDOS 3.1, PCDOS
|
||
3.2, and PCDOS 3.3.
|
||
6) Used in IBMBIO.COM as a vector to int 10, function 0Eh (write TTY)
|
||
followed by an IRET.
|
||
|
||
|
||
|
||
Interrupt 2Ah Microsoft Networks - Session Layer Interrupt
|
||
* (not documented by Microsoft)
|
||
|
||
entry AH 00h check to see if network BIOS installed
|
||
return: AH <> 0 if installed
|
||
01h execute NETBIOS request
|
||
02h set net printer mode
|
||
03h get shared-device status (check direct I/O)
|
||
AL 00h
|
||
DS:SI pointer to ASCIIZ disk device name
|
||
return CF 0 if allowed
|
||
04h execute NETBIOS
|
||
AL 0 for error retry
|
||
1 for no retry
|
||
ES:BX pointer to ncb
|
||
return AX 0 for no error
|
||
AH 1 if error
|
||
AL error code
|
||
05h get network resource information
|
||
AL 00h
|
||
return AX reserved
|
||
BX number of network names
|
||
CX number of commands
|
||
DX number of sessions
|
||
82h unknown
|
||
return ??
|
||
note called by the int 21h function dispatcher in DOS 3.10
|
||
|
||
|
||
Interrupt 2Bh (not documented by Microsoft)
|
||
* Unknown - Internal Routine for DOS (IRET)
|
||
|
||
|
||
Interrupt 2Ch (not documented by Microsoft)
|
||
* Unknown - Internal Routine for DOS (IRET)
|
||
|
||
|
||
Interrupt 2Dh (not documented by Microsoft)
|
||
* Unknown - Internal Routine for DOS (IRET)
|
||
|
||
|
||
Interrupt 2Eh (undocumented by Microsoft)
|
||
* Internal Routine for DOS (Alternate EXEC)
|
||
|
||
This interrupt passes a command line addressed by DS:SI to COMMAND.COM. The
|
||
command line must be formatted just like the unformatted parameter area of a
|
||
Program Segment Prefix. That is, the first byte must be a count of characters,
|
||
and the second and subsequent bytes must be a command line with parameters,
|
||
terminated by a carriage return character.
|
||
When executed, int 2Eh will reload the transient part of the command
|
||
interpreter if it is not currently in memory. If called from a program that
|
||
was called from a batch file, it will abort the batch file. If executed from a
|
||
program which has been spawned by the EXEC function, it will abort the whole
|
||
chain and probably lock up the computer. Int 2Eh also destroys all registers
|
||
including the stack pointer.
|
||
Int 2Eh is called from the transient portion of the program to reset the DOS
|
||
PSP pointers using the above Functions #81 & #80, and then reenters the
|
||
resident program.
|
||
When called with a valid command line, the command will be carried out by
|
||
COMMAND.COM just as though you had typed it in at the DOS prompt. Note that the
|
||
count does not include the carriage return. This is an elegant way to perform a
|
||
SET from an application program against the master environment block for
|
||
example.
|
||
|
||
entry DS:SI pointer to an ASCIIZ command line in the form:
|
||
count byte
|
||
ASCII string
|
||
carriage return
|
||
null byte
|
||
note 1) Destroys all registers including stack pointer
|
||
2) Seems to work OK in both DOS 2.x and 3.x
|
||
3) It is reportedly not used by DOS.
|
||
4) As far as known, int 2Eh is not used by DOS 3.1, although it was called
|
||
by COMMAND.COM of PCDOS 3.0, so it appears to be in 3.1 only for the
|
||
sake of compatibility.
|
||
|
||
|
||
|
||
Interrupt 2Fh Multiplex Interrupt
|
||
|
||
Interrupt 2Fh is the multiplex interrupt. A general interface is defined
|
||
between two processes. It is up to the specific application using interrupt
|
||
2Fh to define specific functions and parameters.
|
||
Every multiplex interrupt handler is assigned a specific multiplex number.
|
||
The multiplex number is specified in the AH register; the AH value tells which
|
||
program your request is directed toward. The specific function that the handler
|
||
is to perform is placed in the AL register. Other parameters are places in the
|
||
other registers as needed. The handlers are chained into the 2Fh interrupt
|
||
vector and the multiplex number is checked to see if any other application is
|
||
using the same multiplex number. There is no predefined method for assigning a
|
||
multiplex number to a handler. You must just pick one. To avoid a conflict if
|
||
two applications choose the same multiplex number, the multiplex numbers used by
|
||
an application should be patchable. In order to check for a previous
|
||
installation of the current application, you can search memory for a unique
|
||
string included in your program. If the value you wanted in AH is taken but
|
||
you don't find the string, then another application has grabbed that location.
|
||
Int 2Fh was not documented under DOS 2.x. There is no reason not to use int 2Fh
|
||
as the multiplex interrupt in DOS 2.x. The only problem is that DOS does not
|
||
initialize the int 2Fh vector, so when you try to chain to it like you are
|
||
supposed to, it will crash. But if your program checks the vector for being zero
|
||
and doesn't chain in that case, it will work for you in 2.x just the same as
|
||
3.x.
|
||
Int 2Fh doesn't require any support from DOS itself for it to be used in
|
||
application programs. It's not handled by DOS, but by the programs themselves.
|
||
The only support DOS has to provide is to initialize the vector to an IRET. DOS
|
||
3.2 does itself contain some int 2Fh handlers - it uses values of 08h, 13h, and
|
||
0F8h. There may be more.
|
||
|
||
|
||
entry AH 01h PRINT.COM
|
||
AL 00h PRINT Get Installed State
|
||
This call must be defined by all int 2Fh handlers. It
|
||
is used by the caller of the handler to determine if
|
||
the handler is present. On entry, AL=0. On return, AL
|
||
contains the installed state as follows:
|
||
return AL 0FFh installed
|
||
01h not installed, not OK to install
|
||
00h not installed, OK to install
|
||
|
||
|
||
01h PRINT Submit File
|
||
DS:DX pointer to submit packet
|
||
format BYTE level
|
||
DWORD pointer to ASCIIZ filename
|
||
return CF set if error
|
||
AX error code
|
||
note 1) A submit packet contains the level (BYTE) and a pointer
|
||
to the ASCIIZ string (DWORD in offset:segment form).
|
||
The ASCIIZ string must contain the drive, path, and
|
||
filename of the file you want to print. The filename
|
||
cannot contain global filename characters.
|
||
return CF set if error
|
||
AX error code
|
||
|
||
02h PRINT Cancel File
|
||
On entry, AL=2 and DS:DX points to the ASCIIZ string for
|
||
the print file you want to cancel. Global filename
|
||
characters are allowed in the filename.
|
||
DS:DX pointer to ASCIIZ file name to cancel (wildcards OK)
|
||
return CF set if error
|
||
AX error code
|
||
|
||
03h PRINT remove all files
|
||
return CF set if error
|
||
AX error code
|
||
|
||
04h PRINT hold queue/get status
|
||
This call holds the jobs in the print queue so that you
|
||
can scan the queue. Issuing any other code releases the
|
||
jobs. On entry, AL=4. On return, DX contains the error
|
||
count. DS:SI points to the print queue. The print queue
|
||
consists of a series of filename entries. Each entry is
|
||
64 bytes long. The first entry in the queue is the file
|
||
currently being printed. The end of the queue is marked
|
||
by the entry having a null as the first character.
|
||
return DX error count
|
||
DS:SI pointer to print queue (null-string terminated
|
||
list of 64-byte ASCIIZ filenames)
|
||
CF set 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
|
||
|
||
05h PRINT restart queue
|
||
return CF set if error
|
||
AX error code
|
||
|
||
AH 05h DOS 3.x critical error handler
|
||
AL 00h installation check
|
||
return AL 00h not installed, OK to install
|
||
01h not installed, can't install
|
||
0FFh installed
|
||
note This set of functions allows a user program to
|
||
partially or completely override the default
|
||
critical error handler in COMMAND.COM
|
||
AL 01h handle error - nonzero error code in AL
|
||
return CF clear
|
||
ES:DI pointer to ASCIIZ error message
|
||
CF set use default error handler
|
||
AL (?)
|
||
|
||
AH 06h ASSIGN
|
||
00h installation check
|
||
return AH <> 0 if installed
|
||
|
||
01h get memory segment
|
||
return ES segment of ASSIGN work area
|
||
|
||
AH 10h SHARE
|
||
00h installation check
|
||
return AL 00h not installed, OK to install
|
||
01h not installed, not OK to install
|
||
0FFh installed
|
||
|
||
AH 11h multiplex - network redirection
|
||
00h installation check
|
||
return AL 00h not installed, OK to install
|
||
01h not installed, not OK to install
|
||
0FFh installed
|
||
01h unknown
|
||
02h unknown
|
||
03h unknown
|
||
04h unknown
|
||
05h unknown
|
||
06h close remote file
|
||
07h unknown
|
||
08h unknown
|
||
09h unknown
|
||
0Ah unknown
|
||
STACK: WORD (?)
|
||
return CF set on error
|
||
0Bh unknown
|
||
STACK: WORD (?)
|
||
return CF set on error(?)
|
||
0Ch unknown
|
||
0Dh unknown
|
||
0Eh unknown
|
||
STACK: WORD (?)
|
||
return (?)
|
||
0Fh unknown
|
||
11h unknown
|
||
13h unknown
|
||
16h unknown
|
||
17h unknown
|
||
STACK: WORD (?)
|
||
return (?)
|
||
18h unknown
|
||
STACK: WORD (?)
|
||
return (?)
|
||
19h unknown
|
||
1Bh unknown
|
||
1Ch unknown
|
||
1Dh unknown
|
||
1Eh do redirection
|
||
STACK: WORD function to execute
|
||
return CF set on error
|
||
1Fh printer setup
|
||
STACK: WORD function(?)
|
||
return CF set on error(?)
|
||
20h unknown
|
||
21h unknown
|
||
22h unknown
|
||
23h unknown
|
||
24h unknown
|
||
25h unknown
|
||
STACK: WORD (?)
|
||
26h unknown
|
||
|
||
AH 12h multiplex, DOS 3.x internal services
|
||
00h installation check
|
||
return AL 0FFh for compatibility with other
|
||
int 2Fh functions
|
||
01h close file (?)
|
||
stack word value - unknown
|
||
return BX unknown
|
||
CX unknown
|
||
ES:DI pointer to unknown value
|
||
note Can be called only from within DOS
|
||
02h get interrupt address
|
||
stack: word vector number
|
||
return ES:BX pointer to interrupt vector
|
||
Stack unchanged
|
||
03h get DOS data segment
|
||
return DS segment of IBMDOS
|
||
04h normalize path separator
|
||
stack: word character to normalize
|
||
return AL normalized character (forward
|
||
slash turned to backslash)
|
||
Stack unchanged
|
||
05h output character
|
||
stack: word character to output
|
||
return Stack unchanged
|
||
note Can be called only from within DOS
|
||
06h invoke critical error
|
||
return AL 0-3 for Abort, Retry, Ignore,
|
||
Fail
|
||
note Can be called only from within DOS
|
||
07h move disk buffer (?)
|
||
DS:DI pointer to disk buffer
|
||
return buffer moved to end of buffer list
|
||
note Can be called only from within DOS
|
||
08h decrement word
|
||
ES:DI pointer to word to decrement
|
||
return AX new value of word
|
||
note Word pointed to by ES:DI decremented,
|
||
skipping zero
|
||
09h unknown
|
||
DS:DI pointer to disk buffer(?)
|
||
return (?)
|
||
note Can be called only from within DOS
|
||
0Ah unknown
|
||
note Can be called only from within DOS
|
||
0Bh unknown
|
||
ES:DI pointer to system file table entry(?)
|
||
return AX (?)
|
||
note Can be called only from within DOS
|
||
0Ch unknown
|
||
note Can be called only from within DOS
|
||
0Dh get date and time
|
||
return AX current date in packed format
|
||
DX current time in packed format
|
||
note Can be called only from within DOS
|
||
0Eh do something to all disk buffers (?)
|
||
return DS:DI pointer to first disk buffer
|
||
note can be called only from within DOS
|
||
0Fh unknown
|
||
DS:DI pointer to (?)
|
||
return DS:DI pointer to (?)
|
||
note 1) Can be called only from within DOS
|
||
2) Calls on function 1207h
|
||
10h find dirty/clean(?) buffer
|
||
DS:DI pointer to first disk buffer
|
||
return DS:DI pointer to first disk buffer
|
||
which has (?) flag clear
|
||
ZF clear if found
|
||
set if not found
|
||
11h normalize ASCIIZ filename
|
||
DS:SI pointer to ASCIZ filename to normalize
|
||
ES:DI ptr to buffer for normalized filename
|
||
return destination buffer filled with upper-
|
||
case filename, with slashes turned to
|
||
backslashes
|
||
12h get length of ASCIIZ string
|
||
ES:DI pointer to ASCIZ string
|
||
return CX length of string
|
||
13h uppercase character
|
||
stack: word character to convert to uppercase
|
||
return AL uppercase character
|
||
Stack unchanged
|
||
14h compare far pointers
|
||
DS:SI first pointer
|
||
ES:DI second pointer
|
||
return ZF set if pointers are equal
|
||
ZF clear if not equal
|
||
15h unknown
|
||
DS:DI pointer to disk buffer
|
||
stack: word (?)
|
||
return Stack unchanged
|
||
note Can be called only from within DOS
|
||
16h get address of system FCB
|
||
BX system file table entry number
|
||
return ES:DI pointer to system file table entry
|
||
17h set default drive (?)
|
||
stack: word drive (0 = A:, 1 = B:, etc)
|
||
return DS:SI pointer to drive data block for
|
||
specified drive
|
||
Stack unchanged
|
||
note Can be called only from within DOS
|
||
18h get something (?)
|
||
return DS:SI pointer to (?)
|
||
19h unknown
|
||
stack: word drive (0 = default, 1 = A:, etc)
|
||
return (?)
|
||
Stack unchanged
|
||
note 1) Can be called only from within DOS
|
||
2) Calls function 1217h
|
||
1Ah get file's drive
|
||
DS:SI pointer to filename
|
||
return AL drive
|
||
(0=default, 1=A:, etc, 0FFh=invalid)
|
||
1Bh set something (?)
|
||
CL unknown
|
||
return AL (?)
|
||
note Can be called only from within DOS
|
||
1Ch checksum memory
|
||
DS:SI pointer to start of memory to checksum
|
||
CX number of bytes
|
||
DX initial checksum
|
||
return DX checksum
|
||
note Can be called only from within DOS
|
||
1Dh unknown
|
||
DS:SI pointer to (?)
|
||
CX (?)
|
||
DX (?)
|
||
return AX (?)
|
||
CX (?)
|
||
DX = (?)
|
||
1Eh compare filenames
|
||
DS:SI pointer to first ASCIIZ filename
|
||
ES:DI pointer to second ASCIIZ filename
|
||
return ZF set if filenames equivalent
|
||
clear if not
|
||
1Fh build drive info block
|
||
stack: word drive letter
|
||
return ES:DI pointer to drive info block
|
||
(will be overwritten by next call)
|
||
Stack unchanged
|
||
note Can be called only from within DOS
|
||
20h get system file table number
|
||
BX file handle
|
||
return CF set on error
|
||
AL 6 (invalid file handle)
|
||
CF clear if successful
|
||
byte ES:[DI] = system file table entry
|
||
number for file handle
|
||
21h unknown
|
||
DS:SI pointer to (?)
|
||
return (?)
|
||
note Can be called only from within DOS
|
||
22h unknown
|
||
SS:SI pointer to (?)
|
||
return nothing(?)
|
||
note Can be called only from within DOS
|
||
23h check if character device (?)
|
||
return DS:SI pointer to device driver with
|
||
same name as (?)
|
||
note Can be called only from within DOS
|
||
24h delay
|
||
return after delay of (?) ms
|
||
note Can be called only from within DOS
|
||
25h get length of ASCIIZ string
|
||
DS:SI pointer to ASCIIZ string
|
||
return CX length of string
|
||
|
||
AH 43h Microsoft Extended Memory Specification (XMS)
|
||
|
||
AH 64h SCRNSAV2.COM
|
||
AL 00h installation check
|
||
return AL 00h not installed
|
||
0FFh installed
|
||
note SCRNSAV2.COM is a screen saver for PS/2's with
|
||
VGA by Alan Ballard
|
||
|
||
AH 7Ah Novell NetWare
|
||
AL 00h installation check
|
||
note Returns address of entry point for IPX and SPX
|
||
|
||
AH 0AAh VIDCLOCK.COM
|
||
AL 00h installation check
|
||
return AL 00h not installed
|
||
0FFh installed
|
||
note VIDCLOCK.COM is a memory-resident clock by
|
||
Thomas G. Hanlin III
|
||
|
||
AH 0B7h APPEND
|
||
AL 00h APPEND installation check
|
||
return AH <> 0 if installed
|
||
01h APPEND - unknown
|
||
02h APPEND - version check
|
||
|
||
AH 0B8h Microsoft Networks
|
||
AL 00h network program installation check
|
||
return AH <> 0 if installed
|
||
BX installed component flags (test in this
|
||
order!)
|
||
bit 6 server
|
||
bit 2 messenger
|
||
bit 7 receiver
|
||
bit 3 redirector
|
||
01h unknown
|
||
02h unknown
|
||
03h get current POST address
|
||
return ES:BX POST address
|
||
04h set new POST address
|
||
ES:BX new POST address
|
||
09h version check
|
||
|
||
AH 0BBh Network functions
|
||
AL 00h net command installation check
|
||
03h get server POST address
|
||
04h get server POST address
|
||
|
||
AH 0F7h AUTOPARK.COM (PD TSR hard disk parking utility)
|
||
AL 00h installation check
|
||
return AL 00h not installed
|
||
0FFh installed
|
||
note AUTOPARK is a TSR HD parker by Alan D. Jones
|
||
01h set parking delay
|
||
BX:CX 32 bit count of 55ms timer ticks
|
||
|
||
return AX Error
|
||
Codes Description
|
||
01h invalid function number
|
||
02h file not found
|
||
03h path not found
|
||
04h too many open files
|
||
05h access denied
|
||
06h invalid handle
|
||
08h queue full
|
||
09h busy
|
||
0Ch name too long
|
||
0Fh invalid drive was specified
|
||
CF clear (0) if OK
|
||
set (1) if error - error returned in AX
|
||
note 1) The multiplex numbers AH=0h through AH=7Fh are reserved for DOS.
|
||
Applications should use multiplex numbers 80h through 0FFh.
|
||
2) When in the chain for int 2Fh, if your code calls DOS or if you execute
|
||
with interrupts enabled, your code must be reentrant/recursive.
|
||
|
||
|
||
|
||
Interrupt 30h (not a vector!) far jump instruction for CP/M-style calls
|
||
|
||
|
||
Interrupt 31h Unknown
|
||
note The CALL 5 entry point does a FAR jump to here
|
||
|
||
|
||
Interrupt 32h Unknown
|
||
|
||
|
||
|
||
|
||
Interrupt 33h Used by Microsoft Mouse Driver
|
||
Function Calls
|
||
|
||
00h Reset Driver and Read Status
|
||
entry AH 00h
|
||
return AH status
|
||
0 hardware/driver not installed
|
||
-1 hardware/driver installed
|
||
BX number of buttons
|
||
-1 two buttons
|
||
0 other than two
|
||
3 Mouse Systems mouse
|
||
|
||
01h Show Mouse Cursor
|
||
entry AH 01h
|
||
return unknown
|
||
|
||
02h Hide Mouse Cursor
|
||
entry AH 02h
|
||
return unknown
|
||
note multiple calls to hide the cursor will require multiple calls
|
||
to function 01h to unhide it.
|
||
|
||
03h Return Position and Button Status
|
||
entry AH 03h
|
||
return BX button status
|
||
bit 0 left button pressed if 1
|
||
bit 1 right button pressed if 1
|
||
bit 2 middle button pressed if 1 (Mouse Systems mouse)
|
||
CX column
|
||
DX row
|
||
|
||
04h Position Mouse Cursor
|
||
entry AH 04h
|
||
CX column
|
||
DX row
|
||
return unknown
|
||
|
||
05h Return Button Press Data
|
||
entry AH 05h
|
||
BX button
|
||
0 left
|
||
1 right
|
||
2 middle (Mouse Systems mouse)
|
||
return AH button states
|
||
bit 0 left button pressed if 1
|
||
bit 1 right button pressed if 1
|
||
bit 2 middle button pressed if 1 (Mouse Systems mouse)
|
||
BX no. of times specified button pressed since last call
|
||
CX column at time specified button was last pressed
|
||
DX row at time specified button was last pressed
|
||
|
||
06h Return Button Release Data
|
||
entry AH 06h
|
||
BX button
|
||
0 left
|
||
1 right
|
||
2 middle (Mouse Systems mouse)
|
||
return AH button states
|
||
bit 0 left button pressed if 1
|
||
bit 1 right button pressed if 1
|
||
bit 2 middle button pressed if 1 (Mouse Systems mouse)
|
||
BX no. of times specified button released since last call
|
||
CX column at time specified button was last released
|
||
DX row at time specified button was last released
|
||
|
||
07h Define Horizontal Curos Range
|
||
entry AH 0007h
|
||
CX minimum column
|
||
DX maximum column
|
||
return unknown
|
||
|
||
08h Define Vertical Cursor Range
|
||
entry AH 08h
|
||
CX minimum row
|
||
DX maximum row
|
||
return unknown
|
||
|
||
09h Define Graphics Cursor
|
||
entry AH 09h
|
||
BX column of cursor hot spot in bitmap (-16 to 16)
|
||
CX row of cursor hot spot (-16 to 16)
|
||
ES:DX pointer to bitmap
|
||
16 words screen mask
|
||
16 words cursor mask
|
||
return unknown
|
||
note Each word defines the sixteen pixels of a row, low bit
|
||
rightmost
|
||
|
||
0Ah Define Text Cursor
|
||
entry AH 0Ah
|
||
BX hardware/software text cursor
|
||
00h software
|
||
CX screen mask
|
||
DX cursor mask
|
||
01h hardware
|
||
CX start scan line
|
||
DX end scan line
|
||
return unknown
|
||
note When the software cursor is selected, the char/attribute data
|
||
at the current screen position is ANDed with the screen mask
|
||
and the with the cursor mask
|
||
|
||
0BH Read Motion Counters
|
||
entry AH 0Bh
|
||
return CX number of mickeys mouse moved horiz. since last call
|
||
DX number of mickeys mouse moved vertically
|
||
note 1) A mickey is the smallest increment the mouse can sense.
|
||
Positive values indicate up/right
|
||
|
||
0Ch Define Interrupt Subroutine Parameters
|
||
entry AH 0Ch
|
||
CX call mask bit
|
||
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
|
||
bit 5 call if middle button pressed (Mouse Systems)
|
||
bit 6 call if middle button released (Mouse Systems)
|
||
ES:DX address of FAR routine
|
||
return unknown
|
||
note when the subroutine is called, it is passed these values:
|
||
AH 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
|
||
|
||
0Dh Light Pen Emulation On
|
||
entry AH 0Dh
|
||
return unknown
|
||
|
||
0Eh Light Pen Emulation Off
|
||
entry AH 0Eh
|
||
return unknown
|
||
|
||
0Fh Define Mickey/Pixel Ratio
|
||
entry AH 0Fh
|
||
CX number of mickeys per 8 pixels horizontally
|
||
DX number of mickeys per 8 pixels vertically
|
||
return unknown
|
||
|
||
10h Define Screen Region for Updating
|
||
entry AH 10h
|
||
CX,DX X,Y coordinates of upper left corner
|
||
SI,DI X,Y coordinates of lower right corner
|
||
return unknown
|
||
note Mouse cursor is hidden during updating, and needs to be
|
||
explicitly turned on again
|
||
|
||
11h not documented by Microsoft
|
||
|
||
12h Set Large Graphics Cursor Block
|
||
AH 12h
|
||
BH cursor width in words
|
||
CH rows in cursor
|
||
BL horizontal hot spot (-16 to 16)
|
||
CL vertical hot spot (-16 to 16)
|
||
ES:DX pointer to bit map of screen and cursor maps
|
||
return AH -1 if successful
|
||
note PC Mouse. Not dodcumented by Microsoft
|
||
|
||
13h Define Double-Speed Threshold
|
||
entry AH 13h
|
||
DX threshold speed in mickeys/second,
|
||
0 = default of 64/second
|
||
return unknown
|
||
note If speed exceeds threshold, the cursor's on-screen motion
|
||
is doubled
|
||
|
||
14h Exchange Interrupt Subroutines
|
||
entry AH 14h
|
||
return unknown
|
||
|
||
15h Return Drive Storage Requirements
|
||
entry AH 15h
|
||
return BX size of buffer needed to store driver state
|
||
|
||
16h Save Driver State
|
||
entry AH 16h
|
||
ES:DX pointer to buffer
|
||
return unknown
|
||
|
||
17h Restore Driver State
|
||
entry AH 17h
|
||
ES:DX pointer to buffer containing saved state
|
||
return unknown
|
||
|
||
18h not documented by Microsoft
|
||
|
||
19h not documented by Microsoft
|
||
|
||
1Ah not documented by Microsoft
|
||
|
||
1Bh not documented by Microsoft
|
||
|
||
1Ch not documented by Microsoft
|
||
|
||
1Dh Define Display Page Number
|
||
entry AH 1Dh
|
||
|
||
1Eh Return Display Page Number
|
||
entry AH 1Eh
|
||
return unknown
|
||
|
||
42h PCMouse - Get MSmouse Storage Requirements
|
||
AH 42h
|
||
return AX 0FFFFh successful
|
||
BX buffer size in bytes for functions 50h and 52h
|
||
00h MSmouse not installed
|
||
42h functions 42h, 50h, and 52h not supported
|
||
|
||
52h PCMouse - Save MSmouse State
|
||
entry AH 50h
|
||
BX buffer size
|
||
ES:DX pointer to buffer
|
||
return AX 0FFFFh if successful
|
||
|
||
52h PCMouse - restore MSmouse state
|
||
entry AH 52h
|
||
BX buffer size
|
||
ES:DX pointer to buffer
|
||
return AX 0FFFFh if successful
|
||
|
||
|
||
Int 33: In addition, the following functions are appended to BIOS int 10h and
|
||
implemented as the EGA Register Interface Library:
|
||
|
||
0F0h read one register
|
||
0F1h write one register
|
||
0F2h read consecutive register range
|
||
0F3h write consecutive register range
|
||
0F4h read non-consecutive register set
|
||
0F5h write non-consecutive register set
|
||
0F6h revert to default register values
|
||
0F7h define default register values
|
||
0FAh get driver status
|
||
|
||
|
||
|
||
Interrupt 34h Turbo C/Microsoft languages - Floating Point emulation
|
||
This interrupt emulates opcode 0D8h
|
||
|
||
Interrupt 35h Turbo C/Microsoft languages - Floating Point emulation
|
||
This interrupt emulates opcode 0D9h
|
||
|
||
Interrupt 36h Turbo C/Microsoft languages - Floating Point emulation
|
||
This interrupt emulates opcode 0DAh
|
||
|
||
Interrupt 37h Turbo C/Microsoft languages - Floating Point emulation
|
||
This interrupt emulates opcode 0DBh
|
||
|
||
Interrupt 38h Turbo C/Microsoft languages - Floating Point emulation
|
||
This interrupt emulates opcode 0DCh
|
||
|
||
Interrupt 39h Turbo C/Microsoft languages - Floating Point emulation
|
||
This interrupt emulates opcode 0DDh
|
||
|
||
Interrupt 3Ah Turbo C/Microsoft languages - Floating Point emulation
|
||
This interrupt emulates opcode 0DEh
|
||
|
||
Interrupt 3Bh Turbo C/Microsoft languages - Floating Point emulation
|
||
This interrupt emulates opcode 0DFh
|
||
|
||
Interrupt 3Ch Turbo C/Microsoft languages - Floating Point emulation
|
||
This int emulates instructions with an ES segment override
|
||
|
||
Interrupt 3Dh Turbo C/Microsoft languages - Floating Point emulation
|
||
This interrupt emulates a standalone FWAIT instruction
|
||
|
||
Interrupt 3Eh Turbo C/Microsoft languages - Floating Point emulation
|
||
|
||
Interrupt 3Fh Overlay manager interrupt (Microsoft LINK.EXE)
|
||
|
||
Interrupt 40h Hard Disk BIOS
|
||
Pointer to disk BIOS entry when a hard disk controller is
|
||
installed. The BIOS routines use int 30h to revector the
|
||
diskette handler (original int 13h) here so int 40 may be used
|
||
for hard disk control
|
||
|
||
Interrupt 41h Hard Disk Parameters (XT,AT,XT2,XT286,PS except ESDI disks)
|
||
Pointer to first Hard Disk Parameter Block, normally located
|
||
in the controller card's ROM. This table may be copied to RAM
|
||
and changed, and this pointer revectored to the new table.
|
||
note 1) format of parameter table is:
|
||
dw cylinders
|
||
db heads
|
||
dw starting reduced write current cylinder (XT only, 0 for others)
|
||
db maximum ECC burst length
|
||
db 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
|
||
db standard timeout (XT only, 0 for others)
|
||
db formatting timeout (XT only, 0 for others)
|
||
db timeout for checking drive (XT only, 0 for others)
|
||
dw landing zone (AT, PS/2)
|
||
db sectors/track (AT, PS/2)
|
||
db 0
|
||
2) normally vectored to ROM table when system is initialized.
|
||
|
||
|
||
Interrupt 42h Pointer to screen BIOS entry (EGA, VGA, PS/2)
|
||
Relocated (by EGA, etc.) video handler (original int 10h).
|
||
Revectors int 10 calls to EGA BIOS.
|
||
|
||
|
||
Interrupt 43h Pointer to EGA initialization parameter table. The POST
|
||
initializes this vector pointing to the default table located
|
||
in the EGA ROM BIOS. (PC-2 and up). Not initialized if EGA not
|
||
present.
|
||
|
||
|
||
Interrupt 44h Pointer to EGA graphics character table (also PCjr). This
|
||
(0:0110h) table contains the dot patterns for the first 128 characters
|
||
in video modes 4,5, and 6, and all 256 characters in all
|
||
additional graphics modes. Not initialized if EGA not present.
|
||
2) EGA/VGA/CONV/PS - EGA/PCjr fonts, characters 00h to 7Fh
|
||
3) Novell NetWare - High-Level Language API
|
||
|
||
|
||
Interrupt 45h Reserved by IBM (not initialized)
|
||
|
||
Interrupt 46h Pointer to second hard disk, parameter block (AT, XT/286, PS/2)
|
||
(see int 41h) (except ESDI hard disks) (not initialized unless
|
||
specific user software calls for it)
|
||
|
||
Interrupt 47h Reserved by IBM (not initialized)
|
||
|
||
Interrupt 48h Cordless Keyboard Translation (PCjr, XT [never delivered])
|
||
(0:0120h) This vector points to code to translate the cordless keyboard
|
||
scancodes into normal 83-key values. The translated scancodes
|
||
are then passed to int 9. (not initialized on PC or AT)
|
||
|
||
Interrupt 49h Non-keyboard Scan Code Translation Table Address (PCjr)
|
||
(0:0124h) This interrupt has the address of a table used to translate
|
||
non-keyboard scancodes (greater than 85 excepting 255). This
|
||
interrupt can be revectored by a user application. IBM
|
||
recommends that the default table be stored at the beginning
|
||
of an application that required revectoring this interrupt,
|
||
and that the default table be restored when the application
|
||
terminates. (not initialized on PC or AT)
|
||
|
||
Interrupt 4Ah Real-Time Clock Alarm (Convertible, PS/2)
|
||
(not initialized on PC or AT)
|
||
Invoked by BIOS when real-time clock alarm occurs
|
||
|
||
Interrupt 4Bh Reserved by IBM (not initialized)
|
||
|
||
Interrupt 4Ch Reserved by IBM (not initialized)
|
||
|
||
Interrupt 4Dh Reserved by IBM (not initialized)
|
||
|
||
Interrupt 4Eh Reserved by IBM (not initialized)
|
||
|
||
Interrupt 4Fh Reserved by IBM (not initialized)
|
||
|
||
Interrupt 50-57 IRQ0-IRQ7 relocated by DesQview
|
||
(normally not initialized)
|
||
|
||
Interrupt 58h Reserved by IBM (not initialized)
|
||
|
||
Interrupt 59h Reserved by IBM (not initialized)
|
||
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 1) Int 59 is the means by which GSS*CGI language bindings
|
||
communicate with GSS*CGI device drivers and the GSS*CGI
|
||
device driver controller.
|
||
2) Also used by the IBM Graphic Development Toolkit
|
||
|
||
Interrupt 5Ah Reserved by IBM (not initialized)
|
||
|
||
Interrupt 5Bh Reserved by IBM (not initialized)
|
||
|
||
Interrupt 5Ah Cluster Adapter BIOS entry address
|
||
(normally not initialized)
|
||
|
||
Interrupt 5Bh Reserved by IBM (not initialized) (cluster adapter?)
|
||
|
||
Interrupt 5Ch NETBIOS interface entry port
|
||
ES:BX pointer to network control block
|
||
note 1) When the NETBIOS is installed, interrupts 13 and 17 are interrupted by
|
||
the NETBIOS; interrupt 18 is moved to int 86 and one of int 2 or 3 is
|
||
used by NETBIOS. Also, NETBIOS extends the int 15 function 90 and 91h
|
||
functions (scheduler functions)
|
||
2) Normally not initialized.
|
||
3) TOPS network card uses DMA 1, 3 or none.
|
||
|
||
Interrupt 5Dh Reserved by IBM (not initialized)
|
||
|
||
Interrupt 5Eh Reserved by IBM (not initialized)
|
||
|
||
Interrupt 5Fh Reserved by IBM (not initialized)
|
||
|
||
Interrupt 60h-67h User Program Interrupts (availible for general use)
|
||
|
||
Interrupt 67h Used by Lotus-Intel-Microsoft Expanded Memory Specification
|
||
user and Ashton-Tate/Quadram/AST Enhanced Expanded Memory
|
||
specification (See Chapter 10)
|
||
|
||
Interrupt 68h Not Used (not initialized)
|
||
|
||
Interrupt 69h Not Used (not initialized)
|
||
|
||
Interrupt 6Ah Not Used (not initialized)
|
||
|
||
Interrupt 6Bh Not Used (not initialized)
|
||
|
||
Interrupt 6Ch System Resume Vector (Convertible) (not initialized on PC)
|
||
|
||
Interrupt 6Dh Not Used (not initialized)
|
||
|
||
Interrupt 6Fh Not Used (not initialized)
|
||
|
||
Interrupt 70h IRQ 8, Real Time Clock Interrupt (AT, XT/286, PS/2)
|
||
|
||
Interrupt 71h IRQ 9, Redirected to IRQ 8 (AT, XT/286, PS/2)
|
||
LAN Adapter 1 (rerouted to int 0Ah by BIOS)
|
||
|
||
Interrupt 72h IRQ 10 (AT, XT/286, PS/2) Reserved
|
||
|
||
Interrupt 73h IRQ 11 (AT, XT/286, PS/2) Reserved
|
||
|
||
Interrupt 74h IRQ 12 Mouse Interrupt (AT, XT/286, PS/2)
|
||
|
||
Interrupt 75h IRQ 13, Coprocessor Error, BIOS Redirect to int 2 (NMI) (AT)
|
||
|
||
Interrupt 76h IRQ 14, Hard Disk Controller (AT, XT/286, PS/2)
|
||
|
||
Interrupt 77h IRQ 15 (AT, XT/286, PS/2) Reserved
|
||
|
||
Interrupt 78h Not Used
|
||
|
||
Interrupt 79h Not Used
|
||
|
||
Interrupt 7Ah Novell NetWare - LOW-LEVEL API
|
||
|
||
Interrupt 7Bh-7Fh Not Used
|
||
|
||
Interrupt 80h-85h Reserved by BASIC
|
||
|
||
note interrupts 80h through ECh are apparently unused and not initialized.
|
||
|
||
Interrupt 86h Relocated by NETBIOS int 18
|
||
|
||
Interrupt 86h-0F0h Used by BASIC when BASIC interpreter is running
|
||
|
||
Intrerrupt 0E0h CP/M-86 function calls
|
||
|
||
Interrupt 0E4h Logitech Modula-2 v2.0 MONITOR
|
||
entry AX 05h monitor entry
|
||
06h monitor exit
|
||
BX priority
|
||
|
||
Interrupts 0F1h-0FFh (absolute addresses 3C4-3FF)
|
||
Location of Interprocess Communications Area
|
||
|
||
Interrupt 0F8h Set Shell Interrupt (OEM)
|
||
Set OEM handler for int 21h calls from 0F9h through 0FFh
|
||
entry AH 0F8h
|
||
DS:DX pointer to handler for Functions 0F9h thru 0FFh
|
||
note 1) To reset these calls, pass DS and DX with 0FFFFh. DOS is set up to
|
||
allow ONE handler for all 7 of these calls. Any call to these handlers
|
||
will result in the carry bit being set and AX will contain 1 if they are
|
||
not initialized. The handling routine is passed all registers just as
|
||
the user set them. The OEM handler routine should be exited through an
|
||
IRET.
|
||
2) 10 ms interval timer (Tandy?)
|
||
|
||
Interrupt 0F9h First of 8 SHELL service codes, reserved for OEM shell (WINDOW);
|
||
use like HP Vectra user interface?
|
||
|
||
Interrupt 0FAh USART ready (RS-232C)
|
||
|
||
Interrupt 0FBh USART RS ready (keyboard)
|
||
|
||
Interrupt 0FCh Unknown
|
||
|
||
Interrupt 0FDh reserved for user interrupt
|
||
|
||
Interrupt 0FEh AT/XT286/PS50+ - destroyed by return from protected mode
|
||
|
||
Interrupt 0FFh AT/XT286/PS50+ - destroyed by return from protected mode
|
||
|
||
CHAPTER 6
|
||
|
||
Programming Technical Reference - IBM
|
||
Copyright 1988, Dave Williams
|
||
|
||
DOS CONTROL BLOCKS AND WORK AREAS
|
||
|
||
When DOS loads a program, it first sets aside a section of memory for the
|
||
program called the program segment, or code segment. Then it constructs a
|
||
control block called the program segment prefix, or PSP, in the first 256
|
||
(100h) bytes. Usually, the program is loaded directly after the PSP at
|
||
100h.
|
||
The PSP contains various information used by DOS to help run the program.
|
||
The PSP is always located at offset 0 within the code segment. When a program
|
||
recieves control certain registers are set to point to the PSP. For a COM
|
||
file, all registers are set to point to the beginning of the PSP and the
|
||
program begins at 100h. For the more complex EXE file structures, only DS and
|
||
ES registers are set to point to the PSP. The linker passes the settings for
|
||
the DS, IP, SS, and SP registers and may set the starting location in CS:IP to
|
||
a location other than 100h.
|
||
|
||
|
||
|
||
IBMBIO provides an IRET instruction at absolute address 847h for use as a
|
||
dummy routine for interrupts that are not used by DOS. This lets the
|
||
interrupts do nothing until their vectors are rerouted to ttheir appropriate
|
||
handlers.
|
||
|
||
A storage block is used by DOS to record the amount and location of allocated
|
||
memory withion the machine's address spacd.
|
||
A storage block, a Program Segment Prefix, and an environment area are built
|
||
by FDOS for each program currently resident in the address space. The storage
|
||
block is used by DOS to record the address range of memory allocated to a
|
||
program. IOt us used by DOs to find th enext availible area to load a program
|
||
and to determine if there is a\enough memory to run that porogram. When a
|
||
memory area is in use, it is said to be allocated. Then the program ends, or
|
||
releases memory, it is said to bne deallocated.
|
||
A storage block contains a pointer ro rhe Program Segment Prefix assoiciated
|
||
with each program. This control block is constructed by IBMDOS for the purpose
|
||
opf providing stanfdardized areas for DOS/program communication., Within ghr
|
||
PSP are arsas which are used to save interrupt vectors, pass parameters to
|
||
the program, record disk directory information, and to buffer disk reads and
|
||
writes. This control block is 100h bytes in lengrth and is followed by the
|
||
program mopdule loaded by DOS.
|
||
The PSP contains a pointer to the environment area for that program. This
|
||
area contains a copy of the current DOS SET, PROMPT, COMSPEC, and PATH values
|
||
as well as any user-set variables. The program may examine and modify this
|
||
information as desired.
|
||
Each storage block is 10h bytes long, although only 5 bytes are currently
|
||
used by DOS. The first byte contains 4Dh (a capital M) to indicate that it
|
||
contains a pointer to the next storage block. A 5Ah (a capital Z) in the
|
||
first byte of a storage block indicatres there are no more storage blocks
|
||
following this one (it is the end of the chain). The identifier byte is
|
||
followeed by a 2 byte segment number for the associated PSP for that program.
|
||
The next 2 bytes contain the number of segments what are allocated to the
|
||
program. If this is not the last storage block, then another storage block
|
||
follows the allocated memory area.
|
||
When thge storage block contains zero for the nuymber of allocated segments,
|
||
then no storage is allocated to thius block and the next storage block
|
||
immediately follows this one. This can ha-p[en whjen memory is allocated and
|
||
then deallocated repeatedly.
|
||
IBMDOS constructs a storage block and PSP before loading the command
|
||
interpreter (default is COMMAND.COM).
|
||
|
||
|
||
If the copy of COMMAND.COM is a secondary copy, it will lack an environment
|
||
address as PSP+2Ch.
|
||
|
||
|
||
|
||
The Disk Transfer Area (DTA)
|
||
|
||
DOS uses an area in memory to contain the data for all file reads and writes
|
||
that are performed with FCB function calls. This are is known as the disk
|
||
transfer area. This disk transfer area (DTA) is sometimes called a buffer.
|
||
It can be located anywhere in the data area of your application program and
|
||
should be set by your program.
|
||
|
||
Only one DTA can be in effect at a time, so your program must tell DOS what
|
||
memory location to use before using any disk read or write functions. Use
|
||
function call 1Ah (Set Disk Transfer Address) to set the disk transfer address.
|
||
Use function call 2Fh (Get Disk Transfer Address) to get the disk transfer
|
||
address. Once set, DOS continues to use that area for all disk operations until
|
||
another function call 1Ah is issued to define a new DTA. When a program is given
|
||
control by COMMAND.COM, a default DTA large enough to hold 128 bytes is
|
||
established at 80h into the program's Program Segment Prefix.
|
||
|
||
For file reads and writes that are performed with the extended function calls,
|
||
there is no need to set a DTA address. Instead, specify a buffer address when
|
||
you issue the read or write call.
|
||
|
||
|
||
DOS Program Segment
|
||
|
||
When you enter an external command or call a program through the EXEC function
|
||
call, DOS determines the lowest availible address space to use as the start of
|
||
available memory for the program being started. This area is called the Program
|
||
Segment.
|
||
At offset 0 within the program segment, DOS builds the Program Segment Prefix
|
||
control block. EXEC loads the program after the Program Segment Prefix (at
|
||
offset 100h) and gives it control.
|
||
The program returns from EXEC by a jump to offset 0 in the Program Segment
|
||
Prefix, by issuing an int 20h, or by issuing an int 21h with register AH=00h or
|
||
4Ch, or by calling location 50h in the PSP with AH=00h or 4Ch.
|
||
It is the responsibility of all programs to ensure that the CS register
|
||
contains the segment address of the Program Segment Prefix when terminating by
|
||
any of these methods except call 4Ch.
|
||
|
||
All of these methods result in returning to the program that issued the EXEC.
|
||
During this returning process, interrupt vectors 22h, 23h, and 24h (Terminate,
|
||
Ctrl-Break, and Critical Error Exit addresses) are restored from the values
|
||
saved in the PSP of the terminating program. Control is then given to the
|
||
terminate address.
|
||
|
||
|
||
When a program receives control, the following conditions are in effect:
|
||
|
||
For all programs:
|
||
|
||
1) The segment address of the passed environment is contained at offset 2Ch in
|
||
the Program Segment Prefix.
|
||
|
||
2) The environment is a series of ASCII strings totalling less than 32k bytes
|
||
in the form: NAME=parameter The default environment is 160 bytes.
|
||
Each string is terminated by a byte of zeroes, and the entire set of strings
|
||
is terminated by abother byte of zeroes. Following the byte of zeroes that
|
||
terminates the set of environment string is a set of initial arguments passed
|
||
to a program that contains a word count followed by an ASCIIZ string. The
|
||
ASCIIZ string contains the drive, path, and filename.ext of the executable
|
||
program. Programs may use this area to determine where the program was loaded
|
||
from. The environment built by the command processor (and passed to all
|
||
programs it invokes) contains a COMSPEC=string at a minimum (the parameter on
|
||
COMSPEC is the path used by DOS to locate COMMAND.COM on disk). The last PATH
|
||
and PROMPT commands issued will also be in the environment, along with any
|
||
environment strings entered through the SET command.
|
||
The environment that you are passed is actually a copy of the invoking
|
||
process's environment. If your application terminates and stays resident
|
||
through int 27h, you should be aware that the copy of the environment passed
|
||
to you is static. That is, it will not change even if subsequent PATH,
|
||
PROMPT, or SET commands are issued.
|
||
|
||
The environment can be used to transfer information between processes or to
|
||
store strings for later use by application programs. The environment is
|
||
always located on a paragraph boundary. This is its format:
|
||
byte ASCIIZ string 1
|
||
byte ASCIIZ string 2
|
||
....
|
||
byte ASCIIZ string n
|
||
byte of zeros (0)
|
||
Typically the environment strings have the form:
|
||
parameter = value
|
||
Following the byte of zeros in the environment, a WORD indicates the number
|
||
of other strings following.
|
||
|
||
If the environment is part of an EXECed command interpreter, it is followed
|
||
by a copy of the DS:DX filename passed to the child process. A zero value
|
||
causes the newly created process to inherit the parent's environment.
|
||
|
||
3) Offset 80h in the PSP contains code to invoke the DOS function dispatcher.
|
||
Thus, by placing the desired function number in AH, a program can issue a
|
||
long call to PSP+50h to invoke a DOS function rather than issuing an int 21h.
|
||
|
||
4) The disk transfer address (DTA) is set to 80h (default DTA in PSP).
|
||
|
||
5) File Control Blocks 5Ch and 6Ch are formatted from the first two parameters
|
||
entered when the command was invoked. Note that if either parameter contained
|
||
a path name, then the corresponding FCB will contain only a valid drive
|
||
number. The filename field will not be valid.
|
||
|
||
6) An unformatted parameter area at 81h contains all the characters entered
|
||
after the command name (including leading and imbedded delimiters), with 80h
|
||
set to the number of characters. If the <, >, or | parameters were entered
|
||
on the command line, they (and the filenames associated with them) will not
|
||
appear in this area, because redirection of standard input and output is
|
||
transparent to applications.
|
||
|
||
(For EXE files only)
|
||
7) DS and ES registers are set to point to the PSP.
|
||
|
||
8) CS, IP, SS, and SP registers are set to the values passed by the linker.
|
||
|
||
(For COM files only)
|
||
9) For COM files, offset 6 (one word) contains the number of bytes availible in
|
||
the segment.
|
||
|
||
10) Register AX reflects the validity of drive specifiers entered with the
|
||
first two parameters as follows:
|
||
AL=0FFh is the first parameter contained an invalid drive specifier,
|
||
otherwise AL=00h.
|
||
AL=0FFh if the second parameter contained an invalid drive specifier,
|
||
otherwise AL=00h.
|
||
|
||
11) All four segment registers contain the segment address of the inital
|
||
allocation block, that starts within the PSP control block. All of user
|
||
memory is allocated to the program. If the program needs to invoke another
|
||
program through the EXEC function call (4Bh), it must first free some memory
|
||
through the SETBLOCK function call to provide space for the program being
|
||
invoked.
|
||
|
||
12) The Instruction Pointer (IP) is set to 100h.
|
||
|
||
13) The SP register is set to the end of the program's segment. The segment size
|
||
at offset 6 is rounded down to the paragraph size.
|
||
|
||
14) A word of zeroes is placed on top of the stack.
|
||
|
||
|
||
The PSP (with offsets in hexadecimal) is formatted as follows:
|
||
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||
<EFBFBD> P R O G R A M S E G M E N T P R E F I X <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> offset<65> size <20> C O N T E N T S <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 0000h <20> 2 bytes <20> int 20h <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 0002h <20> 2 bytes <20> segment address, end of allocation block <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 0004h <20> 1 byte <20> reserved, normally 0 <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 0005h <20> 5 bytes <20> long call to MSDOS function dispatcher <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 000Ah <20> 4 bytes <20> previous termination handler interrupt vector (int 22h) <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 000Eh <20> 4 bytes <20> previous contents of ctrl-C interrupt vector (int 23h) <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 0012h <20> 4 bytes <20> prev. critical error handler interrupt vector (int 24h) <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 0016h <20> 22 bytes <20> reserved for DOS <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 002Ch <20> 2 bytes <20> segment address of environment block <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 002Eh <20> 34 bytes <20> reserved, DOS work area <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<20> 4 bytes <20> stores the calling process's stack pointer when <20>
|
||
<20> <20> switching to DOS's internal stack. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 0050h <20> 3 bytes <20> int 21h, RETF instructions <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 0053h <20> 2 bytes <20> reserved <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 0055h <20> 7 bytes <20> reserved, or FCB#1 extension <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 005Ch <20> <20> default File Control Block #1 <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 006Ch <20> <20> default File Control Block #2 (overlaid if FCB #1 opened) <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 0080h <20> 1 byte <20> parameter length <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 0081h <20> <20> parameters <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 00FFh <20> 128 bytes<65> command tail and default Disk Transfer Area (DTA) <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
1. The first segment of availible memory is in segment (paragraph) form. For
|
||
example, 1000h would respresent 64k.
|
||
|
||
2. The word at offset 6 contains the number of bytes availible in the segment.
|
||
|
||
3. Offset 2Ch contains the segment address of the environment.
|
||
|
||
4. Programs must not alter any part of the PSP below offset 5Ch.
|
||
|
||
offset 0 contains hex bytes CD 20, the int 20h opcode. A program can end
|
||
by making a jump to this location when the CS points to the PSP.
|
||
For normal cases, int 21, function 4Ch should be used.
|
||
|
||
offset 2 contains the segment-paragraph address of the end of memory as
|
||
reported by DOS. (which may not be the same as the real end of RAM).
|
||
Multiply this number by 10h or 16 to get the amount of memory availible.
|
||
|
||
offset 4 reserved
|
||
|
||
offset 05 contains a long call to the DOS function dispatcher. Programs may
|
||
jump to this address instead of calling int 21 if they wish.
|
||
|
||
offsets 10, 14, 18 vectors
|
||
|
||
offset 2C is the segment:offset address of the environment for the program
|
||
using this particular PSP.
|
||
|
||
offset 2E The DWORD at PSP+2EH is used by DOS to store the calling process's
|
||
stack pointer when switching to DOS's own private stack - at the end of
|
||
a DOS function call, SS:SP is restored from this address.
|
||
|
||
offset 50h contains a long call to the DOS function dispatcher.
|
||
|
||
offsets 5C, 65, 6C contain FCB information for use with FCB function calls.
|
||
The first FCB may overlay the second if it is an extended call; your
|
||
program should revector these areas to a safe place if you intend to
|
||
use them.
|
||
|
||
offset 80h and 81h contain th elength and value of parameters passed on the
|
||
command line.
|
||
|
||
offset FF contains the DTA
|
||
|
||
|
||
|
||
|
||
STANDRD FILE CONTROL BLOCK
|
||
|
||
The standard file control block is defined as follows, with the offsets in
|
||
decimal:
|
||
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||
<EFBFBD> F I L E C O N T R O L B L O C K <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> Bytes <20> Function <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 0 <20> Drive number. For example: <20>
|
||
<EFBFBD> <20> Before open: 00h = default drive <20>
|
||
<EFBFBD> <20> 01h = drive A: <20>
|
||
<EFBFBD> <20> 02h = drive B: etc. <20>
|
||
<EFBFBD> <20> After open: 00h = drive C: <20>
|
||
<EFBFBD> <20> 01h = drive A: <20>
|
||
<EFBFBD> <20> 02h = drive B: etc. <20>
|
||
<EFBFBD> <20> 0 is replaced by the actual drive number during open. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1-8 <20> Filename, left justified with trailing blanks. If a reserved device <20>
|
||
<EFBFBD> <20> name is placed here (such as PRN) do not include the optional colon. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 9-11 <20> Filename extension, left justified with trailing blanks. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 12-13 <20> Current block number relative to beginning of file, starting with 0 <20>
|
||
<EFBFBD> <20> (set to 0 by the open function call). A block consists of 128 <20>
|
||
<EFBFBD> <20> records, each of the size specified in the logical record size field.<2E>
|
||
<EFBFBD> <20> The current block number is used with the current record field <20>
|
||
<EFBFBD> <20> (below) for sequential reads and writes. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 14-15 <20> Logical record size in bytes. Set to 80h by the OPEN function call. <20>
|
||
<EFBFBD> <20> If this is not correct, you must set the value because DOS uses it <20>
|
||
<EFBFBD> <20> to determine the proper locations in the file for all disk reads and <20>
|
||
<EFBFBD> <20> writes. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 16-19 <20> File size in bytes. In this 2 word field, the first word is the <20>
|
||
<EFBFBD> <20> low-order part of the size. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 20-21 <20> Date the file was created or last updated. The mm/dd/yy are mapped <20>
|
||
<EFBFBD> <20> as follows: <20>
|
||
<EFBFBD> <20> 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 <20>
|
||
<EFBFBD> <20> y y y y y y y m m m m d d d d d <20>
|
||
<EFBFBD> <20> where: mm is 1-12 <20>
|
||
<EFBFBD> <20> dd is 1-31 <20>
|
||
<EFBFBD> <20> yy is 0-119 (1980-2099) <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 22-31 <20> Reserved for system use. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 32 <20> Current relative record number (0-127) within the current block. <20>
|
||
<EFBFBD> <20> (See above). You must set this field before doing sequential <20>
|
||
<EFBFBD> <20> read/write operations to the diskette. This field is not initialized <20>
|
||
<EFBFBD> <20> by the open function call. <20>
|
||
<EFBFBD> <20> If the record size is less than 64 bytes, both words are used. <20>
|
||
<EFBFBD> <20> Otherwise, only the first 3 bytes are used. Note that if you use the <20>
|
||
<EFBFBD> <20> File Control Block at 5Ch in the program segment, the last byte of <20>
|
||
<EFBFBD> <20> the FCB overlaps the first byte of the unformatted parameter area. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
note 1) An unopened FCB consists of the FCB prefix (if used), drive number, and
|
||
filename.ext properly filled in. An open FCB is one in which the
|
||
remaining fields have been filled in by the CREAT or OPEN function
|
||
calls.
|
||
2) Bytes 0-5 and 32-36 must be set by the user program. Bytes 16-31 are set
|
||
by DOS and must not be changed by user programs.
|
||
3) All word fields are stored with the least significant byte first. For
|
||
example, a record length of 128 is stored as 80h at offset 14, and 00h
|
||
at offset 15.
|
||
|
||
|
||
|
||
EXTENDED FILE CONTROL BLOCK
|
||
|
||
The extended file control block is used to create or search for files in the
|
||
disk directory that have special attributes.
|
||
|
||
It adds a 7 byte prefix to the FCB, formatted as follows:
|
||
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||
<EFBFBD> E X T E N D E D F I L E C O N T R O L B L O C K <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> Bytes <20> Function <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 0 <20> Flag byte containing 0FFh to indicate an extended FCB. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1-6 <20> Reserved <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 6-7 <20> Attribute byte. Refer to function call 11h (search first) for <20>
|
||
<EFBFBD> <20> details on using the attribute bits during directory searches. This <20>
|
||
<EFBFBD> <20> function is present to allow applications to define their own files <20>
|
||
<EFBFBD> <20> as hidden (and thereby excluded from normal directory searches) and <20>
|
||
<EFBFBD> <20> to allow selective directory searches. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Any reference in the DOS function calls to an FCB, whether opened or unopened,
|
||
may use either a normal or extended FCB. If you are using an extended FCB, the
|
||
appropriate register should be set to the first byte of the prefix, rather than
|
||
the drive-number field.
|
||
|
||
|
||
|
||
MEMORY CONTROL BLOCKS
|
||
|
||
DOS keeps track of allocated and availible memory blocks, and provides three
|
||
function calls for application programs to communicate their memory needs to
|
||
DOS. These calls are 48h to allocate a memory block, 49h to free a previously
|
||
allocated memory block, and 4Ah (SETBLOCK) to change the size of an allocated
|
||
memory block.
|
||
|
||
|
||
CONTROL BLOCK
|
||
|
||
DOS manages memory as follows:
|
||
|
||
DOS build a control block for each block of memory, whether free or allocated.
|
||
For example, if a program issues an "allocate" (48h), DOS locates a block of
|
||
free memory that satisfies the request, and then "carves" the requested memory
|
||
out of that block. The requesting program is passed the location of the first
|
||
byte of the block that was allocated for it - a memory management control block,
|
||
describing the allocated block, has been built for the allocated block and a
|
||
second memory management control block describes the amount of space left in the
|
||
original free block of memory. When you do a setblock to shrink an allocated
|
||
block, DOS builds a memory management control block for the area being freed and
|
||
adds it to the chain of control blocks. Thus, any program that changed memory
|
||
that is not allocated to it stands a chance of destroying a DOS memory
|
||
management control block. This causes unpredictable results that don't show up
|
||
until an activity is performed where DOS uses its chain of control blocks. The
|
||
normal result is a memory allocation error, which means a system reset will be
|
||
required.
|
||
|
||
When a program (command or application program) is to be loaded, DOS uses the
|
||
EXEC function call 4Bh to perform the loading.
|
||
|
||
This is the same function call that is availible to applications programs for
|
||
loading other programs. This function call has two options:
|
||
|
||
Function 00h, to load and execute a program (this is what the command
|
||
processor uses to load and execute external commands)
|
||
|
||
Function 03h, to load an overlay (program) without executing it.
|
||
|
||
Although both functions perform their loading in the same way (relocation is
|
||
performed for EXE files) their handling of memory management is different.
|
||
|
||
|
||
FUNCTION 0: For function 0 to load and execute a program, EXEC first allocates
|
||
the largest availible block of memory (the new program's PSP will be at offset
|
||
0 in that block). Then EXEC loads the program. Thus, in most cases, the new
|
||
program owns all the memory from its PSP to the end of memory, including memory
|
||
occupied by the transient parent of COMMAND.COM. If the program were to issue
|
||
its own EXEC function call to load and execute another program, the request
|
||
would fail because no availible memory exists to load the new program into.
|
||
|
||
NOTE: For EXE programs, the amount of memory allocated is the size of the
|
||
program's memory image plus the value in the MAX_ALLOC field of the file's
|
||
header (offset 0Ch, if that much memory is availible. If not, EXEC
|
||
allocates the size of the program's memory image plus the value in the
|
||
MIN_ALLOC field in the header (offset 0Ah). These fields are set by the
|
||
Linker).
|
||
|
||
A well-behaved program uses the SETBLOCK function call when it receives
|
||
control, to shrink its allocated memory block down to the size it really needs.
|
||
A COM program should remember to set up its own stack before doing the SETBLOCK,
|
||
since it is likely that the default stack supplied by DOS lies in the area of
|
||
memory being used. This frees unneeded memory, which can be used for loading
|
||
other programs.
|
||
|
||
If the program requires additional memory during processing, it can obtain
|
||
the memory using the allocate function call and later free it using the free
|
||
memory function call.
|
||
|
||
When a program is loaded using EXEC function call 00h exits, its initial
|
||
allocation block (the block beginning with its PSP) is automatically freed
|
||
before the calling program regains control. It is the responsibility of all
|
||
programs to free any memory they allocate before exiting to the calling
|
||
program.
|
||
|
||
|
||
FUNCTION 3: For function 3, to load an overlay, no PSP is built and EXEC
|
||
assumes the calling program has already allocated memory to load the new program
|
||
into - it will NOT allocate memory for it. Thus the calling program should
|
||
either allow for the loading of overlays when it determines the amount of memory
|
||
to keep when issuing the SETBLOCK call, or should initially free as much memory
|
||
as possible. The calling program should then allocate a block (based on the size
|
||
of the program to be loaded) to hold the program that will be loaded using the
|
||
"load overlay" call. Note that "load overlay" does not check to see if the
|
||
calling program actually owns the memory block it has been instructed to load
|
||
into - it assumes the calling program has followed the rules. If the calling
|
||
program does not own the memory into which the overlay is being loaded, there is
|
||
a chance the program being loaded will overlay one of the control blocks that
|
||
DOS uses to keep track of memory blocks.
|
||
|
||
Programs loaded using function 3 should not issue any SETBLOCK calls since
|
||
they don't own the memory they are operating in. (This memory is owned by the
|
||
calling program)
|
||
|
||
Because programs loaded using function 3 are given control directly by (and
|
||
return contrrol directly to) the calling program, no memory is automatically
|
||
freed when the called program exits. It is up to the calling program to
|
||
determine the disposition of the memory that had been occupied by the exiting
|
||
program. Note that if the exiting program had itself allocated any memory, it
|
||
is responsible for freeing that memory before exiting.
|
||
|
||
|
||
MEMORY CONTROL BLOCKS
|
||
|
||
Only the first 5 bytes of the memory control block are used. The first byte
|
||
will always have the value of 4Dh or 5Ah. The value 5Ah indicates the block is
|
||
the last in a chain, all memory above it is unused. 4Dh means that the block is
|
||
intermediate in a chain, the memory above it belongs to the next program or to
|
||
DOS.
|
||
|
||
The next two bytes hold the PSP segment address of the program that owns the
|
||
corresponding block of memory. A value of 0 means the block is free to be
|
||
claimed, any other value represents a segment address. Bytes 3 and 4 indicate
|
||
the size in paragraphs of the memory block. If you know the address of the first
|
||
block, you can find the next block by adding the length of the memory block plus
|
||
1 to the segment address of the control block.
|
||
|
||
Finding the first block can be difficult, as this varies according to the DOS
|
||
version and the configuration.
|
||
|
||
The remaining 11 bytes are not currently used by DOS, and may contain "trash"
|
||
characters left in memory from previous applications.
|
||
|
||
If DOS determines that the allocation chain of memory control blocks has been
|
||
corrupted, it will halt the system and display the message "Memory Allocation
|
||
Error", and the system will halt, requiring a reboot.
|
||
|
||
Each memory block consists of a signature byte (4Dh or 5Ah) then a word which
|
||
is the PSP value of the owner of the block (which allocated it), followed by a
|
||
word which is the size in paragraphs of the block. The last block has a
|
||
signature of 5Ah. All others have 4Dh. If the owner is 0000 then the block is
|
||
free.
|
||
|
||
User memory is allocated from the lowest end of available memory that will
|
||
satisfy the request for memory.
|
||
|
||
|
||
|
||
CHAPTER 7
|
||
|
||
Programming Technical Reference - IBM
|
||
Copyright 1988, Dave Williams
|
||
|
||
DOS File Structure
|
||
|
||
|
||
File Management Functions
|
||
|
||
Use DOS function calls to create, open, close, read, write, rename, find, and
|
||
erase files. There are two sets of function calls that DOS provides for support
|
||
of file management. They are:
|
||
|
||
* File Control Block function calls (0Fh-24h)
|
||
* Handle function calls (39h-62h)
|
||
|
||
Handle function calls are easier to use and are more powerful than FCB calls.
|
||
Microsoft recommends that the handle function calls be used when writing new
|
||
programs. DOS 3.0 up have been curtailing use of FCB function calls; it is
|
||
possible that future versions of DOS may not support FCB function calls.
|
||
The following table compares the use of FCB calls to Handle function calls:
|
||
|
||
FCB Calls Handle Calls
|
||
|
||
Access files in current Access files in ANY directory
|
||
directory only.
|
||
|
||
Requires the application Does not require use of an FCB.
|
||
program to maintain a file Requires a string with the drive,
|
||
control block to open, path, and filename to open, create,
|
||
create, rename or delete rename, or delete a file. For file
|
||
a file. For I/O requests, I/O requests, the application program
|
||
the application program must maintain a 16 bit file handle
|
||
also needs an FCB that is supplied by DOS.
|
||
|
||
The only reason an application should use FCB function calls is to maintain
|
||
the ability to run under DOS 1.x. To to this, the program may use only function
|
||
calls 00h-2Eh.
|
||
|
||
|
||
FCB FUNCTION CALLS
|
||
|
||
FCB function calls require the use of one File Control Block per open file,
|
||
which is maintained by the application program and DOS. The application program
|
||
supplies a pointer to the FCB and fills in ther appropriate fields required by
|
||
the specific function call. An FCB function call can perform file management on
|
||
any valid drive, but only in the current logged directory. By using the current
|
||
block, current record, and record length fields of the FCB, you can perform
|
||
sequential I/O by using the sequential read or write function calls. Random I/O
|
||
can be performed by filling in the random record and record length fields.
|
||
|
||
Several possible uses of FCB type calls are considered programming errors and
|
||
should not be done under any circumstances to avoid problems with file sharing
|
||
and compatibility with later versions of DOS.
|
||
Some errors are:
|
||
1) If program uses the same FCB structure to access more than one open file. By
|
||
opening a file using an FCB, doing I/O, and then replacing the filename field
|
||
in the file control block with a new filename, a program can open a second
|
||
file using the same FCB. This is invalid because DOS writes control info-
|
||
rmation about the file into the reserved fields of the FCB. If the program
|
||
then replaces the filename field with the original filename and then tries to
|
||
perform I/O on this file, DOS may become confused because the control info-
|
||
rmation has been changed. An FCB should never be used to open a second file
|
||
without closing the one that is currently open. If more than one File Control
|
||
Block is to be open concurrently, separate FCBs should be used.
|
||
|
||
2) A program should never try to use the reserved fields in the FCB, as the
|
||
function of the fields changes with different versions of DOS.
|
||
|
||
3) A delete or a rename on a file that is currently open is considered an error
|
||
and should not be attempted by an application program.
|
||
|
||
It is also good programming practice to close all files when I/O is done. This
|
||
avoids potential file sharing problems that require a limit on the number of
|
||
files concurrently open using FCB function calls.
|
||
|
||
|
||
|
||
HANDLE FUNCTION CALLS
|
||
|
||
The recommended method of file management is by using the extended "handle"
|
||
set of function calls. These calls are not restricted to the current directory.
|
||
Also, the handle calls allow the application program to define the type of
|
||
access that other processes can have concurrently with the same file if the file
|
||
is being shared.
|
||
|
||
To create or open a file, the application supplies a pointer to an ASCIIZ
|
||
string giving the name and location of the file. The ASCIIZ string contains an
|
||
optional drive letter, optional path, mandatory file specification, and a
|
||
terminal byte of 00h. The following is an example of an ASCIIZ string:
|
||
|
||
format [drive][path] filename.ext,0
|
||
|
||
DB "A:\path\filename.ext",0
|
||
|
||
If the file is being created, the application program also supplies the
|
||
attribute of the file. This is a set of values that defines the file read
|
||
only, hidden, system, directory, or volume label.
|
||
|
||
If the file is being opened, the program can define the sharing and access
|
||
modes that the file is opened in. The access mode informs DOS what operations
|
||
your program will perform on this file (read-only, write-only, or read/write)
|
||
The sharing mode controls the type of operations other processes may perform
|
||
concurrently on the file. A program can also control if a child process inherits
|
||
the open files of the parent. The sharing mode has meaning only if file sharing
|
||
is loaded when the file is opened.
|
||
|
||
To rename or delete a file, the appplication program simply needs to provide
|
||
a pointer to the ASCIIZ string containing the name and location of the file
|
||
and another string with the neew name if the file is being renamed.
|
||
|
||
The open or create function calls return a 16-bit value referred to as the
|
||
file handle. To do any I/O to a file, the program uses the handle to reference
|
||
the file. Once a file is opened, a program no longer needs to maintain the
|
||
ASCIIZ string pointing to the file, nor is there any need to stay in the same
|
||
directory. DOS keeps track of the location of the file regardless of what
|
||
directory is current.
|
||
|
||
Sequential I/O can be performed using the handle read (3Fh) or write (40h)
|
||
function calls. The offset in the file that IO is performed to is automatically
|
||
moved to the end of what was just read or written. If random I/O is desired, the
|
||
LSEEK (42h) function call can be used to set the offset into the file where I/O
|
||
is to be performed.
|
||
|
||
|
||
SPECIAL FILE HANDLES
|
||
|
||
DOS reserves five special file handles for use by itself and applications
|
||
programs. They are:
|
||
|
||
0000h STDIN Standard Input Device
|
||
0001h STDOUT Standard Output Device
|
||
0002h STDERR Standard Error Output Device
|
||
0003h STDAUX Standard Auxiliary Device
|
||
0004h STDPRN Standard Printer Device
|
||
|
||
These handles are predefined by DOS and can be used by an application program.
|
||
They do not need to be opened by a program, although a program can close these
|
||
handles. STDIN should be treated as a read-only file, and STDOUT and STDERR
|
||
should be treated as write-only files. STDIN and STDOUT can be redirected. All
|
||
handles inherited by a process can be redirected, but not at the command line.
|
||
|
||
These handles are very useful for doing I/O to and from the console device.
|
||
For example, you could read input from the keyboard using the read (3Fh)
|
||
function call and file handle 0000h (STDIN), and write output to the console
|
||
screen with the write function call (40h) and file handle 0001h (STDOUT). If
|
||
you wanted an output that could not be redirected, you could output it using
|
||
file handle 0002h (STDERR). This is very useful for error messages that must
|
||
be seen by a user.
|
||
|
||
File handles 0003h (STDAUX) and 0004h (STDPRN) can be both read from and
|
||
written to. STDAUX is typically a serial device and STDPRN is usually a parallel
|
||
device.
|
||
|
||
|
||
ASCII and BINARY MODE
|
||
|
||
I/O to files is done in binary mode. This means that the data is read or
|
||
written without modification. However, DOS can also read or write to devices in
|
||
ASCII mode. In ASCII mode, DOS does some string processing and modification to
|
||
the characters read and written. The predefined handles are in ASCII mode when
|
||
initialized by DOS. All other file handles that don't refer to devices are in
|
||
binary mode. A program, can use the IOCTL (44h) function call to set the mode
|
||
that I/O is to a device. The predefined file handles are all devices, so the
|
||
mode can be changed from ASCII to binary via IOCTL. Regular file handles that
|
||
are not devices are always in binary mode and cannot be changed to ASCII mode.
|
||
|
||
The ASCII/BINARY bit was called "raw" in DOS 2.x, but it is called ASCII/BINARY
|
||
in DOS 3.x.
|
||
|
||
The predefined file handles STDIN (0000h) and STDOUT (0001h) and STDERR
|
||
(0002h) are all duplicate handles. If the IOCTL function call is used to change
|
||
the mode of any of these three handles, the mode of all three handles is
|
||
changed. For example, if IOCTL was used to change STDOUT to binary mode, then
|
||
STDIN and STDERR would also be changed to binary mode.
|
||
|
||
|
||
|
||
FILE I/O IN BINARY (RAW) MODE
|
||
|
||
The following is true when a file is read in binary mode:
|
||
|
||
1) The characters ^S (scroll lock), ^P (print screen), ^C (control break) are
|
||
not checked for during the read. Therefore, no printer echo occurs if ^S or
|
||
^P are read.
|
||
2) There is no echo to STDOUT (0001h).
|
||
3) Read the number of specified bytes and returns immediately when the last
|
||
byte is received or the end of file reached.
|
||
4) Allows no editing of the ine input using the function keys if the input is
|
||
from STDIN (0000h).
|
||
|
||
|
||
The following is true when a file is written to in binary mode:
|
||
|
||
1) The characters ^S (scroll lock), ^P (print screen), ^C (control break) are
|
||
not checked for during the write. Therefore, no printer echo occurs.
|
||
2) There is no echo to STDOUT (0001h).
|
||
3) The exact number of bytes specified are written.
|
||
4) Does not caret (^) control characters. For example, ctrl-D is sent out as
|
||
byte 04h instead of the two bytes ^ and D.
|
||
5) Does not expand tabs into spaces.
|
||
|
||
|
||
FILE I/O IN ASCII (COOKED) MODE
|
||
|
||
The following is true when a file is read in ASCII mode:
|
||
|
||
1) Checks for the characters ^C,^S, and ^P.
|
||
2) Returns as many characters as there are in the device input buffer, or the
|
||
number of characters requested, whichever is less. If the number of
|
||
characters requested was less than the number of characters in the device
|
||
buffer, then the next read will address the remaining characters in the
|
||
buffer.
|
||
3) If there are no more bytes remaining in the device input buffer, read a
|
||
line (terminated by ^M) into the buffer. This line may be edited with the
|
||
function keys. The characters returned terminated with a sequence of 0Dh,
|
||
0Ah (^M,^J) if the number of characters requested is sufficient to include
|
||
them. For example, if 5 characters were requested, and only 3 were entered
|
||
before the carriage return (0Dh or ^M) was presented to DOS from the console
|
||
device, then the 3 characters entered and 0Dh and 0Ah would be returned.
|
||
However, if 5 characters were requested and 7 were entered before the
|
||
carriage return, only the first 5 characters would be returned. No 0Dh,0Ah
|
||
sequence would be returned in this case. If less than the number of
|
||
characters requested are entered when the carriage return is received, the
|
||
characters received and 0Dh,0Ah would be returned. The reason the 0Ah
|
||
(linefeed or ^J) is added to the returned characters is to make the devices
|
||
look like text files.
|
||
4) If a 1Ah (^Z) is found, the input is terminated at that point. No 0Dh,0Ah
|
||
(CR,LF) sequence is added to the string.
|
||
5) Echoing is performed.
|
||
6) Tabs are expanded.
|
||
|
||
|
||
The following is true when a file is written to in ASCII mode:
|
||
|
||
1) The characters ^S,^P,and ^C are checked for during the write operation.
|
||
2) Expands tabs to 8-character boundaries and fills with spaces (20h).
|
||
3) Carets control characters, for example, ^D is written as two bytes, ^ and D.
|
||
4) Bytes are output until the number specified is output or a ^Z is
|
||
encountered. The number actually output is returned to the user.
|
||
|
||
|
||
NUMBER OF OPEN FILES ALLOWED
|
||
|
||
The number of files that can be open concurrently is restricted by DOS. This
|
||
number is determined by how the file is opened or created (FCB or handle
|
||
function call) and the number specified by the FCBS and FILES commands in the
|
||
CONFIG.SYS file. The number of files allowed open by FCB function calls and the
|
||
number of files that can be opened by handle type calls are independent of one
|
||
another.
|
||
|
||
|
||
RESTRICTIONS ON FCB USAGE
|
||
|
||
If file sharing is not loaded using the SHARE command, there are no
|
||
restrictions on the nuumber of files concurrently open using FCB function calls.
|
||
|
||
However, when file sharing is loaded, the maximum number of FCBs open is set
|
||
by the the FCBS command in the CONFIG.SYS file.
|
||
|
||
The FCBS command has two values you can specify, 'm' and 'n'. The value for
|
||
'm' specifies the number of files that can be opened by FCBs, and the value 'n'
|
||
specifies the number of FCBs that are protected from being closed.
|
||
|
||
When the maximum number of FCB opens is exceeded, DOS automatically closes the
|
||
least recently used file. Any attempt to access this file results in an int 24h
|
||
critical error message "FCB not availible". If this occurs while an application
|
||
program is running, the value specified for 'm' in the FCBS command should be
|
||
increased.
|
||
|
||
When DOS determines the least recently used file to close, it does not include
|
||
the first 'n' files opened, therefore the first 'n' files are protected from
|
||
being closed.
|
||
|
||
|
||
RESTRICTIONS ON HANDLE USAGE
|
||
|
||
The number of files that can be open simultaneously by all processes is
|
||
determined by the FILES command in the CONFIG.SYS file. The number of files a
|
||
single process can open depends on the value specified for the FILES command. If
|
||
FILES is greater than or equal to 20, a single process can open 20 files. If
|
||
FILES is less than 20, the process can open less than 20 files. This value
|
||
includes three predefined handles: STDIN, STDOUT, and STDERR. This means only
|
||
17 additional handles can be added. DOS 3.3 includes a function to use more than
|
||
20 files per application.
|
||
|
||
ALLOCATING SPACE TO A FILE
|
||
|
||
Files are not nescessarily written sequentially on a disk. Space is allocated
|
||
as needed and the next location availible on the disk is allocated as space for
|
||
the next file being written. Therefore, if considerable file generation has
|
||
taken place, newly created files will not be written in sequential sectors.
|
||
However, due to the mapping (chaining) of file space via the File Allocation
|
||
Table (FAT) and the function calls availible, any file may be used in either a
|
||
sequential or random manner.
|
||
|
||
Space is allocated in increments called clusters. Cluster size varies
|
||
according to the media type. An application program should not concern itself
|
||
with the way that DOS allocates space to a file. The size of a cluster is only
|
||
important in that it determines the smallest amount of space that can be
|
||
allocated to a file. A disk is considered full when all clusters have been
|
||
allocated to files.
|
||
|
||
|
||
|
||
MSDOS / PCDOS DIFFERENCES
|
||
|
||
There is a problem of compatibility between MS-DOS and IBM PC-DOS having to
|
||
do with FCB Open and Create. The IBM 1.0, 1.1, and 2.0 documentation of OPEN
|
||
(call 0Fh) contains the following statement:
|
||
|
||
"The current block field (FCB bytes C-D) is set to zero [when an FCB is
|
||
opened]."
|
||
|
||
This statement is NOT true of MS-DOS 1.25 or MS-DOS 2.00. The difference is
|
||
intentional, and the reason is CP/M 1.4 compatibility. Zeroing that field is
|
||
not CP/M compatible. Some CP/M programs will not run when machine translated if
|
||
that field is zeroed. The reason it is zeroed in the IBM versions is that IBM
|
||
specifically requested that it be zeroed. This is the reason for the complaints
|
||
from some vendors about the fact that IBM MultiPlan will not run under MS-DOS.
|
||
It is probably the reason that some other IBM programs don't run under MS-DOS.
|
||
|
||
NOTE: Do what all MS/PC-DOS Systems programs do: Set every single FCB field you
|
||
want to use regardless of what the documentation says is initialized.
|
||
|
||
|
||
|
||
.EXE FILE STRUCTURE
|
||
|
||
The EXE files produced by the Linker program consist of two parts, control and
|
||
relocation information and the load module itself.
|
||
|
||
The control and relocation information, which is described below, is at the
|
||
beginning of the file in an area known as the header. The load module
|
||
immediately follows the header. The load module begins in the memory image of
|
||
the module contructed by the Linker.
|
||
|
||
When you are loading a file with the name *.EXE, DOS does NOT assume that it
|
||
is an EXE format file. It looks at the first two bytes for a signature telling
|
||
it that it is an EXE file. If it has the proper signature, then the load
|
||
proceeds. Otherwise, it presumes the file to be a .COM format file.
|
||
|
||
If the file has the EXE signature, then the internal consistency is checked.
|
||
Pre-2.0 versions of MSDOS did not check the signature byte for EXE files.
|
||
|
||
The .EXE format can support programs larger than 64K. It does this by
|
||
allowing separate segments to be defined for code, data, and the stack, each
|
||
of which can be up to 64K long. Programs in EXE format may contain explicit
|
||
references to segment addresses. A header in the EXE file has information for
|
||
DOS to resolve these references.
|
||
|
||
|
||
The .EXE header is formatted as follows:
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||
<EFBFBD> Offset <20> C O N T E N T S <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 00h <20> 4Dh <20> This is the Linker's signature to mark the file as a valid <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ .EXE file (The ASCII letters M and Z, for Mark Zbikowski, <20>
|
||
<EFBFBD> 01h <20> 5Ah <20> one of the major designers of DOS at Microsoft) <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 02h-03h <20> Length of the image mod 512 (remainder after dividing the load <20>
|
||
<EFBFBD> <20> module image by 512) <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 04h-05h <20> Size of the file in 512 byte pages including the header. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 06h-07h <20> Number of relocation table items. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 08h-09h <20> Size of the header in 16 byte increments (paragraphs). This is <20>
|
||
<EFBFBD> <20> used to locate the beginning of the load module in the file. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 0Ah-0Bh <20> Minimum number of 16 byte paragraphs required above the end of <20>
|
||
<EFBFBD> <20> the loaded program. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 0Ch-0Dh <20> Maximum number of 16 byte paragraphs required above the end of <20>
|
||
<EFBFBD> <20> the loaded program. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 0Eh-0Fh <20> Displacement in paragraphs of stack segment within load module. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 10h-11h <20> Offset to be in SP register when the module is given control. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 12h-13h <20> Word Checksum - negative sum of all the words in the file, <20>
|
||
<EFBFBD> <20> ignoring overflow. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 14h-15h <20> Offset to be in the IP register when the module is given control. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 16h-17h <20> Displacement in paragraphs of code segment within load module. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 18h-19h <20> Displacement in bytes of the first relocation item in the file. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1Ah-1Bh <20> Overlay number (0 for the resident part of the program) <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
|
||
|
||
THE RELOCATION TABLE
|
||
|
||
The word at 18h locates the first entry in the relocation table. The
|
||
relocation table is made up of a variable number of relocation items. The number
|
||
of items is contained at offset 06-07. The relocation item contains two fields
|
||
- a 2 byte offset value, followed by a 2 byte segment value. These two fields
|
||
represent the displacement into the load module before the module is given
|
||
control. The process is called relocation and is accomplished as follows:
|
||
|
||
1. A Program Segment Prefix is built following the resident portion of the
|
||
program that is performing the load operation.
|
||
|
||
2. The formatted part of the header is read into memory (its size is at
|
||
offset 08-09)
|
||
|
||
3. The load module size is determined by subtracting the header size from the
|
||
file size. Offsets 04-05 and 08-09 can be used for this calculation. The
|
||
actual size is downward adjusted based on the contents of offsets 02-03.
|
||
Note that all files created by the Linker programs prior to version 1.10
|
||
always placed a value of 4 at this location, regardless of the actual
|
||
program size. Therefore, Microsoft recommends that this field be ignored if
|
||
it contains a value of 4. Based on the setting of the high/low loader switch,
|
||
an appropriate segment is determined for loading the load module. This
|
||
segment is called the start segment.
|
||
|
||
4. The load module is read into memory beginning at the start segment. The
|
||
relocation table is an ordered list of relocation items. The first relocation
|
||
item is the one that has the lowest offset in the file.
|
||
|
||
5. The relocation table items are read into a work area one or more at a time.
|
||
|
||
6. Each relocation table item segment value is added to the start segment value.
|
||
The calculated segment, in conjunction with the relocation item offset value,
|
||
points to a word in the load module to which is added the start segment
|
||
value. The result is placed back into the word in the load module.
|
||
|
||
7. Once all the relocation items have been processed, the SS and SP registers
|
||
are set from the values in the header and the start segment value is added
|
||
to SS. The ES and DS registers are set to the segment address of the program
|
||
segment prefix. The start segment value is added to the header CS register
|
||
value. The result, along with the header IP value, is used to give the
|
||
module control.
|
||
|
||
|
||
"NEW" .EXE FORMAT (Microsoft Windows and OS/2)
|
||
|
||
The "old" EXE format is documented here. The "new" EXE format puts more
|
||
information into the header section and is currently used in applications that
|
||
run under Microsoft Windows. The linker that creates these files comes with the
|
||
Microsoft Windows Software Development Kit and is called LINK4. If you try to
|
||
run a Windows-linked program under DOS, you will get the error message "This
|
||
program requires Microsoft Windows".
|
||
|
||
CHAPTER 8
|
||
|
||
Programming Technical Reference - IBM
|
||
Copyright 1988, Dave Williams
|
||
|
||
DOS DISK INFORMATION
|
||
|
||
|
||
THE DOS AREA
|
||
|
||
All disks and diskettes formatted by DOS are created with a sector size of 512
|
||
bytes. The DOS area (entire area for a diskette, DOS partition for hard disks)
|
||
is formatted as follows:
|
||
|
||
Boot record - 1 sector
|
||
First copy of the FAT - variable size
|
||
Second copy of the FAT - same size as first copy
|
||
Root directory - variable size
|
||
Data area
|
||
|
||
The following sections describe each of the allocated areas:
|
||
|
||
|
||
THE BOOT RECORD
|
||
|
||
The boot record resides on track 0, sector 1, side 0 of every diskette
|
||
formatted by the DOS FORMAT program. It is put on all disks to provide an error
|
||
message is you try to start up with a nonsystem disk in drive A:. For hard disks
|
||
the boot record resides on the first sector of the DOS partition.
|
||
|
||
|
||
THE DOS FILE ALLOCATION TABLE (FAT)
|
||
|
||
This section explains how DOS uses the FAT to convert the clusters of a file
|
||
into logical sector numbers. We recommend that system utilities use the DOS
|
||
handle calls rather than interpreting the FAT.
|
||
|
||
The FAT is used by DOS to allocate disk space for files, one cluster at a time.
|
||
|
||
The FAT consists of a 12 bit entry (1.5 bytes) for each cluster on the disk or
|
||
a 16 bit (2 bytes) entry when a hard disk has more than 20740 sectors as is the
|
||
case with fixed disks larger than 10Mb.
|
||
The first two FAT entries map a portion of the directory; these FAT entries
|
||
contain indicators of the size and format of the disk. The FAT can be in a 12
|
||
or 16 bit format. DOS determines whether a disk has a 12 or 16 bit FAT by
|
||
looking at the total number of allocation units on a disk. For all diskettes
|
||
and hard disks with DOS partitions less than 20,740 sectors, the FAT uses a 12
|
||
bit value to map a cluster. For larger partitions, DOS uses a 16 bit value.
|
||
The second, third, and fourth bit applicable for 16 bit FAT bytes always
|
||
contains 0FFFFh. The first byte is used as follows:
|
||
|
||
hex value meaning normally used
|
||
|
||
0F8h hard disk bootable hard disk at C:800
|
||
double sided 18 sector diskette PS/2 1.44 meg DSQD
|
||
0F9h double sided 15 sector diskette AT 1.2 meg DSQD
|
||
double sided 9 sector diskette Convertible 720k DSHD
|
||
0FCh single sided 9 sector diskette DOS 2.0, 180k SSDD
|
||
0FDh double sided 9 sector diskette DOS 2.0, 360k DSDD
|
||
0FEh single sided 8 sector diskette DOS 1.0, 160k SSDD
|
||
0FFh double sided 8 sector diskette DOS 1.1, 320k SSDD
|
||
|
||
|
||
The third FAT entry begins mapping the data area (cluster 002).
|
||
|
||
NOTE: These values are provided as a reference. Therefore, programs should not
|
||
make use of these values.
|
||
|
||
Each entry contains a hexadecimal character (or 4 for 16 bit FATs). ()
|
||
indicates the high order four bit value in the case of 16 bit FAT entries.
|
||
They can be:
|
||
|
||
(0)000h if the cluster is unused and availible
|
||
|
||
(0F)FF8h - (0F)FFFh to indicate the last cluster of a file
|
||
|
||
(X)XXXh any other hexadecimal numbers that are the cluster number
|
||
of the next cluster in the file. The cluster number is the
|
||
first cluster in the file that is kept in the file's
|
||
directory entry.
|
||
|
||
The values (0F)FF0h - (0F)FF7h are used to indicate reserved clusters.
|
||
(0F)FF7h indicates a bad cluster if it is not part of the allocation chain.
|
||
(0F)FF8h - (0F)FFFh are used as end of file markers.
|
||
|
||
The file allocation table always occupies the sector or sectors immediately
|
||
following the boot record. If the FAT is larger than 1 sector, the sectors
|
||
occupy consecutive sector numbers. Two copies of the FAT are written, one
|
||
following the other, for integrity. The FAT is read into one of the DOS buffers
|
||
whenever needed (open, allocate more space, etc).
|
||
|
||
|
||
USE OF THE 12 BIT FILE ALLOCATION TABLE
|
||
|
||
Obtain the starting cluster of the file from the directory entry.
|
||
|
||
Now, to locate each subsequent sector of the file:
|
||
|
||
1. Multiply the cluster number just used by 1.5 (each FAT entry is 1.5
|
||
bytes long).
|
||
2. The whole part of the product is offset into the FAT, pointing to the entry
|
||
that maps the cluster just used. That entry contains the cluster number of
|
||
the next cluster in the file.
|
||
3. Use a MOV instruction to move the word at the calculated FAT into a register.
|
||
4. If the last cluster used was an even number, keep the low order 12 bits of
|
||
the register, otherwise, keep the high order 12 bits.
|
||
5. If the resultant 12 bits are (0FF8h-0FFFh) no more clusters are in the file.
|
||
Otherwise, the next 12 bits contain the cluster number of the next cluster in
|
||
the file.
|
||
|
||
To convert the cluster to a logical sector number (relative sector, such as
|
||
that used by int 25h and 26h and DEBUG):
|
||
|
||
1. Subtract 2 from the cluster number
|
||
2. Multiply the result by the number of sectors per cluster.
|
||
3. Add the logical sector number of the beginning of the data area.
|
||
|
||
|
||
USE OF THE 16 BIT FILE ALLOCATION TABLE
|
||
|
||
Obtain the starting cluster of the file from the directory entry. Now to
|
||
locate each subsequent cluster of the file:
|
||
|
||
1. Multiply the cluster number used by 2 (each FAT entry is 2 bytes long).
|
||
2. Use the MOV word instruction to move the word at the calculated FAT offset
|
||
into a register.
|
||
3. If the resultant 16 bits are (0FF8h-0FFFFh) no more clusters are in the
|
||
file. Otherwise, the 16 bits contain the cluster number of the next cluster
|
||
in the file.
|
||
|
||
Compaq DOS makes availible a new disk type (6) with 32 bit partition values,
|
||
allowing 512 megabytes per hard disk (Compaq DOS 3.3.1)
|
||
|
||
|
||
|
||
DOS DISK DIRECTORY
|
||
|
||
The FORMAT command initially builds the root directory for all disks. Its
|
||
location (logical sector number) and the maximum number of entries are
|
||
availible through the device driver interfaces.
|
||
|
||
|
||
|
||
DIRECTORY ENTRIES
|
||
|
||
Since directories other than the root directory are actually files, there is
|
||
no limit to the number of entries that they may contain.
|
||
|
||
All directory entries are 32 bytes long, and are in the following format (byte
|
||
and offset are decimal). The following paragraphs describe the directory entry
|
||
bytes:
|
||
|
||
*BYTES 0-7
|
||
Bytes 0-7 represent the filename. The first byte of the filename indicates the
|
||
status of the filename. The status of a filename can contain the following
|
||
values:
|
||
|
||
00h Filename never used. This is used to limit the length of directory
|
||
searches, for performance reasons.
|
||
05h Indicates that the first character of the filename actually has an 0Edh
|
||
character.
|
||
0E5h Filename has been used but the file has been erased.
|
||
2Eh This entry is for a directory. If the second byte is also 2Eh, the
|
||
cluster field contains the cluster number of this directory's parent
|
||
directory. (0000h if the parent directory is the root directory).
|
||
|
||
Any other character is the first character of a filename.
|
||
|
||
*BYTES 8-10
|
||
These bytes indicate the filename extension.
|
||
|
||
*BYTE 11
|
||
This byte indicates the file's attribute. The attribute byte is mapped as
|
||
follows (values are in hexadecimal):
|
||
|
||
NOTE: Attributes 08h and 10h cannot be changed using function call 43h (CHMOD).
|
||
|
||
The system files IBMBIO.COM and IBMDOS.COM (or customized equivalent) are
|
||
marked as read-only, hidden, and system files. Files can be marked hidden when
|
||
they are created. Also, the read-only, hidden, and system and archive attributes
|
||
may be changed through the CHMOD function call.
|
||
|
||
01h Indicates that the file is marked read-only. An attempt to open the file
|
||
for output using function call 3Dh results in an error code being returned.
|
||
This value can be used with other values below.
|
||
|
||
02h Indicates a hidden file. The file is excluded from normal directory
|
||
searches.
|
||
|
||
04h Indicates a system file. This file is excluded from normal directory
|
||
searches.
|
||
|
||
08h Indicates that the entry contains the volume label in the first 11 bytes.
|
||
The entry contains no other usable information and may exist only in the
|
||
root directory.
|
||
|
||
20h Indicates an archive bit. This bit is set on whenever the file is written
|
||
to and closed. It is used by BACKUP and RESTORE.
|
||
|
||
All other bits are reserved, and must be 0.
|
||
|
||
*BYTES 12-21
|
||
reserved by DOS
|
||
|
||
|
||
*BYTES 22-23
|
||
These bytes contain the time when the file was created or last updated. The
|
||
time is mapped in the bits as follows:
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||
<20> B Y T E 23 <20> B Y T E 22 <20>
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<20> F E D C B A 9 8 <20> 7 6 5 4 3 2 1 0 <20>
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<20> H H H H H <20> M M M M M M <20> D D D D D <20>
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<20> binary # hrs 0-23 <20> binary # minutes 0-59 <20> bin. # 2-sec incr <20>
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
NOTE: The time is stored with the least significant byte first.
|
||
|
||
|
||
*BYTES 24-25
|
||
This area contains the date when the file was created or last updated. The
|
||
mm/dd/yy are mapped in the bits as follows:
|
||
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||
<20> B Y T E 25 <20> B Y T E 24 <20>
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<20> F E D C B A 9 8 <20> 7 6 5 4 3 2 1 0 <20>
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<20> Y Y Y Y Y Y Y <20> M M M M <20> D D D D D <20>
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<20> 0-119 (1980-2099) <20> 1-12 <20> 1-31 <20>
|
||
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
NOTE: The date is stored with the least significant byte first.
|
||
|
||
|
||
*BYTES 26-27
|
||
This area contains the starting cluster number of the first cluster in the
|
||
file. The first cluster for data space on all fixed disks and floppy disks is
|
||
always cluster 002. The cluster number is stored with the least significant
|
||
byte first.
|
||
|
||
|
||
*BYTES 28-31
|
||
This area contains the file size in bytes. The first word contains the low
|
||
order part of the size. Both words are stored with the least significant byte
|
||
first.
|
||
|
||
|
||
File Allocation Table
|
||
offset size description
|
||
3 8 bytes system id (such as IBM 3.3)
|
||
11 2 bytes number of bytes per sector, ie 512 bytes is 200h
|
||
13 1 byte sectors per cluster (1 or 2)
|
||
14 2 bytes number of reserved sectors at beginning, 1 for floppies
|
||
16 1 byte number of copies of FAT, 2 for floppies
|
||
17 2 bytes number of root directory entries (64, 112, 256,etc)
|
||
19 2 bytes total sectors per disk
|
||
21 1 byte format ID (F8, F9, FC, FF, etc)
|
||
22 2 bytes number of sectors per FAT (1 or 2)
|
||
24 2 bytes number of sectors per track (8 or 9, 17)
|
||
26 2 bytes number of sides, heads, or cylinders (1 or 2 for floppy)
|
||
28 2 bytes number of special reserved sectors
|
||
|
||
|
||
THE DATA AREA
|
||
|
||
Allocation of space for a file (in the data area) is done only when needed
|
||
(it is not preallocated). The space is allocated one cluser (unit allocation)
|
||
at a time. A cluster is always one or more consecutive sector numbers, and all
|
||
of the clusters in a file are "chained" together in the FAT.
|
||
|
||
The clusters are arranged on disk to minimize head movement for multisided
|
||
media. All of the space on a track (or cylinder) is allocated before moving
|
||
on to the next track. This is accomplished by using the sequential sector
|
||
numbers on the lowest-numbered head, then all the sector numbers on the next
|
||
head, and so on until all sectors of all heads of the track are used. Then the
|
||
next sector used will be sector 1 of head 0 on the next track.
|
||
|
||
An interesting innovation that was introduced in MS-DOS 3.0: disk space that
|
||
is freed by erasing a file is not re-used immediately, unlike earlier versions
|
||
of DOS. Instead, free space is obtained from the area not yet used during the
|
||
current session, until all of it is used up. Only then will space that is freed
|
||
during the current session be re-used.
|
||
|
||
This feature minimizes fragmentation of files, since never-before-used space
|
||
is always contiguous. However, once any space has been freed by deleting a file,
|
||
that advantage vanishes at the next system boot. The feature also greatly
|
||
simplifies un-erasing files, provided that the need to do an un-erase is found
|
||
during the same session and also provided that the file occupies contiguous
|
||
clusters.
|
||
|
||
However, when one is using programs which make extensive use of temporary
|
||
files, each of which may be created and erased many times during a session,
|
||
the feature becomes a nuisance; it forces the permanent files to move farther
|
||
and farther into the inner tracks of the disk, thus increasing rather than
|
||
decreasing the amount of fragmentation which occurs.
|
||
|
||
The feature is implemented in DOS by means of a single 16-bit "last cluster
|
||
used" (LCU) pointer for each physical disk drive; this pointer is a part of
|
||
the physical drive table maintained by DOS. At boot time, the LCU pointer is
|
||
zeroed. Each time another cluster is obtained from the free-space pool (the
|
||
FAT), its number is written into the LCU pointer. Each time a fresh cluster
|
||
is required, the FAT is searched to locate a free one; in older versions of
|
||
DOS this search always began at Cluster 0000, but in 3.x it begins at the
|
||
cluster pointed to by the LCU pointer.
|
||
|
||
For hard disks, the size of the file allocation table and directory are
|
||
determined when FORMAT initializes it and are based on the size of the DOS
|
||
partition.
|
||
|
||
The following table gives the specifications for floppy disk formats:
|
||
|
||
# of sectors FAT size DIR DIR sectors total
|
||
disk DOS ver sides /track (sectors) (sectors) (entries) /cluster sectors
|
||
|
||
(5-1/4 inch)
|
||
160k (DOS 1.0) 1 8 (40) 1 4 64 1 320
|
||
320k (DOS 1.1) 2 8 (40) 1 7 112 2 360
|
||
180k (DOS 2.0) 1 9 (40) 2 4 64 1 640
|
||
360k (DOS 2.0) 2 9 (40) 2 7 112 2 720
|
||
1.2M (DOS 3.0) 2 15 (80) 7 14 224 1 2400
|
||
|
||
(3-1/2 inch)
|
||
720k (DOS 3.2) 2 9 (80) 3 7 112 2 1440
|
||
1.44M(DOS 3.3) 2 18 (80) 9 14 224 1 2880
|
||
|
||
Files in the data area are not nescessarily written sequentially on the first.
|
||
The data area space is allocated one cluster at a time, skipping over clusters
|
||
already allocated. The first free cluster found is the next cluster allocated,
|
||
regardless of its physical location on the disk. This permits the most efficient
|
||
utilization of disk space because clusters freed by erasing files can be
|
||
allocated for new files. Refer back to the description of the DOS FAT in this
|
||
chapter for more information.
|
||
|
||
|
||
Hard Disk Layout
|
||
|
||
The DOS hard disk routines perform the following services:
|
||
|
||
1) Allow multiple operating systems to utilize the hard disk without the need
|
||
to backup and restore files when changing operating systems.
|
||
|
||
2) Allow a user-selected operating system to be started from the hard disk.
|
||
|
||
I) In order to share the hard disk among operating systems, the disk may be
|
||
logically divided into 1 to 4 partitions. The space within a given
|
||
partition is contiguous, and can be dedicated to a specific operating
|
||
system. Each operating system may "own" only one partition in DOS versions
|
||
2.0 through 3.2. PCDOS 3.3 introduced the "Extended DOS Partition" which
|
||
allows multiple DOS partitions on the same hard disk. The FDISK.COM (or
|
||
similar program from other DOS vendors) utility allows the user to select
|
||
the number, type, and size of each partition. The partition information is
|
||
kept in a partition table that is embedded in the master fixed disk boot
|
||
record on the first sector of the disk. The format of this table varies
|
||
from version to version of DOS.
|
||
|
||
II) An operating system must consider its partition to be the entire disk,
|
||
and must ensure that its functions and utilities do not access other
|
||
partitions on the disk.
|
||
|
||
III) Each partition may contain a boot record on its first sector, and any
|
||
other programs or data that you choose - including a copy of an operating
|
||
system. For example, the DOS FORMAT command may be used to format and
|
||
place a copy of DOS in the DOS partition in the same manner that a
|
||
diskette is formatted. With the FDISK utility, you may designate a
|
||
partition as "active" (bootable). The master hard disk boot record causes
|
||
that partition's boot record to receive control when the system is started
|
||
or reset. Additional disk partitions could be FORTH, UNIX, Pick, CP/M-86,
|
||
or the UCSD p-System.
|
||
|
||
|
||
|
||
SYSTEM INITIALIZATION
|
||
|
||
The boot sequence is as follows:
|
||
|
||
1. System initialization first attempts to load an operating system from
|
||
diskette drive A. If the drive is not ready or a read error occurs, it then
|
||
attempts to read a master hard disk boot record on the first sector of the
|
||
first hard disk in the system. If unsuccessful, or if no hard disk is
|
||
present, it invokes ROM BASIC in an IBM PC or displays a disk error
|
||
message on most compatibles.
|
||
|
||
2. If initialization is successful, the master hard disk boot record is given
|
||
control and it examines the partition table embedded within it. If one of
|
||
the entries indicates an active (bootable) partition, its boot record is
|
||
read from the partition's first sector and given control.
|
||
|
||
3. If none of the partitions is bootable, ROM BASIC is invoked on an IBM PC or
|
||
a disk error on most compatibles.
|
||
|
||
4. If any of the boot indicators are invalid, or if more than one indicator is
|
||
marked as bootable, the message INVALID PARTITION TABLE is displayed and the
|
||
system stops.
|
||
|
||
5. If the partition's boot record cannot be successfully read within five
|
||
retries due to read errors, the message ERROR LOADING OPERATING SYSTEM
|
||
appears and the system stops.
|
||
|
||
6. If the partition's boot record does not contain a valid "signature", the
|
||
message MISSING OPERATING SYSTEM appears, and the system stops.
|
||
|
||
NOTE: When changing the size or location of any partition, you must ensure that
|
||
all existing data on the disk has been backed up. The partitioning program
|
||
will destroy the data on the disk.
|
||
|
||
|
||
|
||
BOOT RECORD/PARTITION TABLE
|
||
|
||
A boot record must be written on the first sector of all hard disks, and
|
||
must contain the following:
|
||
|
||
1. Code to load and give control to the boot record for one of four possible
|
||
operating systems.
|
||
|
||
2. A partition table at the end of the boot record. Each table entry is 16
|
||
bytes long, and contains the starting and ending cylinder, sector, and head
|
||
for each of four possible partitions, as well as the number of sectors
|
||
preceding the partition and the number of sectors occupied by the partition.
|
||
The "boot indicator" byte is used by the boot record to determine if one of
|
||
the partitions contains a loadable operating system. FDISK initialization
|
||
utilities mark a user-selected partition as "bootable" by placing a value
|
||
of 80h in the corresponding partition's boot indicator (setting all other
|
||
partitions' indicators to 0 at the same time). The presence of the 80h tells
|
||
the standard boot routine to load the sector whose location is contained in
|
||
the following three bytes. That sector is the actual boot record for the
|
||
selected operating system, and it is responsible for the remainder of the
|
||
system's loading process (as it is from the diskette). All boot records are
|
||
loaded at absolute address 0:7C00.
|
||
|
||
The partition table with its offsets into the boot record is:
|
||
(except for Wyse DOS 3.2 with 32 bit allocation table, and DOS 3.3-up)
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||
<EFBFBD> Offset / Purpose <20> <20> Head <20> Sector <20> Cylinder <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1BEh partition 1 begin <20> boot ind <20> H <20> S <20> cyl <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1C2h partition 1 end <20> syst ind <20> H <20> S <20> cyl <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1C6h partition 1 relative sector <20> low word <20> high word <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1CAh partition 1 # sectors <20> low word <20> high word <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1CEh partition 2 begin <20> boot ind <20> H <20> S <20> cyl <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1D2h partition 2 end <20> syst ind <20> H <20> S <20> cyl <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1D6h partition 2 relative sector <20> low word <20> high word <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1DAh partition 2 # sectors <20> low word <20> high word <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1DEh partition 3 begin <20> boot ind <20> H <20> S <20> cyl <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1E2h partition 3 end <20> syst ind <20> H <20> S <20> cyl <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1E6h partition 3 relative sector <20> low word <20> high word <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1EAh partition 3 # sectors <20> low word <20> high word <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1EEh partition 4 begin <20> boot ind <20> H <20> S <20> cyl <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1F2h partition 4 end <20> syst ind <20> H <20> S <20> cyl <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1F6h partition 4 relative sector <20> low word <20> high word <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 1FAh partition 4 # sectors <20> low word <20> high word <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
<EFBFBD> 1FEh signature <20> hex 55 <20> hex AA <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
|
||
|
||
HARD DISK TECHNICAL INFORMATION
|
||
|
||
Boot indicator (boot ind): The boot indicator byte must contain 0 for a non-
|
||
bootable partition or 80h for a bootable partition. Only one partition can be
|
||
marked as bootable at a time.
|
||
|
||
System Indicator (sys ind): The sys ind field contains an indicator of the
|
||
operating system that "owns" the partition.
|
||
|
||
The system indicators are:
|
||
00h unknown (unspecified or non-DOS)
|
||
01h DOS 12 bit FAT
|
||
02h DOS 16 bit FAT
|
||
|
||
Cylinder (CYL) and Sector (S): The 1 byte fields labelled CYL contain the low
|
||
order 8 bits of the cylinder number - the high order 2 bits are in the high
|
||
order 2 bits of the sector (S) field. This corresponds with the ROM BIOS
|
||
interrupt 13h (disk I/O) requirements, to allow for a 10 bit cylinder number.
|
||
|
||
The fields are ordered in such a manner that only two MOV instructions are
|
||
required to properly set up the DX and CX registers for a ROM BIOS call to
|
||
load the appropriate boot record (hard disk booting is only possible from the
|
||
first hard disk in the system, where a BIOS drive number of 80h corresponds
|
||
to the boot indicator byte).
|
||
|
||
All partitions are allocated in cylinder multiples and begin on sector 1,
|
||
head 0.
|
||
|
||
EXCEPTION: The partition that is allocated at the beginning of the disk starts
|
||
at sector 2, to account for the hard disk's master boot record.
|
||
|
||
Relative Sector (rel sect): The number of sectors preceding each partition
|
||
on the disk is kept in the 4 byte field labelled "rel sect". This value is
|
||
obtained by counting the sectors beginning with cylinder 0, sector 1, head 0
|
||
of the disk, and incrementing the sector, head, and then track values up to
|
||
the beginning of the partition. This, if the disk has 17 sectors per track and
|
||
4 heads, and the second partition begins at cylinder 1, sector 1, head 0,and
|
||
the partition's starting relative sector is 68 (decimal) - there were 17
|
||
sectors on each of 4 heads on 1 track allocated ahead of it. The field is stored
|
||
with the least significant word first.
|
||
|
||
Number of sectors (#sects): The number of sectors allocated to the partition
|
||
is kept in the "# of sects" field. This is a 4 byte field stored least
|
||
significant word first.
|
||
|
||
Signature: The last 2 bytes of the boot record (55AAh) are used as a signature
|
||
to identify a valid boot record. Both this record and the partition boot record
|
||
are required to contain the signature at offset 1FEh.
|
||
|
||
The master disk boot record invokes ROM BASIC if no indicator byte reflects a
|
||
bootable system.
|
||
|
||
When a partition's boot record is given control. It is passed its partition
|
||
table entry address in the DS:SI registers.
|
||
|
||
|
||
|
||
DETERMINING FIXED DISK ALLOCATION
|
||
|
||
DOS determines disk allocation using the following formula:
|
||
|
||
D * BPD
|
||
TS - RS - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
BPS
|
||
SPF = <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
BPS * SPC
|
||
CF + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
BPC
|
||
where:
|
||
|
||
TS total sectors on disk
|
||
RS the number of sectrs at the beginning of the disk that are reserved
|
||
for the boot record. DOS reserves 1 sector.
|
||
D The number of directory entries in the root directory.
|
||
BPD the number of bytes per directory entry. This is always 32.
|
||
BPS the number of bytes per logical sector. Typically 512, but you can
|
||
specify a different number with VDISK.
|
||
CF The number of FATS per disk. Usually 2. VDISK is 1.
|
||
SPF the number of sectors per FAT. Maximum 64.
|
||
SPC The number of sectors per allocation unit.
|
||
BPC the number of bytes per FAT entry. BPC is 1.5 for 12 bit FATs.
|
||
2 for 16 bit FATS.
|
||
|
||
|
||
To calculate the minimum partition size that will force a 16-bit FAT:
|
||
|
||
CYL = (max clusters * 8)/(HEADS * SPT)
|
||
|
||
where:
|
||
CYL number of cylinders on the disk
|
||
max clusters 4092 (maximum number of clusters for a 12 bit FAT)
|
||
HEADS number of heads on the hard disk
|
||
SPT sectors per track (normally 17 on MFM)
|
||
|
||
|
||
note: DOS 2.0 uses a "first fit" algorithm when allocating file space on the
|
||
hard disk. Each time an application requests disk space, it will scan from the
|
||
beginning of the FAT until it finds a contiguous peice of storage large enough
|
||
for the file.
|
||
DOS 3.0 keeps a pointer into the disk space, and begins its search from the
|
||
point it last left off. This pointer is lost when the system is rebooted.
|
||
This is called the "next fit" algorithm. It is faster than the first fit and
|
||
helps minimize fragmentation.
|
||
In either case, if the FCB function calls are used instead of the handle
|
||
function calls, the file will be broken into peices starting with the first
|
||
availible space on the disk.
|
||
|
||
|
||
Comment to 826. Comment(s).
|
||
----------
|
||
Better late than never...
|
||
A partition table entry for the IBM AT is set up as follows:
|
||
|
||
DB drive ; 0 or 80H, 80H marks a bootable, active partition
|
||
DB head1 ; starting heads
|
||
DW trksec1 ; starting track/sector (CX value for INT 13)
|
||
DB system ; see below
|
||
DB head2 ; ending head
|
||
DW trksec2 ; ending track/sector
|
||
DD sector1 ; absolute # of starting sector
|
||
DD sector2 ; absolute # of last sector
|
||
|
||
The system byte is different for different O/S entries:
|
||
|
||
1 DOS, 12-bit FAT entries
|
||
4 DOS, 16-bit FAT entries
|
||
DB Concurrent DOS
|
||
F2 2nd partition for Sperry machines with large disks
|
||
|
||
And so on. There are bytes for XENIX, Prologue and lots of other O/S.
|
||
Many manufacturers diddle with these system bytes to implement more than 1 DOS
|
||
partition per disk. The only one I know about who violates the rule that only
|
||
one DOS partition (1 or 4) per disk may exist is Tandon.
|
||
|
||
|
||
CHAPTER 9
|
||
|
||
Programming Technical Reference - IBM
|
||
Copyright 1988, Dave Williams
|
||
|
||
|
||
INSTALLABLE DEVICE DRIVERS
|
||
|
||
|
||
DEVICE DRIVER FORMAT
|
||
|
||
A device driver is a COM or EXE file that contains all of the code needed to
|
||
control an add-in device. It has a special header to identify it as a device,
|
||
define the strategy and interrupt entry points, and define its various
|
||
attributes.
|
||
|
||
NOTE: For device drivers the COM file must not use the ORG 100h. Since the
|
||
driver does not use the program segment prefix, it is simply loaded
|
||
without offset. Therefore the memory image file must have an origin of 0
|
||
(ORG 0 or no ORG statement).
|
||
|
||
|
||
TYPES OF DEVICES
|
||
|
||
There are two types of devices: Character devices and Block devices. Their
|
||
attributes are as follows:
|
||
|
||
Character devices are designed to do character I/O in a serial manner like
|
||
CON, AUX, and PRN. These devices have names like CON, AUX, CLOCK$, and you can
|
||
open channels (handles or FCBs) to do input and output with them. Because
|
||
character devices have only one name, they can only support one device.
|
||
|
||
Block devices are the fixed disk or diskette drives on a system. They can do
|
||
random I/O in peices called blocks, which are usually the physical sector
|
||
size of the disk. These devices are not named as character devices are, and
|
||
cannot be opened directly. Instead they are mapped by using the drive letters
|
||
A,B,C etc. Block devices can have units within them. In this way, a single block
|
||
driver can be responsible for one or more disk drives. For example, the first
|
||
block device driver can be responsible for drives A,B,C,and D. This means it has
|
||
four units defined and therefore takes up four drive letters. The position of
|
||
the driver in the chain of all drives determines the way in which the drive
|
||
letters correspond. For example, if the device driver is the first block driver
|
||
in the device chain, and it defines four units, then these devices are called
|
||
A,B,C, and D. If the second device driver defines three units, then those units
|
||
are E,F,and G. DOS 1.x allows 16 devices. DOS 2.x allows 63, and DOS 3.x allows
|
||
26. It is recommended that drivers limit themselves to 26 devices for
|
||
compatibility with DOS 3.x.
|
||
|
||
DOS doesn't care about the position of installed character devices versus
|
||
block devices. The installed character devices get put into the chain ahead of
|
||
resident character devices so that you can override the system's default driver
|
||
for CON etc.
|
||
|
||
Although it is sometimes beleived that installed block devices get linked into
|
||
the chain BEHIND the resident block devices, if you look at the actual device
|
||
chain, this is not true (though it is true in the sense that installed block
|
||
devices get assigned drive letters in sequence, starting with the next letter
|
||
after the last one assigned to a resident block device).
|
||
|
||
|
||
|
||
DEVICE HEADER
|
||
|
||
A device driver requires a device header at the beginning of the file. This
|
||
is the format of the device header:
|
||
|
||
Field Length
|
||
|
||
Pointer to next device header field dword
|
||
Attribute word
|
||
Pointer to device strategy routine word
|
||
Pointer to device interrupt routine word
|
||
Name/Unit field 8 bytes
|
||
|
||
|
||
POINTER TO NEXT DEVICE HEADER FIELD
|
||
|
||
The device header field is a pointer to the device header of the next device
|
||
driver. It is a doubleword field that is set by DOS at the time the device
|
||
driver is loaded. The first word is an offset and the second word is the
|
||
segment.
|
||
If you are loading only one device driver, set the device header field to -1
|
||
before loading the device. If you are loading more than one device driver, set
|
||
the first word of the device driver header to the offset of the next device
|
||
driver's header. Set the device driver header field of the last device driver
|
||
to -1.
|
||
|
||
|
||
ATTRIBUTE FIELD
|
||
|
||
The attribute field is a word field that describes the attributes of the
|
||
device driver to the system. The attributes are:
|
||
|
||
word bits (decimal)
|
||
15 1 character device
|
||
0 block device
|
||
14 1 supports IOCTL
|
||
0 doesn't support IOCTL
|
||
13 1 non-IBM format (block only)
|
||
0 IBM format
|
||
12 not documented - unknown
|
||
11 1 supports removeable media
|
||
0 doesn't support removeable media
|
||
10 reserved for DOS
|
||
through
|
||
4 reserved for DOS
|
||
3 1 current block device
|
||
0 not current block device
|
||
2 1 current NUL device
|
||
0 not current NUL device
|
||
1 1 current standard output device
|
||
0 not current standard output device
|
||
|
||
|
||
|
||
BIT 15 is the device type bit. Use it to tell the system the that driver is a
|
||
block or character device.
|
||
|
||
BIT 14 is the IOCTL bit. It is used for both character and block devices. Use
|
||
it to tell DOS whether the device driver can handle control strings
|
||
through the IOCTL function call 44h.
|
||
If a device driver cannot process control strings, it should set bit
|
||
14 to 0. This way DOS can return an error is an attempt is made through
|
||
the IOCTL function call to send or receive control strings to the
|
||
device. If a device can process control strings, it should set bit 14
|
||
to 1. This way, DOS makes calls to the IOCTL input and output device
|
||
function to send and receive IOCTL strings.
|
||
The IOCTL functions allow data to be sent to and from the device
|
||
without actually doing a normal read or write. In this way, the device
|
||
driver can use the data for its own use, (for example, setting a baud
|
||
rate or stop bits, changing form lengths, etc.) It is up to the device
|
||
to interpret the information that is passed to it, but the information
|
||
must not be treated as a normal I/O request.
|
||
|
||
|
||
BIT 13 is the non-IBM format bit. It is used for block devices only. It affects
|
||
the operation of the Get BPB (BIOS parameter block) device call.
|
||
|
||
BIT 11 is the open/close removeable media bit. Use it to tell DOS if the
|
||
device driver can handle removeable media. (DOS 3.x only)
|
||
|
||
BIT 3 is the clock device bit. It is used for character devices only. Use it
|
||
to tell DOS if your character device driver is the new CLOCK$ device.
|
||
|
||
BIT 2 is the NUL attribute bit. It is used for character devices only. Use it
|
||
to tell DOS if your character device driver is a NUL device. Although
|
||
there is a NUL device attribute bit, you cannot reassign the NUL device.
|
||
This is an attribute that exists for DOS so that DOS can tell if the NUL
|
||
device is being used.
|
||
|
||
BIT 0 are the standard input and output bits. They are used for character
|
||
& devices only. Use these bits to tell DOS if your character device
|
||
BIT 1 driver is the new standard input device or standard output device.
|
||
|
||
|
||
POINTER TO STRATEGY AND INTERRUPT ROUTINES
|
||
|
||
These two fields are pointers to the entry points of the strategy and input
|
||
routines. They are word values, so they must be in the same segment as the
|
||
device header.
|
||
|
||
|
||
NAME/UNIT FIELD
|
||
|
||
This is an 8-byte field that contains the name of a character device or the
|
||
unit of a block device. For the character names, the name is left-justified and
|
||
the space is filled to 8 bytes. For block devices, the number of units can be
|
||
placed in the first byte. This is optional because DOS fills in this location
|
||
with the value returned by the driver's INIT code.
|
||
|
||
|
||
CREATING A DEVICE DRIVER
|
||
|
||
To create a device driver that DOS can install, perform the following:
|
||
|
||
1) Create a memory image file or an EXE file with a device header at the start
|
||
of the file.
|
||
2) Originate the code (including the device header) at 0, not 100h.
|
||
3) Set the next device header field. Refer to "Pointer to Next Device Header
|
||
Attribute Field" for more information.
|
||
4) Set the attribute field of the device header. Refer to "Attribute Field" for
|
||
more information.
|
||
5) Set the entry points for the interrupt and strategy routines.
|
||
6) Fill in the name/unit field with the name of the character device or the unit
|
||
number of the block device.
|
||
|
||
DOS always processes installable character device drivers before handling the
|
||
default devices. So to install a new CON device, simply name the device CON.
|
||
Be sure to set the standard input device and standard output device bits in
|
||
the attribute field of a new CON device. The scan of the device list stops on
|
||
the first match so the installable device driver takes precedence.
|
||
|
||
NOTE: Because DOS can install the device driver anywhere in memory, care
|
||
must be taken in any FAR memory references. You should not expect that
|
||
your driver will be loaded in the same place every time.
|
||
|
||
|
||
|
||
INSTALLING DEVICE DRIVERS
|
||
|
||
DOS installs new device drivers dynamically at boot time by reading and
|
||
processing the DEVICE command in the config.sys file. For example, if you have
|
||
written a device driver called DRIVER1, to install it put this command in the
|
||
CONFIG.SYS file:
|
||
DEVICE=DRIVER1
|
||
|
||
DOS calls a device driver at its strategy entry point first, passing in a
|
||
request header the information describing what DOS wants the device driver
|
||
to do.
|
||
This strategy routine does not perform the request but rather queues the
|
||
request or saves a pointer to the request header. The second entry point is
|
||
the interrupt routine and is called by DOS immediately after the strategy
|
||
routine returns. The interrupt routine is called with no parameters. Its
|
||
function is to perform the operation based on the queued request and set up
|
||
any return infromation.
|
||
DOS passes the pointer to the request header in ES:BX. This structure consists
|
||
of a fixed length header (Request Header) followed by data pertinent to the
|
||
operation to be performed.
|
||
|
||
NOTE: It is the responsibility of the device driver to preserve the machine
|
||
state. For example, save all registers on entry and restore them on exit.
|
||
|
||
The stack used by DOS has enough room on it to save all the registers. If more
|
||
stack space is needed, it is the device driver's responsibility to allocate and
|
||
maintain another stack.
|
||
All calls to execute device drivers are FAR calls. FAR returns should be
|
||
executed to return to DOS.
|
||
|
||
|
||
|
||
INSTALLING CHARACTER DEVICES
|
||
|
||
One of the functions defined for each device is INIT. This routine is called
|
||
only once when the device is installed and never again. The INIT routine returns
|
||
the following:
|
||
|
||
A) A location to the first free byte of memory after the device driver, like a
|
||
TSR that is stored in the terminating address field. This way, the
|
||
initialization code can be used once and then thrown away to save space.
|
||
B) After setting the address field, a character device driver can set the status
|
||
word and return.
|
||
|
||
|
||
INSTALLING BLOCK DEVICES
|
||
|
||
Block devices are installed in the same way as character devices. The
|
||
difference is that block devices return additional information. Block devices
|
||
must also return:
|
||
|
||
A) The number of units in the block device. This number determines the logical
|
||
names the devices will have. For example, if the current logical device
|
||
letter is F at the time of the install call, and the block device driver INIT
|
||
routine returns three logical units, the letters G, H, and I are assigned to
|
||
the units. The mapping is determined by the position of the driver in the
|
||
device list and the number of units in the device. The number of units
|
||
returned by INIT overrides the value in the name/unit field of the device
|
||
header.
|
||
B) A pointer to a BPB (BIOS parameter block) pointer array. This is a pointer
|
||
to an array of *n* word pointers there *n* is the number of units defined.
|
||
These word pointers point to BPBs. This way, if all of the units are the
|
||
same, the entire array can point to the same BPB to save space.
|
||
The BPB contains information pertinent to the devices such as the sector
|
||
size, number of sectors per allocation unit, and so forth. The sector size of
|
||
the BPB cannot be greater than the maximum allotted size set at DOS
|
||
initialization time.
|
||
NOTE: This array must be protected below the free pointer set by the return.
|
||
C) The media descriptor byte. This byte is passed to devices so that they know
|
||
what parameters DOS is currently using for a particular drive unit.
|
||
|
||
Block devices can take several approaches. They can be *dumb* or *smart*. A
|
||
dumb device would define a unit (and therefore a BPB) for each possible media
|
||
drive combination. Unit 0=drive 0;single side, unit 1=drive 0;double side, etc.
|
||
For this approach, the media descriptor bytes would mean nothing. A smart
|
||
device would allow multiple media per unit. In this case, the BPB table
|
||
returned at INIT must define space large enough to acommodate the largest
|
||
possible medias supported (sector size in BPB must be as large as maximum
|
||
sector size DOS is currently using). Smart drivers will use the media byte to
|
||
pass information about what media is currently in a unit.
|
||
|
||
|
||
REQUEST HEADER
|
||
|
||
The request header passes the information describing what DOS wants the
|
||
device driver to do.
|
||
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||
<EFBFBD> Length <20> F i e l d <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> BYTE <20> Length in bytes of the request header plus any data at end <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> BYTE <20> Unit code. The subunit the operation is for (minor device) <20>
|
||
<EFBFBD> <20> Has no meaning for character devices. <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> WORD <20> Command code <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 8 BYTES <20> Deserved for DOS <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD>(variable)<29> Data appropriate for the operation <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
|
||
UNIT CODE FIELD
|
||
|
||
The unit code field identifies which unit in a block device driver the request
|
||
is for. For example, if a block device driver has three units defined, then the
|
||
possible values of the unit code field would be 0,1,and 2.
|
||
|
||
|
||
COMMAND CODE FIELD
|
||
|
||
The command code field in the request header can have the following values:
|
||
|
||
CODE FUNCTION
|
||
|
||
0 INIT
|
||
1 MEDIA CHECK (block only,NOP for character)
|
||
2 BUILD BPB (block only, NOP for character)
|
||
3 IOCTL input (called only if IOCTL bit is 1)
|
||
4 INPUT (read)
|
||
5 NONDESTRUCTIVE INPUT NO WAIT (character devices only)
|
||
6 INPUT STATUS (character devices only)
|
||
7 INPUT FLUSH (character devices only)
|
||
8 OUTPUT (write)
|
||
9 OUTPUT (write with verify)
|
||
10 OUTPUT STATUS (character devices only)
|
||
11 OUTPUT FLUSH (character devices only)
|
||
12 IOCTL OUTPUT (called only if IOCTL bit is 1)
|
||
13 DEVICE OPEN (called only if OPEN/CLOSE/RM bit is set)
|
||
14 DEVICE CLOSE (called only if OPEN/CLOSE/RM bit is set)
|
||
15 REMOVEABLE MEDIA (called only if OPEN/CLOSE/RM bit is set and
|
||
device is block)
|
||
|
||
NOTE: Command codes 13,14,and 15 are for use with DOS versions 3.x.
|
||
|
||
|
||
STATUS FIELD
|
||
The status field in the request header contains:
|
||
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||
<EFBFBD> D E V I C E D R I V E R S T A T U S F I E L D <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> B <20> 0 <20> <20>
|
||
<EFBFBD> <20> 1 <20> <20>
|
||
<EFBFBD> Y <20> 2 <20> <20>
|
||
<EFBFBD> <20> 3 <20> Error message return code <20>
|
||
<EFBFBD> T <20> 4 <20> (with bit 15=1) <20>
|
||
<EFBFBD> <20> 5 <20> <20>
|
||
<EFBFBD> E <20> 6 <20> <20>
|
||
<EFBFBD> <20> 7 <20> <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> bit <20> 8 <20> DONE <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> bit <20> 9 <20> BUSY <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> bits <20> 10 - 14 <20> Reserved <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> bit <20> 15 <20> Error <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
The status word field is zero on entry and is set by the driver interrupt
|
||
routine on return.
|
||
|
||
BIT 15 is the error bit. If this bit is set, the low 8 bits of the status word
|
||
(7-0) indicate the error code.
|
||
|
||
BITS 14-10 are reserved.
|
||
|
||
BIT 9 is the busy bit. It is only set by status calls and the removable media
|
||
call. See "STATUS" and "REMOVABLE MEDIA" in this chapter for more
|
||
information about the calls.
|
||
|
||
BIT 8 is the done bit. If it is set, it means the operation is complete. The
|
||
driver sets the bit to 1 when it exits.
|
||
|
||
The low 8 bits of the status word define an error message if bit 15 is set.
|
||
These errors are:
|
||
|
||
00h Write protect violation 01h Unknown unit
|
||
02h Device not ready 03h Unknown command
|
||
04h CRC error 05h Bad drive request structure length
|
||
06h seek error 07h unknown media
|
||
08h sector not found 09h printer out of paper
|
||
0Ah write fault 0Bh read fault
|
||
0Ch general failure 0Dh reserved
|
||
0Eh reserved 0Fh invalid disk change
|
||
|
||
|
||
DEVICE DRIVER FUNCTIONS
|
||
|
||
All strategy routines are called with ES:BX pointing to the request header.
|
||
The interrupt routines get the pointers to the request header from the queue
|
||
the strategy routines store them in. The command code in the request header
|
||
tells the driver which function to perform.
|
||
NOTE: all DWORD pointers are stored offset first, then segment.
|
||
|
||
The following function call parameters are described:
|
||
|
||
INIT
|
||
MEDIA CHECK
|
||
BUILD BPB (BIOS PARAMETER BLOCK)
|
||
MEDIA DESCRIPTOR BYTE
|
||
INPUT OR OUTPUT
|
||
NONDESTRUCTIVE INPUT NO WAIT
|
||
STATUS
|
||
FLUSH
|
||
OPEN OR CLOSE
|
||
REMOVABLE MEDIA
|
||
|
||
|
||
INIT
|
||
Command code=0
|
||
ES:BX pointer to request header. Format of header:
|
||
length field
|
||
13 bytes request header
|
||
dword number of units (not set by character devices)
|
||
dword Ending address of resident program code
|
||
dword Pointer to BPB array (not set by character devices)
|
||
/pointer to remainder of arguments
|
||
byte Drive number (3x only)
|
||
|
||
The driver must do the following:
|
||
|
||
A) set the number of units (block devices only)
|
||
B) set up the pointer to the BPB array (block devices only)
|
||
C) perform any initialization code (to modems, printers, etc)
|
||
D) Set the ending address of the resident program code
|
||
E) set the status word in the request header.
|
||
|
||
To obtain information obtained from CONFIG.SYS to a device driver at INIT
|
||
time, the BPB pointer field points to a buffer containing the information
|
||
passed from CONFIG.SYS following the =. The buffer that DOS passes to the
|
||
driver at INIT after the file specification contains an ASCII string for the
|
||
file OPEN. The ASCII string (ending in 0h) is terminated by a carriage return
|
||
(0Dh) and linefeed (0Ah). If there is no parameter information after the file
|
||
specification, the file specification is immediately followed by a linefeed
|
||
(0Ah). This information is read-only and only system calls 01h-0Ch and 30h can
|
||
be issued by the INIT code of the driver.
|
||
The last byte parameter contains the drive letter for the first unit of a
|
||
block driver. For example, 0=A, 1=B etc.
|
||
If an INIT routine determines that it cannot set up the device and wants to
|
||
abort without using any memory, follow this procedure:
|
||
|
||
A) set the number of units to 0
|
||
B) set the ending offset address at 0
|
||
C) set the ending offsret segment address to the code segment (CS)
|
||
|
||
NOTE: If there are multiple device drivers in a single memory image file, the
|
||
ending address returned by the last INIT called is the one DOS uses. It is
|
||
recommended that all device drivers in a single memory image file return
|
||
the same ending address.
|
||
|
||
|
||
MEDIA CHECK
|
||
command code=1
|
||
ES:BX pointer to request header. Format of header:
|
||
length field
|
||
13 bytes request header
|
||
byte media descriptor from DOS
|
||
byte return
|
||
dword returns a pointer to the previous volume ID (if bit
|
||
11=1 and disk change is returned) (DOS 3.x)
|
||
|
||
When the command code field is 1, DOS calls MEDIA CHECK for a drive unit and
|
||
passes its current media descriptor byte. See "Media Descriptor Byte" later in
|
||
this chapter for more information about the byte. MEDIA CHECK returns one of
|
||
the following:
|
||
|
||
A) media not changed C) not sure
|
||
B) media changed D) error code
|
||
|
||
The driver must perform the following:
|
||
A) set the status word in the request header
|
||
B) set the return byte
|
||
-1 media has been changed
|
||
0 don't know if media has been changed
|
||
1 media has not been changed
|
||
|
||
DOS 3.x: If the driver has set the removable media bit 11 of the device header
|
||
attribute word to 1 and the driver returns -1 (media changed), the driver must
|
||
set the DWORD pointer to the previous volume identification field. If DOS
|
||
determines that the media changed is an error, DOS generates an error 0Fh
|
||
(invalid disk change) on behalf of the device. If the driver does not implement
|
||
volume identification support, but has bit 11 set to 1, the driver should set a
|
||
pointer to the string "NO NAME",0.
|
||
|
||
|
||
MEDIA DESCRIPTOR
|
||
Currently the media descriptor byte has been defined for a few media types.
|
||
This byte should be idetnical to the media byte if the device has the non-IBM
|
||
format bit off. These predetermined values are:
|
||
|
||
media descriptor byte => 1 1 1 1 1 0 0 0
|
||
(numerical order) 7 6 5 4 3 2 1 0
|
||
|
||
BIT MEANING
|
||
|
||
0 1=2 sided 0=not 2 sided
|
||
1 1=8 sector 0=not 8 sector
|
||
2 1=removeable 0=nonremoveable
|
||
3-7 must be set to 1
|
||
|
||
|
||
Examples of current DOS media descriptor bytes:
|
||
|
||
media sides sectors ID byte
|
||
|
||
hard disk * * 0F8h
|
||
5-1/4 floppy 2 15 0F9h
|
||
5-1/4 floppy 1 9 0FCh
|
||
5-1/4 floppy 2 9 0FDh
|
||
5-1/4 floppy 2 8 0FFh
|
||
5-1/4 floppy 1 8 0FEh
|
||
8" floppy 1 26 0FEh *
|
||
8" floppy 2 26 0FDh
|
||
8" floppy 2 8 0FEh *
|
||
|
||
*NOTE: The two Media Descriptor Bytes that are the same for 8" diskettes (0FEh)
|
||
are not a misprint. To determine whether you are using a single sided or double
|
||
sided diskette, attempt to read the second side, and if an error occurs you can
|
||
assume the diskette is single sided.
|
||
|
||
|
||
BUILD BPB (BIOS Parameter Block)
|
||
command code =2
|
||
ES:BX pointer to request header. Format:
|
||
length field
|
||
13 bytes request header
|
||
byte media descriptor from DOS
|
||
dword transfer address (buffer address)
|
||
dword pointer to BPB table
|
||
|
||
DOS calls BUILD BPB under the following two conditions:
|
||
|
||
A) If "media changed" is returned
|
||
B) If "not sure" is returned, there are no used buffers. Used buffers are
|
||
buffers with changed data that has not yet been written to the disk.
|
||
|
||
The driver must do the following:
|
||
|
||
A) set the pointer to the BPB
|
||
B) set the status word in the request header.
|
||
|
||
The driver must determine the correct media type currently in the unit to
|
||
return the pointer to the BPB table. The way the buffer is used (pointer
|
||
passed by DOS) is determined by the non-IBM format bit in the attribute field
|
||
of the device header. If bit 13=0 (device is IBM compatible), the buffer
|
||
contains the first sector of the FAT (most importantly the FAT ID byte). The
|
||
driver must not alter this buffer in this case. If bit 13=1 the buffer is a
|
||
one sector scratch area which can be used for anything.
|
||
For drivers that support volume identification and disk change, the call
|
||
should cause a new volume identification to be read off the disk. This call
|
||
indicates that the disk has been legally changed.
|
||
If the device is IBM compatible, it must be true that the first sector of the
|
||
first FAT is located at the same sector for all possible media. This is
|
||
because the FAT sector is read before the media is actually determined.
|
||
The information relating to the BPB for a particular media is kept in the boot
|
||
sector for the media. In particular, the format of the boot sector is:
|
||
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||
<EFBFBD> For DOS 2.x, 3 byte near jump (0E9h) For DOS 3.x, 2 byte near jump (0EBh) <20>
|
||
<EFBFBD> followed by a NOP (90h) <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> 8 bytes <20> OEM name and version <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> BYTE <20> <20> sectors per allocation unit (must be a power of 2) <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> WORD <20> B <20> reserved sectors (strarting at logical sector 0) <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> BYTE <20> <20> number of FATs <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> WORD <20> P <20> max number of root directory entries <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> WORD <20> <20> number of sectors in logical image (total number of <20>
|
||
<EFBFBD> <20> <20> sectors in media, including boot sector directories, etc.) <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ B <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> BYTE <20> <20> media descriptor <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> WORD <20> <20> number of sectors occupied by a single FAT <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> WORD <20> sectors per track <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> WORD <20> number of heads <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ
|
||
<EFBFBD> WORD <20> number of hidden sectors <20>
|
||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
The three words at the end return information about the media. The number of
|
||
heads is useful for supporting different multihead drives that have the same
|
||
storage capacity but a different number of surfaces. The number of hidden
|
||
sectors is useful for drive partitioning schemes.
|
||
|
||
|
||
INPUT / OUTPUT
|
||
command codes=3,4,8,9,and 12
|
||
ES:BX pointer to request header. Format:
|
||
length field
|
||
13 bytes request header
|
||
byte media descriptor byte
|
||
dword transfer address (buffer address)
|
||
word byte/sector count
|
||
dword (DOS 3.x) pointer to the volume ID if error code 0Fh
|
||
is returned
|
||
|
||
The driver must perform the following:
|
||
A) set the status word in the request header
|
||
B) perform the requested function
|
||
C) set the actual number of sectors or bytes tranferred
|
||
|
||
NOTE: No error checking is performed on an IOCTL I/O call. However the driver
|
||
must set the return sector or byte count to the actual number of bytes
|
||
transferred.
|
||
|
||
|
||
The following applies to block device drivers:
|
||
|
||
Under certain circumstances the device driver may be asked to do a write
|
||
operation of 64k bytes that seems to be a *wrap around* of the transfer address
|
||
in the device driver request packet. This arises due to an optimization added to
|
||
write code in DOS. It will only happen in writes that are within a sector size
|
||
of 64k on files that are being exetended past the current end of file. It is
|
||
allowable for the device driver to ignore the balance of the write that wraps
|
||
around, if it so chooses. For example, a write of 10000h bytes worth of sectors
|
||
with a transfer address of XXXX:1 ignores the last two bytes.
|
||
|
||
Remember: A program that uses DOS function calls can never request an input or
|
||
output function of more than 0FFFFh bytes, therefore, a wrap around
|
||
in the transfer (buffer) segment can never occur. It is for this
|
||
reason you can ignore bytes that would have wrapped around in the
|
||
tranfer segment.
|
||
|
||
If the driver returns an error code of 0Fh (invalid disk change) it must put
|
||
a DWORD pointer to an ASCIIZ string which is the correct volume ID to ask the
|
||
user to reinsert the disk.
|
||
|
||
DOS 3.x:
|
||
The reference count of open files on the field (maintained by the OPEN and
|
||
CLOSE calls) allows the driver to determine when to return error 0Fh. If there
|
||
are no open files (reference count=0) and the disk has been changed, the I/O
|
||
is all right, and error 0Fh is not returned. If there are open files
|
||
(reference count > 0) and the disk has been changed, an error 0Fh condition
|
||
may exist.
|
||
|
||
|
||
NONDESTRUCTIVE INPUT NO WAIT
|
||
command code=5
|
||
ES:BX pointer to request header. Format:
|
||
length field
|
||
13 bytes request header
|
||
byte read from device
|
||
|
||
The driver must do the following:
|
||
A) return a byte from the device
|
||
B) set the status word in the request header.
|
||
|
||
If the character device returns busy bit=0 (characters in the buffer), then
|
||
the next character that would be read is returned. This character is not removed
|
||
form the buffer (hence the term nondestructive input). This call allows DOS to
|
||
look ahead one character.
|
||
|
||
|
||
STATUS
|
||
command codes=8 and 10
|
||
ES:BX pointer to a request header. Format:
|
||
length field
|
||
13 bytes request header
|
||
|
||
This driver must perform the following:
|
||
A) perform the requested function
|
||
B) set the busy bit
|
||
C) set the status word in the request header.
|
||
|
||
The busy bit is set as follows:
|
||
|
||
For input on character devices: if the busy bit is 1 on return, a write
|
||
request would wait for completion of a current request. If the busy bit is 0,
|
||
there is no current request. Therefore, a write request would start immediately.
|
||
|
||
For input on character devices with a buffer: if the busy bit is 1 on return,
|
||
a read request does to the physical device. If the busy bit is 0, there are
|
||
characters in the device buffer and a read returns quickly. It also indicates
|
||
that a user has typed something. DOS assumes all character devices have a type-
|
||
ahead input buffer. Devices that do not have this buffer should always return
|
||
busy=0 so that DOS does not hang waiting for information to be put in a buffer
|
||
that does not exist.
|
||
|
||
|
||
FLUSH
|
||
command codes=7 and 11
|
||
ES:BX pointer
|
||
length field
|
||
13 bytes request header
|
||
|
||
This call tells the driver to flush (terminate) all pending requests that it
|
||
has knowledge of. Its primary use is to flush the input queue on character
|
||
devices.
|
||
The driver must set the status word in the request header upon return.
|
||
|
||
|
||
OPEN or CLOSE (3.x)
|
||
command codes=13 and 14
|
||
ES:BX pointer
|
||
length field
|
||
13 bytes static request header
|
||
|
||
These calls are designed to give the device information about the current file
|
||
activity on the device if bit 11 of the attribute word is set. On block
|
||
devices, these calls can be used to manage local buffering. The device can keep
|
||
a reference count. Every OPEN causes the device to increment the reference
|
||
count. Every CLOSE causes the device to decrement the reference count. When the
|
||
reference count is 0, if means there are no open files in the device. Therefore,
|
||
the device should flush buffers inside the device it has written to because now
|
||
the user can change the media on a removeable media drive. If the media had been
|
||
changed, it is advisable to reset the reference count to 0 without flushing the
|
||
buffers. This can be thought of as "last close causes flush". These calls are
|
||
more useful on character devices. The OPEN call can be used to send a device
|
||
initialization string. On a printer, this could cause a string to be sent to set
|
||
the font, page size, etc. so that the printer would always be in a known state
|
||
in the I/O stream. Similarly, a CLOSE call can be used to send a post string
|
||
(like a form feed) at the end of an I/O stream. Using IOCTL to set these pre and
|
||
post strings provides a flexible mechanism of serial I/O device stream control.
|
||
|
||
NOTE: Since all processes have access to STDIN,STDOUT,STDERR,STDAUX, and STDPRN
|
||
(handles 0,1,2,3,and 4) the CON, AUX, and PRN devices are always open.
|
||
|
||
|
||
REMOVABLE MEDIA (DOS 3.x)
|
||
command code=15
|
||
ES:BX pointer
|
||
length field
|
||
13 bytes status request header
|
||
|
||
To use this call, set bit 11 of the attribute field to 1. Block devices can
|
||
only use this call through a subfunction of the IOCTL function call (44h).
|
||
This call is useful because it allows a utility to know whether it is dealing
|
||
with a nonremovable media drive or with a removable media drive. For example,
|
||
the FORMAT utility needs to know whether a drive is removable or nonremovable
|
||
because it prints different versions of some prompts.
|
||
|
||
The information is returned in the BUSY bit of the status word. If the busy
|
||
bit is 1, the media is nonremovable.
|
||
|
||
NOTE: No error checking is performed. It is assumed that this call always
|
||
succeeds.
|
||
|
||
|
||
THE CLOCK$ DEVICE
|
||
|
||
To allow a clock board to be integrated into the system for TIME and DATE,
|
||
the CLOCK$ device is used. This device defines and performs functions like any
|
||
other character device (most functions will be reset done bit, reset error bit,
|
||
and return). When a read or write to this device occurs, 6 bytes are
|
||
transferred. The first 2 bytes are a word, which is the count of days since
|
||
01-01-80. The third byte is minutes, the fourth is hours, the fifth is
|
||
hundredths of a second, and the sixth is seconds.
|
||
Reading the CLOCK$ device gets the date and time, writing to it sets the date
|
||
and time.
|
||
|
||
|
||
|
||
CHAPTER 10
|
||
|
||
Programming Technical Reference - IBM
|
||
Copyright 1988, Dave Williams
|
||
|
||
LOTUS-INTEL-MICROSOFT EXPANDED MEMORY SPECIFICATION
|
||
|
||
The Expanded Memory Manager ............................................ 10-
|
||
History ........................................................ 10-
|
||
Page Frames .................................................... 10-
|
||
Expanded Memory Services ............................................... 10-
|
||
AST/Quadram/Ashton-Tate Enhanced EMM ................................... 10-
|
||
Calling the Manager ............................................ 10-
|
||
Common EMS Functions (hex calls)
|
||
1 (40h) Get Manager Status ............................ 10-
|
||
2 (41h) Get Page Frame Segment ........................ 10-
|
||
3 (42h) Get Number of Pages ........................... 10-
|
||
4 (43h) Get Handle and Allocate Memory ................ 10-
|
||
5 (44h) Map Memory .................................... 10-
|
||
6 (45h) Release Handle and Memory ..................... 10-
|
||
7 (46h) Get EMM Version ............................... 10-
|
||
8 (47h) Save Mapping Context .......................... 10-
|
||
9 (48h) Restore Mapping Context ....................... 10-
|
||
10 (49h) Reserved ...................................... 10-
|
||
11 (4Ah) Reserved ...................................... 10-
|
||
12 (4Bh) Get Number of EMM Handles ..................... 10-
|
||
12 (4Ch) Get Pages Owned By Handle ..................... 10-
|
||
14 (4Dh) Get Pages for All Handles ..................... 10-
|
||
15 (4Eh) Get Or Set Page Map ........................... 10-
|
||
new LIM 4.0 specification:
|
||
16 (4Fh) Get/Set Partial Page Map ...................... 10-
|
||
17 (50h) Map/Unmap Multiple Pages ...................... 10-
|
||
18 (51h) Reallocate Pages .............................. 10-
|
||
19 (52h) Handle Attribute Functions .................... 10-
|
||
20 (53h) Get Handle Name ............................... 10-
|
||
21 (54h) Get Handle Directory .......................... 10-
|
||
22 (55h) Alter Page Map & Jump ......................... 10-
|
||
23 (56h) Alter Page Map & Call ......................... 10-
|
||
24 (57h) Move Memory Region ............................ 10-
|
||
25 (58h) Get Mappable Physical Address Array ........... 10-
|
||
26 (59h) Get Expanded Memory Hardware .................. 10-
|
||
27 (5Ah) Allocate Raw Pages ............................ 10-
|
||
28 (5Bh) Get Alternate Map Register Set ................ 10-
|
||
29 (5Ch) Prepare Expanded Memory Hardware .............. 10-
|
||
30 (5Dh) Enable OS/E Function Set ...................... 10-
|
||
31 (5Eh) Unknown ....................................... 10-
|
||
32 (5Fh) Unknown ....................................... 10-
|
||
33 (60h) Unknown ....................................... 10-
|
||
34 (61h) AST Generic Accelerator Card Support .......... 10-
|
||
Expanded Memory Manager Error Codes .................................... 10-
|
||
|
||
|
||
|
||
THE EXPANDED MEMORY MANAGER
|
||
|
||
History
|
||
|
||
The Lotus/Intel/Microsoft Expanded Memory Manager was originally a Lotus and
|
||
Intel project and was announced as version 3.0 in the second quarter of 1985
|
||
primarily as a means of running larger Lotus worksheets by transparently
|
||
paging unused sections to bank-switched memory. Shortly afterward Microsoft
|
||
announced support of the standard and version 3.2 was subsequently released
|
||
with support for Microsoft Windows. LIM 3.2 supported up to 8 megabytes of
|
||
paged memory. The LIM 4.0 supports up to 32 megabytes of paged memory.
|
||
|
||
|
||
|
||
AST/QUADRAM/ASHTON-TATE ENHANCED EXPANDED MEMORY SPECIFICATION
|
||
|
||
The AQA EEMS maintains upward compatibility with the LIM, but is a superset
|
||
of functions.
|
||
|
||
The AQA EEMS permits its pages to be scattered throughout the unused portion
|
||
of the machine's address space.
|
||
|
||
On August 19, 1987, the new version of the Expanded Memory Specification (EMS)
|
||
was announced by Lotus, Intel and Microsoft. This new version of the
|
||
specification includes many features of the Enhanced Expanded Memory
|
||
Specification (EEMS) originally developed by AST Reserach, Quadram and Ashton-
|
||
Tate, although the three original sponsoring companies elected not to make the
|
||
new specification upward compatible with EEMS. AST Research says that they will
|
||
endorse EMS 4.0 without reservation.
|
||
|
||
The definitive document for the LIM-EMS is Intel part number 300275-004,
|
||
August, 1987.
|
||
|
||
32M <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
|
||
/<EFBFBD> <20>
|
||
<20> <20>
|
||
/ <20> <20>
|
||
<20> <20>
|
||
/ <20> <20>
|
||
<20> <20>
|
||
/ <20> <20>
|
||
<20> Expanded <20>
|
||
/ <20> Memory <20>
|
||
1024K <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ <20> <20>
|
||
<20> / / / / / / <20> / <20> <20>
|
||
960K <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ <20> <20>
|
||
<20> Page Frame <20> <20> <20>
|
||
<20> <20> <20> <20>
|
||
<20> 12 16K-Byte <20> <20> <20>
|
||
<20> Physical <20> <20> <20>
|
||
<20> Pages <20> <20> <20>
|
||
768K <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ <20> Divided into <20>
|
||
<20> / / / / / / <20> \ <20> logical <20>
|
||
640K <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ <20> pages <20>
|
||
<20> <20> \ <20> <20>
|
||
<20> <20> <20> <20>
|
||
<20> <20> \ <20> <20>
|
||
<20> <20> <20> <20>
|
||
<20> 24 16K-Byte <20> \ <20> <20>
|
||
<20> Physical <20> <20> <20>
|
||
<20> Pages* <20> \ <20> <20>
|
||
<20> <20> <20> <20>
|
||
<20> <20> \ <20> <20>
|
||
<20> <20> <20> <20>
|
||
<20> <20> \ <20> <20>
|
||
256K <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ <20> <20>
|
||
<20> <20> \ <20> <20>
|
||
<20> / / / / / / <20> <20> <20>
|
||
<20> <20> \ <20> <20>
|
||
<20> / / / / / / <20> <20> <20>
|
||
<20> <20> \ <20> <20>
|
||
<20> / / / / / / <20> <20> <20>
|
||
<20> <20> \ <20> <20>
|
||
0 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20>
|
||
\ <20> <20>
|
||
<20> <20>
|
||
\ <20> <20>
|
||
0 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
|
||
The page frame is located above the 640k system RAM area, anywhere from
|
||
0A000h to 0FFFFh. This area is used by the video adapters, network cards, and
|
||
add-on ROMs (as in hard disk controllers). The page frames are mapped around
|
||
areas that are in use.
|
||
|
||
|
||
|
||
WRITING PROGRAMS THAT USE EXPANDED MEMORY
|
||
|
||
In order to use expanded memory, applications must perform these steps in the
|
||
following order:
|
||
|
||
1. Determine if EMM is installed.
|
||
2. Determine if enough expanded memory pages exist for your application.
|
||
(Function 3)
|
||
3. Allocate expanded memory pages. (Function 4 or 18)
|
||
4. Get the page frame base address. (Function 2)
|
||
5. Map in expanded memory pages. (Function 5 or 17)
|
||
6. Read/write/execute data in expanded memory, just as if it were conventional
|
||
memory.
|
||
7. Return expanded memory pages to expanded memory pool before exiting. Function
|
||
6 or 18)
|
||
|
||
|
||
Programming Guidelines
|
||
|
||
The following section contains guidelines for programmers writing applications
|
||
that use EMM.
|
||
|
||
A) Do not put a program's stack in expanded memory.
|
||
|
||
B) Do not replace interrupt 67h. This is the interrupt vector the EMM uses.
|
||
Replacing interrupt 67h could result in disabling the Expanded Memory
|
||
Manager.
|
||
|
||
C) Do not map into conventional memory address space your application doesn't
|
||
own. Applications that use the EMM to swap into conventional memory space,
|
||
must first allocate this space from the operating system. If the operating
|
||
system is not aware that a region of memory it manages is in use, it will
|
||
think it is available. This could have disastrous results. EMM should not be
|
||
used to "allocate" conventional memory. DOS is the proper manager of
|
||
conventional memory space. EMM should only be used to swap data in
|
||
conventional memory space previously allocated from DOS.
|
||
|
||
D) Applications that plan on using data aliasing in expanded memory must check
|
||
for the presence of expanded memory hardware. Data aliasing occurs when
|
||
mapping one logical page into two or more mappable segments. This makes one
|
||
16K-byte expanded memory page appear to be in more than one 16K-byte memory
|
||
address space. Data aliasing is legal and sometimes useful for applications.
|
||
Software-only expanded memory emulators cannot perform data aliasing. A
|
||
simple way to distinguish software emulators from actual expanded memory
|
||
hardware is to attempt data aliasing and check the results. For example, map
|
||
one logical page into four physical pages. Write to physical page 0. Read
|
||
physical pages 1-3 to see if the data is there as well. If the data appears
|
||
in all four physical pages, then expanded memory hardware is installed in the
|
||
system, and data aliasing is supported.
|
||
|
||
E) Applications should always return expanded memory pages to the expanded
|
||
memory manager upon termination. These pages will be made available for other
|
||
applications. If unneeded pages are not returned to the expanded memory
|
||
manager, the system could run out of expanded memory pages or expanded
|
||
memory handles.
|
||
|
||
F) Terminate and stay resident programs (TSRs) should always save the state of
|
||
the map registers before changing them. Since TSRs may interrupt other
|
||
programs which may be using expanded memory, they must not change the state
|
||
of the page mapping registers without first saving them. Before exiting, TSRs
|
||
must restore the state of the map registers.
|
||
The following sections describe the three ways to save and restore the state
|
||
of the map registers.
|
||
1) Save Page Map and Restore Page Map (Functions 8 and 9). This is the
|
||
simplest of the three methods. The EMM saves the map register contents in
|
||
its own data structures -- the application does not need to provide extra
|
||
storage locations for the mapping context. The last mapping context to be
|
||
saved, under a particular handle, will be restored when a call to Restore
|
||
Page Map is issued with the same handle. This method is limited to one
|
||
mapping context for each handle and saves the context for only LIM
|
||
standard 64K-byte page frames.
|
||
2) Get/Set Page Map (Function 15). This method requires the application to
|
||
allocate space for the storage array. The EMM saves the mapping context in
|
||
an array whose address is passed to the EMM. When restoring the mapping
|
||
context with this method, an application passes the address of an array
|
||
which contains a previously stored mapping context. This method is
|
||
preferable if an application needs to do more than one save before a
|
||
restore. It provides a mechanism for switching between more than one
|
||
mapping context.
|
||
3) Get/Set Partial Page Map (Function 16). This method provides a way for
|
||
saving a partial mapping context. It should be used when the application
|
||
does not need to save the context of all mappable memory. This function
|
||
also requires that the storage array be part of the application's data.
|
||
|
||
G) All functions using pointers to data structures must have those data
|
||
structures in memory which will not be mapped out. Functions 22 and 23
|
||
(Alter Map & Call and Alter Map & Jump) are the only exceptions.
|
||
|
||
|
||
|
||
EMS 4.0 SPECIFICATIONS
|
||
|
||
Page Frames
|
||
|
||
The bank switched memory chunks are referred to as "page frames". These frame
|
||
consist of four 16K memory blocks mapped into some of the normally unused
|
||
system ROM address area, 0C0000-0EFFFF. Each 16K page is independent of the
|
||
other and they can map to discrete or overlapping areas of the 8 megabyte
|
||
expanded memory address area. Most cards allow selection of addresses to prevent
|
||
conflict with other cards, such as hard disk controllers and other expanded
|
||
memory boards.
|
||
|
||
|
||
Calling the Manager
|
||
|
||
Applications programs communicate with the EMM device driver directly via user
|
||
interrupt 67h. All communication between the application program and the driver
|
||
bypasses DOS completely. To call the driver, register AH is loaded with the
|
||
number of the EMM service requested; DX is loaded with the file handle; and
|
||
interrupt 67h is called. ES:DI is used to pass the address of a buffer or array
|
||
if needed.
|
||
On return AH contains 0 if the call was successful or an error code from 80h to
|
||
8Fh if unsuccessful.
|
||
|
||
|
||
|
||
TESTING FOR THE PRESENCE OF THE EXPANDED MEMORY MANAGER
|
||
|
||
Before an application program can use the Expanded Memory Manager, it must
|
||
determine whether the manager is present. The two recommended methods are the
|
||
"open handle" technique and the "get interrupt vector" technique.
|
||
|
||
The majority of application programs can use either the "open handle" or the
|
||
"get interrupt vector" method. However, if your program is a device driver or
|
||
if it interrupts DOS during file system operations, you must use only the "get
|
||
interrupt vector" method.
|
||
|
||
Device drivers execute from within DOS and can't access the DOS file functions;
|
||
programs that interrupt DOS during file operations have a similar restriction.
|
||
During their interrupt processing procedures, they can't access the DOS file
|
||
functions because another program may be using the system. Since the "get
|
||
interrupt vector" method doesn't require the DOS file functions, you must use
|
||
it for programs of this type.
|
||
|
||
|
||
The "Open Handle" Method
|
||
|
||
Most application programs can use the DOS "Open Handle" method to test for
|
||
the presence of the EMM. To use this method, follow these steps in order:
|
||
|
||
1) Issue an "open handle" command (DOS function 3Dh) in "read only" access mode
|
||
(register AL = 0). This function requires your program to point to an ASCII
|
||
string which contains the path name of the file or device in which you're
|
||
interested (register set DS:DX contains the pointer). In this case the file
|
||
is actually the reserved name of the expanded memory manager.
|
||
|
||
you should format the ASCII string as follows:
|
||
|
||
ASCII_device_name DB 'EMMXXXX0', 0
|
||
|
||
The ASCII codes for the capital letters EMMXXXX0 are terminated by a byte
|
||
containing a value of zero.
|
||
|
||
2) If DOS returns no error code, skip Steps 3 and 4 and go to Step 5. If DOS
|
||
returns a "Too many open files" error code, go to Step 3. If DOS returns a
|
||
"File/Path not found" error code, skip Step 3 and go to Step 4.
|
||
|
||
3) If DOS returns a "Too many open files" (not enough handles) status code, your
|
||
program should invoke the "open file" command before it opens any other
|
||
files. This will guarantee that at least one file handle will be available to
|
||
perform the function without causing this error.
|
||
After the program performs the "open file" command, it should perform the
|
||
test described in Step 6 and close the "file handle" (DOS function 3Eh).
|
||
Don't keep the manager "open" after this status test is performed since
|
||
"manager" functions are not available through DOS. Go to Step 6.
|
||
|
||
4) If DOS returns a "File/Path not found," the memory manager is not installed.
|
||
If your application requires the memory manager, the user will have to reboot
|
||
the system with a disk containing the memory manager and the appropriate
|
||
CONFIG.SYS file before proceeding.
|
||
|
||
5) If DOS doesn't return an error status code you can assume that either a
|
||
device with the name EMMXXXX0 is resident in the system, or a file with this
|
||
name is on disk in the current disk drive. Go to Step 6.
|
||
|
||
6) Issue an "I/O Control for Devices" command (DOS function 44h) with a "get
|
||
device information" command (register AL = 0). DOS function 44h determines
|
||
whether EMMXXXX0 is a device or a file.
|
||
You must use the file handle (register BX) which you obtained in Step 1 to
|
||
access the "EMM" device.
|
||
This function returns the "device information" in a word (register DX).
|
||
Go to Step 7.
|
||
|
||
7. If DOS returns any error code, you should assume that the memory manager
|
||
device driver is not installed. If your application requires the memory
|
||
manager, the user will have to reboot the system with a disk containing the
|
||
memory manager and the appropriate CONFIG.SYS file before proceeding.
|
||
|
||
8) If DOS didn't return an error status, test the contents of bit 7 (counting
|
||
from 0) of the "device information" word (register DX) the function
|
||
returned. Go to Step 9.
|
||
|
||
9) If bit 7 of the "device information" word contains a zero, then EMMXXXX0 is
|
||
a file, and the memory manager device driver is not present. If your
|
||
application requires the memory manager, the user will have to reboot the
|
||
system with a disk containing the memory manager and the appropriate
|
||
CONFIG.SYS file before proceeding.
|
||
If bit 7 contains a one, then EMMXXXX0 is a device. Go to Step 10.
|
||
|
||
10) Issue an "I/O Control for Devices" command (DOS function 44h) with a "get
|
||
output status" command (register AL = 7). You must use the file handle you
|
||
obtained in Step 1 to access the "EMM" device (register BX). Go to Step 11.
|
||
|
||
11) If the expanded memory device driver is ready, the memory manager passes
|
||
a status value of 0FFh in register AL. The status value is 00h if the device
|
||
driver is not ready.
|
||
If the memory manager device driver is "not ready" and your application
|
||
requires its presence, the user will have to reboot the system with a disk
|
||
containing the memory manager and the appropriate CONFIG.SYS file before
|
||
proceeding.
|
||
If the memory manager device driver is "ready," go to Step 12.
|
||
|
||
12) Issue a "Close File Handle" command (DOS function 3Eh) to close the expanded
|
||
memory device driver. You must use the file handle you obtained in Step 1 to
|
||
close the "EMM" device (register BX).
|
||
|
||
|
||
|
||
The "Get Interrupt Vector" technique
|
||
|
||
Any type of program can use this method to test for the presence of the EMM.
|
||
|
||
Use this method (not the "Open Handle" method) if your program is a device
|
||
driver or if it interrupts DOS during file system operations.
|
||
|
||
Follow these steps in order:
|
||
|
||
1) Issue a "get vector" command (DOS function 35h) to obtain the contents of
|
||
interrupt vector array entry number 67h (addresses 0000:019Ch thru
|
||
0000:019Fh).
|
||
The memory manager uses this interrupt vector to perform all manager
|
||
functions. The offset portion of this interrupt service routine address is
|
||
stored in the word located at address 0000:019Ch; the segment portion is
|
||
stored in the word located at address 0000:019Eh.
|
||
2) Compare the "device name field" with the contents of the ASCII string which
|
||
starts at the address specified by the segment portion of the contents of
|
||
interrupt vector address 67h and a fixed offset of 000Ah. If DOS loaded the
|
||
memory manager at boot time this name field will have the name of the device
|
||
in it.
|
||
Since the memory manager is implemented as a character device driver, its
|
||
program origin is 0000h. Device drivers are required to have a "device
|
||
header" located at the program origin. Within the "device header" is an 8
|
||
byte "device name field." For a character mode device driver this name field
|
||
is always located at offset 000Ah within the device header. The device name
|
||
field contains the name of the device which DOS uses when it references the
|
||
device.
|
||
If the result of the "string compare" in this technique is positive, the
|
||
memory manager is present.
|
||
|
||
|
||
|
||
Terminate and Stay Resident (TSR) Program Cooperation:
|
||
In order for TSR's to cooperate with each other and with other applications,
|
||
TSRs must follow this rule: a program may only remap the DOS partition it lives
|
||
in. This rule applies at all times, even when no expanded memory is present.
|
||
|
||
|
||
|
||
|
||
EXPANDED MEMORY SERVICES
|
||
|
||
FUNCTIONS DEFINED IN EMS 3.2 SPECIFICATION
|
||
|
||
Interrupt 67h
|
||
|
||
Function 40h Get Manager Status
|
||
LIM Function Call 1
|
||
Returns a status code indicating whether the memory manager is
|
||
present and the hardware is working correctly.
|
||
entry AH 40h
|
||
return AH error status: 00h, 80h, 81h, 84h
|
||
note 1) upward and downward compatible with both EMS and EEMS 3.2.
|
||
this call can be used only after establishing that the EMS driver is in
|
||
fact present
|
||
2) uses register AX
|
||
|
||
|
||
Function 41h Get Page Frame Segment
|
||
LIM Function Call 2
|
||
Obtain segment address of the page frame used by the EMM.
|
||
entry AH 41h
|
||
return AH error status: 00h, 80h, 81h, 84h
|
||
BX page frame segment address (error code 0)
|
||
note 1) upward and downward compatible with both EMS and EEMS 3.2.
|
||
2) uses registers AX & BX
|
||
|
||
|
||
Function 42h Get Unallocated Page Count
|
||
LIM Function Call 3
|
||
Obtain total number of logical expanded memory pages present in
|
||
the system and the number of those pages not already allocated.
|
||
entry AH 42h
|
||
return AH error status: 00h, 80h, 81h, 84h
|
||
BX number of unallocated pages currently availible
|
||
DX total number of pages
|
||
note 1) upward and downward compatible with both EMS and EEMS 3.2. Note that EMS
|
||
and EEMS 3.2 had no mechanism to return the maximum number of handles
|
||
that can be allocated by programs. This is handled by the EMS 4.0 new
|
||
function 54h/02h.
|
||
2) uses registers AX, BX, DX
|
||
|
||
|
||
Function 43h Get Handle and Allocate Memory
|
||
LIM Function Call 4
|
||
Notifies the EMM that a program will be using extended memory,
|
||
obtains a handle, and allocates a certain number of logical pages
|
||
of extended memory to be controlled by that handle
|
||
entry AH 43h
|
||
BX number of 16k logical pages requested (zero OK)
|
||
return AH error status: 00h, 80h, 81h, 84h, 85h, 87h, 88h, 89h
|
||
DX unique EMM handle (see note 2)
|
||
note 1) upward compatible with both EMS and EEMS 3.2; EMS and EEMS 3.2 do not
|
||
allow the allocation of zero pages (returns error status 89h). EMS 4.0
|
||
does allow zero pages to be requested for a handle, allocating pages
|
||
later using function 51h
|
||
2) your program must use this EMM handle as a parameter in any function
|
||
that requires it. You can use up to 255 handles. The uppermost byte of
|
||
the handle will be zero and cannot be used by the application.
|
||
3) regs AX & DX are used
|
||
|
||
|
||
Function 44h Map Memory
|
||
LIM Function Call 5
|
||
Maps one of the logical pages of expanded memory assigned to a
|
||
handle onto one of the four physical pages within the EMM's page
|
||
frame.
|
||
entry AH 44h
|
||
AL physical page to be mapped (0-3)
|
||
BX the logical page to be mapped (zero through [number of pages
|
||
allocated to the EMM handle - 1]). If the logical page number
|
||
is 0FFFFh, the physical page specified in AL will be unmapped
|
||
(made inaccessible for reading or writing).
|
||
DX the EMM handle your program received from Function 4 (Allocate
|
||
Pages).
|
||
return AH error status: 00h, 80h, 81h, 83h, 84h, 8Ah, 8Bh
|
||
note 1) downward compatible with both EMS and EEMS 3.2; EMS and EEMS 3.2 do not
|
||
support unmap (logical page 0FFFFh) capability. Also, EEMS 3.2
|
||
specified there were precisely four physical pages; EMS 4.0 uses the
|
||
subfunctions of function 58h to return the permitted number of physical
|
||
pages. This incorporates the functionality of function 69h ("function
|
||
42") of EEMS.
|
||
2) uses register AX
|
||
|
||
|
||
Function 45h Release Handle and Memory
|
||
LIM Function Call 6
|
||
Deallocates the logical pages of expanded memory currently
|
||
assigned to a handle and then releases the handle itself.
|
||
entry AH 45h
|
||
DX handle
|
||
return AH error status: 00h, 80h, 81h, 83h, 84h, 86h
|
||
note 1) upward and downward compatible with both EMS and EEMS 3.2.
|
||
2) uses register AX
|
||
3) when a handle is deallocated, its name is set to all ASCII nulls
|
||
(binary zeros).
|
||
4) a program must perform this function before it exits to DOS or no other
|
||
programs can use these pages or the EMM handle.
|
||
|
||
|
||
Function 46h Get EMM Version
|
||
LIM Function Call 7
|
||
Returns the version number of the Expanded Memory Manager software.
|
||
entry AH 46h
|
||
return AH error status: 00h, 80h, 81h, 84h
|
||
AL version number byte (if AL=00h)
|
||
binary coded decimal (BCD) format if version byte:
|
||
high nibble: integer digit of the version number
|
||
low nibble : fractional digit of version number
|
||
i.e., version 4.0 is represented like this:
|
||
0100 0000
|
||
/ \
|
||
4 . 0
|
||
note 1) upward and downward compatible with both EMS and EEMS 3.2. It appears
|
||
that the intended use for this function is to return the version of the
|
||
vendor implementation of the expanded memory manager instead of the
|
||
specification version.
|
||
2) uses register AX
|
||
|
||
|
||
Function 47h Save Mapping Context
|
||
LIM Function Call 8
|
||
Save the contents of the expanded memory page-mapping registers on
|
||
the expanded memory boards, associating those contents with a
|
||
specific EMM handle.
|
||
entry AH 47h
|
||
DX caller's EMM handle (NOT current EMM handle)
|
||
return AH error status: 00h, 80h, 81h, 83h, 84h, 8Ch, 8Dh
|
||
note 1) upward and downward compatible with both EMS and EEMS 3.2.
|
||
2) This only saves the context saved in EMS 3.2 specification; if a driver,
|
||
interrupt routine or TSR needs to do more, functions 4Eh (Page Map
|
||
functions) or 4Fh (Partial Page Map functions) should be used.
|
||
3) no mention is made about the number of save contexts to provide. AST
|
||
recommends in their Rampage AT manual one save context for each handle
|
||
plus one per possible interrupt (5 + <handles>).
|
||
4) uses register AX
|
||
5) this function saves the state of the map registers for only the 64K page
|
||
frame defined in versions 3.x of the LIM. Since all applications written
|
||
to LIM versions 3.x require saving the map register state of only this
|
||
64K page frame, saving the entire mapping state for a large number of
|
||
mappable pages would be inefficient use of memory. Applications that use
|
||
a mappable memory region outside the LIM 3.x page frame should use
|
||
functions 15 or 16 to save and restore the state of the map registers.
|
||
|
||
|
||
Function 48h Restore Page Map
|
||
LIM Function Call 9
|
||
Restores the contents of all expanded memory hardwere page-mapping
|
||
registers to the values associated with the given handle by a
|
||
previous function 08h (Save Mapping Context).
|
||
entry AH 48h
|
||
DX caller's EMM handle (NOT current EMM handle)
|
||
return AH error status: 00h, 80h, 81h, 83h, 84h, 8Eh
|
||
note 1) upward and downward compatible with both EMS and EEMS 3.2.
|
||
2) This only restores the context saved in EMS 3.2 specification; if a
|
||
driver, interrupt routine or TSR needs to do more, functions 4Eh (Page
|
||
Map functions) or 4Fh (Partial Page Map functions) should be used.
|
||
3) uses register AX
|
||
4) this function saves the state of the map registers for only the 64K page
|
||
frame defined in versions 3.x of the LIM. Since all applications written
|
||
to LIM versions 3.x require saving the map register state of only this
|
||
64K page frame, saving the entire mapping state for a large number of
|
||
mappable pages would be inefficient use of memory. Applications that use
|
||
a mappable memory region outside the LIM 3.x page frame should use
|
||
functions 15 or 16 to save and restore the state of the map registers.
|
||
|
||
|
||
Function 49h Reserved
|
||
LIM Function Call 10
|
||
This function was used in EMS 3.0, but was no longer documented in
|
||
EMS 3.2. It formerly returned the page mapping register I/O port
|
||
array. Use of this function is discouraged, and in EMS 4.0 may
|
||
conflict with the use of the new functions 16 through 30 (4Fh
|
||
through 5Dh) and functions 10 and 11. Functions 10 and 11 are
|
||
specific to the hardware on Intel expanded memory boards and may
|
||
not work correctly on all vendors' expanded memory boards.
|
||
|
||
|
||
Function 4Ah Reserved
|
||
LIM Function Call 11
|
||
This function was used in EMS 3.0, but was no longer documented in
|
||
EMS 3.2. It was formerly Get Page Translation Array. Use of this
|
||
function is discouraged, and in EMS 4.0 may conflict with the use
|
||
of the new functions (4Fh through 5Dh).
|
||
|
||
|
||
Function 4Bh Get Number of EMM Handles
|
||
LIM Function Call 12
|
||
The Get Handle Count function returns the number of open EMM
|
||
handles (including the operating system handle 0) in the system.
|
||
entry AH 4Bh
|
||
return AH error status: 00h, 80h, 81h, 84h
|
||
BX handle count (AH=00h) (including the operating system handle
|
||
[0]). max 255.
|
||
note 1) upward and downward compatible with EMS and EEMS 3.2.
|
||
2) uses registers AX and BX
|
||
|
||
|
||
Function 4Ch Get Pages Owned by Handle
|
||
LIM Function Call 13
|
||
Returns number of logical expanded memory pages allocated to a
|
||
specific EMM handle.
|
||
entry AH 4Ch
|
||
DX handle
|
||
return AH error status: 00h, 80h, 81h, 83h, 84h
|
||
BX pages allocated to handle, max 2048 because the EMM allows a
|
||
maximum of 2048 pages (32M bytes) of expanded memory.
|
||
note 1) This function is upward compatible with EMS and EEMS 3.2.
|
||
2) programmers should compare the number returned in BX with the maximum
|
||
number of pages returned by function 42h register DX, total number of
|
||
EMM pages. This should be an UNSIGNED comparison, just in case the spec
|
||
writers decide to use 16 bit unsigned numbers (for a maximum space of
|
||
one gigabyte) instead of signed numbers (for a maximum space of 512
|
||
megabytes). Unsigned comparisons will work properly in either case
|
||
3) uses registers AX and BX
|
||
|
||
|
||
Function 4Dh Get Pages for All Handles
|
||
LIM Function Call 14
|
||
Returns an array containing all active handles and the number of
|
||
logical expanded memory pages associated with each handle.
|
||
entry AH 4Dh
|
||
ES:DI pointer to 1020 byte array to receive information on an array of
|
||
structures where a copy of all open EMM handles and the number
|
||
of pages allocated to each will be stored.
|
||
return AH error status: 00h, 80h, 81h, 84h
|
||
BX number of active handles (1-255); array filled with 2-word
|
||
entries, consisting of a handle and the number of pages
|
||
allocated to that handle. (including the operating system handle
|
||
[0]). BX cannot be zero because the operating system handle is
|
||
always active and cannot be deallocated.
|
||
note 1) NOT COMPATIBLE with EMS or EEMS 3.2, since the new special OS handle
|
||
0000h is returned as part of the array. Unless benign use of this
|
||
information is used (such as displaying the handle and count of pages
|
||
associated with the handle) code should be changed to only work with
|
||
handles between 01h and FFh and to specifically ignore handle 00h.
|
||
2) The array consists of an array of 255 elements. The first word of each
|
||
element is the handle number, the second word contains the number of
|
||
pages allocated.
|
||
3) There are two types of handles, "standard" and "raw". The specification
|
||
does not talk about how this function works when both raw and standard
|
||
handles exist in a given system. There is no currently known way to
|
||
differentiate between a standard handle and a raw handle in EMS 4.0.
|
||
4) uses registers AX and BX
|
||
|
||
|
||
Function 4Eh Get or Set Page Map
|
||
LIM Function Call 15
|
||
Gets or sets the contents of the EMS page-mapping registers on the
|
||
expanded memory boards.
|
||
This group of four subfunctions is provided for context switching
|
||
required by operating environments and systems. These functions are
|
||
upward and downward compatible with both EMS and EEMS 3.2; in
|
||
addition, these functions now include the functionality of EEMS
|
||
function 6Ah ("function 43") involving all pages.
|
||
The size and contents of the map register array will vary from
|
||
system to system based on hardware vendor, software vendor, number
|
||
of boards and the capacity of each board in the system. Note the
|
||
array size can be determined by function 4Eh/03h.
|
||
Use these functions (except for 03h) instead of Functions 8 and 9
|
||
if you need to save or restore the mapping context but don't want
|
||
(or have) to use a handle.
|
||
|
||
00h Get Page Map
|
||
This call saves the mapping context for all mappable memory regions
|
||
(conventional and expanded) by copying the contents of the mapping
|
||
registers from each expanded memory board to a destination array.
|
||
The application must pass a pointer to the destination array.
|
||
entry AH 4Eh
|
||
AL 00h
|
||
ES:DI pointer to target array
|
||
return AH error status: 00h, 80h, 81h, 84h, 8Fh
|
||
note 1) uses register AX
|
||
2) does not use an EMM handle
|
||
|
||
|
||
01h Set Page Map
|
||
This call the mapping context for all mappable memory regions
|
||
(conventional and expanded) by copying the contents of a source
|
||
array into the mapping registers on each expanded memory board in
|
||
the system. The application must pass a pointer to the source array.
|
||
entry AH 4Eh
|
||
AL 01h
|
||
DS:SI pointer to source array
|
||
return AH error status: 00h, 80h, 81h, 84h, 8Fh, 0A3h
|
||
note 1) uses register AX
|
||
2) does not use an EMM handle
|
||
|
||
|
||
02h Get & Set Page Map
|
||
This call simultaneously saves the current mapping context and
|
||
restores a previous mapping context for all mappable memory regions
|
||
(both conventional and expanded). It first copies the contents of
|
||
the mapping registers from each expanded memory board in the system
|
||
into a destination array. Then the subfunction copies the contents
|
||
of a source array into the mapping registers on each of the
|
||
expanded memory boards.
|
||
entry AH 4Eh
|
||
AL 02h
|
||
DS:SI pointer to source array
|
||
ES:DI pointer to target array
|
||
return AH error status: 00h, 80h, 81h, 84h, 8Fh, 0A3h
|
||
note 1) uses register AX
|
||
|
||
|
||
03h Get Size of Page Map Save Array
|
||
entry AH 4Eh
|
||
AL 03h
|
||
return AH error status: 00h, 80h, 81h, 84h, 8Fh
|
||
AL size in bytes of array
|
||
note 1) this subfunction does not require an EMM handle
|
||
2) uses register AX
|
||
|
||
|
||
|
||
FUNCTIONS NEW TO EMS 4.0
|
||
|
||
Function 4Eh Get or Set Page Map
|
||
LIM Function Call 16
|
||
entry 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 error status: 00h, 80h, 81h, 84h, 8Fh, 0A3h
|
||
note 1) this function was designed to be used by multitasking operating systems
|
||
and should not ordinarily be used by appplication software.
|
||
|
||
|
||
Function 4Fh Get/Set Partial Page Map
|
||
LIM Function Call 16
|
||
These four subfunctions are provided for context switching required
|
||
by interrupt routines, operating environments and systems. This set
|
||
of functions provides extended functionality over the EEMS function
|
||
6Ah (function 43) involving subsets of pages. In EEMS, a subset of
|
||
pages could be specified by starting position and number of pages;
|
||
in this function a list of pages is specified, which need not be
|
||
contiguous.
|
||
Interrupt routines can use this function in place of functions 47h
|
||
and 48h, especially if the interrupt routine wants to use more than
|
||
the standard four physical pages.
|
||
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 error status (00h): 00h, 80h, 81h, 84h, 8Bh, 8Fh, 0A3h
|
||
error status (01h): 00h, 80h, 81h, 84h, 8Fh, 0A3h
|
||
error status (02h): 00h, 80h, 81h, 84h, 8Bh, 8Fh
|
||
AL size of partial page map for subfunction 02h
|
||
DS:SI (call 00h) pointer to array containing the partial mapping
|
||
context and any additional information necessary to restore this
|
||
context to its original state when the program invokes a Set
|
||
subfunction.
|
||
note uses register AX
|
||
|
||
|
||
Function 50h Map/Unmap Multiple Pages
|
||
LIM Function Call 17
|
||
entry AH 50h
|
||
AL 00h (by physical page)
|
||
01h (by segment number)
|
||
CX contains the number of entries in the array. For example, if the
|
||
array contained four pages to map or unmap, then CX would
|
||
contain 4.
|
||
DX handle
|
||
DS:SI pointer to an array of structures that contains the information
|
||
necessary to map the desired pages.
|
||
return AH error status: 00h, 80h, 81h, 83h, 84h, 8Ah, 8Bh, 8Fh
|
||
note 1) New function permits multiple logical-to-physical assignments to be made
|
||
in a single call.(faster than mapping individual pages)
|
||
2) The source map array is an array of word pairs. The first word of a
|
||
pair contains the logical page to map (0FFFFh if the physical page is
|
||
to be totally unmapped) and the second word of a pair contains the
|
||
physical page number (subfunction 00h) or the segment selector
|
||
(subfunction 01h) of the physical page in which the logical page shall
|
||
be mapped.
|
||
3) A map of available physical pages (by physical page number and segment
|
||
selectors) can be obtained using function 58h/00h, Get Mappable
|
||
Physical Address Array.
|
||
4) uses register AX
|
||
5) Both mapping and unmapping pages can be done simultaneously.
|
||
6) If a request to map or unmap zero pages is made, nothing is done and no
|
||
error is returned.
|
||
7) Pages can be mapped or unmapped using one of two methods. Both methods
|
||
produce identical results.
|
||
A) A logical page and a physical page at which the logical page is to
|
||
be mapped. This method is an extension of Function 5 (Map Handle
|
||
Page).
|
||
B) Specifys both a logical page and a corresponding segment address at
|
||
which the logical page is to be mapped. While functionally the same
|
||
as the first method, it may be easier to use the actual segment
|
||
address of a physical page than to use a number which only
|
||
represents its location. The memory manager verifies whether the
|
||
specified segment address falls on the boundary of a mappable
|
||
physical page. The manager then translates the segment address
|
||
passed to it into the necessary internal representation to map the
|
||
pages.
|
||
|
||
|
||
Function 51h Reallocate pages
|
||
LIM Function Call 18
|
||
This function allows an application to change the number of logical
|
||
pages allocated to an EMM handle.
|
||
entry AH 51h
|
||
BX number of pages desired at return
|
||
DX handle
|
||
return AH error status: 00h, 80h, 81h, 83h, 84h, 87h, 88h
|
||
BX number of pages now associated with handle
|
||
note 1) uses registers AX, BX
|
||
2) Logical pages which were originally allocated with Function 4 are called
|
||
pages and are 16K bytes long. Logical pages which were allocated with
|
||
Function 27 are called raw pages and might not be the same size as pages
|
||
allocated with Function 4.
|
||
3) If the status returned in BX is not zero, the value in BX is equal to
|
||
the number of pages allocated to the handle prior to calling this
|
||
function. This information can be used to verify that the request
|
||
generated the expected results.
|
||
|
||
|
||
Function 52h Get/Set Handle Attributes
|
||
LIM Function Call 19
|
||
entry AH 52h
|
||
AL subfunction
|
||
00h get handle attributes
|
||
01h set handle attributes
|
||
BL new attribute
|
||
00h make handle volatile
|
||
01h make handle non-volatile
|
||
02h get attribute capability
|
||
DX handle
|
||
return AH error status: (function 00h) 00h, 80h, 81h, 83h, 84h, 8Fh, 91h
|
||
error status: (function 01h) 00h, 80h, 81h, 83h, 84h, 8Fh, 90h,
|
||
91h
|
||
error status: (function 02h) 00h, 80h, 81h, 84h, 8Fh
|
||
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
|
||
note 1) uses register AX
|
||
2) A volatile handle attribute instructs the memory manager to deallocate
|
||
both the handle and the pages allocated to it after a warm boot. If all
|
||
handles have the volatile attribute (default) at warm boot the handle
|
||
directory will be empty and all expanded memory will be initialized to
|
||
zero immediately after a warm boot.
|
||
3) If the handle's attribute has been set to non-volatile, the handle, its
|
||
name (if it is assigned one), and the contents of the pages allocated to
|
||
the handle are all maintained after a warm boot.
|
||
4) Most PCs disable RAM refresh signals for a considerable period during a
|
||
warm boot. This can corrupt some of the data in memory boards. Non-
|
||
volatile handles should not be used unless it is definitely known that
|
||
the EMS board will retain proper function through a warm boot.
|
||
5) subfunction 02h can be used to determine whether the memory manager can
|
||
support the non-volatile attribute.
|
||
6) Currently the only attribute supported is non-volatile handles and
|
||
pages, indicated by the least significant bit.
|
||
|
||
|
||
Function 53h Handle Name Functions
|
||
LIM Function Call 20
|
||
EMS handles may be named. Each name may be any eight characters.
|
||
At installation, all handles have their name initialized to ASCII
|
||
nulls (binary zeros). There is no restriction on the characters
|
||
which may be used in the handle name (ASCII chars 00h through
|
||
0FFh). A name of eight nulls (zeroes) is special, and indicates a
|
||
handle has no name. Nulls have no special significance, and they
|
||
can appear in the middle of a name. The handle name is 64 bits of
|
||
binary information to the EMM.
|
||
Functions 53h and 54h provide a way of setting and reading the
|
||
names associated with a particular handle. Function 53h manipulates
|
||
names by number.
|
||
When a handle is assigned a name, at least one character in the
|
||
name must be a non-null character in order to distinguish it from
|
||
a handle without a name.
|
||
|
||
00h Get Handle Name
|
||
This subfunction gets the eight character name currently
|
||
assigned to a handle.
|
||
The handle name is initialized to ASCII nulls (binary zeros)
|
||
three times: when the memory manager is installed, when a handle
|
||
is allocated, and when a handle is deallocated.
|
||
entry AH 53h
|
||
AL 00h
|
||
DX handle
|
||
ES:DI pointer to 8-byte handle name array into which the name
|
||
currently assigned to the handle will be copied.
|
||
return AH error status: 00h, 80h, 81h, 83h, 84h, 8Fh
|
||
note uses register AX
|
||
|
||
01h Set Handle Name
|
||
This subfunction assigns an eight character name to a handle.
|
||
A handle can be renamed at any time by setting the handle's
|
||
name to a new value. When a handle is deallocated, its name is
|
||
removed (set to ASCII nulls).
|
||
entry AH 53h
|
||
AL 01h
|
||
DX handle
|
||
DS:SI pointer to 8-byte handle name array that is to be assigned to
|
||
the handle. The handle name must be padded with nulls if the
|
||
name is less than eight characters long.
|
||
return AH error status: 00h, 80h, 81h, 83h, 84h, 8Fh, 0A1h
|
||
note uses register AX
|
||
|
||
|
||
Function 54h Handle Directory Functions
|
||
LIM Function Call 21
|
||
Function 54h manipulates handles by name.
|
||
|
||
00h Get Handle Directory
|
||
Returns an array which contains all active handles and the names
|
||
associated with each.
|
||
entry AH 54h
|
||
AL 00h
|
||
ES:DI pointer to 2550 byte target array
|
||
return AH error status: 00h, 80h, 81h, 84h, 8Fh
|
||
AL number of active handles
|
||
note 1) The name array consists of 10 byte entries; each entry has a word
|
||
containing the handle number, followed by the eight byte (64 bit) name.
|
||
2) uses register AX
|
||
3) The number of bytes required by the target array is:
|
||
10 bytes * total number of handles
|
||
4) The maximum size of this array is:
|
||
(10 bytes/entry) * 255 entries = 2550 bytes.
|
||
|
||
01h Search for Named Handle
|
||
Searches the handle name directory for a handle with a particular
|
||
name. If the named handle is found, this subfunction returns the
|
||
handle number associated with the name.
|
||
entry AH 54h
|
||
AL 01h
|
||
DS:SI pointer to an 8-byte string that contains the name of the
|
||
handle being searched for
|
||
return AH error status: 00h, 80h, 81h, 84h, 8Fh, A0h, 0A1h
|
||
DX handle number
|
||
note 1) uses registers AX and DX
|
||
|
||
02h Get Total Handles
|
||
Returns the total number of handles the EMM supports, including
|
||
the operating system handle (handle value 0).
|
||
entry AH 54h
|
||
AL 02h
|
||
return AH error status: 00h, 80h, 81h, 84h, 8Fh
|
||
BX total number of handles availible
|
||
note 1) This is NOT the current number of handles defined, but the maximum
|
||
number of handles that can be supported in the current environment.
|
||
2) uses registers AX and BX
|
||
|
||
|
||
Function 55h Alter Page Map and Jump (cross page branch)
|
||
LIM Function Call 22
|
||
Alters the memory mapping context and transfers control to the
|
||
specified address. Analogous to the FAR JUMP in the 8086 family
|
||
architecture. The memory mapping context which existed before
|
||
calling function is lost.
|
||
entry AH 55h
|
||
AL 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 AH error status: 00h, 80h, 81h, 83h, 84h, 8Ah, 8Bh, 8Fh
|
||
note 1) Flags and all registers except AX are preserved across the jump.
|
||
2) uses register AX
|
||
3) Values in registers which don't contain required parameters maintain the
|
||
values across the jump. The values in registers (with the exception of
|
||
AX) and the flag state at the beginning of the function are still in the
|
||
registers and flags when the target address is reached.
|
||
4) Mapping no pages and jumping is not considered an error. If a request to
|
||
map zero pages and jump is made, control is transferred to the target
|
||
address, and this function performs a far jump.
|
||
|
||
|
||
Function 56h Alter Page Map and Call (cross page call)
|
||
LIM Function Call 23
|
||
00h and 01h
|
||
This subfunction saves the current memory mapping context,
|
||
alters the specified memory mapping context, and transfers
|
||
control to the specified address.
|
||
entry AH 56h
|
||
AL 00h physical page numbers provided by caller
|
||
01h segment addresses provided by caller
|
||
DS:SI pointer to structure containing page map and call address
|
||
DX handle
|
||
return AH error status: 00h, 80h, 81h, 83h, 84h, 8Ah, 8Bh, 8Fh
|
||
note 1) Flags and all registers except AX are preserved to the called routine.
|
||
On return, flags and all registers except AX are preserved; AL is set to
|
||
zero and AX is undefined.
|
||
2) uses register AX
|
||
3) Values in registers which don't contain required parameters maintain
|
||
the values across the call. The values in registers (with the exception
|
||
of AX) and the flag state at the beginning of the function are still in
|
||
the registers and flags when the target address is reached.
|
||
4) Developers using this subfunction must make allowances for the
|
||
additional stack space this subfunction will use.
|
||
|
||
02h Get Page Map Stack Space Size
|
||
Since the Alter Page Map & Call function pushes additional
|
||
information onto the stack, this subfunction returns the number of
|
||
bytes of stack space the function requires.
|
||
entry AH 56h
|
||
AL 02h
|
||
return: BX number of bytes of stack used per call
|
||
AH error status: 00h, 80h, 81h, 84h, 8Fh
|
||
note 1) if successful, the target address is called. Use a RETF to return and
|
||
restore mapping context
|
||
2) uses registers AX, BX
|
||
|
||
|
||
Function 57h Move/Exchange Memory Region
|
||
LIM Function Call 24
|
||
00h Move Memory Region
|
||
Moves data between two memory areas. Includes moves between paged
|
||
and non-paged areas, or between two different paged areas.
|
||
entry AH 57h
|
||
AL 00h
|
||
SI offset to request block
|
||
DS segment selector to request block
|
||
return AH error status: 00h, 80h, 81h, 83h, 84h, 8Ah, 8Fh, 92h, 93h, 94h,
|
||
95h, 96h, 98h, 0A2h
|
||
note 1) uses register AX
|
||
|
||
01h Exchange Memory Region
|
||
Exchanges data between two memory areas. Includes exchanges between
|
||
paged and non-paged areas, or between two different paged areas.
|
||
entry AH 57h
|
||
AL 01h
|
||
DS:SI pointer to the data structure which contains the source and
|
||
destination information for the exchange.
|
||
return AH error status: 00h, 80h, 81h, 83h, 84h, 8Ah, 8Fh, 93h, 94h, 95h,
|
||
96h, 97h, 98h, 0A2h
|
||
note 1) The request block is a structure with the following format:
|
||
dword region length in bytes
|
||
byte 0=source in conventional memory
|
||
1=source in expanded memory
|
||
word source handle
|
||
word source offset in page or selector
|
||
word source logical page (expanded) or selector (conventional)
|
||
byte 0=target in conventional memory
|
||
1=target in expanded memory
|
||
word target handle
|
||
word target offset in page or selector
|
||
word target logical page (expanded) or selector (conventional)
|
||
2) Expanded memory allocated to a handle is considered to be a linear
|
||
array, starting from logical page 0 and progressing through logical page
|
||
1, 2, ... n, n+1, ... up to the last logical page in the handle.
|
||
3) uses register AX
|
||
|
||
|
||
Function 58h Mappable Physical Address Array
|
||
LIM Function Call 25
|
||
These functions let you obtain a complete map of the way physical
|
||
memory is laid out in a vendor independent manner. This is a
|
||
functional equivalent of EEMS function 68h ("function 41"). EEMS
|
||
function 60h ("function 33") is a subset call of 68h.
|
||
|
||
00h Get Array
|
||
Returns an array containing the segment address and physical page
|
||
number for each mappable physical page in a system. This array
|
||
provides a cross reference between physical page numbers and the
|
||
actual segment addresses for each mappable page in the system.
|
||
entry AH 58h
|
||
AL 00h
|
||
ES:DI pointer to target array
|
||
return AH error status: 00h, 80h, 81h, 84h, 8Fh
|
||
CX entries in target array
|
||
note 1) The information returned is in an array composed of word pairs. The
|
||
first word is the physical page's segment selector, the second word the
|
||
physical page number. Note that values are not necessarily returned in a
|
||
particular order, either ascending/decending segment selector values or
|
||
as ascending/decending physical page number.
|
||
2) For compatibility with earlier EMS specifications, physical page zero
|
||
contains the segment selector value returned by function 41h, and
|
||
physical pages 1, 2 and 3 return segment selector values that corrospond
|
||
to the physical 16 KB blocks immediately following physical page zero.
|
||
3) uses registers AX and CX
|
||
4) The array is sorted in ascending segment order. This does not mean that
|
||
the physical page numbers associated with the segment addresses are
|
||
also in ascending order.
|
||
|
||
01h Get Physical Page Address Array Entries.
|
||
Returns a word which represents the number of entries in the
|
||
array returned by the previous subfunction. This number also
|
||
indicates the number of mappable physical pages in a system.
|
||
entry AH 58h
|
||
AL 01h
|
||
return AH error status: 00h, 80h, 81h, 84h, 8Fh
|
||
CX number of entries returned by 58h/00h
|
||
note 1) multiply CX by 4 for the byte count.
|
||
2) uses registers AX and CX
|
||
|
||
|
||
Function 59h Get Expanded Memory Hardware Information
|
||
LIM Function Call 26
|
||
These functions return information specific to a given hardware
|
||
implementation and to use of raw pages as opposed to standard
|
||
pages. The intent is that only operating system code ever need use
|
||
these functions.
|
||
00h Get EMS Hardware Info
|
||
Returns an array containing expanded memory hardware configuration
|
||
information for use by an operating system.
|
||
entry AH 59h
|
||
AL 00h
|
||
ES:DI pointer to 10 byte target array
|
||
The target array has the following format:
|
||
word: raw page size in paragraphs (multiples of 16 bytes)
|
||
word: number of alternate register sets
|
||
word: size of page maps (function 4Eh [15])
|
||
word: number of alternate registers sets for DMA
|
||
word: DMA operation -- see full specification
|
||
return AH error status: 00h, 80h, 81h, 84h, 8Fh, 0A4h
|
||
note 1) uses register AX
|
||
2) This function is for use by operating systems only.
|
||
3) This function can be disabled at any time by the operating system.
|
||
|
||
01h Get Unallocated Raw Page Count
|
||
Returns the number of unallocated non-standard length mappable
|
||
pages as well as the total number of non-standard length mappable
|
||
pages of expanded memory
|
||
entry AH 59h
|
||
AL 01h
|
||
return AH error status: 00h, 80h, 81h, 84h, 8Fh
|
||
BX unallocated raw pages availible for use
|
||
DX total raw 16k pages of expanded memory
|
||
note 1) uses registers AX, BX, CX
|
||
2) An expanded memory page which is a sub-multiple of 16K is termed a raw
|
||
page. An operating system may deal with mappable physical page sizes
|
||
which are sub-multiples of 16K bytes.
|
||
3) If the expanded memory board supplies pages in exact multiples of 16K
|
||
bytes, the number of pages this function returns is identical to the
|
||
number Function 3 (Get Unallocated Page Count) returns. In this case,
|
||
there is no difference between a page and a raw page.
|
||
|
||
|
||
Function 5Ah Allocate Raw Pages
|
||
LIM Function Call 27
|
||
Allocates the number of nonstandard size pages that the operating
|
||
system requests and assigns a unique EMM handle to these pages.
|
||
entry AH 5Ah
|
||
AL 00h allocate standard pages
|
||
01h allocate raw pages
|
||
BX number of pages to allocate
|
||
return AH error status: 00h, 80h, 81h, 84h, 85h, 87h, 88h
|
||
DX unique raw EMM handle (1-255)
|
||
note 1) it is intended this call be used only by operating systems
|
||
2) uses registers AX and DX
|
||
3) For all functions using the raw handle returned in DX, the length of
|
||
the physical and logical pages allocated to it are some nonstandard
|
||
length (that is, not 16K bytes).
|
||
4) this call is primarily for use by operating systems or EMM drivers
|
||
supporting hardware with a nonstandard EMS page size.
|
||
|
||
|
||
Function 5Bh Alternate Map Register Set - DMA Registers
|
||
LIM Function Call 28
|
||
entry AH 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
|
||
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 AH status: 00h, 02h 00h, 80h, 84h, 81h, 8Fh, 0A4h
|
||
01h 00h, 80h, 81h, 84h, 8Fh, 9Ah, 9Ch, 9Dh,
|
||
0A3h, 0A4h
|
||
03h, 05h 00h 80h 81h 84h, 8Fh, 9Bh, 0A4h
|
||
04h 00h, 80h, 81h, 84h, 8Fh, 9Ch, 9Dh, 0A4h
|
||
06h, 07h 00h, 80h, 81h, 84h, 8Fh, 9Ah, 9Ch, 9Dh, 9Eh,
|
||
9Fh, 0A4h
|
||
BL current active alternate map register set number if nonzero
|
||
(AL=0)
|
||
BL number of alternate map register set; zero if not supported
|
||
(AL=3)
|
||
DX array size in bytes (subfunction 02h)
|
||
ES:DI pointer to a map register context save area if BL=0 (AL=0)
|
||
note 1) this call is for use by operating systems only, and can be enabled
|
||
or disabled at any time by the operating system
|
||
2) This set of functions performs the same functions at EEMS function 6Ah
|
||
subfunctions 04h and 05h ("function 43").
|
||
3) 00h uses registers AX, BX, ES:DI
|
||
01h uses register AX
|
||
02h uses registers AX and DX
|
||
03h uses registers AX and BX
|
||
04h uses register AX
|
||
05h uses registers AX, BX
|
||
06h uses register AX
|
||
07h uses register AX
|
||
|
||
|
||
Function 5Ch Prepare EMS Hardware for Warm Boot
|
||
LIM Function Call 29
|
||
Prepares the EMM hardware for a warm boot.
|
||
entry AH 5Ch
|
||
return AH error status: 00h, 80h, 81h, 84h
|
||
note 1) uses register AX
|
||
2) this function assumes that the next operation that the operating system
|
||
performs is a warm boot of the system.
|
||
3) in general, this function will affect the current mapping context, the
|
||
alternate register set in use, and any other expanded memory hardware
|
||
dependencies which need to be initialized at boot time.
|
||
4) if an application decides to map memory below 640K, the application must
|
||
trap all possible conditions leading to a warm boot and invoke this
|
||
function before performing the warm boot itself.
|
||
|
||
|
||
Function 5Dh Enable/Disable OS Function Set Functions
|
||
LIM Function Call 30
|
||
Lets the OS allow other programs or device drivers to use the OS
|
||
specific functions. This capability is provided only for an OS
|
||
which manages regions of mappable conventional memory and cannot
|
||
permit programs to use any of the functions which affect that
|
||
memory, but must be able to use these functions itself.
|
||
entry AH 5Dh
|
||
AL 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, 80h, 81h, 84h, 8Fh, 0A4h
|
||
note 1) this function is for use by operating systems only. The operating system
|
||
can disable this function at any time.
|
||
2) 00h uses registers AX, BX, CX
|
||
01h uses registers AX, BX, CX
|
||
02h uses register AX
|
||
3) 00h, 01h: The OS/E (Operating System/Environment) functions these
|
||
subfunctions affect are:
|
||
Function 26. Get Expanded Memory Hardware Information.
|
||
Function 28. Alternate Map Register Sets.
|
||
Function 30. Enable/Disable Operating System Functions.
|
||
|
||
|
||
Function 5Eh Unknown
|
||
LIM Function call (not defined under LIM)
|
||
|
||
|
||
Function 5Fh Unknown
|
||
LIM Function call (not defined under LIM)
|
||
|
||
|
||
Function 60h EEMS - Get Physical Window Array
|
||
LIM Function call (not defined under LIM)
|
||
entry AH 60h
|
||
ES:DI pointer to buffer
|
||
return AH status
|
||
AL number of entries
|
||
buffer at ES:DI filled
|
||
|
||
|
||
Function 61h Generic Accelerator Card Support
|
||
LIM Function Call 34
|
||
Contact AST Research for a copy of the Generic Accelerator Card
|
||
Driver (GACD) Specification
|
||
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.
|
||
|
||
|
||
Function 68h EEMS - Get Addresses of All Page Frames in System
|
||
LIM Function Call (not defined under LIM)
|
||
entry AH 68h
|
||
ES:DI pointer to buffer
|
||
return AH status
|
||
AL number of entries
|
||
buffer at ES:DI filled
|
||
note Equivalent to LIM 4.0 function 58h
|
||
|
||
|
||
Function 69h EEMS - Map Page Into Frame
|
||
LIM Function Call (not defined under LIM)
|
||
entry AH 69h
|
||
AL frame number
|
||
BX page number
|
||
DX handle
|
||
return AH status
|
||
note Similar to EMS function 44h
|
||
|
||
|
||
Function 6Ah EEMS - Page Mapping
|
||
LIM Function Call (not defined under LIM)
|
||
entry AH 6Ah
|
||
AL 00h save partial page map
|
||
CH first page frame
|
||
CL number of frames
|
||
ES:DI pointer to buffer which is to be filled
|
||
01h restore partial page map
|
||
CH first page frame
|
||
CL number of frames
|
||
DI:SI pointer to 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 LIM function 4Eh, except that a subrange of pages can
|
||
be specified
|
||
|
||
|
||
|
||
EXPANDED MEMORY MANAGER ERROR CODES
|
||
|
||
EMM error codes are returned in AH after a call to the EMM (int 67h).
|
||
|
||
code meaning
|
||
|
||
00h function successful
|
||
80h internal error in EMM software (possibly corrupted driver)
|
||
81h hardware malfunction
|
||
82h EMM busy (dropped in EEMS 3.2)
|
||
83h invalid EMM handle
|
||
84h function requested not defined - unknown function code in AH.
|
||
85h no more EMM handles availible
|
||
86h error in save or restore of mapping context
|
||
87h more pages requested than exist
|
||
88h allocation request specified more logical pages than currently
|
||
availible in system (request does not exceed actual physical number of
|
||
pages, but some are already allocated to other handles); no pages
|
||
allocated
|
||
89h zero pages; cannot be allocated (dropped in EMS 4.0)
|
||
8Ah logical page requested to be mapped outside range of logical pages
|
||
assigned to handle
|
||
8Bh illegal page number in mapping request (valid numbers are 0 to 3)
|
||
8Ch page-mapping hardware state save area full
|
||
8Dh save of mapping context failed; save area already contains context
|
||
associated with page handle
|
||
8Eh retore of mapping context failed; save area does not contain context
|
||
for requested handle
|
||
8Fh subfunction parameter not defined (unknown function)
|
||
|
||
LIM 4.0 extended error codes:
|
||
|
||
90h attribute type undefined
|
||
91h warm boot data save not implemented
|
||
92h move overlaps memory
|
||
93h move/exchange larger than allocated region
|
||
94h conventional/expanded regions overlap
|
||
95h logical page offset outside of logical page
|
||
96h region larger than 1 MB
|
||
97h exchange source/destination overlap
|
||
98h source/destination undefined or not supported
|
||
99h (no status assigned)
|
||
9Ah alternate map register sets supported, specified set is not
|
||
9Bh all alternate map & DMA register sets allocated
|
||
9Ch alternate map & DMA register sets not supported
|
||
9Dh alternate map register or DMA set not defined, allocated or is currently
|
||
defined set
|
||
9Eh dedicated DMA channels not supported
|
||
9Fh dedicated DMA channels supported; specifed channel is not
|
||
0A0h named handle could not be found
|
||
0A1h handle name already exists
|
||
0A2h move/exchange wraps around 1 MB boundry
|
||
0A3h data structure contains corrupted data
|
||
0A4h access denied
|
||
|
||
|
||
|
||
This is a user-supported technical reference. If you find this information
|
||
to be of use, please mail your check or money order for $15 to:
|
||
|
||
Dave Williams
|
||
PO Box 181
|
||
Jacksonville, AR 72087-0181
|
||
USA
|
||
|
||
In return for your support you will receive the very latest edition of this
|
||
manual on a disk, plus one disk of appendixes and references and a third
|
||
disk with source code. That's about two megabytes of raw data when
|
||
uncompressed, or the equivalent of ten manuals the size of the technical
|
||
reference manuals from IBM or Microsoft.
|
||
|
||
In addition, supporting users may obtain updates by merely mailing a disk and
|
||
return postage whenever they feel like it.
|
||
INDEX
|
||
|
||
DOS TECHNICAL INFORMATION
|
||
Programming Technical Reference - IBM
|
||
Copyright 1988, Dave Williams
|
||
|
||
CHAPTER 1.
|
||
SOME HISTORY
|
||
THE OPERATING SYSTEM HIERARCHY
|
||
DOS STRUCTURE
|
||
DOS Initialization
|
||
|
||
CHAPTER 2.
|
||
SYSTEM MEMORY MAP - OVERALL
|
||
PC Port Assignment, Intel 8088, 80C88, 8086, 80286, 80386 CPUs
|
||
Reserved Memory Locations in the IBM PC
|
||
At Absolute Addresses
|
||
The IBM PC System Interrupts (Overview)
|
||
The IBM-PC System Interrupts (in detail)
|
||
Interrupt 00h Divide by Zero (processor error).
|
||
Interrupt 01h Single step
|
||
Interrupt 02h Non-maskable interrupt
|
||
Interrupt 03h Breakpoint
|
||
Interrupt 04h Divide overflow
|
||
Interrupt 05h Print Screen
|
||
Interrupt 06h Reserved by IBM
|
||
Interrupt 07h Reserved by IBM
|
||
Interrupt 08h Timer
|
||
Interrupt 09h Keyboard
|
||
Interrupt 0Ah EGA Vertical Retrace
|
||
Interrupt 0Bh Communications Controller (serial port) hdw. entry
|
||
Interrupt 0Ch Communications Controller (serial port) hdw. entry
|
||
Interrupt 0Dh Alternate Printer, PC/AT 80287
|
||
Interrupt 0Eh Diskette
|
||
Interrupt 0Fh Reserved by IBM
|
||
|
||
CHAPTER 3. THE PC ROM BIOS
|
||
Interrupt 10h Video I/O
|
||
Function 00h Determine or Set Video State
|
||
01h Set Cursor Type
|
||
02h Set Cursor Position
|
||
03h Read Cursor Position
|
||
04h Read Light Pen
|
||
05h Select Active Page
|
||
06h Scroll Page Up
|
||
07h Scroll Page Down
|
||
08h Read Character Attribute
|
||
09h Write Character and Attribute
|
||
0Ah Write Character
|
||
0Bh Set Color Palette
|
||
0Ch Write Dot
|
||
0Dh Read Dot
|
||
0Eh Write TTY
|
||
0Fh Return Current Video State
|
||
10h Set Palette Registers
|
||
11h Character Generator Routine (EGA and after)
|
||
12h Alternate Select (EGA and after)
|
||
13h Write String
|
||
14h Load LCD Character Font
|
||
15h Return Physical Display Parameters
|
||
1Ah Display Combination Code
|
||
1Bh Functionality/State Information
|
||
1Ch Save/Restore Video State
|
||
70h Get Video RAM Address
|
||
71h Get INCRAM Addresses
|
||
72h Scroll Screen Right
|
||
73h Scroll Screen Left
|
||
81h DESQview video - Get something?
|
||
82h DESQview - Get Current Window Info
|
||
F0h Microsoft Mouse driver EGA support - Read One Register
|
||
F1h Microsoft Mouse driver EGA support - Write One Register
|
||
F2h Microsoft Mouse driver EGA support - Read Register Range
|
||
F3h Microsoft Mouse driver EGA support - Write Register Range
|
||
F4h Microsoft Mouse driver EGA support - Read Register Set
|
||
F5h Microsoft Mouse driver EGA support - Read Register Set
|
||
F6h Microsoft Mouse driver EGA support
|
||
F7h Microsoft Mouse driver EGA support
|
||
FAh Microsoft Mouse driver EGA support - Interrogate Driver
|
||
FEh Get Alternate Screen Buffer Address (text mode only)
|
||
FFh Update Real Display (text mode only)
|
||
Interrupt 11h Equipment Check
|
||
Interrupt 12h Memory Size
|
||
Interrupt 13h Disk I/O
|
||
Function 00h Reset
|
||
01h Get Status of disk system
|
||
02h Read Sectors
|
||
03h Write Sectors
|
||
04h Verify
|
||
05h Format Track
|
||
06h Hard Disk
|
||
07h Hard Disk
|
||
08h Read Drive Parameters
|
||
09h Initialize Two Fixed Disk Base Tables
|
||
0Ah Read Long (Hard disk)
|
||
0Bh Write Long
|
||
0Ch Seek To Cylinder
|
||
0Dh Alternate Disk Reset
|
||
0Eh Read Sector Buffer
|
||
0Fh Write sector buffer
|
||
10h Test For Drive Ready
|
||
11h Recalibrate Drive
|
||
12h Controller RAM Diagnostic
|
||
13h Drive Diagnostic
|
||
14h Controller Internal Diagnostic
|
||
15h Get Disk Type
|
||
16h Change of Disk Status (diskette)
|
||
17h Set Disk Type for Format (diskette)
|
||
18h Set Media Type For Format (diskette)
|
||
19h Park Hard Disk Heads
|
||
1Ah ESDI Hard Disk - Format
|
||
Interrupt 14h Initialize and Access Serial Port For Int 14
|
||
Function 01h Send Character in AL to Comm Port DX (0 or 1)
|
||
02h Wait For A Character From Comm Port DX
|
||
03h Fetch the Status of Comm Port DX (0 or 1)
|
||
04h Extended Initialize
|
||
05h Extended Communication Port Control
|
||
Interrupt 15h Cassette I/O
|
||
Function 00h Turn Cassette Motor On
|
||
01h Turn Cassette Motor Off
|
||
02h Read Blocks From Cassette
|
||
03h Write Data Blocks to Cassette
|
||
0Fh ESDI Format Unit Periodic Interrupt
|
||
10h TopView API Function Calls
|
||
20h PRINT.COM (DOS internal)
|
||
21h Power-On Self Test (POST) Error Log
|
||
40h Read/Modify Profiles
|
||
41h Wait On External Event
|
||
42h Request System Power Off
|
||
43h Read System Status
|
||
44h (De)activate Internal Modem Power
|
||
4Fh Keyboard Intercept
|
||
80h Device Open
|
||
81h Device Close
|
||
82h Program Termination
|
||
83h Event Wait
|
||
84h Read Joystick Input Settings
|
||
85h System Request (SysReq) Key Pressed
|
||
86h Elapsed Time Wait
|
||
88h Extended Memory Size Determine
|
||
89h Switch Processor to Protected Mode
|
||
91h Set Flag and Complete Interrupt
|
||
C0h Get System Configuration
|
||
C1h System
|
||
C2h Pointing Device BIOS Interface (DesQview 2.x)
|
||
C3h Enable/Disable Watchdog Timeout
|
||
C4h Programmable Option Select
|
||
DEh DesQview Services
|
||
Interrupt 16h Keyboard I/O
|
||
Function 00h Get Keyboard Input
|
||
01h Check Keystroke Buffer
|
||
02h Shift Status
|
||
03h Keyboard
|
||
04h Keyboard Click Toggle
|
||
05h Keyboard Buffer Write
|
||
10h Get Enhanced Keystroke And Read
|
||
11h Check Enhanced Keystroke
|
||
12h Extended Get Shift Status
|
||
F0h Set CPU speed (Compaq 386)
|
||
Interrupt 17h Printer
|
||
Function 00h Print Character/send AL to printer DX (0, 1, or 2)
|
||
01h Initialize Printer
|
||
02h Printer Status
|
||
Interrupt 18h ROM BASIC
|
||
Interrupt 19h Bootstrap Loader
|
||
Interrupt 1Ah Time of Day
|
||
Function 00h Read System Time Counter
|
||
01h Set Clock
|
||
02h Read Real Time Clock Time
|
||
03h Set Real Time Clock Time
|
||
04h Read Real Time Clock Date
|
||
05h Set Real Time Clock Date
|
||
06h Set Real Time Clock Alarm
|
||
07h Reset Real Time Clock Alarm
|
||
08h Set Real Time Clock Activated Power On Mode
|
||
09h Read Real Time Clock Alarm Time and Status
|
||
0Ah Read System-Timer Day Counter
|
||
0Bh Set System-Timer Day Counter
|
||
80h Set Up Sound Multiplexor
|
||
Interrupt 1Bh Control-Break
|
||
Interrupt 1Ch Timer Tick
|
||
Interrupt 1Dh Vector of Video Initialization Parameters.
|
||
Interrupt 1Eh Vector of Diskette Controller Parameters
|
||
Interrupt 1Fh Pointer to Graphics Character Extensions (Graphics Set 2)
|
||
Interrupt 20h PROGRAM TERMINATE
|
||
Interrupt 20h DOS - Terminate Program
|
||
Interrupt 20h Minix - Send/Receive Message
|
||
|
||
CHAPTER 4. DOS INTERRUPTS AND FUNCTION CALLS
|
||
DOS Registers
|
||
Interrupts
|
||
Interrupt 21h Function Request (Overview)
|
||
Calling the DOS Services
|
||
Interrupt 21h Function Request (in detail)
|
||
Function 00h Program Terminate
|
||
01h Keyboard Input
|
||
02h Display Output
|
||
03h Auxiliary Input
|
||
04h Auxiliary Output
|
||
05h Printer Output
|
||
06h Direct Console I/O
|
||
07h Direct Console Input Without Echo
|
||
08h Console Input Without Echo
|
||
09h Print String
|
||
0Ah Buffered Keyboard Input
|
||
0Bh Check Standard Input Status
|
||
0Ch Clear Keyboard Buffer and Invoke a Kbd Function
|
||
0Dh Disk Reset
|
||
0Eh Select Disk
|
||
0Fh Open File
|
||
10h Close File
|
||
11h Search for First Entry
|
||
12h Search for Next Entry
|
||
13h Delete File
|
||
14h Sequential Read
|
||
15h Sequential Write
|
||
16h Create File
|
||
17h Rename File
|
||
18h Unknown
|
||
19h Current Disk
|
||
1Ah Set Disk Transfer Address
|
||
1Bh Allocation Table Information
|
||
1Ch Allocation Table Information for Specific Device
|
||
1Dh Unknown
|
||
1Eh Unknown
|
||
1Fh Read DOS Disk Block (default drive)
|
||
20h Unknown
|
||
21h Random Read
|
||
22h Random Write
|
||
23h File Size
|
||
24h Set Relative Record Field
|
||
25h Set Interrupt Vector
|
||
26h Create New Program Segment
|
||
27h Random Block Read
|
||
28h Random Block Write
|
||
29h Parse Filename
|
||
2Ah Get Date
|
||
2Bh Get Date
|
||
2Ch Get Time
|
||
2Dh Set Time
|
||
2Eh Set/Reset Verify Switch
|
||
2Fh Get Disk Transfer Address (DTA)
|
||
30h Get DOS Version Number
|
||
31h Terminate Process and Stay Resident
|
||
32h Read DOS Disk Block
|
||
33h Ctrl-Break Check
|
||
34h Return INDOS Flag
|
||
35h Get Vector
|
||
36h Get Disk Free Space
|
||
37h Get/Set Switch Character (SWITCHAR)
|
||
38h Return Country Dependent Information
|
||
39h Create Subdirectory (MKDIR)
|
||
3Ah Remove Subdirectory (RMDIR)
|
||
3Bh Change Durrent Directory (CHDIR)
|
||
3Ch Create a File (CREAT)
|
||
3Dh Open a File
|
||
3Eh Close a File Handle
|
||
3Fh Read From a File or Device
|
||
40h Write to a File or Device
|
||
41h Delete a File from a Specified Directory (UNLINK)
|
||
42h Move File Read/Write Pointer (LSEEK)
|
||
43h Change File Mode (CHMOD)
|
||
44h I/O Control for Devices (IOCTL)
|
||
45h Duplicate a File Handle (DUP)
|
||
46h Force a Duplicate of a Handle (FORCDUP)
|
||
47h Get Current Directory
|
||
48h Allocate Memory
|
||
49h Free Allocated Memory
|
||
4Ah Modify Allocated Memory Blocks (SETBLOCK)
|
||
4Bh Load or Execute a Program (EXEC)
|
||
4Ch Terminate a Process (EXIT)
|
||
4Dh Get Return Code of a Subprocess (WAIT)
|
||
4Eh Find First Matching File (FIND FIRST)
|
||
4Fh Find Next Matching File (FIND NEXT)
|
||
50h Set PSP
|
||
51h Get PSP
|
||
52h IN-VARS
|
||
53h Translate BPB
|
||
54h Get Verify Setting
|
||
55h Create Child PSP
|
||
56h Rename a File
|
||
57h Get or Set Timestamp of a File
|
||
58h Get/Set Allocation Strategy (DOS 3.x)
|
||
59h Get Extended Error Code
|
||
5Ah Create Unique Filename
|
||
5Bh Create a New File
|
||
5Ch Lock/Unlock File Access
|
||
5Dh Network - Partial
|
||
5Eh Network Printer
|
||
5Fh Network Redirection
|
||
60h Parse Pathname
|
||
61h Unknown
|
||
62h Get Program Segment Prefix (PSP) Address
|
||
63h Get Lead Byte Table (DOS 2.25)
|
||
64h Unknown
|
||
65h Get Extended Country Information (DOS 3.3)
|
||
66h Get/Set Global Code Page Table (DOS 3.3)
|
||
67h Set Handle Count (DOS 3.3)
|
||
68h Commit File (DOS 3.3)
|
||
69h Disk Serial Number DOS 4.0 (US)
|
||
6Ah unknown (DOS 4.0?)
|
||
6Bh unknown (DOS 4.0?)
|
||
6Ch Extended Open/Create DOS 4.0 (US)
|
||
89h DOS_Sleep
|
||
Aftermarket Application Installed Function Calls, Used by NetWare
|
||
Function B6h-FFh Novell NetWare
|
||
|
||
CHAPTER 5. Interrupts 22h Through 86h
|
||
Interrupt 22h Terminate Address
|
||
Interrupt 23h Ctrl-Break Exit Address
|
||
Interrupt 24h Critical Error Handler
|
||
Interrupt 25h Absolute Disk Read
|
||
Interrupt 26h Absolute Disk Write
|
||
Interrupt 27h Terminate And Stay Resident
|
||
Interrupt 28h (not documented by Microsoft)
|
||
Interrupt 29h (not documented by Microsoft)
|
||
Interrupt 2Ah Microsoft Networks - Session Layer Interrupt
|
||
Interrupt 2Bh (not documented by Microsoft)
|
||
Interrupt 2Ch (not documented by Microsoft)
|
||
Interrupt 2Dh (not documented by Microsoft)
|
||
Interrupt 2Eh (undocumented by Microsoft)
|
||
Interrupt 2Fh Multiplex Interrupt
|
||
Interrupt 30h (not a vector!) far jump instruction for CP/M-style calls
|
||
Interrupt 31h Unknown
|
||
Interrupt 32h Unknown
|
||
Interrupt 33h Used by Microsoft Mouse Driver
|
||
Interrupt 34h Turbo C/Microsoft languages - Floating Point emulation
|
||
Interrupt 35h Turbo C/Microsoft languages - Floating Point emulation
|
||
Interrupt 36h Turbo C/Microsoft languages - Floating Point emulation
|
||
Interrupt 37h Turbo C/Microsoft languages - Floating Point emulation
|
||
Interrupt 38h Turbo C/Microsoft languages - Floating Point emulation
|
||
Interrupt 39h Turbo C/Microsoft languages - Floating Point emulation
|
||
Interrupt 3Ah Turbo C/Microsoft languages - Floating Point emulation
|
||
Interrupt 3Bh Turbo C/Microsoft languages - Floating Point emulation
|
||
Interrupt 3Ch Turbo C/Microsoft languages - Floating Point emulation
|
||
Interrupt 3Dh Turbo C/Microsoft languages - Floating Point emulation
|
||
Interrupt 3Eh Turbo C/Microsoft languages - Floating Point emulation
|
||
Interrupt 3Fh Overlay manager interrupt (Microsoft LINK.EXE)
|
||
Interrupt 40h Hard Disk BIOS
|
||
Interrupt 41h Hard Disk Parameters
|
||
Interrupt 42h Pointer to screen BIOS entry
|
||
Interrupt 43h Pointer to EGA initialization parameter table
|
||
Interrupt 44h Pointer to EGA graphics character table
|
||
Interrupt 45h Reserved by IBM (not initialized)
|
||
Interrupt 46h Pointer to second hard disk, parameter block
|
||
Interrupt 47h Reserved by IBM (not initialized)
|
||
Interrupt 48h Cordless Keyboard Translation
|
||
Interrupt 49h Non-keyboard Scan Code Translation Table Address
|
||
Interrupt 4Ah Real-Time Clock Alarm
|
||
Interrupt 4Bh Reserved by IBM (not initialized)
|
||
Interrupt 4Ch Reserved by IBM (not initialized)
|
||
Interrupt 4Dh Reserved by IBM (not initialized)
|
||
Interrupt 4Eh Reserved by IBM (not initialized)
|
||
Interrupt 4Fh Reserved by IBM (not initialized)
|
||
Interrupt 50-57 IRQ0-IRQ7 relocated by DesQview
|
||
Interrupt 58h Reserved by IBM (not initialized)
|
||
Interrupt 59h Reserved by IBM (not initialized)
|
||
Interrupt 5Ah Reserved by IBM (not initialized)
|
||
Interrupt 5Bh Reserved by IBM (not initialized)
|
||
Interrupt 5Ah Cluster Adapter BIOS entry address
|
||
Interrupt 5Bh Reserved by IBM (not initialized) (cluster adapter?)
|
||
Interrupt 5Ch NETBIOS interface entry port
|
||
Interrupt 5Dh Reserved by IBM (not initialized)
|
||
Interrupt 5Eh Reserved by IBM (not initialized)
|
||
Interrupt 5Fh Reserved by IBM (not initialized)
|
||
Interrupt 60h-67h User Program Interrupts (availible for general use)
|
||
Interrupt 67h Used by Lotus-Intel-Microsoft Expanded Memory Specification
|
||
Interrupt 68h Not Used (not initialized)
|
||
Interrupt 69h Not Used (not initialized)
|
||
Interrupt 6Ah Not Used (not initialized)
|
||
Interrupt 6Bh Not Used (not initialized)
|
||
Interrupt 6Ch System Resume Vector (Convertible) (not initialized on PC)
|
||
Interrupt 6Dh Not Used (not initialized)
|
||
Interrupt 6Fh Not Used (not initialized)
|
||
Interrupt 70h IRQ 8, Real Time Clock Interrupt
|
||
Interrupt 71h IRQ 9, Redirected to IRQ 8
|
||
Interrupt 72h IRQ 10 (AT, XT/286, PS/2) Reserved
|
||
Interrupt 73h IRQ 11 (AT, XT/286, PS/2) Reserved
|
||
Interrupt 74h IRQ 12 Mouse Interrupt (AT, XT/286, PS/2)
|
||
Interrupt 75h IRQ 13, Coprocessor Error, BIOS Redirect to int 2 (NMI) (AT)
|
||
Interrupt 76h IRQ 14, Hard Disk Controller (AT, XT/286, PS/2)
|
||
Interrupt 77h IRQ 15 (AT, XT/286, PS/2) Reserved
|
||
Interrupt 78h Not Used
|
||
Interrupt 79h Not Used
|
||
Interrupt 7Ah Novell NetWare - LOW-LEVEL API
|
||
Interrupt 7Bh-7Fh Not Used
|
||
Interrupt 80h-85h Reserved by BASIC
|
||
Interrupt 86h Relocated by NETBIOS int 18
|
||
Interrupt 86h-F0h Used by BASIC when BASIC interpreter is running
|
||
Interrupt E4h Logitech Modula-2 v2.0 MONITOR
|
||
Interrupt F1h-FFh (absolute addresses 3C4-3FF)
|
||
Interrupt F8h Set Shell Interrupt (OEM)
|
||
Interrupt F9h First of 8 SHELL service codes, reserved for OEM shell (WINDOW);
|
||
Interrupt FAh USART ready (RS-232C)
|
||
Interrupt FBh USART RS ready (keyboard)
|
||
Interrupt FCh Unknown
|
||
Interrupt FDh reserved for user interrupt
|
||
Interrupt FEh AT/XT286/PS50+ - destroyed by return from protected mode
|
||
Interrupt FFh AT/XT286/PS50+ - destroyed by return from protected mode
|
||
|
||
CHAPTER 6. DOS CONTROL BLOCKS AND WORK AREAS
|
||
The Disk Transfer Area (DTA)
|
||
DOS Program Segment
|
||
STANDRD FILE CONTROL BLOCK
|
||
EXTENDED FILE CONTROL BLOCK
|
||
MEMORY CONTROL BLOCKS
|
||
CONTROL BLOCK
|
||
MEMORY CONTROL BLOCKS
|
||
|
||
CHAPTER 7. DOS File Structure
|
||
File Management Functions
|
||
FCB FUNCTION CALLS
|
||
HANDLE FUNCTION CALLS
|
||
SPECIAL FILE HANDLES
|
||
ASCII and BINARY MODE
|
||
FILE I/O IN BINARY (RAW) MODE
|
||
FILE I/O IN ASCII (COOKED) MODE
|
||
NUMBER OF OPEN FILES ALLOWED
|
||
RESTRICTIONS ON FCB USAGE
|
||
RESTRICTIONS ON HANDLE USAGE
|
||
ALLOCATING SPACE TO A FILE
|
||
MSDOS / PCDOS DIFFERENCES
|
||
.EXE FILE STRUCTURE
|
||
THE RELOCATION TABLE
|
||
"NEW" .EXE FORMAT (Microsoft Windows and OS/2)
|
||
|
||
CHAPTER 8. DOS DISK INFORMATION
|
||
THE DOS AREA
|
||
THE BOOT RECORD
|
||
THE DOS FILE ALLOCATION TABLE (FAT)
|
||
USE OF THE 12 BIT FILE ALLOCATION TABLE
|
||
USE OF THE 16 BIT FILE ALLOCATION TABLE
|
||
DOS DISK DIRECTORY
|
||
DIRECTORY ENTRIES
|
||
THE DATA AREA
|
||
HArd DISK LAYOUT
|
||
SYSTEM INITIALIZATION
|
||
THE BOOT SEQUENCE
|
||
BOOT RECORD/PARTITION TABLE
|
||
HARD DISK TECHNICAL INFORMATION
|
||
DETERMINING FIXED DISK ALLOCATION
|
||
|
||
CHAPTER 9. INSTALLABLE DEVICE DRIVERS
|
||
DEVICE DRIVER FORMAT
|
||
TYPES OF DEVICES
|
||
DEVICE HEADER
|
||
POINTER TO NEXT DEVICE HEADER FIELD
|
||
ATTRIBUTE FIELD
|
||
POINTER TO STRATEGY AND INTERRUPT ROUTINES
|
||
NAME/UNIT FIELD
|
||
CREATING A DEVICE DRIVER
|
||
INSTALLING DEVICE DRIVERS
|
||
INSTALLING CHARACTER DEVICES
|
||
INSTALLING BLOCK DEVICES
|
||
REQUEST HEADER
|
||
UNIT CODE FIELD
|
||
COMMAND CODE FIELD
|
||
STATUS FIELD
|
||
DEVICE DRIVER FUNCTIONS
|
||
INIT
|
||
MEDIA CHECK
|
||
MEDIA DESCRIPTOR
|
||
BUILD BPB (BIOS Parameter Block)
|
||
INPUT / OUTPUT
|
||
NONDESTRUCTIVE INPUT NO WAIT
|
||
STATUS
|
||
FLUSH
|
||
OPEN or CLOSE (3.x)
|
||
REMOVABLE MEDIA (DOS 3.x)
|
||
THE CLOCK$ DEVICE
|
||
|
||
CHAPTER 10. LOTUS-INTEL-MICROSOFT EXPANDED MEMORY SPECIFICATION
|
||
The Expanded Memory Manager
|
||
History
|
||
Page Frames
|
||
Expanded Memory Services
|
||
AST/Quadram/Ashton-Tate Enhanced EMM
|
||
Calling the Manager
|
||
Common EMS s (hex calls)
|
||
1 (40h) Get Manager Status
|
||
2 (41h) Get Page Frame Segment
|
||
3 (42h) Get Number of Pages
|
||
4 (43h) Get Handle and Allocate Memory
|
||
5 (44h) Map Memory
|
||
6 (45h) Release Handle and Memory
|
||
7 (46h) Get EMM Version
|
||
8 (47h) Save Mapping Context
|
||
9 (48h) Restore Mapping Context
|
||
10 (49h) Reserved
|
||
11 (4Ah) Reserved
|
||
12 (4Bh) Get Number of EMM Handles
|
||
13 (4Ch) Get Pages Owned By Handle
|
||
14 (4Dh) Get Pages for All Handles
|
||
15 (4Eh) Get Or Set Page Map
|
||
new LIM 4.0 specification:
|
||
16 (4Fh) Get/Set Partial Page Map
|
||
17 (50h) Map/Unmap Multiple Pages
|
||
18 (51h) Reallocate Pages
|
||
19 (52h) Handle Attribute Functions
|
||
20 (53h) Get Handle Name
|
||
21 (54h) Get Handle Directory
|
||
22 (55h) Alter Page Map & Jump
|
||
23 (56h) Alter Page Map & Call
|
||
24 (57h) Move Memory Region
|
||
25 (58h) Get Mappable Physical Address Array
|
||
26 (59h) Get Expanded Memory Hardware
|
||
27 (5Ah) Allocate Raw Pages
|
||
28 (5Bh) Get Alternate Map Register Set
|
||
29 (5Ch) Prepare Expanded Memory Hardware
|
||
30 (5Dh) Enable OS/E Function Set
|
||
31 (5Eh) Unknown
|
||
32 (5Fh) Unknown
|
||
33 (60h) Unknown
|
||
34 (61h) AST Generic Accelerator Card Support
|
||
(68h) EEMS - Get Addresses of All Page Frames in System
|
||
(69h) EEMS - Map Page Into Frame
|
||
(6Ah) EEMS - Page Mapping
|
||
Expanded Memory Manager Error Codes
|
||
LIM 4.0 extended error codes
|
||
|
||
Programming Technical Reference - IBM
|
||
Copyright 1988, Dave Williams
|
||
|
||
|
||
These scan codes are generated by pressing a key on the PC's keyboard. This
|
||
is the 'make' code. A 'break' code is generated when the key is released. The
|
||
break scancode is 128 higher than the make code, and is generated by setting
|
||
bit 7 of the scan code byte to 1.
|
||
|
||
|
||
IBM PC KEYBOARD EXTENDED CODES
|
||
|
||
Normal Shift Control Alt
|
||
|
||
ESC 1
|
||
1 2 0;120
|
||
2 3 0;121
|
||
3 4 0;122
|
||
4 5 0;123
|
||
5 6 0;124
|
||
6 7 0;125
|
||
7 8 0;126
|
||
8 9 0;127
|
||
9 10 0;128
|
||
0 11 0;129
|
||
- 12 0;130
|
||
= 13 0;131
|
||
TAB 15 0;15(backtab)
|
||
backtab none 0;15
|
||
RETURN 28
|
||
|
||
Normal Shift Control Alt NumLock
|
||
|
||
Home 0;71 0;119 none 7
|
||
UpArrow 0;72 none none 8
|
||
PgUp 0;73 0;132 none 9
|
||
gray - 0;74 0;74
|
||
LArrow 0;75 0;115 none 4
|
||
keypad 5 none none none 5
|
||
RArrow 0;77 0;116 6
|
||
gray + 0;78 0;78
|
||
End 0;79 0;117 none 1
|
||
DnArrow 0;80 2
|
||
PgDn 0;81 0;118 none 3
|
||
Ins 0;82 none 11
|
||
Del 0;83 0;128 none 52
|
||
PrtSc 55 0;114
|
||
L shift 42
|
||
R shift 54
|
||
alt key 56
|
||
capslock 58
|
||
spacebar 57
|
||
control key 29
|
||
numlock 69
|
||
scrollock 70
|
||
; 39
|
||
[ 26
|
||
] 27
|
||
" 40
|
||
\ 43
|
||
/ 53
|
||
, 51
|
||
. 52
|
||
|
||
IBM PC KEYBOARD EXTENDED CODES
|
||
|
||
Normal Shift Control Alt
|
||
|
||
a = 30 0;30
|
||
b = 48 0;48
|
||
c = 46 0;46
|
||
d = 32 0;32
|
||
e = 18 0;18
|
||
f = 33 0;33
|
||
g = 34 0;34
|
||
h = 35 0;35
|
||
i = 23 0;23
|
||
j = 36 0;36
|
||
k = 37 0;37
|
||
l = 38 0;38
|
||
m = 50 0;50
|
||
n = 49 0;49
|
||
o = 24 0;24
|
||
p = 25 0;25
|
||
q = 16 0;16
|
||
r = 19 0;19
|
||
s = 31 0;31
|
||
t = 20 0;20
|
||
u = 22 0;22
|
||
v = 47 0;47
|
||
w = 17 0;17
|
||
x = 45 0;45
|
||
y = 21 0;21
|
||
z = 44 0;44
|
||
|
||
Normal Shift Control Alt
|
||
|
||
F1 = 0;59 0;84 0;94 0;104
|
||
F2 = 0;60 0;85 0;95 0;105
|
||
F3 = 0;61 0;86 0;96 0;106
|
||
F4 = 0;62 0;87 0;97 0;107
|
||
F5 = 0;63 0;88 0;98 0;108
|
||
F6 = 0;64 0;89 0;99 0;109
|
||
F7 = 0;65 0;90 0;100 0;110
|
||
F8 = 0;66 0;91 0;101 0;111
|
||
F9 = 0;67 0;92 0;102 0;112
|
||
F10 = 0;68 0;93 0;103 0;113
|
||
|
||
"Enhanced" 101/102 key keyboard scancodes
|
||
|
||
Normal Shift Control Alt
|
||
F11 = 0;152 0;162 0;172 0;182 |
|
||
F12 = 0;153 0;163 0;173 0;183 | Tandy?
|
||
|
||
F11 = 0;133 0;135 0;137 0;139
|
||
F12 = 0;134 0;136 0;138 0;140
|
||
|
||
alt-home 0;151
|
||
UpArr 0;141 0;152
|
||
Ctrl - 0;142
|
||
Ctrl 5 0;143
|
||
Ctrl + 0;144
|
||
DnArr 0;145 0;160
|
||
Ins 0;146 0;162
|
||
Del 0;147 0;163
|
||
Tab 0;148 0;165
|
||
/ 0;149 0;164
|
||
Ctrl-* 0;150
|
||
alt-Enter 0;166
|
||
alt-PgUp 0;153
|
||
alt-LArr 0;154
|
||
alt-RArr 0;155
|
||
alt-End 0;156
|
||
alt-PgDn 0;161
|
||
|
||
BIOS keystroke codes, hexadecimal
|
||
|
||
Key Normal Shift Control Alt
|
||
|
||
Esc 011B 011B 011B --
|
||
1! 0231 '1' 0221 '!' -- 7800
|
||
2@ 0332 '2' 0340 '@' 0300 7900
|
||
3# 0433 '3' 0423 '#' -- 7A00
|
||
4$ 0534 '4' 0524 '$' -- 7B00
|
||
5% 0635 '5' 0625 '%' -- 7C00
|
||
6^ 0736 '6' 075E '^' 071E 7D00
|
||
7& 0837 '7' 0826 '&' -- 7E00
|
||
8* 0938 '8' 092A '*' -- 7F00
|
||
9( 0A39 '9' 0A28 '(' -- 8000
|
||
0) 0B30 '0' 0B29 ')' -- 8100
|
||
-_ 0C2D '-' 0C5F '_' 0C1F 8200
|
||
=+ 0D3D '=' 0D2B '+' -- 8300
|
||
BkSpc 0E08 0E08 0E7F --
|
||
tab 0F09 0F00 -- --
|
||
q 1071 'q' 1051 'Q' 1011 1000
|
||
w 1177 'w' 1157 'W' 1117 1100
|
||
e 1265 'e' 1245 'E' 1205 1200
|
||
r 1372 'r' 1352 'R' 1312 1300
|
||
t 1474 't' 1454 'T' 1414 1400
|
||
y 1579 'y' 1559 'Y' 1519 1500
|
||
u 1675 'u' 1655 'U' 1615 1600
|
||
i 1769 'i' 1749 'I' 1709 1700
|
||
o 186F 'o' 184F 'O' 180F 1800
|
||
p 1970 'p' 1950 'P' 1910 1900
|
||
[{ 1A5B '[' 1A7B '{' 1A1B --
|
||
]} 1B5D ']' 1B7D '}' 1B1D --
|
||
enter 1C0D 1C0D 1C0A --
|
||
Ctrl -- -- -- --
|
||
a 1E61 'a' 1E41 'A' 1E01 1E00
|
||
s 1F73 's' 1F53 'S' 1F13 1F00
|
||
d 2064 'd' 2044 'D' 2004 2000
|
||
f 2166 'f' 2146 'F' 2106 2100
|
||
g 2267 'g' 2247 'G' 2207 2200
|
||
h 2368 'h' 2348 'H' 2308 2300
|
||
j 246A 'j' 244A 'J' 240A 2400
|
||
k 256B 'k' 254B 'K' 250B 2500
|
||
l 266C 'l' 264C 'L' 260C 2600
|
||
;: 273B ';' 273A ':' -- --
|
||
'" 2827 ''' 2822 '"' -- --
|
||
`~ 2960 '`' 297E '~' -- --
|
||
l shift -- -- -- --
|
||
\| 2B5C '\' 2B7C '|' 2B1C --
|
||
z 2C7A 'z' 2C5A 'Z' 2C1A 2C00
|
||
x 2D78 'x' 2D58 'X' 2D18 2D00
|
||
c 2E63 'c' 2E43 'C' 2E03 2E00
|
||
v 2F76 'v' 2F56 'V' 2F16 2F00
|
||
b 3062 'b' 3042 'B' 3002 3000
|
||
n 316E 'n' 314E 'N' 310E 3100
|
||
m 326D 'm' 324D 'M' 320D 3200
|
||
,< 332C ',' 333C '<' -- --
|
||
.> 342E '.' 343E '>' -- --
|
||
/? 352F '/' 353F '?' -- --
|
||
r shift -- -- -- --
|
||
PrtSc 372A '*' -- 7200 --
|
||
Alt -- -- -- --
|
||
spacebar 3920 ' ' 3920 ' ' 3920 ' ' 3920 ' '
|
||
CapsLock -- -- -- --
|
||
|
||
BIOS keystroke codes, hexadecimal, continued
|
||
|
||
Key Normal Shift Control Alt
|
||
|
||
F1 3B00 5400 5E00 6800
|
||
F2 3C00 5500 5F00 6900
|
||
F3 3D00 5600 6000 6A00
|
||
F4 3E00 5700 6100 6B00
|
||
F5 3F00 5800 6200 6C00
|
||
F6 4000 5900 6300 6D00
|
||
F7 4100 5A00 6400 6E00
|
||
F8 4200 5B00 6500 6F00
|
||
F9 4300 5C00 6600 7000
|
||
F10 4400 5D00 6700 7100
|
||
NumLock -- -- -- --
|
||
Scroll -- -- -- --
|
||
7 Home 4700 4737 '7' 7700 --
|
||
8 up 4800 4838 '8' -- --
|
||
9 PgUp 4900 4939 '9' 8400 --
|
||
grey - 4A2D '-' 4A2D '-' -- --
|
||
4 left 4B00 4B34 '4' 7300 --
|
||
5 -- 4C35 '5' -- --
|
||
6 right 4D00 4D36 '6' 7400 --
|
||
grey + 4E2B '+' 4E2B '+' -- --
|
||
1 End 4F00 4F31 '1' 7500 --
|
||
2 down 5000 5032 '2' -- --
|
||
3 PgDn 5100 5133 '3' 7600 --
|
||
Ins 5200 5230 '0' -- --
|
||
Del 5300 532E '.' -- --
|
||
|
||
A table entry of "--" means you can't get that combination out of BIOS.
|
||
|