MLHA - Software - Programmering - Assembler - DOS - Program Segment Prefix (PSP)

All COM programs start with a 256 byte PSP - so the first program byte is at offset 100h.
The PSP is built by DOS when the program is loaded.

+00 pspInt20 2 CD 20 (INT 20); terminate program.
- when loading COM programs, DOS initializes SP to FFFE and puts a 0000 there - so RET will jump here.
+02 pspNextParagraph 2 segment addr of first paragraph after memory allocated to program - A000 if all memory allocated (as in COM programs).
+04 pspReserved1 1 reserved.
+05 pspDispatcher 5 FAR call to DOS function handler - for compatibility:
CALL 5 with f.nr in CL = INT 21,f.nr
+0A pspTerminateVect 4 termination vector - terminal restore INT 22
+0E pspControlCVect 4 ^C (^BREAK) vector - terminal restore INT 23
+12 pspCritErrorVect 4 critical error vector - terminal restore INT 24
+16 pspReserved1 22 reserved.
+2C pspEnvironment 2 segment of environment for program.
+2E pspReserved2 34 reserved (DOS work area).
+50   3 CD 21 CB: INT 21/ RETF
+52   9  
+5C pspFCB_1 16 default FCB #1, first 16 bytes:
  +00 fcbDriveID 1 drive no. (0=default, 1=A,...)
- set by DOS if programname is followed by DriveName:
>PROGRAM A:
sets fcbDriveID=01
+5D +01 fcbFileName 8 Filename (UPPERCASE, 8 chars - padded with spaces (20))
- or - (Filename+Extension):
First command-line argument - treated as a filename - ex:
"file.ext" is converted to "FILE EXT".
"123456789ABC" is converted to "12345678 ".
+65 +09 fcbExtension 3 Extension ( - )
+68 +0C fcbCurBlockNo 2 current block number - with current record.
=0000 after opening file (set by DOS).
+6A +0E fcbRecSize 2 record size
+6C pspFCB_2 16 default FCB #2, first 16 bytes.
+7C pspReserved3 4 reserved.
+80 pspCommandTail 128 command tail (also default DTA)
  +00 CommandLen 1 length of command-line tail
+81 +01 Commands ? unformatted command-line
- first char is <space> (20)
- first text-char is at offset 82h
- terminated by <ret> (0D)
+100                 256 bytes
  

ex.: the PSP of COMMAND.COM :
     0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
------------------------------------------------------------------------
 00  CD 20                                           ;INT 20 instruction
  2        00 A0                                     ;A000: addr after prog
  4              00                                  ;reserved
  5                 9A F0 FE-1D F0                   ;CALL F01D:FEF0 instr.
  A                                F5 02 E7 51       ;termination addr.(int 22)
  E                                            2E 03 ;^C handler addr.(int 23)
 10  E7 51                                           ;           = 51E7:032E
  2        BD 02 E7 51                               ;crit. err. addr.(int 24)
  6                    AF 51-05 06 01 00 02 FF FF FF ;reserved
 20  FF FF FF FF FF FF FF FF-FF FF FF FF
  C                                      CB 55       ;segment of environment
  E                                            C8 30 ;reserved (DOS work area)
 30  E7 51 14 00 18 00 D2 55-FF FF FF FF 00 00 00 00
 40  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
 50  CD 21                                           ;INT 21 instr.
  2        CB 00 00 00 00 00-00 00 00 00             ;RETF (reserved)
  C                                      00 20 20 20 ;FCB #1
 60  20 20 20 20 20 20 20 20-00 00 00 00
  C                                      00 20 20 20 ;FCB #2
 70  20 20 20 20 20 20 20 20-00 00 00 00
  C                                      00 00 00 00 ;reserved
                                                     ;COMMAND-TAIL:
 80  0D                                              ;length of parameters:
  1     20 5C 43 4F 4D 4D 41-4E 44 2E 43 4F 4D       ;   \COMMAND.COM.
                                               0D    ;
                                                  00
 90  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
  |
 F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
------------------------------------------------------------------------