This is based on the script at http://www.openrce.org/downloads/details/67/create_PSP_segment.
This version creates a struct type. I use it with the IDA Pro 4.9 Freeware version. It is written for EXE files, but getting it to support COM files should only involve changes to main.
// -*- C -*- (Use C mode in emacs)
#include <idc.idc>
static CW(x,off,name,cmt) {
AddStrucMember(x, name, off, FF_WORD, -1, 2);
SetMemberComment(x, off, cmt, 1);
}
//-------------------------------------------------------------------------
static CD(x,off,name,cmt) {
AddStrucMember(x, name, off, FF_DWRD, -1, 4);
SetMemberComment(x, off, cmt, 1);
}
//-------------------------------------------------------------------------
static CB(x,off,name,cmt) {
AddStrucMember(x, name, off, FF_BYTE, -1, 1);
SetMemberComment(x, off, cmt, 1);
}
//-------------------------------------------------------------------------
static CA(x,off,siz,name,cmt) {
AddStrucMember(x, name, off, FF_ASCI, -1, siz);
SetMemberComment(x, off, cmt, 1);
}
//-------------------------------------------------------------------------
static CmtBdata(x) {
CW(x,0x000, "Exit","Process exit entry point");
CW(x,0x002, "Memory","First free segment");
CB(x,0x004, "Reserved1","Reserved");
CA(x,0x005,0x005,"SysCall","System call entry point");
CD(x,0x00A, "Int22","Int 22 entry point");
CD(x,0x00E, "Int23","Int 23 entry point");
CD(x,0x012, "Int24","Int 24 entry point");
CA(x,0x016,0x016,"Reserved2","Reserved for DOS");
CW(x,0x02C, "Env","Environment segment");
CA(x,0x02E,0x02E,"Reserved3","Reserved for DOS");
CA(x,0x05C,0x010,"FCB1","FCB block of the first prog arg");
CA(x,0x06C,0x014,"FCB2","FCB block of the second prog arg");
CB(x,0x080, "ArgLen","Arguments length");
CA(x,0x081,0x07F,"Arguments","Arguments area");
}
//-------------------------------------------------------------------------
static main() {
auto PSP_struct, x;
PSP_struct = AddStruc(0, "PSP");
CmtBdata(PSP_struct);
SegCreate(0x800, 0x900, 0x80, 0, saAbs, scPub);
SegRename(0x800, "PSP_DATA");
SegClass(0x800, "PSPSEG");
SetSegmentType(0x800, 0);
SetReg(BeginEA(),"ds",0x80);
MakeStruct(0x800, "PSP");
MakeName(0x800, "my_psp");
}







