mirror of https://github.com/AR1972/DOS3.3
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
440 lines
11 KiB
440 lines
11 KiB
|
|
_ _ | | _ _
|
|
|
|
Programming Hints
|
|
|
|
_ ______________________________
|
|
|
|
|
|
8.1 Introduction
|
|
|
|
This chapter describes recommended MS-DOS 3.3 programming pro-
|
|
cedures. By using these programming hints, you can ensure compatibility
|
|
with future versions of MS-DOS.
|
|
|
|
The hints are organized in the following categories:
|
|
|
|
o Interrupts
|
|
|
|
o System Calls
|
|
|
|
o Device Management
|
|
|
|
o Memory Management
|
|
|
|
o Process Management
|
|
|
|
o File and Directory Management
|
|
|
|
o Miscellaneous
|
|
|
|
|
|
8.2 Interrupts
|
|
|
|
o Never explicitly issue Interrupt 22H (Terminate Process Exit
|
|
Address).
|
|
|
|
Only the DOS should do this. To change the terminate address,
|
|
use Function 35H (Get Interrupt Vector) to get the current address
|
|
and save it, then use Function 25H (Set Interrupt Vector) to
|
|
change the Interrupt 22H entry in the vector table to point to the
|
|
new terminate address.
|
|
|
|
o Use Interrupt 24H (Critical-Error-Handler Address) with care. The
|
|
Interrupt 24H handler must preserve the ES register.
|
|
|
|
An Interrupt 24H handler can issue only the system calls 01H-0CH.
|
|
Making any other calls destroys the MS-DOS stack and prevents
|
|
successful use of the Retry or Ignore options.
|
|
|
|
When using the Retry or Ignore options, you must preserve the SS,
|
|
SP, DS, BX, CX, and DX registers.
|
|
|
|
o When an Interrupt 24H (Critical-Error-Handler Address) is
|
|
received, always IRET back to MS-DOS with one of the standard
|
|
responses.
|
|
|
|
Programs that do not IRET from Interrupt 24H leave the system in
|
|
an unpredictable state until a function call other than 01H-0CH is
|
|
made. The Ignore option may leave incorrect or invalid data in
|
|
|
|
3
|
|
|
|
_ _ | | _ _
|
|
|
|
|
|
|
|
|
|
_ _ | | _ _
|
|
|
|
|
|
|
|
_ ______________
|
|
|
|
internal system buffers.
|
|
|
|
o Avoid trapping Interrupt 23H (CONTROL-C Handler Address) and
|
|
Interrupt 24H (Critical-Error-Handler Address). Don't rely on trap-
|
|
ping errors via Interrupt 24H as part of a copy protection scheme.
|
|
|
|
These methods might not be included in future releases of
|
|
MS-DOS.
|
|
|
|
o A user program must never issue Interrupt 23H (CONTROL-C
|
|
Handler Address).
|
|
|
|
Only MS-DOS may issue Interrupt 23H.
|
|
|
|
o Save any registers that your program uses before issuing Interrupt
|
|
25H (Absolute Disk Read) or Interrupt 26H (Absolute Disk Write).
|
|
|
|
These interrupts destroy all registers except for the segment regis-
|
|
ters.
|
|
|
|
Avoid writing or reading an interrupt vector directly to or from
|
|
memory.
|
|
|
|
o Use Functions 25H and 35H (Set Interrupt Vector and Get Inter-
|
|
rupt Vector) to set and get values in the interrupt table.
|
|
|
|
|
|
8.3 System Calls
|
|
|
|
o Use new system calls.
|
|
|
|
Avoid using system calls that have been superseded by new calls
|
|
unless the program must maintain backward compatibility with
|
|
MS-DOS versions before 2.0. See Section 1.9, "Old System Calls",
|
|
for a list of these new calls.
|
|
|
|
o Avoid using functions 01H-0CH and 26H (Create New PSP).
|
|
|
|
Use the new "tools" approach for reading and writing on standard
|
|
input and output. Use Function 4BH (Load and Execute Program)
|
|
instead of 26H to execute a child process.
|
|
|
|
o Use file-sharing calls if more than one process is in effect.
|
|
|
|
For more information, see File Sharing, in Section 1.5.2, "File-
|
|
Related Function Requests."
|
|
|
|
o Use networking calls where appropriate.
|
|
|
|
Some forms of IOCtl can only be used with Microsoft Networks.
|
|
For more information, and a list of these calls, see Section 1.6,
|
|
"Microsoft Networks,"
|
|
|
|
4
|
|
|
|
_ _ | | _ _
|
|
|
|
|
|
|
|
|
|
_ _ | | _ _
|
|
|
|
Programming Hints
|
|
|
|
_ ______________________________
|
|
|
|
o When selecting a disk with Function 0EH (Select Disk), treat the
|
|
value returned in AL with care.
|
|
|
|
The value in AL specifies the maximum number of logical drives; it
|
|
does not specify which drives are valid.
|
|
|
|
|
|
8.4 Device Management
|
|
|
|
o Use installable device drivers.
|
|
|
|
MS-DOS provides a modular device driver structure for the BIOS,
|
|
allowing you to configure and install device drivers at boot time.
|
|
Block device drivers transmit a block of data at a time, while char-
|
|
acter device drivers transmit a byte of data at a time.
|
|
|
|
Examples of both types of device drivers are given in Chapter 2, "-
|
|
MS-DOS Device Drivers."
|
|
|
|
o Use buffered I/O.
|
|
|
|
The device drivers can handle streams of data up to 64K bytes. To
|
|
improve performance when sending a large amount of output to
|
|
the screen, you can send it with one system call.
|
|
|
|
o Programs that use direct console I/O via Function 06H and 07H
|
|
(Direct Console I/O and Direct Console Input) and that want to
|
|
read CONTROL-C as data should ensure that CONTROL-C checking is
|
|
off.
|
|
|
|
The program should ensure that CONTROL-C checking is off by using
|
|
Function 33H (CONTROL-C Check).
|
|
|
|
o Be compatible with international support.
|
|
|
|
To provide support for international character sets, MS-DOS
|
|
recognizes all possible byte values as significant characters in
|
|
filenames and data streams. MS-DOS versions before 2.0 ignored
|
|
the high bit in the MS-DOS filename.
|
|
|
|
|
|
8.5 Memory Management
|
|
|
|
o Use memory management.
|
|
|
|
MS-DOS keeps track of allocated memory by writing a memory
|
|
control block at the beginning of each area of memory. Programs
|
|
should use Functions 48H (Allocate Memory), 49H (Free Allocated
|
|
Memory), and 4AH (Set Block) to release unneeded memory.
|
|
|
|
5
|
|
|
|
_ _ | | _ _
|
|
|
|
|
|
|
|
|
|
_ _ | | _ _
|
|
|
|
|
|
|
|
_ ______________
|
|
|
|
This allows for future compatibility. For more information, see
|
|
Section 1.3, "Memory Management."
|
|
|
|
o Use only allocated memory.
|
|
|
|
Don't directly access memory that was not provided as a result of a
|
|
system call. Do not use fixed addressing, use only relative refer-
|
|
ences.
|
|
|
|
A program that uses memory that has not been allocated to it may
|
|
destroy other memory control blocks or cause other applications to
|
|
fail.
|
|
|
|
|
|
8.6 Process Management
|
|
|
|
o Use Function 4BH (Load and Execute Program, or EXEC) to load
|
|
and execute programs.
|
|
|
|
EXEC is the preferred call to use when loading programs and pro-
|
|
gram overlays. Using the EXEC call instead of hard-coding infor-
|
|
mation about how to load an .exe file (or always assuming that
|
|
your file is a .com file) isolates your program from changes in .exe
|
|
file formats and future releases of MS-DOS.
|
|
|
|
o Use Function 31H (Keep Process), instead of Interrupt 27H (Ter-
|
|
minate But Stay Resident).
|
|
|
|
Function 31H allows programs that are greater than 64K bytes to
|
|
terminate and stay resident.
|
|
|
|
o Programs should terminate using Function 4CH (End Process).
|
|
|
|
Programs that terminate by one of the following must ensure that
|
|
the CS register contains the segment address of the PSP:
|
|
|
|
o A long jump to offset 0 in the PSP
|
|
|
|
o Issuing an Interrupt 20H with CS:0 pointing at the PSP
|
|
|
|
o Issuing an Interrupt 21H with AH=0, CS:0 pointing at the PSP
|
|
|
|
o A long call to location 50H in the PSP with AH=0
|
|
|
|
|
|
|
|
6
|
|
|
|
_ _ | | _ _
|
|
|
|
|
|
|
|
|
|
_ _ | | _ _
|
|
|
|
Programming Hints
|
|
|
|
_ ______________________________
|
|
|
|
|
|
8.7 File and Directory Management
|
|
|
|
o Use the MS-DOS file management system.
|
|
|
|
Using the MS-DOS file system ensures program compatibility with
|
|
future MS-DOS versions through compatible disk formats and con-
|
|
sistent internal storage.
|
|
|
|
o Use file handles instead of FCBs.
|
|
|
|
A handle is a 16-bit number that MS-DOS returns when a file is
|
|
opened or created using Functions 3CH, 3DH, 5AH, or 5BH (Create
|
|
Handle, Open Handle, Create Temporary File, or Create New File).
|
|
The MS-DOS file-related function requests that use handles are
|
|
listed in Table 1.5 in Chapter 1, "System Calls."
|
|
|
|
Although the default maximum number of open files is 20, this
|
|
limit can be raised to 64K by Function 67H (Set Handle Count).
|
|
For more information on this system call, see Chapter 1, "System
|
|
Calls."
|
|
|
|
You should use these calls instead of the old file-related functions
|
|
that use FCBs (file control blocks). This is because a file operation
|
|
can simply pass its handle rather than maintaining FCB informa-
|
|
tion. If you must use FCBs, be sure the program closes them and
|
|
does not move them around in memory.
|
|
|
|
o Close files that have changed in length before issuing an Interrupt
|
|
20H (Program Terminate), Function 00H (Terminate Program),
|
|
Function 4CH (End Process), or Function 0DH (Reset Disk).
|
|
|
|
If you do not close a changed file, its length will not be recorded
|
|
correctly in the directory.
|
|
|
|
o Close files when they are no longer needed.
|
|
|
|
Closing unneeded files increases efficiency in a networking environ-
|
|
ment.
|
|
|
|
o If a program does use FCBs, that program should not close an FCB
|
|
file and then continue writing to it. This practice will not work in
|
|
a network environment, and is not recommended under any cir-
|
|
cumstances.
|
|
|
|
o Change disks only if all files on the disk are closed.
|
|
|
|
If you don't close all the files, any information in internal system
|
|
buffers may be written incorrectly to a changed disk.
|
|
|
|
|
|
|
|
7
|
|
|
|
_ _ | | _ _
|
|
|
|
|
|
|
|
|
|
_ _ | | _ _
|
|
|
|
|
|
|
|
_ ______________
|
|
|
|
|
|
8.7.1 Locking Files
|
|
|
|
o Programs should not rely on being denied access to a locked region.
|
|
|
|
To determine the status of a region, first, attempt to lock it, then
|
|
examine its error code.
|
|
|
|
o Programs should not close a file with a locked region or terminate
|
|
with an open file that contains a locked region.
|
|
|
|
The result of this procedure is undefined. Programs that might be
|
|
terminated by an Interrupt 23H or Interrupt 24H (CONTROL-C
|
|
Handler Address or Critical-Error-Handler Address) should trap
|
|
these interrupts and unlock any locked regions before exiting.
|
|
|
|
|
|
8.8 Miscellaneous
|
|
|
|
o Avoid timing dependencies.
|
|
|
|
Various machines use CPUs of different speeds. Also, programs
|
|
that rely upon the speed of the clock for timing are not dependable
|
|
in a networking environment.
|
|
|
|
o Use the documented interface to the operating system. If either
|
|
the hardware or media change, the operating system can use the
|
|
features without modification.
|
|
|
|
Don't use the ROM support provided by the OEM (Original Equip-
|
|
ment Manufacturer).
|
|
|
|
Don't directly address the video memory.
|
|
|
|
Don't use undocumented function calls, interrupts, or features.
|
|
|
|
These items may change or may not exist in future MS-DOS ver-
|
|
sions. If you do use these features, you will make your program
|
|
highly non-portable.
|
|
|
|
o Use the .exe format rather than the .com format.
|
|
|
|
.Exe files are relocatable; .com files are direct memory images that
|
|
load at a specific place and have no room for additional control
|
|
information. .Exe files have headers that can be expanded for com-
|
|
patibility with future MS-DOS versions.
|
|
|
|
o Use the environment to pass information to applications.
|
|
|
|
The environment allows a parent process to pass information to a
|
|
child process. The command.com file is usually the parent process
|
|
to every application, so it can easily pass default drive and path
|
|
information to the application.
|
|
|
|
8
|
|
|
|
_ _ | | _ _
|
|
|
|
|
|
|
|
|
|
_ _ | | _ _
|
|
|
|
Programming Hints
|
|
|
|
_ ______________________________
|
|
|
|
|
|
Chapter 8
|
|
|
|
Programming Hints
|
|
|
|
_ ________________________________________________________________
|
|
|
|
8.1 Introduction 3
|
|
|
|
8.2 Interrupts 3
|
|
|
|
8.3 System Calls 4
|
|
|
|
8.4 Device Management 5
|
|
|
|
8.5 Memory Management 5
|
|
|
|
8.6 Process Management 6
|
|
|
|
8.7 File and Directory Management 7
|
|
|
|
8.7.1 Locking Files 8
|
|
|
|
8.8 Miscellaneous 8
|
|
|
|
|
|
|
|
9
|
|
|
|
_ _ | | _ _
|
|
|
|
|
|
|
|
|
|
_ _ | | _ _
|
|
|
|
|
|
|
|
_ ______________
|
|
|
|
|
|
9
|
|
|
|
_ _ | | _ _
|
|
|
|
|
|
|