PSP - DOS Program Segment Prefix Layout

The Program Segment Prefix (PSP) is a data structure used in DOS systems to store the state of a program. It resembles the Zero Page in the CP/M operating system. The PSP has the following structure:

Offset Size Description
00 word CP/M like exit code, always contains machine code INT 20 instruction (CDh 20h)
02 word top of memory in segment (paragraph) form
04 byte reserved for DOS, usually 0
05 5 bytes machine code instruction long call to the DOS function dispatcher (obsolete CP/M)
06 word .COM programs bytes available in segment (CP/M)
0A dword INT 22 terminate address; DOS loader jumps to this address upon exit; the EXEC function forces a child process to return to the parent by setting this vector to code within the parent (IP,CS)
0E dword INT 23 Ctrl-Break exit address; the original INT 23 vector is NOT restored from this pointer (IP,CS)
12 dword INT 24 critical error exit address; the original INT 24 vector is NOT restored from this field (IP,CS)
16 word parent process segment addr (Undoc. DOS 2.x+) COMMAND.COM has a parent id of zero, or its own PSP
18 20 bytes file handle array (Undocumented DOS 2.x+); if handle array element is FF then handle is available. Network redirectors often indicate remotes files by setting these to values between 80-FE.
2C word segment address of the environment, or zero (DOS 2.x+)
2E dword SS:SP on entry to last INT 21 function (Undoc. 2.x+) 1)
32 word handle array size (Undocumented DOS 3.x+)
34 dword handle array pointer (Undocumented DOS 3.x+)
38 dword pointer to previous PSP (deflt FFFF:FFFF, Undoc 3.x+) 2)
3C 20 bytes unused in DOS before 4.01 3)
50 3 bytes DOS function dispatcher CDh 21h CBh (Undoc. 3.x+) 4)
53 9 bytes unused
5C 36 bytes default unopened FCB #1 (parts overlayed by FCB #2)
6C 20 bytes default unopened FCB #2 (overlays part of FCB #1)
80 byte count of characters in command tail; all bytes following command name; also default DTA (128 bytes)
81 127 bytes all characters entered after the program name followed by a CR byte

Notes

  • offset 5 contains a jump address which is 2 bytes too low for PSP's created by the DOS EXEC function in DOS 2.x+ Ø
  • program name and complete path can be found after the environment in DOS versions after 3.0. See offset 2Ch.
1) , 2) , 3) , 4)
see Bibliography for reference to “Undocumented DOS”