Borland Delphi (vv. 2.0-9.0), Kylix (vv. 1.0-3.0) Unit(DCU32.rfi):
Class: Executable and Object, Status: Guess Work, Last change: 20.02.2024 15:22:40

/*            
This file describes the results of reverse engineering the DCU file format for
Delphi 2.0-8.0, 2005(.net and WIN32), 2006(.net and WIN32)/Turbo Delphi,
2009,2010,XE1-XE7/AppMethod,XE8,10 Seattle,10.1 Berlin,10.2 Tokyo,10.3 Rio,10.4 Sydney,
11 Alexandria, 12 Athens, Kylix 1.0-3.0.
Note, that the FlexT file describes only the DCU memory layout aspects of file
format. The Pascal code for parsing DCUs (DCU32INT project) is published at
http://hmelnov.icc.ru/DCU/
*/

data
  0x0000 ulong Magic

type
  TPlatformName enum byte of (win32,win64,osx32,osx64,osxarm64,
    iosEmulator,iosSimArm64,iosDevice32,iosDevice64,
    Android,Android64,Linux64)

%$IF Magic=0xF21F148C;
//Kylix1.0
const
  Ver=100;
descr ('Borland Kylix 1.0 unit file.')
%$ELSIF Magic=0x0E1011DD;
//Kylix2.0
const
  Ver=101;
descr ('Borland Kylix 2.0 unit file.')
%$ELSIF Magic=0x0E0001DD;
//Kylix2.0, another magic
const
  Ver=101;
descr ('Borland Kylix 2.0 unit file (kind $00).')
%$ELSIF (Magic=0x0F1001DD)or(Magic=0x0F0001DD);
//Kylix3.0
const
  Ver=102;
descr ('Borland Kylix 3.0 unit file.')
%$ELSIF Magic=0x1600034B;
//Delphi XE
const
  Ver=14;
descr ('Borland Delphi XE unit file.')
%$ELSIF Magic=0x15000045;
//Delphi2010
const
  Ver=13;
descr ('Borland Delphi 2010 unit file.')
%$ELSIF Magic=0x14000039;
//Delphi2009
const
  Ver=12;
descr ('Borland Delphi 2009 unit file.')
%$ELSIF Magic=0x1200024D;
//Delphi 2006 .net
const
  Ver=10;
  MSIL=1;
descr ('Borland Delphi 2006 unit file.')
%$ELSIF Magic=0x12000023;
//Delphi 2006
const
  Ver=10;
descr ('Borland Delphi 2006 unit file.')
%$ELSIF Magic=0x11000239;
//Delphi 2005 .net
const
  Ver=9;
  MSIL=1;
descr ('Borland Delphi 2005 MSIL unit file.')
%$ELSIF (Magic=0x1100000D)or(Magic=0x11800009); //0x11800009 in DUnitMainForm.dcu
//Delphi 2005
const
  Ver=9;
descr ('Borland Delphi 2005 unit file.')
%$ELSIF Magic=0x10000229;
//Delphi8.0
const
  Ver=8;
  MSIL=1;
descr ('Borland Delphi 8.0 MSIL unit file.')
%$ELSIF Magic and 0xFF80FFFF=0xFF0000DF;
//Delphi7.0
const
  Ver=7;
descr ('Borland Delphi 7.0 (Free) unit file.')
%$ELSIF Magic and 0xFF00FFFF=0x0F0000DF;
//Delphi7.0
const
  Ver=7;
descr ('Borland Delphi 7.0 unit file.')
%$ELSIF Magic and 0xFF80FFFF=0x0E0000DD;
//Delphi6.0
const
  Ver=6;
descr ('Borland Delphi 6.0 unit file.')
%$ELSIF Magic and 0xFF80FFFF=0x0E8000DD;
//Delphi6.0, another magic
const
  Ver=6;
descr ('Borland Delphi 6.0 unit file (kind $80).')
%$ELSIF Magic=0xF21F148B;
//Delphi5.0
const
  Ver=5;
descr ('Borland Delphi 5.0 unit file.')
%$ELSIF Magic=0x4768A6D8;
//Delphi4.0
const
  Ver=4;
descr ('Borland Delphi 4.0 unit file.')
%$ELSIF Magic=0x44518641; //'AÆQD'
//Delphi3.0
const
  Ver=3;
descr ('Borland Delphi 3.0 unit file.')
%$ELSIF Magic=0x50505348; //HSPP
//Delphi2.0
const
  Ver=2;
descr ('Borland Delphi 2.0 unit file.')
%$ELSIF Magic and 0x00FF00F9=0x00000049; 
const
  Ver=(Magic shr 24)-8;

  %$IF (Ver<=28)and(Ver>=19)and(Magic and 0xFF=0x4D)or
     (Ver<=18)and(Ver>=15)and(Magic and 0xFF=0x4B);
  //28 - 0x2400xx4D Delphi 12 Athens
  //27 - 0x2300xx4D Delphi 11 Alexandria
  //26 - 0x2200xx4D Delphi 10.4 Sydney
  //25 - 0x2100xx4D Delphi 10.3 Rio
  //24 - 0x2000xx4D Delphi 10.2 Tokyo
  //23 - 0x1F00xx4D Delphi 10.1 Berlin
  //22 - 0x1E00xx4D Delphi 10 Seattle
  //21 - 0x1D00xx4D Delphi XE8
  //20 - 0x1C00xx4D Delphi XE7
  //19 - 0x1B00xx4D Delphi XE6
  //18 - 0x1A00xx4B Delphi XE5
  //17 - 0x1900xx4B Delphi XE4
  //16 - 0x1800xx4B Delphi XE3
  //15 - 0x1700xx4B Delphi XE2

  const
    PlMagic=(Magic shr 8)and 0xFF;
  %$ELSE
  assert 0; //fail
  %$END

  %$IF PlMagic=0x03;
  const
    cPlatform=TPlatformName.win32;
  %$ELSIF PlMagic=0x23;
  const
    cPlatform=TPlatformName.win64;
    mode64=1;
  %$ELSIF PlMagic=0x04;
  const
    cPlatform=TPlatformName.osx32;
  %$ELSIF PlMagic=0x24;
  const
    cPlatform=TPlatformName.osx64;
    mode64=1;
  %$ELSIF (PlMagic=0x84)and(Ver>=28/*12 Athens*/);
  const
    cPlatform=TPlatformName.osxarm64;
    mode64=1;
    //Mobile=1;
  %$ELSIF (PlMagic=0x14)and(Ver>=17/*XE4*/);
  const
    cPlatform=TPlatformName.iosEmulator;
    iOs=1;
    Mobile=1;
  %$ELSIF (PlMagic=0x88)and(Ver>=28/*12 Athens*/);
  const
    cPlatform=TPlatformName.iosSimArm64;
    iOs=1;
    Mobile=1;
  %$ELSIF (PlMagic=0x76)and(Ver>=17/*XE4*/);
  const
    cPlatform=TPlatformName.iosDevice32;
    iOs=2;
    Mobile=1;
  %$ELSIF (PlMagic=0x94)and(Ver>=21/*XE8*/)and(Ver<27/*11 Alexandria*/)or(PlMagic=0x86)and(Ver>=27/*11 Alexandria*/);
  const
    cPlatform=TPlatformName.iosDevice64;
    iOs=2;
    mode64=1;
    Mobile=1;
  %$ELSIF (PlMagic=0x77)and(Ver>=18/*XE5*/)and(Ver<26/*10.4 Sydney*/)or(PlMagic=0x67)and(Ver>=26/*10.4 Sydney*/);
  const
    cPlatform=TPlatformName.Android;
    iOs=3;
    Mobile=1;
  %$ELSIF (PlMagic=0x87)and(Ver>=26/*10.4 Sydney*/);
  const
    cPlatform=TPlatformName.Android64;
    iOs=3;
    mode64=1;
    Mobile=1;
  %$ELSIF (PlMagic=0x21)and(Ver>=24/*10.2 Tokyo*/);
  const
    cPlatform=TPlatformName.Linux64;
    mode64=1;
    ARC = 1; //Automatic reference count
  %$ELSE
    assert 0; //fail
  %$END

descr ('Embarcadero Delphi ',
  case Ver of
   28: ('12 Athens')
   27: ('11 Alexandria')
   26: ('10.4 Sydney')
   25: ('10.3 Rio')
   24: ('10.2 Tokyo')
   23: ('10.1 Berlin')
   22: ('10 Seattle')
   else ('XE',INT(Ver-13))
  endc, ' (',valname(cPlatform,TPlatformName),') unit file.')

%$ELSE
assert 0; //fail
%$END

%$IF not defined MSIL;
const
MSIL=0;
%$END

%$IF not defined Packaged;
const
Packaged=0;
%$END     

%$IF Packaged;
%$IF (Ver<6); 
const
  PkgNdxFlag=0x80;
%$ELSE
const
  PkgNdxFlag=0x100;
%$END
%$END
%$IF not defined mode64;
const
mode64=0;
%$END

%$IF not defined iOs;
const
iOs=0;
%$END

%$IF not defined ARC;
const
ARC=iOs>0;
%$END

%$IF not defined Mobile;
const
Mobile=0;
%$END

%$IF not defined cPlatform;
const
cPlatform=0;
%$END


descr (NL,
  'Info Src: Partially reconstructed by me (Alexei Hmelnov (mailto:alex@icc.ru)).',NL,
  'Info Src: DoDi''s DCU Documentation (mailto:VBDis@aol.com)',NL)

const
  IsKylix = Ver>=100;
  IsDelphi = Ver<100;
  gen7 = (Ver>=7) and IsDelphi or (Ver>=102);

type

TDCU30RecTag enum char of (
  drStop=0,
  drStop_a='a', //Last Tag in all files
  drStop1='c',
 %$IF Packaged and MSIL/*(Ver=8)*/and IsDelphi;
  drAssemblyData='b', //Last Tag of Assembly description?
 %$END
  drUnit='d',
  drUnit1='e', //in implementation
  drImpType='f',
  drImpVal='g',
  drDLL='h',
  drExport='i',
  drEmbeddedProcStart='j',
  drEmbeddedProcEnd='k',
  drCBlock='l',
  drFixUp='m',
  drImpTypeDef='n', //import of type definition by "A = type B"
%$IF (Ver>=8)and IsDelphi;
  drORec='o', //goes before drCBlock
 %$IF (Ver>=10)and IsDelphi;
  drStrConstRec='6',
 %$ELSE
  drStrConstRec='5',
 %$END
%$END
  drSrc='p',
  drObj='q',
  drRes='r',
  drAsm='s', //Observed in D5
 %$IF Packaged and MSIL/*(Ver=8)*/and IsDelphi;
  drAssemblySrc='t',
 %$END
  drStop2='ß', //!!!
  drConst=0x25, //'%',

 %$IF (Ver>=10)and IsDelphi;
  drThreadVar='2',
  drResStr='3',
 %$ELSE
  drThreadVar='1',
  drResStr='2',
 %$END

  drType='*',
  drTypeP='&',
  drProc='(',
  drSysProc=')',
  drVar=0x20, //' ',
  drVarC=0x27, //''',
  drAbsVar='$',
  drVoid='@',
  drLabel='+',
  drBoolRangeDef='A',
  drChRangeDef='B',
  drEnumDef='C',
  drRangeDef='D',
  drPtrDef='E',
  drClassDef='F',
  drObjVMTDef='G',
  drProcTypeDef='H',
  drFloatDef='I',
  drSetDef='J',
  drShortStrDef='K',
  drArrayDef='L',
  drRecDef='M',
  drObjDef='N',
  drFileDef='O',
  drTextDef='P',
  drWCharRangeDef='Q', //WideChar
  drStringDef='R',
  drVariantDef='S',
  drInterfaceDef='T',
  drWideStrDef='U',
  drWideRangeDef='V',
%$IF (Ver>=8)and IsDelphi;
  drMetaClassDef='W', //?? guess name
 %$IF (Ver>=12)and IsDelphi;
  drDynArrayDef='X', //Separate from drArrayDef tag now
  drTemplateArgDef='Y',
  drTemplateCall='Z',
  drUnicodeStringDef='[',
 %$IF (Ver>=13)and IsDelphi;
  drUnitInlineSrc='v',
 %$END
 %$END
%$END
//Various tables
  drCodeLines=0x90,
  drLinNum=0x91,
  drStrucScope=0x92,
  drSymbolRef=0x93,
  drLocVarTbl=0x94,
  drUnitFlags=0x96,
%$IF IsKylix; //Kylix specific flags
 // drUnit3=0xE0, //4-bytes record, present in almost all units
 // drUnit3s=0x06, //3-bytes record, present in System and SysInit
  drUnit4=0x0F, //5-bytes record, was observed in QOpenBanner.dcu only
%$ELSIF Ver>=7;
 %$IF (Ver>=10)and IsDelphi;
  drUnitAddInfo='5',
 %$ELSE
  drUnitAddInfo='4',
 %$END
  drProcAddInfo=0x9E,
%$END
%$IF gen7;
  drConstAddInfo=0x9C, //caused by the "platform" keyword
%$END
%$IF (Ver>=9)and(Ver<=10)and MSIL;
  drAssemblyInfo=0x9D, //The unit is from package generated for assemmbly
%$END
%$IF (Ver>=3)and IsDelphi;
  drCPPFlags=0x98,
%$END
%$IF (Ver>=10)and IsDelphi;
//  drAddInfo6='6',
  drSpecVar='7',
  drCLine=0xA0,
  drA1Info=0xA1,
  drA2Info=0xA2,
 %$IF (Ver>=12)and IsDelphi;
  arCopyDecl=0xA3,
  drA5Info=0xA5,
  drA6Info=0xA6,
  drA7Info=0xA7,
  drA8Info=0xA8,
 %$IF (Ver>=17)and IsDelphi;
  drA9Info=0xA9,
 %$END
  drDelayedImpInfo=0xB0,
 %$END
 %$IF (Ver>=15)and IsDelphi /*and mode64*/;
  drSegInfo=0xB1,
  drAddrToSegInfo=0xB2,
 %$END
 %$IF (Ver>=28)and IsDelphi and(cPlatform in (iosSimArm64,iosDevice64));
  drDLLInfo1=0xB3,
 %$END
 %$IF (Ver>=20)and IsDelphi;
  drNextOverload=0xB6,
 %$END
 %$IF (Ver>=22)and IsDelphi;
  drDependencyInfo=0xB5,
 %$END
 %$IF (Ver>=27)and IsDelphi;
  drInDcpWin64Info=0xB7,
 %$END
%$END
  drSetDeft=0x9A //Set Default parameter value
)

include Float.rfi

type bit
/*
  TBit num+(1)
  TBit2 num+(2)
  TBit3 num+(3)
  TBit4 num+(4)
  TBit8 num+(8)
 */
  TBit7 num+(7)
  TBit14 num+(14)
  TBit21 num+(21)
  TBit28 num+(28)
  TBit32 num+(32)

  TNDXB1b struc pas
    F: TBit
    V: TBit7
  ends:assert[@.F=0]: displ=(HEX(@.V))

  TNDXB2b struc pas
    F: TBit2
    V: TBit14
  ends:assert[@.F=0x1]: displ=(HEX(@.V))

  TNDXB3b struc pas
    F: TBit3
    V: TBit21
  ends:assert[@.F=0x3]: displ=(HEX(@.V))

  TNDXB4b struc pas
    F: TBit4
    V: TBit28
  ends:assert[@.F=0x7]: displ=(HEX(@.V))

  TNDXB5b struc pas
    F: TBit8
    V: TBit32
  ends:assert[@.F=0xF]: displ=(HEX(@.V))

  TNDXB9b struc pas
    F: TBit8  //F=0xFF: Delphi 4.0 - 64 bit
    Lo: TBit32
    Hi: TBit32
  ends: displ=(HEX(@.Hi),HEX(@.Lo,8))

  TNDXB1 try
   b1: TNDXB1b
   b2: TNDXB2b
   b3: TNDXB3b
   b4: TNDXB4b
   b5: TNDXB5b
   b9: TNDXB9b
  endt: displ=('#',@):let Val=@.b1.V exc @.b2.V exc @.b3.V exc
    @.b4.V exc @.b5.V exc @.b9.Lo/*8-byte values are not supported in FlexT yet*/;

  TSBit7 num-(7)
  TSBit14 num-(14)
  TSBit21 num-(21)
  TSBit28 num-(28)
  TSBit32 num-(32)

  TSNDXB1b struc pas
    F: TBit
    V: TSBit7
  ends:assert[@.F=0]: displ=(INT(@.V))

  TSNDXB2b struc pas
    F: TBit2
    V: TSBit14
  ends:assert[@.F=0x1]: displ=(INT(@.V))

  TSNDXB3b struc pas
    F: TBit3
    V: TSBit21
  ends:assert[@.F=0x3]: displ=(INT(@.V))

  TSNDXB4b struc pas
    F: TBit4
    V: TSBit28
  ends:assert[@.F=0x7]: displ=(INT(@.V))

  TSNDXB5b struc pas
    F: TBit8
    V: TSBit32
  ends:assert[@.F=0xF]: displ=(INT(@.V))

  TSNDXB9b struc pas
    F: TBit8  //F=0xFF: Delphi 4.0 - 64 bit
    Lo: TBit32
    Hi: TBit32
  ends: displ=(HEX(@.Hi),HEX(@.Lo,8))

  TSNDXB1 try
   b1: TSNDXB1b
   b2: TSNDXB2b
   b3: TSNDXB3b
   b4: TSNDXB4b
   b5: TSNDXB5b
   b9: TSNDXB9b
  endt: displ=('!',@):let Val=@.b1.V exc @.b2.V exc @.b3.V exc
    @.b4.V exc @.b5.V exc @.b9.Lo/*8-byte values are not supported in FlexT yet*/;

/*
  TNDXB1 struc pas
    IsW: TBit
    V: case @.IsW of
     0: TBit7
     else struc pas
       IsB3: TBit
       V: case @.IsB3 of
        0: TBit14
        else struc pas
          IsB4: TBit
          V: case @.IsB4 of
           0: TBit21
           else struc pas
             IsB5: TBit
             V: case @.IsB5 of
              0: TBit28
              else struc pas
                Z: TBit4
                V: case @.Z of
                  0: TBit32
                  else struc pas //0xF: Delphi 4.0 - 64 bit
                    Lo: TBit32
                    Hi: TBit32
                  ends: displ=(HEX(@.Hi),HEX(@.Lo))
                 endc: displ=((@.0)exc(@.0xF))
              ends
              endc:displ=((@.0)exc(@.1))
           ends
           endc:displ=((@.0)exc(@.1.V))
        ends
        endc:displ=((@.0)exc(@.1.V))
     ends
     endc:displ=((@.0)exc(@.1.V))
  ends:displ=('#',@.V):let Val=(@.V.0)exc((@.V.1.V.0)exc
      ((@.V.1.V.1.V.0)exc((@.V.1.V.1.V.1.V.0)exc
      (@.V.1.V.1.V.1.V.1.V/*4.0*/.0))));
*/

/*
TFileTime struc pas
  S: num+(5)
  M: num+(6)
  H: num+(5)
  D: num+(5)
  Mon: num+(4)
  Y: num+(7)
ends:displ=(INT(@.D),'.',INT(@.Mon),'.',INT(@.Y+1980),' ',
      INT(@.H),':',INT(@.M),':',INT(@.S*2))
*/

type    
  TNDXB1d TNDXB1():let Val=@.@:Val;:displ=('`',INT(@.@:Val)) //decimal representation


%$IF IsDelphi;

include DOSFTime.rfi

%$ELSE

include UNIXTime.rfi

type

TFileTime TTimeStamp

%$END

type

%$IF (Ver>=12)and IsDelphi; 
TNameStr struc pas
  L: byte
  LL: case @.L of
    0xFF: ulong
   endc
  S: array[(@.LL.0xFF)exc @.L]of char
ends: displ=(@.S)
%$ELSE
TNameStr str
%$END


TDCU30ListC forward

TSrcInf struc pas
  FT: TFileTime
  B: TNDXB1
%$IF MSIL;
  path: str
%$END
ends

%$IF Packaged and MSIL/*(Ver=8)*/and IsDelphi;
TAssemblySrcInf struc pas
  FT: TFileTime
  B: TNDXB1
ends 
%$END

%$IF (Ver>7)and IsDelphi;
TResInf struc pas
  FT: TFileTime
  B: TNDXB1
ends
%$ELSE
TResInf TSrcInf
%$END

TUnitInf struc pas
 %$IF (Ver>=8)and IsDelphi;
  hPack: TNDXB1
 %$END
 %$IF (Ver>=10)and IsDelphi;
  Inf: TNDXB1
 %$ELSE
  Inf: ulong
 %$END
%$IF (Ver=7)and IsDelphi;
  X: ulong
//%$ELSIF (Ver>=8)and IsDelphi;
//  X: byte
%$END
 %$IF (Ver>=12)and IsDelphi;
  X: TNDXB1
 %$END
  L: TDCU30ListC
ends

%$IF (Ver>=13)and IsDelphi;
TUnitInlineSrcInf struc pas
  Inf: ulong
  B: TNDXB1 //Source number
ends
%$END

%$IF (Ver>=8)and IsDelphi;
TDLLInf struc pas
 %$IF (Ver>=10)and IsDelphi;
  Inf: TNDXB1
 %$ELSE
  Inf: ulong
 %$END
  X: ulong
 %$IF (Ver>=12)and IsDelphi;
  X: TNDXB1 //analogously to TUnitInf b0: Byte
 %$END
  L: TDCU30ListC
ends
%$ELSE
  TDLLInf TUnitInf
%$END


TImpTypeDefInf struc pas
  RTTISz: TNDXB1//L: Byte
  Inf: ulong
ends

TExportInf struc pas
  hSym: TNDXB1
  Index: TNDXB1
ends

TNameFDeclBase(NoInf) struc pas
  B: TNDXB1
%$IF (Ver>=8)and IsDelphi;
  B1: TNDXB1
%$END
 %$IF (Ver>=12)and IsDelphi;
  B3: TNDXB1
 %$END
  Inf: case (@:NoInf xor 1)*(@.B:Val and 0x40) of
    0x40: ulong
  endc
/*%$IF Packaged and(Ver>=3);
  PkgNdx: case @.B:Val and PkgNdxFlag of
    PkgNdxFlag: TNDXB1
  endc
%$END*/
%$IF (Ver>=8)and IsDelphi;
  B2: case @.B1:Val and 0x80 of
    0x80: struc pas
       X: TNDXB1 //Base type for defs like TX = type TY
        //when TX and TY both in the same unit,
        //earlier versions were just duplicating definitions
 %$IF (Ver=8)and IsDelphi;
       Z: case @@@.B:Val and 0x08 of
        0x08: TNDXB1 //always 0
       endc
 %$END
     ends
  endc
%$END
ends

TNameFDecl TNameFDeclBase(0)

TTypeInf(NoInf) struc pas
  NF: TNameFDeclBase(@:NoInf)
  hDef: TNDXB1
%$IF Packaged and((Ver>=3)and(Ver<=8)or(Ver>=100));
  PkgNdx: case @.NF.B:Val and PkgNdxFlag of
    PkgNdxFlag: TNDXB1
  endc
%$END
ends

TTypePInf struc pas
  NF: TNameFDecl
  hDef: TNDXB1
//  B1: Byte
  B1: TNDXB1
%$IF Packaged and((Ver>=3)and(Ver<=8)or(Ver>=100));
  PkgNdx: case @.NF.B:Val and PkgNdxFlag of
    PkgNdxFlag: TNDXB1
  endc
%$END
ends

TVarInf struc pas
  NF: TNameFDecl
  hDT: TNDXB1
  Ofs: TNDXB1 //hDT: TNDXB1 //B0: Byte
%$IF Packaged and((Ver>=3)and(Ver<=8)or(Ver>=100));
  PkgNdx: case @.NF.B:Val and PkgNdxFlag of
    PkgNdxFlag: TNDXB1
  endc
%$END
ends

%$IF Packaged;
TResStrDef struc pas
  NF: TNameFDecl
  hDT: TNDXB1
  Ofs: TNDXB1 //hDT: TNDXB1 //B0: Byte
%$IF Packaged and((Ver>=3)and(Ver<=8)or(Ver>=100));
  PkgNdx: case @.NF.B:Val and PkgNdxFlag of
    PkgNdxFlag: TNDXB1
  endc
%$END
ends
%$ELSE     
TResStrDef TVarInf
%$END

%$IF (Ver>=15)and IsDelphi /*and mode64*/;
TConstVal(Kind) struc pas
  Sz: TNDXB1
  Val: case (@.Sz.b1.V)exc 1 of
    0: case @@:Kind of
      4: void
     else TNDXB1
     endc
  else raw[@@.Sz:Val]
  endc
ends
%$ELSE
TConstVal struc pas
  Sz: TNDXB1
  Val: case (@.Sz.b1.V)exc 1 of
    0: TNDXB1
  else raw[@@.Sz:Val]
  endc
ends
%$END

TConstDef struc pas
  NF: TNameFDecl
  //Inf: ulong
  hDT: TNDXB1
%$IF Ver>4;
  Kind: TNDXB1 //O - scalar, 1 - string (offset=8), 2 - resourcestring,
               //3-float, 4 - set,
               //[ver>=verD12] 5 - Unicode string (offset=12)
               //for 64-bit mode 4 means pointer
%$END
%$IF (Ver>=15)and IsDelphi /*and mode64*/;
  Val: TConstVal(@.Kind:Val)
%$ELSE
  Val: TConstVal
%$END
ends

%$IF (Ver>=22)and IsDelphi;
TDependencyInfoItem struc pas
  Z: Byte
  sName: Str
  W: Word
  Ndx: TNDXB1
  L: TNDXB1
  Tbl: array[@.L:val]of TNDXB1
ends

TDependencyInfoRec struc pas
  Cnt: TNDXB1
  Items: array[@.Cnt:val]of TDependencyInfoItem
ends
%$END

%$IF (Ver>=27)and IsDelphi;
//This kind of records was found in the .dcp files with Magic='PKX1' of Delphi 11   
TInDcpWin64Info struc pas 
  bFF: Byte;
  F1: ulong                                       
  F2: ulong
ends
%$END
/*
TResStrDef struc pas
  b80: Byte
  Inf: case @.b80 and 0x80 of
    0x80: ulong
  endc
  hDT: TNDXB1
  Ofs: TNDXB1
/*
  NDX1: TNDXB1
  B1: Byte
  B2: Byte
  V: TNDXB1
  Val: TConstVal
*/
ends
*/

TProcArgTag enum TDCU30RecTag of (
  arStop='c',
  arVal='!',
  arVar='"',
  arResult='#',
  arAbsLocVar='$',
  arLabel='+',
  arLocVar=0x20,//' ',
  arConst=0x25, //'%',
  arLocType='*',
  arEmbeddedProcEnd='k', //For Ver 5.0
//Fields
  arFld=',',
 %$IF (Ver>=10)and IsDelphi;
  arClassVar='-',
  arMethod='.',
  arConstr='/',
  arDestr='0',
  arProperty='1',
 %$ELSE
  arMethod='-',
  arConstr='.',
  arDestr='/',
  arProperty='0',
 %$END
  arCDecl=0x81,
  arPascal=0x82,
  arStdCall=0x83,
  arSafeCall=0x84,
%$IF (Ver>=10)and IsDelphi;
  arCopyDecl=0xA3,
%$END
%$IF (Ver>=13)and IsDelphi;
  arAnonymousBlock=0x01,
%$END
 %$IF (Ver>=16)and IsDelphi;
  arFinalFlag=0xC2,
 %$END
  arSetDeft=0x9A //Set Default parameter value
)

TPropInfo struc pas
  Flags: TNDXB1
 %$IF (Ver>=8)and IsDelphi;
  FlagsEx: TNDXB1 //For Ver>=8 public=0x1,protected=0x2,published=0x5,class=0x10
 %$END
 %$IF (Ver>=12)and IsDelphi;
  X4: TNDXB1
 %$END
  hDT: TNDXB1
  Ndx: TNDXB1
  hIndex: TNDXB1 //property index
/*  D0Fl0: ulong
  B80: Byte */
  hRead: TNDXB1
  hWrite: TNDXB1
  hStored: TNDXB1
/*  D0Fl1: ulong
  B80a: Byte */
 %$IF (Ver>=8)and IsDelphi;
 //It looks like the next two fields contain references
 //to the class members specified in Pascal source for read and
 //write when compiler had to change calling convention or something else,
 //and hRead or hWrite point to the thunk methods created by the compiler
  hReadOrig: TNDXB1
  hWriteOrig: TNDXB1
 %$IF MSIL;
  X2: TNDXB1
  X3: TNDXB1
 %$END
 %$END
  hDeft: TNDXB1
ends

TSetDeftInfo struc pas
  hConst: TNDXB1
  hArg: TNDXB1
/*  sdB0: Byte
  sdB1: Byte
  sdB2: Byte
  sdB3: Byte
*/
ends

//%$IF (Ver>=7)and IsDelphi;
%$IF gen7;

%$IF (Ver>=8)and IsDelphi;

TConstAddInfo01Rec struc pas
  hDef: TNDXB1
  V: TNDXB1
  Len: TNDXB1
  SD: case @.Len:Val>0 of
    1: struc pas
      Name: array[@@@.Len:Val]of Char
      Cnt: TNDXB1
      Defs: array[@.Cnt:Val] of TNDXB1
     ends
   endc
ends

TStrNDXB1 struc pas
  Len: TNDXB1
  V: array[@.Len:Val]of Char
ends

%$IF (Ver>=28)and IsDelphi;
TStrNDXB1X struc pas //It is very strange, that they don't simply use TStrNDXB1
  //may be Len:Val=0 has some special meaning  
  Len: TNDXB1
  V: array[(@.Len:Val-1)when(@.Len:Val>0)exc 0]of Char
ends

TSomeNameInfo28 struc pas
  Kind: TNDXB1
  D: case @.Kind:Val of
   0: void
   1: struc pas
     vVal: TNDXB1
     //v0: TNDXB1
    ends
   6: struc pas
     sName: TStrNDXB1X
     sUnit: TStrNDXB1X
     //v0: TNDXB1
    ends
   10: struc pas
     sName: TStrNDXB1X
     v4: TNDXB1
    ends
  endc
ends
%$END



TConstAddInfo0A_7Rec struc pas
  Name: TStrNDXB1
  V: TNDXB1
  V1: TNDXB1
  hDT: TNDXB1
ends

TInlineOpNDX TNDXB1():displ=(case (@.@:Val and 1)-(@.@:Val=0) of
-1:('-')
0:('@',INT(@.@:Val div 2-1))//Command index
else ('v',INT(@.@:Val div 2))
endc)

%$IF (Ver>=9)and IsDelphi;                        
const        
 %$IF Ver=9;
  inline_0=0x19;
 %$ELSIF Ver<=19;
  inline_0=0x1B;
 %$ELSE
  inline_0=0x20;
 %$END

type     
TInlineOpCode enum byte of (
 //The codes in comments are from D2005
  NOP=inline_0/*0x19*/, //end try or catch block in try ... finally and try ... except| raise; argument| may be NOP
  PutConst/*=0x1A*/,
  LeaC/*=0x1B*/,
  PutField/*=0x1C*/,
  ?,
  Lea/*=0x1E*/,
  PutStr/*=0x1F*/, //and functions to function variables
  ArgList/*=0x20*/,
  Let/*=0x21*/,
  LetF/*=0x22*/, //F - Float
  LetShortStr/*=0x23*/, //ShortString
  LetSet/*=0x24*/, //set of ..., Variant
  LetStr/*=0x25*/,
  LetIntf/*=0x26*/,
 %$IF Mobile and(Ver<20);
  LetCast,
 %$END
  LetDynArray/*=0x27*/,
  Add/*=0x28*/,
  Sub/*=0x29*/,
  Mul/*=0x2A*/,
  Div_/*=0x2B*/,
  Mod_/*=0x2C*/,
  AndB/*=0x2D*/,
  OrB/*=0x2E*/,
  XorB/*=0x2F*/,
  Shl_/*=0x30*/,
  Shr_/*=0x31*/,
  Inc/*=0x32*/,
  Dec/*=0x33*/,
  ?/*=0x34*/,
  ?/*=0x35*/,
  ?/*=0x36*/,
  ?/*=0x37*/,
  ?/*=0x38*/,
  ?/*=0x39*/,
  ?/*=0x3A*/,
  ?/*=0x3B*/,
  ?/*=0x3C*/,
  ?/*=0x3D*/,
  Neg/*=0x3E*/,
  NotB/*=0x3F*/,
  ?/*=0x40*/,
  ?/*=0x41*/,
  ?/*=0x42*/,
  LetI64/*=0x43*/,
  AddI64/*=0x44*/,
  SubI64/*=0x45*/,
  MulI64/*=0x46*/,
  DivI64/*=0x47*/,
  ModI64/*=0x48*/,
  AndBI64/*=0x49*/,
  OrBI64/*=0x4A*/,
  XorBI64/*=0x4B*/,
  ShlI64/*=0x4C*/,
  ShrI64/*=0x4D*/,
 %$IF Ver>=21;
  LetCvtPtr1/*=4E*/, //Perhapse it is LetCvtPtr
 %$ELSE
  ?/*=4E*/,
 %$END
 %$IF Ver>=27;
  DecI64/*=4F*/,
 %$ELSE
  ?/*=4F*/,
 %$END
  ?/*=50*/,
  ?/*=51*/,
  ?/*=52*/,
  ?/*=53*/,
  ?/*=54*/,
  ?/*=55*/,
  ?/*=56*/,
  ?/*=57*/,
  ?/*=58*/,
  ?/*=59*/,
  NegI64/*=0x5A*/,
  NotBI64/*=0x5B*/,
  CmpEQi64/*=0x5C*/,
  CmpNEi64/*=0x5D*/,
  CmpLTi64/*=0x5E*/,
  CmpLEi64/*=0x5F*/,
  CmpGTi64/*=0x60*/,
  CmpGEi64/*=0x61*/,
  AddF/*=0x62*/,
  SubF/*=0x63*/,
  MulF/*=0x64*/,
  DivF/*=0x65*/, //A/B for Int64 and Float
 %$IF Ver>=20;
  ?,
 %$END
  NegF/*=0x66*/,
 %$IF Ver>=20;
  ?,
 %$END
  ?/*=0x67*/,
  ?/*=0x68*/,
  ?/*=0x69*/,
  ?/*=0x6A*/,
  ?/*=0x6B*/,
  ?/*=0x6C*/,
  "And"/*=0x6D*/,
  "Or"/*=0x6E*/,
  "Not"/*=0x6F*/,
  CmpEQ/*=0x70*/,
  CmpNE/*=0x71*/,
  CmpLT/*=0x72*/,
  CmpLE/*=0x73*/,
  CmpGT/*=0x74*/,
  CmpGE/*=0x75*/,
  CmpEQF/*=0x76*/, //Float
  CmpNEF/*=0x77*/, //
  CmpLTF/*=0x78*/, //
  CmpLEF/*=0x79*/, //
  CmpGTF/*=0x7A*/, //
  CmpGEF/*=0x7B*/, //
  CmpEqSet/*=0x7C*/, //set of
  CmpNESet/*=0x7D*/,
  CmpLESet/*=0x7E*/,
  CmtGESet/*=0x7F*/,
  CmpEQShortS/*=0x80*/, //ShortString
  CmpNEShortS/*=0x81*/, //
  CmpLTShortS/*=0x82*/, //
  CmpLEShortS/*=0x83*/, //
  CmpGTShortS/*=0x84*/, //
  CmpGEShortS/*=0x85*/, //
  CmpEQS/*=0x86*/, //String
  CmpNES/*=0x87*/, //
  CmpLTS/*=0x88*/, //
  CmpLES/*=0x89*/, //
  CmpGTS/*=0x8A*/, //
  CmpGES/*=0x8B*/, //
  InSet/*=0x8C*/,
  SetIntersect/*=0x8D*/,
  SetUnion/*=0x8E*/,
  SetDiff/*=0x8F*/,
  SetForElt/*=0x90*/,
  SetForRange/*=0x91*/,
  ShortStrCat/*=0x92*/,
  StrCat/*=0x93*/,
  AddVar/*=0x94*/, //Variant
  SubVar/*=0x95*/, //
  MulVar/*=0x96*/, //
  DivVar/*=0x97*/, // div operator
  ModVar/*=0x98*/, //
  AndVar/*=0x99*/, //
  OrVar/*=0x9A*/, //
  XorVar/*=0x9B*/, //
  ShlVar/*=0x9C*/, //
  ShrVar/*=0x9D*/, //
  NegVar/*=0x9E*/, //
  NotVar/*=0x9F*/, //
  DivideVar/*=0xA0*/,// / operator
  CmpEQVar/*=0xA1*/, //Variant
  CmpNEVar/*=0xA2*/, //
  CmpLTVar/*=0xA3*/, //
  CmpLEVar/*=0xA4*/, //
  CmpGTVar/*=0xA5*/, //
  CmpGEVar/*=0xA6*/, //
  ?/*=0xA7*/,
  ?/*=0xA8*/,
  CallInt/*=0xA9*/,
  CallFloat/*=0xAA*/, //Procedures, methods
  PutArg/*=0xAB*/,
  CallFnAsProc/*=0xAC*/, //Int
  CallFnAsProcFile/*=0xAD*/, //For write, which returns TextFile
  Block/*=0xAE*/,
  IfT/*=0xAF*/, //If then
  IfTE/*=0xB0*/, //If then else
  While_/*=0xB1*/,
  Repeat/*=0xB2*/,
  Case_/*=0xB3*/,
  For_/*=0xB4*/,
  GoTo/*=0xB5*/,
  SetLabel/*=0xB6*/,
  CvtT/*=0xB7*/,
  Cond/*=0xB8*/,
  ChkRange/*=0xB9*/,
  Include_/*=0xBA*/,
  Exclude_/*=0xBB*/,
  Break_/*=0xBC*/,
  Continue_/*=0xBD*/,
  Exit/*=0xBE*/,
  ?/*=0xBF*/,
  Raise/*=0xC0*/,
  TryExcept/*=0xC1*/,
  TryFinally/*=0xC2*/,
  TryCase/*=0xC3*/,
  ObjIs/*=0xC4*/,
  ObjAs/*=0xC5*/,
  OpenArrayArg/*=0xC6*/,
  ForIn/*=0xC7*/,
  LetCvtPtrSArg/*=0xC8*/,
  ?/*=0xC9*/,
  ?/*=0xCA*/,
  Unknown1/*=xCB*/,
  ?/*=0xCC*/,
  ?/*=0xCD*/,
  PutClass/*=0xCE*/
  CvtIntDT/*=0xCF*/,
  ?/*=0xD0*/,
  ?/*=0xD1*/,
 %$IF Ver>=20;
  ?,?
 %$END
  LetT/*=0xD2*/, //in templates
  MemberT/*=0xD3*/, //in templates
 %$IF Ver>=20;
  ?
 %$END
  OpenArrayElT/*=0xD4*/, //in templates
  ?/*=0xD5*/
  ?/*=0xD6*/
 %$IF Ver>=13;
  ,CvtIntfToCl/*=0xD7*/ //Interface to Class
  %$IF Ver>=18;
  ,CvtTToClass/*=0xD8*/
  %$IF Ver>=22;
  ,CvtAuxIntfToClass/*=0xD9*/
  %$END
  %$END
 %$END
 %$IF Mobile and(Ver>=20);
  ,LetCast=0xE7
 %$END
 %$IF Ver>=21;
  ,LetCvtPtr=0xEA
  ,CvtConst=0xEB
 %$END
 %$IF Ver>=24;
  ,InlineFCall=0xEC //When some complex inline function (several operators) is called from an expression (was observed in the call of Length() from the ForIn)
 %$END
 %$IF Ver>=28;
  ,InlineUnknown1=0xED
  ,InlineVar=0xEE
 %$END
)       

%$IF Ver>=12;
%$IF Ver>=21;
TLineIndex(W) case @:W and 0x1000<>0 of
 0: ulong
endc
%$ELSE;
TLineIndex ulong //The index of the line in the tables Lines.
  //It looks like some dummy have added this field without any idea about indices (TNDXB1)
%$END
%$END

%$IF Ver>20;
TInt64 struc pas
  Lo: TNDXB1
  Hi: TNDXB1
ends:displ=('$',@.Hi,HEX(@.Lo:Val,8))

TInlineConstKind enum byte of (
 //The other values were not encountered yet
  cInt=1,
  cUInt=2,
  cInt64=3,
  cUInt64=4,
  cFloat=7,
  cStr=8,
  cSet=0xC,
  c1=0x10/*1*/,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,
  c_1=0x20/*-1L*/,c_2,c_3,c_4,c_5,c_6,c_7,c_8,c_9,c_10,c_11,c_12,c_13,c_14,c_15,c_16,
  c1L=0x30/*1*/,c2L,c3L,c4L,c5L,c6L,c7L,c8L,c9L,c10L,c11L,c12L,c13L,c14L,c15L,c16L, /*All 64-bit*/
  c_1L=0x40/*-1L*/,c_2L,c_3L,c_4L,c_5L,c_6L,c_7L,c_8L,c_9L,c_10L,c_11L,c_12L,c_13L,c_14L,c_15L,c_16L,
  c0=0x50,c0L=0x51/*64-bit*/,c0Float,c1Float
)        

TInlineStrConst struc pas
  Sz: TNDXB1
  D: raw[@.Sz:Val]
ends     

TInlineSet  struc pas
  Sz: TNDXB1
  Base: TNDXB1 //?
  D: raw[@.Sz:Val]
ends     

TInlineConst struc pas
  Kind: TInlineConstKind
  V: case @.Kind of
   cInt,cUInt: TNDXB1
   cInt64,cUInt64: TInt64
   cFloat: TExtended
   cStr: TInlineStrConst
   cSet: TInlineSet
  endc
ends
%$END

TInlineOp struc pas
  Op: TInlineOpCode
  W: Word
  hDT: TNDXB1 //Index in Types
  Args: case @.Op of
  %$IF Ver<=20;
   PutConst: struc pas
     C: TNDXB1 //In fact it can be Extended for floats and so on,
     //but it is required to use the hDT data type info to determine the value type
     /*C: case @.Kind:Val of
       1: TExtended
       2: TNDXB1
     endc*/
    ends
  %$ELSE
   PutConst: TInlineConst
  %$END
   PutStr,PutClass: struc pas
     hVar: TInlineOpNDX
    ends
   LeaC: struc pas
     Ofs: TNDXB1
    %$IF mode64;
     GlobBase: TInlineOpNDX
    %$END
     Base: TInlineOpNDX
    ends
   Lea: struc pas //Result := Base+Index shl Shift
     Ofs: TNDXB1
    %$IF mode64;
     GlobBase: TInlineOpNDX
    %$END
     Base: TInlineOpNDX
     Index: TInlineOpNDX
     Shift: TNDXB1
    ends
   PutArg: struc pas
     hArg: TInlineOpNDX
    ends
   Block: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     Cnt: TNDXB1
     Args: array[@.Cnt:Val]of TInlineOpNDX
    ends
   IfT: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     Cond: TInlineOpNDX
     Then_: TInlineOpNDX
    ends
   IfTE: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     Cond: TInlineOpNDX
     Then_: TInlineOpNDX
     Else_: TInlineOpNDX
    ends
   Case_: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     Expr: TInlineOpNDX
     Cnt: TNDXB1 //Case count
     Code: array[@.Cnt:Val]of TInlineOpNDX //The operators for the cases
     ICnt: TNDXB1 //Interval count
     Intervals: array[@.ICnt:Val]of struc pas
       S: TNDXB1
       E: TNDXB1
       hCode: TNDXB1
      ends
     Else_: TInlineOpNDX
    ends
   Repeat: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     Cond: TInlineOpNDX
     Body: TInlineOpNDX
    ends
   For_: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     Z0: TNDXB1
     Z1: TNDXB1
     hVar: TInlineOpNDX
     hB: TInlineOpNDX
     hFrom: TInlineOpNDX
     hTo: TInlineOpNDX
     Z2: TNDXB1
     hBody: TInlineOpNDX
     hStep: TInlineOpNDX
    ends
   ForIn: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     Z0: TNDXB1
     Z1: TNDXB1
     hCond: TInlineOpNDX
     hBody: TInlineOpNDX
     hStep: TInlineOpNDX
    ends
   While_: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     hCond: TInlineOpNDX
     hBody: TInlineOpNDX
    ends
   Break_,Continue_: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     nTarget: TNDXB1d
     B0: Byte //Proof: XE5, REST.JsonReflect.dcu, TTypeMarshaller`1.MarshalData,
     Z1: TNDXB1
     Z2: TNDXB1
     /*Z2: case @.nTarget:Val<@@@:# of
      0: TNDXB1
      endc*/
    ends
   Exit,NOP: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
    ends
   TryFinally: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     hTry: TInlineOpNDX
     hFinally: TInlineOpNDX
    ends
   TryExcept: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     hTry: TInlineOpNDX
     hExcept: TInlineOpNDX
    ends
   TryCase: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     hCode: TInlineOpNDX
     hNext: TInlineOpNDX
     hExcVar: TInlineOpNDX //The variable for the exception
     hExcType: TNDXB1
    ends
   Raise: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     hCode: TInlineOpNDX //NOP for reraise
    %$IF Ver>=14;
     AtAddr: TInlineOpNDX
    %$END
    ends
  %$IF Mobile;
   LetCast,
  %$END
  %$IF Ver>=21;
   LetCvtPtr,
   %$IF Ver>=21;
    LetCvtPtr1,
   %$END
  %$END
   Let,LetI64,LetF,LetShortStr,LetStr,LetSet,LetIntf,LetDynArray,LetT,LetCvtPtrSArg: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     hDest: TInlineOpNDX
     hSrc: TInlineOpNDX
    ends
   ArgList,OpenArrayArg: struc pas
     hArg: TInlineOpNDX
     hNext: TInlineOpNDX
    ends
   NegF: struc pas
     hArg: TInlineOpNDX
    %$IF Ver=9;
     hArg2: TInlineOpNDX/*For some error they had two arguments in D2005*/
    %$END
    ends
   NegVar,NotVar,ChkRange: struc pas
     hArg: TInlineOpNDX
     hArg2: TInlineOpNDX/*For some error they had two arguments too*/
    ends
  %$IF Ver>=27;
   DecI64,
  %$END
   Inc,Dec,Include_,Exclude_: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     hArg1: TInlineOpNDX
     hArg2: TInlineOpNDX
    ends
   Add,Sub,Mul,Div_,Mod_,
   Shl_,Shr_,AndB,OrB,XorB,"And","Or",
   AddI64,SubI64,MulI64,DivI64,ModI64,DivF,
   AndBI64,OrBI64,XorBI64,ShlI64,ShrI64,
   AddF,SubF,MulF,
   CmpEQ,CmpNE,CmpLT,CmpLE,CmpGT,CmpGE,
   CmpEQi64,CmpNEi64,CmpLTi64,CmpLEi64,CmpGTi64,CmpGEi64,
   CmpEQF,CmpNEF,CmpLTF,CmpLEF,CmpGTF,CmpGEF,
   CmpEQS,CmpNES,CmpLTS,CmpLES,CmpGTS,CmpGES,
   CmpEQShortS,CmpNEShortS,CmpLTShortS,CmpLEShortS,CmpGTShortS,CmpGEShortS,
   CmpEQVar,CmpNEVar,CmpLTVar,CmpLEVar,CmpGTVar,CmpGEVar,
   CmpEQSet,CmpNESet,CmpLESet,CmtGESet,
   InSet,SetUnion,SetIntersect,SetDiff,
   AddVar,SubVar,MulVar,DivVar,ModVar,AndVar,OrVar,XorVar,
   ShlVar,ShrVar,DivideVar,
   ShortStrCat,StrCat,OpenArrayElT,CvtIntDT: struc pas
     hArg1: TInlineOpNDX
     hArg2: TInlineOpNDX
    ends
   Cond,CallFnAsProc,CallFnAsProcFile,SetLabel,GoTo: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     hArg: TInlineOpNDX
    ends
  %$IF Ver>=24;
   InlineFCall: struc pas
     nLine: TLineIndex(@@@.W)
     hOp: TInlineOpNDX //Operator to execute before expressions
     hVal: TInlineOpNDX //the expression (condition) itself
    ends
  %$END
  %$IF Ver>=28;
   InlineVar,InlineUnknown1: struc pas
     nLine: TLineIndex(@@@.W)
     hOp: TInlineOpNDX //Operator to execute before expressions
     hVal: TInlineOpNDX //the expression (condition) itself
    ends
  %$END
  %$IF Ver>=18;
   CvtTToClass,
  %$IF Ver>=22;
   CvtAuxIntfToClass,
  %$END
  %$END
  %$IF Ver>=21;
   CvtConst,
  %$END
   "Not",Neg,NotB,NotBI64,NegI64: struc pas
     hArg: TInlineOpNDX
    ends
   /*CallProc,*/CallInt,CallFloat: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     hFunc: TInlineOpNDX
     hArgs: TInlineOpNDX
     //F: TInlineOpNDX
    ends
   Unknown1: struc pas
    %$IF Ver>=21;
     nLine: TLineIndex(@@@.W)
    %$ELSIF Ver>=12;
     nLine: TLineIndex
    %$END
     /*hFunc: TInlineOpNDX
     hArgs: TInlineOpNDX
     X1: TInlineOpNDX
     X2: TInlineOpNDX*/
     //nLine1: ulong //Some flags? may be 0 or 02000000
     //F: TInlineOpNDX
    //Copy from TryCase:
     hCode: TInlineOpNDX
     hNext: TInlineOpNDX
     hExcVar: TInlineOpNDX //The variable for the exception
     hExcType: TInlineOpNDX //TNDXB1
    ends
   SetForElt,SetForRange: struc pas
     hElt: TInlineOpNDX
     hElt1: TInlineOpNDX //0 for SetForElt
    ends
   ObjIs,ObjAs: struc pas
     hObj: TInlineOpNDX
     hCl: TInlineOpNDX
    ends
 %$IF Ver>=13;
   CvtIntfToCl: struc pas
     hCl: TInlineOpNDX
     hIntf: TInlineOpNDX
    ends
 %$END
   CvtT: struc pas
     hDest: TInlineOpNDX //Unnamed, always addr with hAddr=0
     hSrc: TInlineOpNDX
    ends
   PutField: struc pas
     Ofs: TNDXB1
    %$IF mode64;
     GlobBase: TInlineOpNDX
    %$END
     hObj: TInlineOpNDX
    ends
   MemberT: struc pas
     hObj: TInlineOpNDX
     hType: TInlineOpNDX
    ends
  endc
ends:displ=(INT(@:#)/*,':',HEX(&@-&@:@)*//*ADDR(&@)*/,': ',valname(@.Op),' ',HEX(@.W,4),', hDT:',@.hDT,' ',@.Args)

TInlineCode(Sz) struc pas
  Codes: array of TInlineOp?(&@-&@:@>=(@:@:@ as TInlineCode):Sz)or not HasEnumName(@.Op,TInlineOpCode)!void;:displ=(ShowArray(@,(NL,@)),NL)
  rest: raw[] at &@.Codes;
ends:[@:Size=@:Sz]
%$ELSE         
TInlineCode(Sz) raw[@:Sz]
%$END

const
%$IF (Ver>=12)and IsDelphi;
  cafInline=0x40000;
  cafBigVal=0x80000;
%$ELSE
  cafInline=0x80000;
  cafBigVal=0x100000;
%$END

type

TConstAddInfoRec struc pas
  Tag: Byte
  D: case @.Tag of
   0x01: struc pas
     hDef: TNDXB1
     F: TNDXB1 //$1-deprecated,$2-Platform,$80000-Inline
     %$IF (Ver>=10)and(Ver<23)and IsDelphi and(iOs=0);
     IP1: case @.F:Val and 0x1000000 of
      0x1000000: TNDXB1 //Some int(4)
     endc
     %$END
    %$IF MSIL; //and(Ver<=9);
     %$IF (Ver>=9)and IsDelphi;
     IP2: case @.F:Val and 0x10000 of
      0x10000: struc pas
         L: TNDXB1
         sCSharp: array[@.L:Val]of Char
       ends
     endc
     %$END
     Cnt: TNDXB1
     Tbl: array[@.Cnt:Val] of TConstAddInfo01Rec
    %$END
    /**/
    %$IF (Ver>=9)and IsDelphi;
     %$IF (Ver>=12)and IsDelphi;
      hUsedCl: case @.F:Val and 0x800000/*0x840000*/ of
       0x800000: TNDXB1 ////Class reference, when 0x40000 already in Inline
        //Since D2010 it is generated for attributes and contains the attribute class type reference
        //The attribute constructor and its parameters are missing and can be found in RTTI memory only
        //until D_XE6, when the 0x80000000 flag had been introduced
      endc
     %$END
     %$IF (Ver>=12)and IsDelphi;
      Deprecated: case @.F:Val and 0x1 of
       0x1: TStrNDXB1
      endc
     %$END
     %$IF (Ver>=19)and IsDelphi;
      Attribute: case @.F:Val and 0x80000000=0 of
       0: struc pas
         N: TNDXB1 //Attribute count
         Attrs: array[@.N:Val] of struc pas
           hAttrCtor: TNDXB1 //Attribute constructor
           MemberKind: TNDXB1 //[Result: Unsafe] Result=#D
           hAttrDT: TNDXB1 //Attribute type
           ArgCnt: TNDXB1
           Args: array[@.ArgCnt:Val]of struc pas
             ArgKind: TNDXB1 //Argument Kind
             Arg: case @.ArgKind:Val of
              0: struc pas //const
                hArgT: TNDXB1 //Argument type
                Kind: TNDXB1 //Like that in TConstDecl
                  //(O - scalar, 1 - string (offset=8), 2 - resourcestring,
                  //3-float, 4 - set,
                  //[ver>=verD12] 5 - Unicode string
                Val: TConstVal(@.Kind:Val)
               ends
              1: struc pas //TypeInfo(DT)
                hDT: TNDXB1 //DT index in the type table
                hDTAddr: TNDXB1 //DT index in the addr table
               ends
             endc
            ends
          ends
        ends
      endc
     %$END
     Inline: case @.F:Val and cafInline of
      cafInline: struc pas
       %$IF (Ver>=10)and IsDelphi;
         Y: TNDXB1
         Y1: TNDXB1
        %$IF MSIL;
        // Y1: TNDXB1
        %$END
       %$END
        %$IF (Ver>=13)and IsDelphi;
        // DY: array[@.Y:Val]of TNDXB1
        %$END
         Sz: TNDXB1
         D: TInlineCode(@.Sz:Val)
         X0: TNDXB1
         X1: TNDXB1
        %$IF (Ver>=15)and IsDelphi;
         XX: TNDXB1
        %$END
         hRoot: TInlineOpNDX //The root node
         nRes: TInlineOpNDX //The number of result var
         X4: TNDXB1
         V2: TNDXB1 //Always 2=#1
         LenA: TNDXB1
        %$IF (Ver>=12)and IsDelphi;
         StartLine: TNDXB1 //The source line # of begin
         MaxLine: TNDXB1 //Max(Lines[i])+1
         //Y4: TNDXB1
         NLines: TNDXB1 //Number of source lines
         Lines: array[@.NLines:Val]of long //the lines (<0 => -absolute line number, else relative line number (from prev. absolute))
        %$END
         Addrs: array[@.LenA:Val]of struc pas
         %$IF (Ver<12)and IsDelphi;
           F: TNDXB1
           D: case @.F:Val of
             0: struc pas
               hAddr: TNDXB1 //Address index of parameter, procedure, or data type used
               hMember: TNDXB1 //The ordinal number of class member
              ends
            else struc pas
              hDT: TNDXB1 //The unit type index of the anonymous variable
             ends
            endc
         %$ELSE
           hAddr: TNDXB1 //Address index of parameter, procedure, or data type used
           hDT: TNDXB1 //The index in types
           hMember: TNDXB1 //The ordinal number of class member
         %$END
         %$IF (Ver>=12)and IsDelphi;
           Y1: TNDXB1
           CntR: TNDXB1
          %$IF (Ver>=13)and IsDelphi;
           N: TNDXB1
          %$END
           /*R: case @.Z:Val<>0 of
            1: TNDXB1
           endc*/
           R: array[@.CntR:Val]of TNDXB1
         %$END
          ends
         LenT: TNDXB1
         Types: array[@.LenT:Val/*when (@.Len2:Val<200)exc 0*/]of struc pas
           Kind: TNDXB1 //1 => Addr, 2 => Type
          %$IF (Ver>=12)and IsDelphi;
          /*
           V: array[@.LF:Val div 2]of TNDXB1
           C: case @.LF:Val and 1 of
            1: struc pas //!!!
               N1: TNDXB1
               N2: TNDXB1
             ends
           endc*/
          %$END
           C: case @.Kind:Val of
           %$IF (Ver>=12)and IsDelphi;
            1: struc pas
               N1: TNDXB1
               N2: TNDXB1
              %$IF (Ver>=14);
               N3: TNDXB1
              %$END
             ends
            2: struc pas
               hType: TNDXB1 //Data type index
             ends
            3: struc pas
              //%$IF (Ver<14);
               N1: TNDXB1
               N2: TNDXB1
               N3: TNDXB1
              //%$END
             ends
            4: struc pas
               N1: TNDXB1
               N2: TNDXB1
             ends
            5: struc pas
               N1: TNDXB1
               N2: TNDXB1
               N3: TNDXB1
               N4: TNDXB1
             ends
            6: struc pas //Ver13 only
              %$IF (Ver>=23)and IsDelphi;
               N0: TNDXB1
              %$END
               N1: TNDXB1
               /*N2: TNDXB1
               N3: TNDXB1
               N4: TNDXB1
               N5: TNDXB1*/
             ends
            7: struc pas //Ve1
              %$IF (Ver>=23)and IsDelphi;
               N0: TNDXB1
              %$END
               N1: TNDXB1
             ends
           %$ELSE
            1: struc pas
               N1: TNDXB1
               N2: TNDXB1
               N3: TNDXB1
             ends
            else TNDXB1
           %$END
           endc
          ends
         NUnits: TNDXB1
         ImpData: array[@.NUnits:Val/*when (@.Len3:Val<100)exc 0*/]of struc pas
           hUnit: TNDXB1
           Len: TNDXB1
           D: array[@.Len:Val/*when (@.Len:Val<100)exc 0*/]of TNDXB1 //Imported def
          ends
        %$IF (Ver>=10)and IsDelphi;
         Len4: TNDXB1
         Data4: array[@.Len4:Val/*when (@.Len4:Val<100)exc 0*/]of TNDXB1
        %$IF (Ver>=12)and IsDelphi;
         V0: TNDXB1
         V1: TNDXB1
         V2: TNDXB1
        %$END
        %$END
       /*
        %$IF (Ver>=12)and IsDelphi;
         Len4: TNDXB1
         Data4: array[@.Len4:Val/*when (@.Len4:Val<100)exc 0*/]of TNDXB1
         V0: TNDXB1
         V1: TNDXB1
         V2: TNDXB1
        %$END
        */
       /*
        %$IF (Ver>=10)and IsDelphi;
        //may be part of IP
         DeprecatedArgs: case @@@.F:Val and 0x100001 of
           0x1: struc pas
             LenArgsF: TNDXB1
             ArgsF: array[@.LenArgsF:Val]of TNDXB1
            ends
          endc
        %$END*/
       ends
     endc
    %$IF (Ver>=9)and IsDelphi;
     InfBig: case @.F:Val and cafBigVal of
      cafBigVal: TNDXB1 //Big value - 5 bytes
     endc
    %$END
    /*
    %$IF (Ver>=12)and IsDelphi;
     Inf80000: case @.F:Val and 0x80000 of
      0x80000: TNDXB1 //Big value - 5 bytes
     endc
    %$END
     IP: case @.F:Val and 0x100000 of
      0x100000: struc pas
       %$IF (Ver>=10)and IsDelphi;
        Cnt: TNDXB1
        Tbl: array[@.Cnt:Val] of TNDXB1
       %$END
        V: TNDXB1 //Some int(4-byte)
      ends
     endc
     */
/*1
     %$IF (Ver>=10)and IsDelphi;
     IP1: case @.F:Val and 0x1000000 of
      0x1000000: TNDXB1 //Some int(4)
     endc
     %$END
*/
    %$END
   /**/
    ends
   %$IF (Ver>=10)and IsDelphi;
   0x04: struc pas
     V: TNDXB1
     V1: TNDXB1
    ends
   %$END
   0x06: struc pas
     hDef: TNDXB1
     hDT: TNDXB1
     V: TNDXB1
     hDef1: TNDXB1
    ends
   0x07: struc pas
     hDef: TNDXB1
     hDef1: TNDXB1
     hDef2: TNDXB1
     V: TNDXB1
    ends
  %$IF (Ver>=27)and IsDelphi;
   0x08: struc pas
     hDef: TNDXB1
     S: TStrNDXB1 //XML Doc
    ends
  %$END
   0x09: struc pas
     hDef: TNDXB1
     hDT: TNDXB1
    ends
   0x0A: struc pas
     hDef: TNDXB1
     V: TNDXB1
     F: TNDXB1
     hDT: case @.F:Val and 0x1 of
      0x1: TNDXB1
     endc
     hDef1: case @.F:Val and 0x2 of
      0x2: TNDXB1
     endc
     V2: case @.F:Val and 0x4 of
      0x4: TNDXB1
     endc
     V3: case @.F:Val and 0x8 of
      0x8: TNDXB1
     endc
     V4: case @.F:Val and 0x10 of
      0x10: TNDXB1
     endc
     hDef5: case @.F:Val and 0x20 of
      0x20: TNDXB1
     endc
     inf7: case @.F:Val and 0x40 of
      0x40: struc pas
        Cnt: TNDXB1
        Tbl: array[@.Cnt:Val] of TConstAddInfo0A_7Rec
       ends
     endc
     inf8: case @.F:Val and 0x80 of
      0x80: struc pas
        V: TNDXB1
        V1: TNDXB1
        V2: TNDXB1
       ends
     endc
     sGenName: case @.F:Val and 0x100 of //The value in the generated code
      0x100: TStrNDXB1
     endc
     s10: case @.F:Val and 0x200 of
      0x200: TStrNDXB1
     endc
     hDef11: case @.F:Val and 0x400 of
      0x400: TNDXB1
     endc
     hDef12: case @.F:Val and 0x800 of
      0x800: TNDXB1
     endc
     hDef13: case @.F:Val and 0x1000 of
      0x1000: TNDXB1
     endc
     hDef14: case @.F:Val and 0x2000 of
      0x2000: TNDXB1
     endc
     hDef15: case @.F:Val and 0x4000 of
      0x4000: TNDXB1 //MSIL 9 only?
     endc
    ends
   0x0C: struc pas
     hDef: TNDXB1
     V1: TNDXB1
     V2: TNDXB1
    ends
  %$IF (Ver>=9)and IsDelphi;
   0x0D: struc pas
     hDef: TNDXB1
     S: TStrNDXB1
    ends
  %$END
  %$IF (Ver>=12)and IsDelphi;
   0x10: struc pas
     V0: TNDXB1
     V1: TNDXB1
     V2: TNDXB1
    ends
  %$IF (Ver>=17)and IsDelphi;
   0x11: struc pas
     hDef: TNDXB1
     V: TNDXB1
    ends
  %$END
   0x12: struc pas //appears for TX = type TY
     V0: TNDXB1
     V1: TNDXB1
    ends
   0x13: struc pas
     hAddr: TNDXB1
     V1: TNDXB1
     V2: TNDXB1
     ExtSym: TStrNDXB1 // $EXTERNALSYM
     ExtSym1: TStrNDXB1 //??
     ObjTN: TStrNDXB1 // $OBJTYPENAME
    ends
   0x14: struc pas //qualifier path for aux field
     //which is created now when property read/write/etc
     //references a field inside record
     hDef: TNDXB1
     V1: TNDXB1
     Cnt: TNDXB1
     Tbl: array[@.Cnt:Val]of struc pas
       Kind: TNDXB1 //0-record, 1-Array
       hDT: TNDXB1
       Index: TNDXB1 //array element index for arrays, ??? (not addr or type or offset)
         //for records (may be some precomputed hash function of the FldName)
       FldName: case @.Kind:Val<>0 of
         0: TStrNDXB1
        endc
     ends
    ends
  %$END
  %$IF (Ver>=15)and IsDelphi;
   0x15: struc pas
     hDef: TNDXB1
     V0: TNDXB1
     V1: TNDXB1
    ends
  %$END
  %$IF (Ver>=27)and IsDelphi;
   0x16: struc pas
     hAddr: TNDXB1
     Name: TStrNDXB1
    ends
  %$END
  %$IF (Ver>=28)and IsDelphi;
   0x17: struc pas
     hAddr: TNDXB1
     //(@.Tag=0x17)and(@.D.0x17.Kind:Val<>1)and(@.D.0x17.Kind:Val<>6)and(@.D.0x17.Kind:Val<>10)and(@.D.0x17.Kind:Val<>0)
     //(@.Tag=0x17)and((@.D.0x17.Tbl[0].Kind:Val<>0)and(@.D.0x17.Tbl[1].Kind:Val<>0))//and(@.D.0x17.D.6.v0:Val<>0)//and(@.D.0x17.Kind:Val<>6)and(@.D.0x17.Kind:Val<>10)and(@.D.0x17.Kind:Val<>0)
     Tbl: array[2] of TSomeNameInfo28 //In fact one of the kinds is always 0
    ends
  %$END
  endc
ends

%$IF (Ver>=28)and IsDelphi;
const
  caiStop=0x18;
%$ELSIF (Ver>=27)and IsDelphi;
const
  caiStop=0x17;
%$ELSIF (Ver>=15)and IsDelphi;
const
  caiStop=0x16;
%$ELSIF (Ver>=12)and IsDelphi;
const
  caiStop=0x15;
%$ELSIF (Ver>=9)and IsDelphi;
const
  caiStop=0x0F;
%$ELSE
const
  caiStop=0x0D;
%$END

%$ELSE gen7
const
  caiStop=0x06;

type
TConstAddInfoRec struc pas //it`s easier to repeat it here than to hide all the tags of the higher versions
  Tag: Byte
  D: case @.Tag of
   0x01: struc pas
     hDef: TNDXB1
     F: TNDXB1 //$1-deprecated,$2-Platform - from the higher versions, may be wrong
    ends
  endc
ends
/* D7:DesignIDE.dcp@Designeditors.dcu shows that it`s a sequence too
TConstAddInfo struc pas
  B01: Byte
  Ndx: TNDXB1
  B02: Byte
  B06: Byte
ends
*/
%$END gen7

type

TConstAddInfo array of TConstAddInfoRec ?@.Tag>=caiStop!byte; //= ==> Ok,> ==> Error

%$END

%$IF (Ver>=8)and IsDelphi;
 Tbyte1 byte():assert[@=1]
%$END

%$IF (Ver>=12)and IsDelphi;
/*
 TChar21 Char():assert[(@='!') //override
   or (@='a') //override abstract?
   or (@=' ') //static
 ]

 TOverloadF try
  Overload: TChar21
  None: void
 endt
*/
/*
 TInlineRec struc pas
  Tag: Byte
  V: TNDXB1
 ends:assert[(@.Tag=4/*Inline*/)or(@.Tag=2/*Class helpers*/)]

 TInlineZRec struc pas
  Tag: Byte
  B80: Byte //or 0
  B20: Byte
 ends:assert[(@.Tag=0)or(@.Tag=0x80)or(@.Tag=0x84)]

 TInlineF try
  Inline: TInlineRec
  Z: TInlineZRec
  None: void
 endt
*/

 TInlineF array of byte ?not((@=0x80)or(@=0x84)or
   (@=4)or(@=2)or(@=0x20)or(@=0)or(@=0x18)or
  %$IF (Ver>=13)and IsDelphi;
   (@=1)or
  %$END
  %$IF (Ver>=15)and IsDelphi;
   (@=0x38)or //& operator
   (@=0x28)or //&op_Equality in debug mode
  %$END
  %$IF (Ver>=16)and IsDelphi;
   (@=0x42)or
   (@=0x22)or
   (@=0x9)or //auto added from Helper
  %$END
  %$IF (Ver>=17)and IsDelphi and ARC;
   //in fact ARC support
   (@=0x47)or //unsafe
   (@=0x4F)or //unsafe virtual?
  %$END
  %$IF (Ver>=20)and IsDelphi;
   (@=0x60)or //static?
  %$END
  %$IF (Ver>=21)and IsDelphi;
   (@=0xA1)or //Method from helper
  %$END
  %$IF (Ver>=24)and IsDelphi;
   (@=0x7)or //Found in System.Net.Socket
   (@=0x41)or//
  %$END
   (@=8)or(@=0x10)or
  //from TOverloadF:
   (@='!') //override
   or (@='a') //override abstract?
   or (@=' ') //static
   )!void;

%$END

%$IF (Ver>=9)and(Ver<=10)and MSIL;
TAssemblyInfo struc pas
  Name: TStrNDXB1
ends
%$END

%$IF (Ver>=12)and IsDelphi;
TA7Info struc pas
  V1: TNDXB1
  Cnt: TNDXB1
  Args: array[@.Cnt:Val]of struc pas
    hDT: TNDXB1
   %$IF (Ver>=28)and IsDelphi;
    Info: TSomeNameInfo28
    //Len: TNDXB1
    //Tbl: array[@.Len:Val]of TNDXB1
   %$END
  ends
  //%$IF (Ver>=28)and IsDelphi;
  // Info: TSomeInfo28
  //%$END
ends
%$END

TProcArg struc pas
  Tag: TProcArgTag
  D: case @.Tag of
    arSetDeft: TSetDeftInfo
    arEmbeddedProcEnd: void //For Ver=5
//   %$IF (Ver>=7)and IsDelphi;
   %$IF gen7;
    TDCU30RecTag.drConstAddInfo: TConstAddInfo
   %$END
   %$IF (Ver>=7)and IsDelphi;
    TDCU30RecTag.drProcAddInfo: TNDXB1
   %$END
   %$IF (Ver>=20)and IsDelphi;
    TDCU30RecTag.drNextOverload: TNDXB1
   %$END
   %$IF (Ver>=8)and IsDelphi;
    TDCU30RecTag.drEmbeddedProcStart: void
   %$END
%$IF (Ver>=10)and IsDelphi;
    arCopyDecl: TNDXB1 //index of the address to copy from
  %$IF (Ver>=12)and IsDelphi;
   // arCopyDecl=TDCU30RecTag.arCopyDecl: TNDXB1
    TDCU30RecTag.drA5Info: struc pas
     // bA6: Byte;
     // X: TNDXB1
     ends
    TDCU30RecTag.drA6Info: TDCU30ListC //void
    TDCU30RecTag.drA7Info: TA7Info
    TDCU30RecTag.drA8Info: TNDXB1
  %$END
  %$IF (Ver>=16)and IsDelphi;
    arFinalFlag: TNDXB1
  %$END
    0x80..0xA2,0xA4..0xFF: void
%$ELSE
    0x80..0xFF: void
%$END
   else struc pas
    Name: TNameStr
    D: case @@@.Tag of
      arLocType: TTypeInf(1)
      arProperty: TPropInfo
      arConst: TConstDef
      arLabel: struc pas
        Flags: TNDXB1
       %$IF (Ver>=8)and IsDelphi;
        FlagsEx: TNDXB1
       %$END
       %$IF (Ver>=12)and IsDelphi;
        B3: TNDXB1
       %$END
       ends
      arMethod: struc pas
        Flags: TNDXB1 //public=0x2,protected=0x4,published=0xA, (for Ver<8)
          //default property=0x20,virtual=0x40,$80=dynamic, class=0x01
       %$IF (Ver>=8)and IsDelphi;
        FlagsEx: TNDXB1 //For Ver>=8 public=0x1,protected=0x2,published=0x5,class=0x10
       %$END
       %$IF (Ver>=12)and IsDelphi;
        B3: TNDXB1
       %$END
        hDT: TSNDXB1 //VMT index, dynamic index, for static methods - [last negative VMT index]-1
        Ndx: TNDXB1 //The addr of the method
       %$IF MSIL; //(Ver>=8)and IsDelphi;
        B1: case (@.Ndx.b1.V)exc 1 of
         0: void
         else
          try
           Is1:Tbyte1
           Els: void
          endt
         endc
       %$END
       %$IF (Ver>=7)and IsDelphi;
        %$IF Ver>=12;
        BF: case @@@.Name.L=0 of
         0: Byte
        endc
        //BF: Byte
        %$END
        hImp: TNDXB1
       %$ELSE
        hImp: case @@@.Name[0] of
         0: TNDXB1
        endc //for property P:X read Proc{Implemented in parent class}
       %$END
       %$IF (Ver>=12)and IsDelphi;
//        %$IF (Ver>=13)and IsDelphi;
//         ClassF: case @.FlagsEx:Val and 0x1F of
//           0x18: TNDXB1 //0x10 - class static; 0x18 - class procedure
//         endc
//        %$END
        fInline: TInlineF
        //fOverload: TOverloadF
       %$END
      ends
    %$IF (Ver>=7)and IsDelphi;
      arConstr,arDestr: struc pas
        Flags: TNDXB1 //public=0x2,protected=0x4,published=0xA,
          //default property=0x20,virtual=0x40,$80=dynamic
       %$IF (Ver>=8)and IsDelphi;
        FlagsEx: TNDXB1 //For Ver>=8 public=0x1,protected=0x2,published=0x5,class=0x10
       %$END
       %$IF (Ver>=12)and IsDelphi;
        B3: TNDXB1
       %$END
        hDT: TSNDXB1 //VMT index, dynamic index
        Ndx: TNDXB1 //The addr of the method
       %$IF (Ver>=12)and IsDelphi;
        BF: Byte
       %$END
        hImp: TNDXB1
      ends
    %$END
    %$IF (Ver>=13)and IsDelphi;
      arAnonymousBlock: struc pas
        B10: TNDXB1
        B0: TNDXB1
      ends
    %$END
      else struc pas
        Flags: TNDXB1 //public=0x2,protected=0x4,published=0xA,
          //default property=0x20,virtual=0x40,$80=dynamic
          //XE4: 0x40 - [REF]
       %$IF (Ver>=8)and IsDelphi;
        FlagsEx: TNDXB1 //For Ver>=8 public=0x1,protected=0x2,published=0x5,class=0x10
       %$END
       %$IF (Ver>=12)and IsDelphi;
        B3: TNDXB1
        %$IF (Ver>=17)and IsDelphi;
         Decorator: case @.Flags:Val and 0x40 of
          0x40: ulong
         endc
        %$END
       %$END
        hDT: TNDXB1
        Ndx: TNDXB1
      ends
    endc
   ends
  endc
ends:displ=('[',ADDR(&@),']',@)

TProcArgList array of TProcArg ?@.Tag=TProcArgTag.arStop!Char;

//B0: TNDXB1//Byte
//Sz: TNDXB1

%$IF (Ver>=14)and IsDelphi;
TProcData(B1) struc pas
%$ELSE
TProcData struc pas
%$END
 %$IF Ver>2;
  VProc: TNDXB1
 %$END
  hDTRes: TNDXB1
/*!!!Check
 %$IF (Ver>=14)and IsDelphi;
   hClass: case (@.VProc:val=0x4F)and(@:B1 and 0x40<>0) of
     0: TNDXB1
    endc //For methods
   Args: case (@.VProc:val=0x4F)and(@:B1 and 0x40<>0) of
     0: TProcArgList
    endc
 %$ELSE
*/
  %$IF (Ver>=8)and IsDelphi;
   hClass: TNDXB1 //For methods
  %$END
   Args: TProcArgList
// %$END
ends

/*
TProcDataD struc pas
  D: ulong
  Dat: TProcData
ends

TProcInf struc pas
  BProc: Byte
  D: case @.BProc of
    0: struc pas
        B0: Byte
        Vp: TNDXB1
      ends
    1: struc pas
        B0: Byte
        D: case @.B0 of
          3: TProcDataD
        else Word
        endc
      ends
    else TProcDataD
  endc
ends

TEmbeddedProcInf struc pas
//  Tag:TDCU30RecTag
//  Name: Str
  BProc: Byte
  D: case @.BProc of
    0: struc pas
        B0: Byte
        Vp: TNDXB1
      ends
    1: struc pas
        B0: Byte
        W: Word
      ends
    else TProcData
  endc
ends
*/

/*
TProcInf(NoName) struc pas
  BProc: Byte
  D: case @:NoName of
    1: case @@.BProc of
       0: struc pas
         B0: Byte
         Vp: TNDXB1
       ends
       1: struc pas
           B0: Byte
           B1: Byte
           Sz: TNDXB1
         ends
  %$IF Ver>=6;
       3: struc pas
           B0: Byte
           B2: Byte
           B1: Byte
           Sz: TNDXB1
         ends
  %$END
    endc
  else struc pas
     D1: case @@@.BProc of
       0: void
       1: struc pas
           B0: Byte
           D: case @.B0 and 1 of
             1: ulong
           endc
         ends
       else ulong
     endc
     Dat: TProcData
   ends
  endc
ends
*/

TProcInf(NoName) struc pas
  NF: TNameFDecl
  B0: TNDXB1//Byte
  Sz: TNDXB1
 %$IF (Ver>=14)and IsDelphi;
  X: Byte//TNDXB1
 %$END
  D: case @:NoName of
    1: void
  else
  %$IF (Ver>=14)and IsDelphi;
    TProcData(@@.NF.B1:val)
  %$ELSE
    TProcData
  %$END
  endc
ends

%$IF (Ver>=8)and IsDelphi;
TSysProcInf struc pas
//  NF: TNameFDecl
  B80: Byte
  H: TNDXB1
 %$IF (Ver>=12)and IsDelphi;
  B3: TNDXB1
 %$END
  B0: TNDXB1//Byte
  Sz: TNDXB1
 %$IF (Ver>=14)and IsDelphi;
  X: Byte//TNDXB1
  D: TProcData(0)
 %$ELSE
  D: TProcData
 %$END
ends
%$ELSE
TSysProcInf struc pas
  B80: Byte
  H: TNDXB1
ends
%$END

/*
TEmbeddedInf struc pas
  Tag:TDCU30RecTag
  Name: Str
  D: case @.Tag of
    drType: TTypeInf(0)
    drTypeP: TTypePInf
    drVar,drThreadVar: TVarInf
    drVarC: TVarInf
    drProc: TProcInf((@@.Name[0]=0)or(@@.Name='.')) //TEmbeddedProcInf
    drSysProc: TSysProcInf
    drResStr: TVarInf //TResStrDef
  endc
ends

TEmbeddedList array of TEmbeddedInf ?
  /*@.Tag<>TDCU30RecTag.drProc*/
  @.Tag=TDCU30RecTag.drEmbeddedProcEnd!TDCU30RecTag;
*/

TEmbeddedList forward

//// DEFINITIONS

TTypeDefBase struc pas
  RTTISz: TNDXB1 //Size of RTTI for type, if available
  Sz: TNDXB1
  hAddr: TNDXB1 //The # of definition of the type
 %$IF MSIL; //(Ver>=8)and IsDelphi;
  X: TNDXB1
  X1: TNDXB1
//  X2: TNDXB1
 %$ELSIF (Ver>=9)and IsDelphi;
  hClass: TNDXB1
 %$END
ends

%$IF (Ver>=8)and IsDelphi;
TTypeDefBase0 struc pas
  RTTISz: TNDXB1 //Size of RTTI for type, if available
/* %$IF (Ver>=12)and IsDelphi;
  RTTISz: Byte //M.b. something else
 %$ELSE
  RTTISz: TNDXB1 //Size of RTTI for type, if available
 %$END*/
  Sz: TNDXB1
  hAddr: TNDXB1
ends
%$ELSE
TTypeDefBase0 TTypeDefBase
%$END

%$IF (Ver>=14)and IsDelphi;
TVoidDefInf struc pas
  Base: TTypeDefBase
 /*
  %$IF (Ver>=15)and IsDelphi;
  X: Byte
  %$ELSE
  X: TNDXB1 //¦ôõ¸¹ ü.ñ. ªþöõ, ýþ ýðôþ ÿ¨þòõ¨øª¹
  %$END
  */
  X: Byte//TNDXB1
ends
%$ELSE
TVoidDefInf TTypeDefBase
%$END

TParentInterfaceInf forward

TRecDefInf struc pas
  Base: TTypeDefBase
  B2: Byte
 %$IF MSIL;//(Ver>=8)and IsDelphi;
  %$IF (Ver>=10)and IsDelphi;
   B1: Byte
   //X0: Byte
  %$END
  X: TNDXB1
  I: TParentInterfaceInf
 %$ELSIF (Ver>=9)and IsDelphi;
  %$IF (Ver>=10)and IsDelphi;
   B1: Byte
   X0: Byte
  %$END
  X: TNDXB1
  %$IF (Ver>=12)and IsDelphi;
   X1: TNDXB1
   Z2: TNDXB1
   %$IF (Ver>=13)and IsDelphi;
    Z3: TNDXB1
   %$END
  %$END
 %$END
  Fields: TProcArgList
//  Fields: array[22]of TProcArg
ends

TPtrDefInf struc pas
  Base: TTypeDefBase
  hRefDT: TNDXB1
 %$IF (Ver>=12)and IsDelphi;
  X0: TNDXB1
 %$END
ends

TRangeDefInf struc pas
  Base: TTypeDefBase
  hDTBase: TNDXB1
  Lo: TNDXB1
  Hi: TNDXB1
 %$IF (Ver>=8)and IsDelphi;
// %$ELSIF (Ver=8)and IsDelphi;
  B: TNDXB1
 %$ELSE
  B: Byte
 %$END
ends

TEnumDefInf struc pas
  Base: TTypeDefBase
  hDTBase: TNDXB1
 %$IF (Ver>=12)and IsDelphi;
  X1: TNDXB1
 /* X1: case @.RTTISz:Val=0 of
    0: TNDXB1
   endc*/
 %$END
  Ndx: TNDXB1
  Lo: TNDXB1
  Hi: TNDXB1
 %$IF (Ver>=8)and IsDelphi;
// %$ELSIF (Ver=8)and IsDelphi;
  B: TNDXB1
 %$ELSE
  B: Byte
 %$END
ends

TSetDefInf struc pas
  Base: TTypeDefBase
  BStart: Byte //0-based start byte number
  hDTBase: TNDXB1
ends

%$IF (Ver>=16)and IsDelphi; //From XE3
type bit
TFloatKind0 forward

TFloatKind struc
  TFloatKind0 K
  TBit X
ends

TFloatKind0 enum TBit7 of (
%$ELSE
TFloatKind enum byte of (
%$END
  fkReal48=0, fkSingle=1, fkDouble=2, fkExtended=3, fkComp=4, fkCurrency=5)

type

TFloatDefInf struc pas
  Base: TTypeDefBase
  Kind: TFloatKind
 %$IF (Ver>=16)and IsDelphi;
  X: case @.Kind.X of
   1: Byte
  endc
 %$END
ends

TArrayDefInf struc pas
  Base: TTypeDefBase
  B1: Byte
  hDTNdx: TNDXB1
  hDTEl: TNDXB1
 %$IF MSIL; //(Ver>=8)and IsDelphi;
  X: TNDXB1
 %$END
ends

TShortStrDefInf struc pas
  Base: TTypeDefBase
  B1: Byte
  V: TNDXB1
  Ndx1: TNDXB1
 %$IF (Ver>=12)and IsDelphi;
  CodePage: TNDXB1
 %$END
ends

TFileDefInf struc pas
  Base: TTypeDefBase
  hBaseDT: TNDXB1
ends

TStringDefInf struc pas
  Base: TTypeDefBase
  B0: Byte
  B1: TNDXB1//Byte
  hBaseDT: TNDXB1
 %$IF (Ver>=12)and IsDelphi;
  CodePage: TNDXB1
 %$END
ends

TVariantDefInf struc pas
  Base: TTypeDefBase
%$IF Ver>2;
  B: byte
%$END
ends

%$IF Ver=2;

TProcTypeDefInf struc pas
  Base: TTypeDefBase
  hDTRes: TNDXB1
  Bj: TDCU30RecTag
  Args: case @.Bj of
    drEmbeddedProcStart: TProcArgList
  endc
ends

%$ELSE

TProcTypeAddArg TProcArg

TProcTypeDefInf struc pas
  Base: TTypeDefBase
  NDX0: TNDXB1//B0: Byte
  hDTRes: TNDXB1
 /* AddB: case @.B0 and 0x08 of
    0x08: Byte
  endc*/
  AddB: array of TProcTypeAddArg ?(@.Tag=106/*'j'*/)or(@.Tag=99/*'c'*/)!void;
  Bj: TDCU30RecTag
  Args: case @.Bj of
    drEmbeddedProcStart: TProcArgList
  endc
ends

%$END

TObjVMTDefInf struc pas
  Base: TTypeDefBase
  hObjDT: TNDXB1
  VMTSz: TNDXB1
 %$IF MSIL; //(Ver>=8)and IsDelphi;
  X2: TNDXB1
 %$END
ends

TObjDefInf struc pas
  Base: TTypeDefBase
  B03: Byte
  %$IF (Ver>=10)and IsDelphi;
  BX: Byte //TNDXB1 (proof: object in 64-bit) //or m.b. array[@.BxLen]of byte
  %$END
  %$IF (Ver>=14)and IsDelphi;
  BX1: byte
  %$END
  hParent: TNDXB1
  VMTOfs: TNDXB1 //-1=FE => no VMT
  hVMT: TNDXB1 //index in address table
  VMCnt: TNDXB1
  %$IF (Ver>=15)and IsDelphi;
  BX2: TNDXB1
  %$END
  Args: TProcArgList
ends

TParentInterfaceRec struc pas
  hIntf: TNDXB1
 %$IF MSIL and(Ver>=10)and IsDelphi;
   mX1: TNDXB1
   mMCnt: TNDXB1
 %$END
  Cnt: TNDXB1 //Member count
 %$IF Packaged and(Ver>=4);
 // PkgNdx: array[@.Cnt:Val] of TNDXB1
 %$END
 %$IF MSIL; //(Ver>=8)and IsDelphi;
  Member: array[@.Cnt:Val] of struc pas
    N: TNDXB1
    hMember: TNDXB1
   ends
 %$ELSIF (Ver>=10)and IsDelphi;
/*
 %$END
 %$IF (Ver>=10)and IsDelphi;
 */
   X1: TNDXB1
   MCnt: TNDXB1
  %$IF (Ver>=13)and IsDelphi;
    X3: TNDXB1
    X4: TNDXB1
    Match: array[@.MCnt:Val]of struc pas
      B: Byte
      Name: str
      N: TNDXB1
      I: TNDXB1
     ends
   %$IF Ver>=28;
    AName: TStrNDXB1X
    //Info: TSomeInfo28
   %$END
  %$END
 %$END
ends

TParentInterfaceInf struc pas
  ICnt: TNDXB1
  ITbl: array[@.ICnt:Val] of TParentInterfaceRec//Byte
ends

TClassDefInf struc pas
  Base: TTypeDefBase
  %$IF (Ver>=10)and IsDelphi;
  BX: byte//TNDXB1
  %$END
  %$IF (Ver>=12)and IsDelphi;
  %$IF (Ver>=15)and IsDelphi;
  BX1: Byte
  %$ELSE
  BX1: TNDXB1 //¦ôõ¸¹ ü.ñ. ªþöõ, ýþ ýðôþ ÿ¨þòõ¨øª¹
  %$END
  BX2: byte//TNDXB1
  %$END
  hParent: TNDXB1
  InstBase: TTypeDefBase0
  VMCnt: TNDXB1//B00: Byte
  NdxFE: TNDXB1//BFE: Byte
  PropCnt/*Ndx00a*/: TNDXB1//B00a: Byte
 %$IF (Ver>=8)and IsDelphi;
  Flags: TNDXB1 //$4 - abstract, $40 - sealed
 %$IF (Ver>=13)and IsDelphi;
  BX3: TNDXB1
 %$END
 %$IF not MSIL and Packaged /*and not(IsDelphi and(Ver>=13))*/;
  PkgExtra: case @.Flags:Val and 0x8 of
   0x8: struc pas
     V1: TNDXB1 //Usually #1
     Cnt: TNDXB1 //Usually #1
     Tbl: array[@.Cnt:Val]of TNDXB1 //some numbers in descending order //Usually #1
    ends
  endc
 %$END
 %$ELSE
  Flags: Byte
 %$IF (Ver>=3)and(Ver<=7)and Packaged;
  PkgExtra: case @.Flags and 0x10 of
   0x10: array[3]of TNDXB1
  endc
 %$END
 %$END
%$IF Ver>2;
/*
  B00b: Byte //always 0 or 2 and was 4 in CorbaObj.dcu
  DAdd: case @.B00b=0 of
      0: struc pas
        B0: Byte
        B1: Byte
       ends
    endc
*/
  I: TParentInterfaceInf
%$END
  Args: TProcArgList
//  Args: array[6]of TProcArg
ends

%$IF (Ver>=8)and IsDelphi;

TMetaClassDefInf struc pas
  Base: TTypeDefBase
  %$IF (Ver>=10)and IsDelphi;
  BX: byte//TNDXB1
  %$END
  %$IF (Ver>=12)and IsDelphi;
  %$IF (Ver>=15)and IsDelphi;
  BX1: Byte
  %$ELSE
  BX1: TNDXB1 //¦ôõ¸¹ ü.ñ. ªþöõ, ýþ ýðôþ ÿ¨þòõ¨øª¹
  %$END
  BX2: byte//TNDXB1
  %$END
  hParent: TNDXB1
 %$IF (Ver>=13)and IsDelphi;
  BX3: TNDXB1
 %$END
  InstBase: TTypeDefBase0
  VMCnt: TNDXB1//B00: Byte
  NdxFE: TNDXB1//BFE: Byte
  Ndx00a: TNDXB1//B00a: Byte
 %$IF (Ver>=8)and IsDelphi;
  Flags: TNDXB1
 %$ELSE
  Flags: Byte
 %$END
/*
  hParent: TNDXB1
  InstBase: TTypeDefBase0
  VMCnt: TNDXB1//B00: Byte
  NdxFE: TNDXB1//BFE: Byte
  Ndx00a: TNDXB1//B00a: Byte
 %$IF (Ver>=8)and IsDelphi;
  Flags: TNDXB1
  %$IF (Ver>=10)and IsDelphi;
  BX: TNDXB1
  %$IF (Ver>=12)and IsDelphi;
  BX1: TNDXB1
  BX2: TNDXB1
  %$IF ((Ver<12)or(Ver>=13))and IsDelphi;
   BX3: TNDXB1
  %$END
  %$END
  %$END
 %$ELSE
  Flags: Byte
 %$END
*/
%$IF Ver>2;
  //%$IF (Ver<14)or not IsDelphi;
  hCl: TNDXB1  //Only this 2 fields are added in comparison with TClassDefInf
  X: TNDXB1
  //%$END
  I: TParentInterfaceInf
%$END
  Args: TProcArgList
ends

%$END

TGUID struc
  ulong D1
  word D2
  word D3
  array[8] of byte D4
ends

TInterfaceProcArg struc pas
  Tag: TProcArgTag
  D: case @.Tag and 0x80 of
    0x80:
   %$IF gen7;
    case @@.Tag of
     TDCU30RecTag.drConstAddInfo: TConstAddInfo
    else void
    endc
   %$ELSE
    void
   %$END
   else struc pas
    Name: Str
    D: case @@@.Tag of
//      arLocType: TTypeInf(1)
      arProperty: TPropInfo
      else struc pas
        Ndx1: TNDXB1
      %$IF (Ver>=8)and IsDelphi;
        B1: TNDXB1
       %$IF (Ver>=12)and IsDelphi;
        X: TNDXB1
       %$END
      %$END
        hDT: TNDXB1
        NDXB: TNDXB1
        Ndx: TNDXB1
      ends
    endc
   ends
  endc
ends

TInterfaceProcArgList array of TInterfaceProcArg ?@.Tag=TProcArgTag.arStop!Char;

TDispInterfaceProcArg struc pas
  Tag: TProcArgTag
  D: case @.Tag and 0x80 of
    0x80:
   %$IF gen7;
    case @@.Tag of
     TDCU30RecTag.drConstAddInfo: TConstAddInfo
    else void
    endc
   %$ELSE
    void
   %$END
   else struc pas
    Name: Str
    D: struc pas
        Ndx1: TNDXB1
      %$IF (Ver>=8)and IsDelphi;
        B1: TNDXB1
      %$END
      %$IF (Ver>=12)and IsDelphi;
        B3: TNDXB1
      %$END
        hDT: TNDXB1
        NDXB: TNDXB1
        Ndx: TNDXB1
      ends
   ends
  endc
ends

TDispInterfaceProcArgList array of TDispInterfaceProcArg ?@.Tag=TProcArgTag.arStop!Char;

TInterfaceDefInf struc pas
  Base: TTypeDefBase
  %$IF (Ver>=12)and IsDelphi;
  BX: byte//TNDXB1
  %$END
  hParent: TNDXB1
  VMCnt: TNDXB1
  GUID: TGUID
  B: Byte //02 for all interfaces, 06 for dispinterface
 %$IF (Ver>=8)and IsDelphi;
  %$IF (Ver>=13)and IsDelphi;
  BY: TNDXB1
  %$END
  Sz: TNDXB1
  D: array[@.Sz:Val] of struc pas
     X: TNDXB1
     Z: TNDXB1
    %$IF MSIL and(Ver>=10)and IsDelphi;
     X1: TNDXB1
     Z1: TNDXB1
    %$END
   ends
 %$END
  Args: case @.B and 0x04 of
    0: TInterfaceProcArgList
  else TDispInterfaceProcArgList
  endc
ends


TCodeBlockInf struc pas
  Sz: TNDXB1
  D: raw[@.Sz:Val]
ends

TFixUpRec struc pas
  dOfs: TNDXB1 //From the start of the previous one
  B1: byte
  N2: TNDXB1
ends

TFixUpData struc pas
  Sz: TNDXB1
  D: array[@.Sz:Val] of TFixUpRec
ends

TCodeLinesRec struc pas
  dL: TSNDXB1
  dOfs: TNDXB1
ends

TCodeLinesData struc pas
  Sz: TNDXB1
  D: array[@.Sz:Val] of TCodeLinesRec
ends

TLineRange struc pas
  Line0: TNDXB1d
  LineNum: TNDXB1d
  hFile: TNDXB1d
ends

function sumLineNums(TLineRange& R, L)=L+R.LineNum:Val;

type
TLinNumData struc pas
  Sz: TNDXB1
  Ranges: array[@.Sz:Val] of TLineRange
ends:displ=(@,', MaxLine=',INT(FoldL(0,sumLineNums,@.Ranges)))

TStrucScopeRec struc pas //
  hType: TNDXB1
  hVar: TNDXB1 //<>0 for With
  Ofs: TNDXB1 //usually=0
  LnStart: TNDXB1 //1st member line
  LnCnt: TNDXB1 //total member lines
 %$IF (Ver>=25)and IsDelphi;
  X: TNDXB1
 %$END
ends

TStrucScopeData struc pas
  Sz: TNDXB1
  D: array[@.Sz:Val] of TStrucScopeRec
ends

TSymbolRefRec struc pas
  hSym: TNDXB1
  hMember: TNDXB1 //for symbols - type members, else - 0
  Sz: TNDXB1
  hDef: TNDXB1 //index of symbol definition in the L array
  L: array[@.Sz:Val] of TNDXB1
ends

TSymbolRefData struc pas
  Sz: TNDXB1
  NPrimary: TNDXB1 //# of Not member definitions
  D: array[@.Sz:Val] of TSymbolRefRec
ends

%$IF Ver=3;
TUnitFlagsData struc pas
  Flags: TNDXB1 //0x500 - WEAKPACKAGEUNIT
ends
%$ELSIF Ver>3;
TUnitFlagsData struc pas
  Flags: TNDXB1 //0x500 - WEAKPACKAGEUNIT
%$IF (Ver>9)and(IsDelphi);
  Flags1: TNDXB1
%$END
  Priority: TNDXB1 //Always 0x1E
ends
%$END

%$IF (Ver>=15)and IsDelphi and mode64;
TLocVarFrameCode enum byte of (
  RAX,RCX,RDX,RBX/*!*/,RSP,RBP,RSI/*!*/,RDI, R8,R9,R10,R11,R12,R13,R14,R15, //guess values
   _end_=0x7F
)
%$ELSE
TLocVarFrameCode enum byte of (
  EAX,EDX,ECX,EBX,ESI,EDI,EBP,
 //Register parts:
  AL,DL,CL,BL, AH,DH,CH,BH, AX,DX,CX,BX, _end_=0x7F
)
%$END

TLocVarFrame TNDXB1():displ=(valname((@ as TNDXB1):Val,TLocVarFrameCode),'{',@,'}')

TLocVarInf0 struc pas //DoDi's info
  sym: TNDXB1 //Symbol # in the symbol table, 0 - proc data end
  ofs: TNDXB1 //Offset in procedure code
  frame: TLocVarFrame //-1(0x7f)-symbol end, else - symbol start 0-EAX, 1-EDX,
    //2-ECX, 3-EBX, 4-ESI...
    //Size of local variables for procedures (for SUB ESP,Size)
ends

%$IF (Ver>=15)and IsDelphi and mode64;
TLocVarProcInf struc pas
  sym: TNDXB1 //Symbol # in the symbol table, 0 - proc data end
  ofs: TNDXB1
  LocSz: TNDXB1 //Size of local variables for procedures (for SUB ESP,LocSz-LocSz1)
  V0: TNDXB1
  V1: TNDXB1
  V2: TNDXB1
  V3: TNDXB1
  LocSz1: TNDXB1 //very often
  LocSz1a: TNDXB1//EQ
ends:assert[(@.Ofs:Val and 0x7=0)and(@.LocSz:Val and 0x7=0)
  and(@.V0:Val and 0x7=0)and(@.V0:Val<0x140/*An empirically found by the analysis of LIB64 files value.
    We check this field cause it corresponds to the next sym and it grows quickly for valid syms*/)
  and(@.V1:Val and 0x7=0)/*and(@.V2:Val and 0x7=0)*/
  and(@.V3:Val and 0x7=0)and(@.LocSz1:Val and 0x7=0)and(@.LocSz1a:Val and 0x7=0)]
  //In fact we should check that sym is a procedure
  //but we try to use this heuristics instead

TLocVarInf try
  P: TLocVarProcInf
  V: TLocVarInf0
endt
%$ELSE
TLocVarInf TLocVarInf0
%$END


/*
TLocVarInf struc pas //DoDi's info
  sym: TNDXB1 //Symbol # in the symbol table, 0 - proc data end
  ofs: TNDXB1 //Offset in procedure code
  frame: TLocVarFrame //-1(0x7f)-symbol end, else - symbol start 0-EAX, 1-EDX,
    //2-ECX, 3-EBX, 4-ESI...
    //Size of local variables for procedures (for SUB ESP,Size)
  %$IF (Ver>=15)and IsDelphi and mode64;
  Extra: case ((@.frame as TNDXB1):Val and 0x7=0)and(@.Ofs:Val and 0x7=0) of
//  Extra: case (@.sym:Val=0)or((@.frame as TNDXB1):Val>=0x10)and((@.frame as TNDXB1):Val and 0xF=0) of
//  Extra: case (@.sym:Val=0)or(@.frame:Val and 0xF=0) of
   0: void
   else struc pas
    sym: TNDXB1
    ofs: TNDXB1
    frame: TNDXB1
    sym1: TNDXB1
    ofs1: TNDXB1
    frame1: TNDXB1
   ends
  endc
  %$END
/*
  %$IF (Ver>=15)and IsDelphi;
  frame: Byte
  %$ELSE
  frame: TNDXB1 //-1(0x7f)-symbol end, else - symbol start 0-EAX, 1-EDX,
    //2-ECX, 3-EBX, 4-ESI...
  %$END
  */
ends
*/

TLocVarTbl struc pas
  Sz: TNDXB1
  %$IF (Ver>=15)and IsDelphi and mode64;
  //D: array[@.Sz:Val] of TLocVarInf takes 2 when ((@.frame as TNDXB1):Val and 0x7=0)and(@.Ofs:Val and 0x7=0) exc 1;
  D: array[@.Sz:Val] of TLocVarInf takes 1+(valid @.P);
  %$ELSE
  D: array[@.Sz:Val] of TLocVarInf
  %$END
ends

%$IF (Ver>=7)and IsDelphi;
/*
TUnitAddInfo struc pas
  D: array of char,'c';
ends
%$ELSIF (Ver>=8)and IsDelphi;
*/
TUnitAddInfo struc pas
  NF: TNameFDecl
  B: TNDXB1
  Sub: TDCU30ListC
ends
%$END

%$IF (Ver>=12)and IsDelphi;
TDelayedImpRec struc pas
  N: long
  NDX: TNDXB1
ends

TDynArrayInf struc pas
  Base: TTypeDefBase
  hBaseDT: TNDXB1 //Should be array[0..-1]of ...
  X0: TNDXB1
ends

TTemplateArgInf struc pas
  Base: TTypeDefBase
  Cnt: TNDXB1
  Args: array[@.Cnt:Val]of TNDXB1
  V5: TNDXB1
ends

TTemplateCall struc pas
  Base: TTypeDefBase
 %$IF (Ver>=14)and IsDelphi;
  X: Byte//TNDXB1
 %$END
  hDT: TNDXB1 //The type with `
  Cnt: TNDXB1
  Args: array[@.Cnt:Val]of struc pas
    hDT: TNDXB1
   %$IF (Ver>=28)and IsDelphi;
    Info: TSomeNameInfo28
    //Len: TNDXB1
    //Tbl: array[@.Len:Val]of TNDXB1
   %$END
  ends
 //%$IF (Ver>=28)and IsDelphi;
 // Info: TSomeInfo28
  //Len1: TNDXB1
  //Tbl: array[@.Len1:Val>0]of TNDXB1
 //%$END
  hDTFull: TNDXB1 //The type with actual args in <>
ends
%$END

%$IF (Ver>=8)and IsDelphi;
TORec struc pas
%$IF (Ver>=12)and IsDelphi;
  Name: str
  DW: long
  N: int
  Args: TDCU30ListC //TB0ImpRec
%$ELSE
  B: TNDXB1
%$END
ends


TStrConstRec struc pas
//%$IF (Ver<10);
  NF: TNameFDecl
  V: TNDXB1
  Sz: TNDXB1
 %$IF (Ver>=14)and IsDelphi;
  X: byte//TNDXB1
 %$END
/*
%$ELSE
  NF: TNameFDecl
  hDT: TNDXB1
  L: Byte //drStop1='c' - some list
%$END
*/
ends
%$END


%$IF (Ver>=3)and IsDelphi;
TCPPFlags set 8 of (EXTERNALSYM ^4, NODEFINE ^ 8, NOINCLUDE ^ 0x10, OBJTYPENAME ^ 0x20)

TCPPFlagsRec struc pas
// %$IF (Ver>6);
//  B4: TNDXB1
// %$ELSE
//  B4: Byte
// %$END
  F: TCPPFlags
  hAddr: TNDXB1
ends
%$END

%$IF Packaged and MSIL/*(Ver=8)*/and IsDelphi;
TAssemblyDataHdr(Sz) struc pas
  F: ulong
  SzPublicKey: ulong
  PublicKey: raw[@.SzPublicKey]
  SzPublicKeyToken: ulong
  PublicKeyToken: raw[@.SzPublicKeyToken]
  Y: ulong
  SzName: ulong
  Name: array[@.SzName]of Char,<0;
  SomeData: raw[0x18]
  //AlName: align 4 at &@.F/*&@.Name*/;
  rest: raw[]
ends:[@:Size=@:Sz]

TAssemblyData struc pas
  HdrSize: TNDXB1
  H: TAssemblyDataHdr(@.HdrSize:Val)
  Descr: str
  Cnt1: TNDXB1
  Tbl1: array[@.Cnt1:Val]of ulong
  Tbl2: array[@.Cnt1:Val]of TNDXB1
  Cnt2: TNDXB1
  Tbl3: array[@.Cnt2:Val]of ulong
  Tbl4: array[@.Cnt2:Val]of ulong
  Tbl5: array[@.Cnt2:Val]of ulong
  Cnt3: TNDXB1
  Tbl6: array[@.Cnt3:Val]of ulong
ends
%$END

//Main Stream Record
TDCU30Rec struc pas
  Tag: TDCU30RecTag
  D: case @.Tag of
      drVoid: TVoidDefInf
      drRecDef: TRecDefInf
      drPtrDef: TPtrDefInf
      drRangeDef,drChRangeDef,drBoolRangeDef,drWCharRangeDef,
      drWideRangeDef: TRangeDefInf
      drEnumDef: TEnumDefInf
      drFloatDef: TFloatDefInf
      drSetDef: TSetDefInf
      drArrayDef: TArrayDefInf
      drShortStrDef: TShortStrDefInf
      drFileDef: TFileDefInf
      drTextDef: TTypeDefBase
      drStringDef,drWideStrDef: TStringDefInf
      drVariantDef: TVariantDefInf
      drProcTypeDef: TProcTypeDefInf
      drObjVMTDef: TObjVMTDefInf
      drObjDef: TObjDefInf
      drClassDef: TClassDefInf
 %$IF (Ver>=8)and IsDelphi;
      drMetaClassDef: TMetaClassDefInf
 %$END
      drInterfaceDef: TInterfaceDefInf
      drEmbeddedProcStart:TEmbeddedList
      drEmbeddedProcEnd: void
      drCBlock: TCodeBlockInf
      drFixUp: TFixUpData
      drCodeLines: TCodeLinesData
      drLinNum: TLinNumData
      drStrucScope: TStrucScopeData
      drSymbolRef: TSymbolRefData
      drLocVarTbl: TLocVarTbl
%$IF Ver>=3;
      drUnitFlags: TUnitFlagsData
%$END
/*
%$IF Ver>=100; //Kylix specific flags
      drUnit3,drUnit3s: array[3]of byte
      drUnit4: ulong
%$END
*/
     %$IF gen7;
       drConstAddInfo: TConstAddInfo
     %$END
     %$IF (Ver>=9)and(Ver<=10)and MSIL;
       drAssemblyInfo: TAssemblyInfo
     %$END
     %$IF (Ver>=7)and IsDelphi;
       drProcAddInfo: TNDXB1//byte //=02
     %$END
     %$IF (Ver>=20)and IsDelphi;
      drNextOverload: TNDXB1
     %$END
     %$IF (Ver>=22)and IsDelphi;
      drDependencyInfo: TDependencyInfoRec
     %$END
     %$IF (Ver>=27)and IsDelphi;
      drInDcpWin64Info: TInDcpWin64Info
     %$END
     %$IF Packaged and MSIL/*(Ver=8)*/and IsDelphi;
      drAssemblyData: TAssemblyData
     %$END
      drSetDeft: TSetDeftInfo
     %$IF (Ver>=9)and IsDelphi;
      drStop2: ulong
     %$ELSE
      drStop2: void
     %$END
     %$IF (Ver>=8)and IsDelphi;
      drORec: TORec //goes before drCBlock
     %$END
     %$IF (Ver>=3)and IsDelphi;
      drCPPFlags: TCPPFlagsRec
     %$END
     %$IF (Ver>=10)and IsDelphi;
      drCLine: struc pas
       %$IF (Ver>=14)and IsDelphi;
        X: byte//TNDXB1
       %$END
        Cnt: TNDXB1
        Txt: array[@.Cnt:Val]of Char
       ends
      drA1Info: struc pas
        V0: TNDXB1
        V1: TNDXB1
        V2: TNDXB1
        V3: TNDXB1
        Cnt: TNDXB1
        Tbl: array[@.Cnt:Val]of TNDXB1
       ends
      drA2Info: void
      %$IF (Ver>=12)and IsDelphi;
      arCopyDecl: TNDXB1
      drA5Info: struc pas
      //  bA6: Byte;
      //  X: TNDXB1
       ends
      drA6Info: TDCU30ListC //void
      drA7Info: TA7Info
      drA8Info: TNDXB1 //The index of template arg address
     %$IF (Ver>=17)and IsDelphi;
      drA9Info: TNDXB1
     %$END
      drDynArrayDef: TDynArrayInf
      drTemplateArgDef: TTemplateArgInf
      drTemplateCall: TTemplateCall
      drUnicodeStringDef: TStringDefInf
     %$IF (Ver>=15)and IsDelphi /*and mode64*/;
      drSegInfo: struc pas
        Len: TNDXB1
        Tbl: array[@.Len:Val] of struc pas
          Name: str
          F: byte
          H: TNDXB1
         ends
       ends
      drAddrToSegInfo: struc pas
        Len: TNDXB1
        Tbl: array[@.Len:Val] of struc pas
          hAddr: TNDXB1 //with data
          hSeg: TNDXB1
          B: Byte
          V2: TNDXB1
          Fix0: TNDXB1 //Starting fixup of the block
          Size: TNDXB1
          V5: TNDXB1
         ends
      ends
     %$END
     %$END
     %$END
     else struc pas
      Name: TNameStr
      D: case @@@.Tag of
        drSrc, drObj, drAsm: TSrcInf
       %$IF Packaged and MSIL/*(Ver=8)*/and IsDelphi;
        drAssemblySrc: TAssemblySrcInf
       %$END
        drRes: TResInf
        drUnit,drUnit1: TUnitInf
       %$IF (Ver>=13)and IsDelphi;
        drUnitInlineSrc: TUnitInlineSrcInf
       %$END
        drDLL: TDllInf
       %$IF (Ver>=28)and IsDelphi and(cPlatform in (iosSimArm64,iosDevice64));
        drDLLInfo1: TDllInf
       %$END
        drType: TTypeInf(0/*NoInf*/)
        drTypeP: TTypePInf
        drImpType,drImpVal: ulong
        drImpTypeDef: TImpTypeDefInf
        drExport: TExportInf
        drVar,drThreadVar: TVarInf
        drVarC: TVarInf
        drAbsVar: TVarInf
       /* drProc: TProcInf((@@.Name[0]=0)or(@@.Name='.')/* for Ver>=6 : */or
          (@@.Name='..'))*/
       %$IF (Ver>=14)and IsDelphi;
        drProc: TProcInf((@@.Name.L=0)or(@@.Name.S[0]='.')or(@@.Name.S[0]='$'))
       %$ELSIF (Ver>=12)and IsDelphi;
        drProc: TProcInf((@@.Name.L=0)or(@@.Name.S[0]='.'))
       %$ELSE
        drProc: TProcInf((@@.Name[0]=0)or(@@.Name[1]='.'))
       %$END
        drSysProc: TSysProcInf
        drConst: TConstDef
        drResStr: TResStrDef
        drLabel: TNDXB1
       %$IF (Ver>=7)and IsDelphi;
        drUnitAddInfo: TUnitAddInfo
       %$END
       %$IF (Ver>=8)and IsDelphi;
        drStrConstRec: TStrConstRec
       %$END
       %$IF (Ver>=10)and IsDelphi;
       /* drStrConstRec
        drAddInfo6: struc pas
           V1: TNDXB1 //0
           Z1: TNDXB1 //0
           V2: TNDXB1 //0
           Z2: TNDXB1 //was<>0
         ends
       */
        drSpecVar: TVarInf
        /*
         struc pas
           V1: TNDXB1 //#23
           Z1: TNDXB1 //0
           V2: TNDXB1 //#17
           Z2: TNDXB1 //0
         ends
        */
       %$END
       %$IF (Ver>=12)and IsDelphi;
        drDelayedImpInfo: TDelayedImpRec
       %$END
      endc
     ends
    endc
ends:displ=('[',ADDR(&@),']',@):autoname=(valname(@.Tag,TDCU30RecTag),cond((&@.D.drSrc>0)exc 0,(': ',@.D.drSrc.Name.S)))

TDCU30List0 array of TDCU30Rec ?((@.Tag<0x61/*'a'*/)and
  (@.Tag<>TDCU30RecTag.drType)and
  (@.Tag<>TDCU30RecTag.drTypeP)and
  (@.Tag<>TDCU30RecTag.drProc)and
  (@.Tag<>TDCU30RecTag.drSysProc)and
  (@.Tag<>TDCU30RecTag.drConst)and
  (@.Tag<>TDCU30RecTag.drResStr)and
  (@.Tag<>TDCU30RecTag.drVar)and
  (@.Tag<>TDCU30RecTag.drThreadVar)and
  (@.Tag<>TDCU30RecTag.drVarC)and
  (@.Tag<>TDCU30RecTag.drAbsVar)and
  (@.Tag<>TDCU30RecTag.drVoid)and
  (@.Tag<>TDCU30RecTag.drLabel)and
  (@.Tag<>TDCU30RecTag.drRecDef)and
  (@.Tag<>TDCU30RecTag.drPtrDef)and
  (@.Tag<>TDCU30RecTag.drRangeDef)and
  (@.Tag<>TDCU30RecTag.drChRangeDef)and
  (@.Tag<>TDCU30RecTag.drWCharRangeDef)and
  (@.Tag<>TDCU30RecTag.drBoolRangeDef)and
  (@.Tag<>TDCU30RecTag.drEnumDef)and
  (@.Tag<>TDCU30RecTag.drFloatDef)and
  (@.Tag<>TDCU30RecTag.drSetDef)and
  (@.Tag<>TDCU30RecTag.drArrayDef)and
  (@.Tag<>TDCU30RecTag.drShortStrDef)and
  (@.Tag<>TDCU30RecTag.drFileDef)and
  (@.Tag<>TDCU30RecTag.drTextDef)and
  (@.Tag<>TDCU30RecTag.drStringDef)and
  (@.Tag<>TDCU30RecTag.drWideStrDef)and
  (@.Tag<>TDCU30RecTag.drWideRangeDef)and
  (@.Tag<>TDCU30RecTag.drVariantDef)and
  (@.Tag<>TDCU30RecTag.drProcTypeDef)and
  (@.Tag<>TDCU30RecTag.drObjVMTDef)and
  (@.Tag<>TDCU30RecTag.drObjDef)and
  (@.Tag<>TDCU30RecTag.drClassDef)and
/*
%$IF Ver>=100; //Kylix specific flags
  (@.Tag<>TDCU30RecTag.drUnit4)and
  (@.Tag<>TDCU30RecTag.drUnit3s)and
%$END
*/
 %$IF (Ver>=7)and IsDelphi;
  (@.Tag<>TDCU30RecTag.drUnitAddInfo)and
 %$END
 %$IF (Ver>=8)and IsDelphi;
  (@.Tag<>TDCU30RecTag.drStrConstRec)and
  (@.Tag<>TDCU30RecTag.drMetaClassDef)and
 %$END
%$IF (Ver>=10)and IsDelphi;
//  (@.Tag<>TDCU30RecTag.drAddInfo6)and
  (@.Tag<>TDCU30RecTag.drSpecVar)and
%$END
 %$IF (Ver>=12)and IsDelphi;
  (@.Tag<>TDCU30RecTag.drDynArrayDef)and
  (@.Tag<>TDCU30RecTag.drTemplateArgDef)and
  (@.Tag<>TDCU30RecTag.drTemplateCall)and
  (@.Tag<>TDCU30RecTag.drUnicodeStringDef)and
 %$END
  (@.Tag<>TDCU30RecTag.drInterfaceDef)
  or(@.Tag=TDCU30RecTag.drStop2)
  or(@.Tag=TDCU30RecTag.drStop_a)
  or(@.Tag>0x7A/*z*/)and
  (@.Tag<>TDCU30RecTag.drCodeLines)and
  (@.Tag<>TDCU30RecTag.drLinNum)and
  (@.Tag<>TDCU30RecTag.drStrucScope)and
  (@.Tag<>TDCU30RecTag.drSymbolRef)and
  (@.Tag<>TDCU30RecTag.drLocVarTbl)and
/*
%$IF Ver>=100; //Kylix specific flags
  (@.Tag<>TDCU30RecTag.drUnit3)and
%$END
*/
// %$IF (Ver>=7)and IsDelphi;
 %$IF gen7;
  (@.Tag<>TDCU30RecTag.drConstAddInfo)and
 %$END
 %$IF (Ver>=9)and(Ver<=10)and MSIL;
  (@.Tag<>TDCU30RecTag.drAssemblyInfo)and
 %$END
 %$IF (Ver>=7)and IsDelphi;
  (@.Tag<>TDCU30RecTag.drProcAddInfo)and
 %$END
 %$IF (Ver>=20)and IsDelphi;
  (@.Tag<>TDCU30RecTag.drNextOverload)and
 %$END
 %$IF (Ver>=22)and IsDelphi;
  (@.Tag<>TDCU30RecTag.drDependencyInfo)and
 %$END
 %$IF (Ver>=27)and IsDelphi;
  (@.Tag<>TDCU30RecTag.drInDcpWin64Info)and
 %$END
 %$IF (Ver>=8)and IsDelphi;
  (@.Tag<>TDCU30RecTag.drORec)and
 %$END
%$IF (Ver>=3)and IsDelphi;
  (@.Tag<>TDCU30RecTag.drCPPFlags)and
%$END
%$IF (Ver>=10)and IsDelphi;
  (@.Tag<>TDCU30RecTag.drCLine)and
  (@.Tag<>TDCU30RecTag.drA1Info)and
  (@.Tag<>TDCU30RecTag.drA2Info)and
 %$IF (Ver>=12)and IsDelphi;
  (@.Tag<>TDCU30RecTag.arCopyDecl)and
  (@.Tag<>TDCU30RecTag.drA5Info)and
  (@.Tag<>TDCU30RecTag.drA6Info)and
  (@.Tag<>TDCU30RecTag.drA7Info)and
  (@.Tag<>TDCU30RecTag.drA8Info)and
 %$IF (Ver>=17)and IsDelphi;
  (@.Tag<>TDCU30RecTag.drA9Info)and
 %$END
  (@.Tag<>TDCU30RecTag.drDelayedImpInfo)and
 %$END
 %$IF (Ver>=15)and IsDelphi /*and mode64*/;
  (@.Tag<>TDCU30RecTag.drSegInfo)and
  (@.Tag<>TDCU30RecTag.drAddrToSegInfo)and
 %$END
 %$IF (Ver>=28)and IsDelphi and(cPlatform in (iosSimArm64,iosDevice64));
  (@.Tag<>TDCU30RecTag.drDLLInfo1)and
 %$END
%$END
  (@.Tag<>TDCU30RecTag.drUnitFlags)and
  (@.Tag<>TDCU30RecTag.drSetDeft)
)!TDCU30RecTag;

//TDCU30List0 array of TDCU30Rec ?(@.Tag=0)!Char;
//TDCU30List0 array[100] of TDCU30Rec

TDCU30ListC array of TDCU30Rec ?@.Tag=TDCU30RecTag.drStop1!TDCU30RecTag;
TEmbeddedList array of TDCU30Rec/*TEmbeddedInf*/ ?
  /*@.Tag<>TDCU30RecTag.drProc*/
  @.Tag=TDCU30RecTag.drEmbeddedProcEnd!TDCU30RecTag;

//Unit header record (version-dependent)

%$IF Ver=2;
//Delphi2
type

TDCUHeader struc pas
  FileSize: ulong
  CompileTime: TFileTime //L1: ulong
  b00: byte
  Tbl: TDCU30List0
ends//:[@:Size=FileSize]

%$ELSIF (Ver>=3)and(Ver<=6);
//Delphi3
//Delphi4
//Delphi5
//Delphi6
type

TDCUHeader struc pas
  FileSize: ulong
  CompileTime: TFileTime //L1: ulong
  Inf: ulong
  b00: byte
  Tbl: TDCU30List0
ends//:[@:Size=FileSize]

%$ELSIF (Ver=7)or(Ver=8);
//Delphi7
type

TDCUHeader struc pas
  FileSize: ulong
  CompileTime: TFileTime //L1: ulong
  Inf: ulong
  b00: byte
  b02: byte
  Tbl: TDCU30List0
ends//:[@:Size=FileSize]

%$ELSIF (Ver=9)or(Ver=10);
//Delphi2005
//Delphi2006
type

TDCUHeader struc pas
  FileSize: ulong
  CompileTime: TFileTime //L1: ulong
  Inf: ulong
  b00: byte
  b02: byte
  Name: str
  Tbl: TDCU30List0
ends//:[@:Size=FileSize]

%$ELSIF (Ver>=12)and(Ver<=28);
//Delphi2009
//Delphi2010
//Delphi XE
//Delphi XE2
//Delphi XE3
//Delphi XE4
//Delphi XE5
//Delphi XE6
//Delphi XE7/AppMethod
//Delphi XE8
//Delphi 10 Seattle
//Delphi 10.1 Berlin
//Delphi 10.2 Tokyo
//Delphi 10.3 Rio
//Delphi 10.4 Sydney
//Delphi 11 Alexandria
//Delphi 12 Athens
type

TDCUHeader struc pas
  FileSize: ulong
  CompileTime: TFileTime //L1: ulong
  Inf: ulong
  b00: byte
  b02: byte
  Name: str
  bFE: TNDXB1
  X: TNDXB1
  Tbl: TDCU30List0
ends//:[@:Size=FileSize]

%$ELSIF Ver>=100;
//Kylix 1.0,2.0
type

TLXRec struc pas
  F: byte
  D: ulong
ends

/*
TLX0F array of TLXRec?@.F<>0x0F!void;:assert[@[0].F exc 0]
TLX try
  F: TLX0F
  ELS: ulong
endt
*/
TLX0F array of TLXRec?@.F<>0x0F!void;
TELS num+(4):assert[Byte(@)<>TDCU30RecTag.drUnitFlags]
TLX struc
  TLX0F X //This structure was observed in the file QOpenBanner.dcu
    //which displays Kylix nag screen and treated specially by
    //compiler
  try
    ELS: TELS
    NO: void
  endt ELS //Sometimes these 4 bytes are not present, and the 1st byte of
    //of them can have various values such as 0,0x12 or E0.
ends

TDCUHeader struc pas
  FileSize: ulong
  CompileTime: TFileTime //L1: ulong
  Inf: ulong
  b00: byte
  LX: TLX
  Tbl: TDCU30List0
ends//:[@:Size=FileSize]

%$END

//Find in files: @:Size+4<>FileSize or Hdr:Size<>FileSize-4
data
  0x0004 TDCUHeader Hdr


Other specifications.


FlexT home page, Author`s home page.