MapBasic eXecutable (for MapInfo).(MBX.rfi):
Class: Executable and Object, Status: Partial, Last change: 09.04.2009 19:12:50
type
TSign array[4] of char
data
0x0000 TSign Sign
assert Sign='!App';
descr ('MapBasic eXecutable (for MapInfo).')
descr (NL,
'Info Src: Partially reconstructed by me (Alexei Hmelnov (mailto:alex@monster.icc.ru)).',NL)
data
0x0004 array[0xFC] of char,<0; StrInf
type
uint num+(2):displ=(INT(@))
usint num+(1):displ=(INT(@))
TProcData(hProc) forward
PProcData(hProc) ^TProcData(@:hProc) near=ulong
TVarInfRecs(Cnt) forward
PVarInfRecs(Cnt) ^TVarInfRecs(@:Cnt) near=ulong
TProcInfos(Cnt) forward
PProcInfos(Cnt) ^TProcInfos(@:Cnt) near=ulong
TTypeInfTbl(Cnt) forward
PTypeInfTbl(Cnt) ^TTypeInfTbl(@:Cnt) near=ulong
TVarNames(Sz) array of str:[@:Size=@:Sz]
PVarNames(Sz) ^TVarNames(@:Sz) near=ulong
TProcFrame struc
PProcData(@:#) D
ulong PNext
ulong Cnt
array[@.Cnt] of Str Locals
raw[] rest
ends:[@:Size=@.PNext-&@]
TProcFrames(Sz) array of TProcFrame:[@:Size=@:Sz]
PProcFrames(Sz) ^TProcFrames(@:Sz) near=ulong
TSrcInfo struc
ulong PNext
ulong Cnt
array of str FNs
//raw[] rest
ends:[@:Size=@.PNext-&@]
TSrcInfos(Cnt) array[@:Cnt]of TSrcInfo
PSrcInfos(Cnt) ^TSrcInfos(@:Cnt) near=ulong
TClassInfo struc
ulong PNext
ulong Cnt
array of str FNs //FNs[0] - Class name, FNs[i+1] - the name of TTypeInfRec.Fields[i]
//raw[] rest
ends:[@:Size=@.PNext-&@]
TClassInfos(Sz) array of TClassInfo:[@:Size=@:Sz]
PClassInfos(Sz) ^TClassInfos(@:Sz) near=ulong
PVarsHdr ^TVarsHdr near=ulong
TVarsHdr struc
PVarNames GlobNames
PClassInfos ClassInf
PProcFrames Frms
PSrcInfos SrcInf
ulong SrcCnt
ends:[@.GlobNames:Sz=(@.Frms when(@.ClassInf=0) exc @.ClassInf)-@.GlobNames,
@.ClassInf:Sz=(@.Frms-@.ClassInf)when(@.Frms<>0) exc 0,
@.Frms:Sz=@.SrcInf-@.Frms,@.SrcInf:Cnt=@.SrcCnt]
TDLLInfo struc
uint Cnt
str Name
array[@.Cnt] of str Proc
ends
TDLLInfos(Cnt) array[@:Cnt]of TDLLInfo
PDLLInfos(Cnt) ^TDLLInfos(@:Cnt) near=ulong
TMBXHdr struc
ulong X0
PVarInfRecs VarInf
PProcInfos ProcNames
PTypeInfTbl Types
PVarsHdr Vars
PDLLInfos DLLTbl
uint GlobCnt
uint ProcCnt
uint TypeCnt
uint DLLCnt
uint XCnt
ends:[
@.ProcNames:Cnt=@.ProcCnt,
@.VarInf:Cnt=@.GlobCnt,
//@.ProcNames:Sz=@.Vars-@.ProcNames,
//@.VarInf:Sz=@.Types-@.VarInf,
@.DLLTbl:Cnt=@.DLLCnt,
@.Types:Cnt=@.TypeCnt]
data
0x0100 TMBXHdr Hdr
type
// PXData ^void near=ulong
TProcInfo struc
PProcData(@:#) D
str N
ends:autoname=('pi_',@.N)
TProcInfos(Cnt) array[@:Cnt] of TProcInfo
TDTCodeB enum usint (
dtString=1,
dt_Val=2, //any numeric value represented by double
dtInteger=3,
dtSmallInt=4,
dtDate=5,
dtLogical=6,
dtFloat=8,
dt_PChar=10,
dtPen=11,
dtBrush=12,
dtObject=13,
dtSymbol=14,
dtFont=15,
dtStringL=16,
dtAlias=21,
dtProcName=24,
dtObject1=29
)
/*
TDTCode enum int (
dtString=1,
dtInteger=3,
dtSmallInt=4,
dtDate=5,
dtLogical=6,
dtFloat=8,
dtPen=11,
dtBrush=12,
dtObject=13,
dtSymbol=14,
dtFont=15,
dtStringL=16,
dtAlias=21
)*/
TDTFlags set 8 of (byRef ^ 0x01)
TDTCode struc
TDTCodeB DT
TDTFlags F
ends
TTypeNDX(DT) word():displ=(COND(@:DT=TDTCodeB.dtObject1,
(Hdr.Vars^.ClassInf^[@].FNs[0],'{',INT(@),'}'),(INT(@))) )
TVarInfRec struc
TDTCode DT
int Cnt //Array count, -1 => not an array
TTypeNDX(@.DT.DT) hType
word StrLen //for String*Len
ends
TVarInfRecs(Cnt) array[@:Cnt] of TVarInfRec
TTypeInfRec struc
word Cnt
array[@.Cnt] of TVarInfRec Fields
ends
TTypeInfTbl(Cnt) array[@:Cnt] of TTypeInfRec
include Float.rfi
/*
type bit
TBit1 num+(1)
TBit11 num+(11)
TBit20 num+(20)
TFloatHi struc
TBit20 M
TBit11 P
TBit1 S
ends
type
TFloat struc
ulong Lo
TFloatHi Hi
ends: displ=(@.Hi.S,' 1.',@.Hi.M,@.Lo,'*2^',INT(@.Hi.P-0x3FF));
*/
type
TFloat TDouble
TLocConst(DT) case TDTCodeB @:DT of
dt_Val: TFloat
dtString,dt_PChar,dtProcName: pchar
else
void
endc
PLocConst(Base,DT) ^TLocConst(@:DT) hideref nil- near=word, REF=@+@:Base;:
displ=(@^,'{'/*,HEX(@:Base),'+'*/,@,'}')
TLocConstInf(Base) struc
TDTCodeB DT
PLocConst(@:Base,@.DT) Ofs
ends
include MBX_CMD.rfi
type
TMBXOpSeq(hProc,MaxSz,Base,BaseD) array of TMBXOp(@:hProc,@:MaxSz,@:Base,@:BaseD) ?
// ((@:@ as TMBXOpSeq):MaxSz<=&@-&@:@/*+@:Size*/)
// or(not @:assert)!void;: displ=('(', Let's see the wrong value
((@:@ as TMBXOpSeq):MaxSz-1<=&@-&@:@/*+@:Size*/)
or(not @:assert);: displ=('(',
ShowArray(@,(NL,HEX(&@-&@:@,4),': ',@)),NL,')')
TMBXOpSeq1(hProc,Sz,Base,BaseD) struc
TMBXOpSeq(@:hProc,@:Sz,@:Base,@:BaseD) Ops
// raw[]at @:base; Rest
raw[]at &@; Rest
ends:[@:Size=@:Sz]
TProcData(hProc) struc
ulong Base
ulong CodeStart
ulong DataStart
ulong DataEnd
word C1
word LocConstCnt // array of 3-byte recs at the end of DataB
//Each rec is Byte DT, Word Ofs in the DataB
word LocCnt
word ArgCnt
TDTCode ResType
word C6
ulong X1
ulong Z2
ulong Size
// raw[@.DataStart-0x28/*@.CodeStart*/] at &@; CodeB
TMBXOpSeq1(@:hProc,@.DataStart-0x28/*@.CodeStart*/,&@) CodeB
raw[@.DataEnd-@.DataStart-@.LocConstCnt*3] /*at &@;*/ DataB
array[@.LocConstCnt]of TLocConstInf(&@@.DataB) LocConsts
array[@.LocCnt] of TVarInfRec LocVars //Starting ArgCnt items are arguments
raw[] rest
ends:[@:Size=@.Size,@.CodeB:BaseD=&@.DataB]:assert[@.Base=&@,
@.DataEnd-@.DataStart>=@.LocConstCnt*3]
Other specifications.
FlexT home page,
Author`s home page.