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 |