KeyFC欢迎致辞,点击播放
资源、介绍、历史、Q群等新人必读
KeyFC 社区总索引
如果你找到这个笔记本,请把它邮寄给我们的回忆
KeyFC 漂流瓶传递活动 Since 2011
 

請教如何解開SEEN.TXT

[ 16771 查看 / 11 回复 ]

回复: 請教如何解開SEEN.TXT

原帖由 Serw 于 2007-7-17 13:23:00 发表
问题是上文还有你的AVG32脚本解析工具都只能得到指令, 看不到操作数的格式. 比如 $1C        Jump        无条件跳转, 最后会跳转到什么地方? $37        Var        Bit变量赋值 是给哪个变量赋什么值?


快速的回顾了一下我的解析器的源码,每一个指令的参数在解析器内部好像都分析出来了的。
我记得当时是因为没有工夫去写详细的界面,于是没有把所有的信息都显示出来(但是解析器二进制窗口中你点每条指令就会把对应的参数源码显示出来,这样很方便用眼睛瞄得:D)

鉴于楼上应该已经能够解包SEEN了,我这里只把对解开后的每个脚本的解析代码列出来:
  1. // Copyright 2001-2004 Misha @ Keyfc.net

  2. // 仅供个人研究学习,严禁他用

  3. // 未经作者许可,请勿转载



  4. Unit SCENUnpack;



  5. Interface



  6. Uses SysUtils, ComCtrls, Contnrs, MD5Service;



  7. Const

  8.   ScenFileSignature: String = 'TPC32';



  9. ResourceString

  10.   SeenScriptSignError = '脚本签名错误';

  11.   SeenHeaderMenuCountError = '脚本菜单数量错误 (%d)';

  12.   SeenHeaderSubMenuCountError = '脚本子菜单数量错误 (%d:%d)';

  13.   SeenHeaderSubMenuMaxError = '脚本子菜单最值错误 (%d-%d:%d)';

  14.   SeenHeaderSubMenuLoopError = '脚本循环子菜单标记数量错误 (%d-%d-%d:%d)';

  15.   SeenHeaderGetTextError = '错误的行号';

  16.   SeenCMDTextExtractNIL = '无效文字提取过程';

  17.   SeenCMDNIL = '空指令序列';

  18.   SeenCMDSelectListError = '选项列表没有开始';

  19.   SeenCMDSumError = '不能识别的求和指令';

  20.   SeenCMDValueHeaderError = '无效数值头';

  21.   SeenCMDConditionLevelOverflow = '太多的条件嵌套';

  22.   SeenCMDConditionLOperPosError = '无效的逻辑指令位置';

  23.   SeenCMDConditionPropertyUnExp = '意外的属性指令';

  24.   SeenCMDConditionPropertyPosError = '无效的属性指令位置';

  25.   SeenCMDConditionPropertyError = '无效的属性指令参数';

  26.   SeenCMDConditionError = '无效的条件指令';

  27.   SeenCMDFStringConditionError = '同一分支出现多个条件';

  28.   SeenCMDFString10hSubCMDError = '无效的字符串格式 ($10子指令)';

  29.   SeenCMDFStringError = '无效的字符串格式';



  30.   SeenCMDExplainDetailUnImp = '$%.2x:$%.2x 的详细资料 (不可用功能)';

  31.   SeenCMDFaultHeader = '出错命令:';

  32.   SeenCMDExpEmpty = '空指令记录';



  33.   SeenCMDExpCat01 = '全部脚本结束';

  34.   SeenCMDExpCat02 = '等待鼠标点击, 然后换行或者清除文字';

  35.   SeenCMDExpCat03 = '换行 {...}';

  36.   SeenCMDExpCat04 = '等待点击, 然后继续脚本';

  37.   SeenCMDExpCat05 = '文本窗口操作 {...}';

  38.   SeenCMDExpCat06 = '特效文本 {...}';

  39.   SeenCMDExpCat07 = '图像/PDT文件操作 {...}';

  40.   SeenCMDExpCat08 = '动画操作 {...}';

  41.   SeenCMDExpCat09 = '声音/媒体操作 {...}';

  42.   SeenCMDExpCat10 = '变量文字写入 {...}';

  43.   SeenCMDExpCat11 = '图像渐变操作 {...}';

  44.   SeenCMDExpCat12 = '条件转移';

  45.   SeenCMDExpCat13 = '指令转移 {...}';

  46.   SeenCMDExpCat14 = '图像摇动 {...}';

  47.   SeenCMDExpCat15 = '文字颜色';

  48.   SeenCMDExpCat16 = '等待 {...}';

  49.   SeenCMDExpCat17 = '脚本内嵌入';

  50.   SeenCMDExpCat18 = '无条件跳转';

  51.   SeenCMDExpCat19 = '查询表格条件嵌入';

  52.   SeenCMDExpCat20 = '查询表格条件跳转';

  53.   SeenCMDExpCat21 = '嵌入返回';

  54.   SeenCMDExpCat22 = 'Bit变量赋值';

  55.   SeenCMDExpCat23 = 'Bit变量复制';

  56.   SeenCMDExpCat24 = '整数变量赋值';

  57.   SeenCMDExpCat25 = '整数变量 +';

  58.   SeenCMDExpCat26 = '整数变量 -';

  59.   SeenCMDExpCat27 = '整数变量 *';

  60.   SeenCMDExpCat28 = '整数变量 /';

  61.   SeenCMDExpCat29 = '整数变量 %';

  62.   SeenCMDExpCat30 = '整数变量 AND';

  63.   SeenCMDExpCat31 = '整数变量 OR';

  64.   SeenCMDExpCat32 = '整数变量 XOR';

  65.   SeenCMDExpCat33 = '整数变量复制';

  66.   SeenCMDExpCat34 = '整数变量 + 整数变量';

  67.   SeenCMDExpCat35 = '整数变量 - 整数变量';

  68.   SeenCMDExpCat36 = '整数变量 * 整数变量';

  69.   SeenCMDExpCat37 = '整数变量 / 整数变量';

  70.   SeenCMDExpCat38 = '整数变量 % 整数变量';

  71.   SeenCMDExpCat39 = '整数变量 AND 整数变量';

  72.   SeenCMDExpCat40 = '整数变量 OR 整数变量';

  73.   SeenCMDExpCat41 = '整数变量 XOR 整数变量';

  74.   SeenCMDExpCat42 = 'Bit变量随机赋值';

  75.   SeenCMDExpCat43 = '整数变量随机赋值';

  76.   SeenCMDExpCat44 = '用户选择操作 {...}';

  77.   SeenCMDExpCat45 = '字符串操作 {...}';

  78.   SeenCMDExpCat46 = '多变量赋值 {...}';

  79.   SeenCMDExpCat47 = '多变量初始化 {...}';

  80.   SeenCMDExpCat48 = '多变量顺序复制 {...}';

  81.   SeenCMDExpCat49 = '获得脚本信息 {...}';

  82.   SeenCMDExpCat50 = '多变量统计操作 {...}';

  83.   SeenCMDExpCat51 = '系统杂项操作 {...}';

  84.   SeenCMDExpCat52 = '名称操作 {...}';

  85.   SeenCMDExpCat53 = '图像Get/Put操作 {...}';

  86.   SeenCMDExpCat54 = '图像处理 {...}';

  87.   SeenCMDExpCat55 = '写字符串到图像缓存';

  88.   SeenCMDExpCat56 = '图像缓存操作 {...}';

  89.   SeenCMDExpCat57 = '图像画面操作 {...}';

  90.   SeenCMDExpCat58 = '图像滚动切换';

  91.   SeenCMDExpCat59 = '多图像滚动处理 {...}';

  92.   SeenCMDExpCat60 = '区域信息操作 {...}';

  93.   SeenCMDExpCat61 = '鼠标操作 {...}';

  94.   SeenCMDExpCat62 = 'CG模式操作 {...}';

  95.   SeenCMDExpCat63 = '系统窗口状态操作 {...}';

  96.   SeenCMDExpCat64 = '系统窗口位置操作 {...}';

  97.   SeenCMDExpCat65 = '系统状态操作 {...}';

  98.   SeenCMDExpCat66 = '弹出菜单控制 {...}';

  99.   SeenCMDExpCat67 = '音量控制 {...}';

  100.   SeenCMDExpCat68 = 'Novel模式控制 {...}';

  101.   SeenCMDExpCat69 = '显示半角文字';

  102.   SeenCMDExpCat70 = '显示全角文字';

  103.   SeenCMDExpCatXX = '未知命令 $%.2x:$%.2x';



  104. Type

  105.   RMixInt = Record

  106.   Case Boolean of

  107.     True:  ( Bytes: Array[0..3] of Char );

  108.     False: ( AInt: Integer );

  109.   END;



  110.   RScenHeader = Record

  111.   Sign: Array [1..16] of Char;

  112.   Resv: Array [1..8] of Char;

  113.   LineCount: Integer;

  114.   END;



  115.   RScenMenu = Record

  116.   Start, LoopBack: Integer;

  117.   Num: Byte;



  118.   SubNum, ID, StrID: Array[1..8] of Byte;

  119.   SubCnt, SubCntMax, SubID, SubStrID: Array[1..8, 1..8] of Byte;

  120.   Flag: Array[1..8, 1..8, 1..8] of Byte;

  121.   SubStart: Array[1..8, 1..8, 1..8] of Integer;

  122.   Str: Array[0..71] of ANSIString;



  123.   Cur, CurSub, CurSubSub: Integer;

  124.   Bit, BitCnt, SubBit, SubBitCnt: Byte;

  125.   END;



  126.   RLine = Record

  127.   Index: Integer;

  128.   Text: ANSIString;

  129.   END;



  130.   RValue = Record

  131.   IsRegister: Boolean;

  132.   Spacing: Byte;

  133.   Value: Integer;

  134.   END;



  135.   RText = Record

  136.   IsRegister: Boolean;

  137.   IsIndirect: Boolean;

  138.   Value: Integer;

  139.   Spacing: Integer;

  140.   Text: ANSIString;

  141.   END;



  142.   SCondType = ( CPRInt, CPRBit, CPImm, CPAttr, CPLOp );



  143.   RCondRec = Record

  144.   CType:  SCondType;

  145.   CValue: Integer;

  146.   END;



  147.   RConR = Array of RCondRec;



  148.   RCond = Record

  149.   Spacing: Integer;

  150.   Condition: RConR;

  151.   END;



  152.   RSelect = Record

  153.   Text: ANSIString;

  154.   Condition: RConR;

  155.   END;



  156.   PPutLineProc = Procedure(Index: Integer; Text: ANSIString) of Object;



  157.   RScenCMD = Class

  158.   Private

  159.     Offset: Integer;

  160.     Source: ANSIString;



  161.     CMD, SCMD, SSCMD: Byte;



  162.     CMDIntR: Array[1..32] of RValue;

  163.     CMDStrR: Array[1..4]  of RText;

  164.     CMDStr:  Array[1..2]  of ANSIString;

  165.     CMDInt:  Array[1..16] of Integer;



  166.     CMDAInt:  Array of Integer;

  167.     CMDAByte: Array of Byte;

  168.     CMDAStr:  Array of ANSIString;



  169.     CMDAIntR:  Array of RValue;

  170.     CMDAIntDR: Array of Array of RValue;

  171.     CMDAStrR:  Array of RText;

  172.     CMDACond:  Array of RCond;

  173.     CMDASelR:  Array of RSelect;



  174.     Function IntReader(Pos: Integer): Integer;

  175.     Function ValueReader(Pos: Integer): RValue;

  176.     Function TextReader(Pos: Integer): RText;

  177.     Function Conditioner(Pos: Integer; ExpectAttr: Boolean = False): RCond;

  178.     Function ReadFString(Pos: Integer; ExpectAttr: Boolean = False): Integer;

  179.     Function Han2Zen(StrIn: ANSIString): ANSIString;



  180.     Procedure Fault(Error: String; Pos: Integer = 256);

  181.   Public

  182.     Constructor Create(OrigLen, LineMax: Integer; PutLine:PPutLineProc; Var CMDString: ANSIString);

  183.     Destructor  Destroy; Override;



  184.     Function  Explain(Detail: Boolean): String;

  185.     Procedure ExpressTree(Tree: TTreeView; Root: TTreeNode);



  186.     Property RAWText: ANSIString read Source;

  187.     Property Start: Integer read Offset;

  188.   END;



  189.   RCMDTerm = Class

  190.   Private

  191.     ErrorMSG: String;



  192.   Public

  193.     Constructor Create(LError: String);

  194.     Destructor Destroy; Override;



  195.     Property Error: String read ErrorMSG;

  196.   END;



  197.   TScenario = Class

  198.   Private

  199.     SourceLen: Integer;

  200.     SourceMD5: String;



  201.     Source: ANSIString;

  202.     Header: RScenHeader;

  203.     IndexedLines: Array of RLine;



  204.     MenuPad:  Integer;

  205.     Version:  Integer;

  206.     ExtraPad: Integer;

  207.     Counter:  Integer;

  208.     JumpBase: Integer;

  209.     StartPos: Integer;



  210.     Menu: RScenMenu;

  211.     CMDS: TObjectList;



  212.     Function IntReader(Pos: Integer): Integer;

  213.     Function GetLine(Index: Integer): RLine;

  214.     Procedure PutLine(Index: Integer; Text: ANSIString);

  215.   Public

  216.     Constructor Create(SeenFile: ANSIString);

  217.     Destructor Destroy; Override;



  218.     Property SLen: Integer read SourceLen;

  219.     Property SMD5: String  read SourceMD5;

  220.     Property RAWText: ANSIString read Source;



  221.     Property MPad:  Integer read MenuPad;

  222.     Property Ver:  Integer read Version;

  223.     Property ExPad: Integer read ExtraPad;

  224.     Property Cntr:  Integer read Counter;

  225.     Property JMase: Integer read JumpBase;

  226.     Property Start: Integer read StartPos;



  227.     Property SHeader: RScenHeader read Header;

  228.     Property SMenu: RScenMenu read Menu;

  229.     Property SCMDS: TObjectList read CMDS;

  230.     Property Lines[Index: Integer]: RLine read GetLine;

  231.   end;



  232. Implementation



  233. Constructor RCMDTerm.Create(LError: String);

  234.   BEGIN

  235.   Inherited Create;



  236.   ErrorMSG:= LError;

  237.   END;



  238. Destructor RCMDTerm.Destroy;

  239.   BEGIN

  240.   Inherited;

  241.   END;



  242. Constructor TScenario.Create(SeenFile: ANSIString);

  243.   Var

  244.   I, J, K, L: Integer;

  245.   Pos, Str, Loop: Integer;



  246.   CMDSerial: ANSIString;

  247.   CMDItem: RScenCMD;

  248.   BEGIN

  249.   Inherited Create;

  250.   Source:= SeenFile;

  251.   SourceLen:= Length(Source);

  252.   SourceMD5:= MD5(Source);



  253.   Move(PChar(Source)^,Header,Sizeof(RScenHeader));

  254.   IF Trim(String(Header.Sign)) <> ScenFileSignature then

  255.     Raise Exception.Create(SeenScriptSignError);



  256.   SetLength(IndexedLines,Header.LineCount);

  257.   For I:= 0 to Header.LineCount-1 do

  258.     IndexedLines[I].Index:= IntReader($21+I*4);



  259.   MenuPad:= Header.LineCount * 4 + $50;

  260.   Pos:= MenuPad+1;

  261.   Version:= IntReader(Pos);

  262.   if Version = 5 then ExtraPad:= 4

  263.                   else ExtraPad:= 0;



  264.   Menu.Num:= IntReader(Pos-$24);

  265.   Counter:= IntReader(Pos-$28)-1;



  266.   // Reading Menu...

  267.   Str:= 0;

  268.   if Menu.Num > 8 then

  269.     Raise Exception.Create(Format(SeenHeaderMenuCountError, [ Menu.Num ]));



  270.   For I:= 1 to Menu.Num do

  271.     BEGIN

  272.     Menu.ID[I]:= ORD(Source[Pos]);

  273.     Menu.SubNum[I]:= ORD(Source[Pos+1]);

  274.     Inc(Pos,2);

  275.     Menu.StrID[I]:= Str; Inc(Str);



  276.     if Menu.SubNum[I] > 8 then

  277.       Raise Exception.Create(Format(SeenHeaderSubMenuCountError, [ I, Menu.SubNum[I] ]));



  278.     For J:= 1 to Menu.SubNum[I] do

  279.       BEGIN

  280.       Menu.SubID[I][J]:= ORD(Source[Pos]);

  281.       Menu.SubCntMax[I][J]:= ORD(Source[Pos+1]);

  282.       Inc(Pos,2);

  283.       Menu.SubStrID[I][J]:= Str; Inc(Str);



  284.       if Menu.SubCntMax[I][J] > 8 then

  285.         Raise Exception.Create(Format(SeenHeaderSubMenuMaxError, [ I, J, Menu.SubCntMax[I][J] ]));



  286.       For K:= 1 to Menu.SubCntMax[I][J] do

  287.         BEGIN

  288.         Loop:= ORD(Source[Pos]); Inc(Pos);



  289.         if Loop > 8 then

  290.           Raise Exception.Create(Format(SeenHeaderSubMenuLoopError, [ I, J, K, Loop ]));



  291.         For L:= 1 to Loop do

  292.           BEGIN

  293.           Menu.Flag[I][J][K]:= ORD(Source[Pos]);

  294.           Inc(Pos,3);

  295.           END;

  296.         END;

  297.       END;

  298.     END;



  299.   For I:= 1 to Str do

  300.     BEGIN

  301.     Menu.Str[I]:= PChar(Copy(Source,Pos+1,SourceLen));

  302.     Inc(Pos,ORD(Source[Pos])+1);

  303.     END;



  304.   Menu.Start:= IntReader(MenuPad+ExtraPad+$F+1) - 1;

  305.   Loop:= Menu.Start + 1;

  306.   StartPos:= MenuPad + ExtraPad + $13;

  307.   IF Counter > 0 then

  308.     BEGIN

  309.     Menu.LoopBack:= Loop + 4;

  310.     For I:= 1 to Counter do

  311.       Inc(Loop,IntReader(StartPos + Loop + 1)+4);

  312.     END;



  313.   For I:= 1 to Menu.Num do

  314.     For J:= 1 to Menu.SubNum[I] do

  315.     For K:= 1 to Menu.SubCntMax[I][J] do

  316.       BEGIN

  317.       Menu.SubStart[I][J][K]:= Loop + 4;

  318.       Inc(Loop,IntReader(StartPos + Loop + 1)+4);

  319.       END;



  320.   Menu.Cur:= -1;

  321.   Menu.Bit:= 1;

  322.   Menu.BitCnt:= 0;

  323.   Menu.SubBit:= 1;

  324.   Menu.SubBitCnt:= 0;

  325.   JumpBase:= 0;



  326.   CMDS:= TObjectList.Create(True);

  327.   CMDSerial:= Copy(Source,StartPos+1,Length(Source));

  328.   L:= Length(CMDSerial);

  329.   Repeat

  330.     Try

  331.     CMDItem:= RScenCMD.Create(L, Header.LineCount, PutLine, CMDSerial);

  332.     CMDS.Add(CMDItem);

  333.     Except

  334.     On E:Exception do

  335.       BEGIN

  336.       CMDS.Add(RCMDTerm.Create(E.Message));

  337.       Break;

  338.       END;

  339.     END;

  340.   Until CMDSerial = '';

  341.   END;



  342. Destructor TScenario.Destroy;

  343.   BEGIN

  344.   FreeAndNIL(CMDS);

  345.   SetLength(IndexedLines,0);



  346.   Inherited;

  347.   END;



  348. Function TScenario.IntReader(Pos: Integer): Integer;

  349.   Var

  350.   Cache: RMixInt;

  351.   BEGIN

  352.   Cache.Bytes[0]:= Source[Pos];

  353.   Cache.Bytes[1]:= Source[Pos+1];

  354.   Cache.Bytes[2]:= Source[Pos+2];

  355.   Cache.Bytes[3]:= Source[Pos+3];

  356.   Result:= Cache.AInt;

  357.   END;



  358. Function TScenario.GetLine(Index: Integer): RLine;

  359.   BEGIN

  360.   IF Index < Length(IndexedLines) then

  361.     Result:= IndexedLines[Index]

  362.   else

  363.     BEGIN

  364.     Result.Index:= -1;

  365.     Result.Text:= SeenHeaderGetTextError;

  366.     END;

  367.   END;



  368. Procedure TScenario.PutLine(Index: Integer; Text: ANSIString);

  369.   BEGIN

  370.   IndexedLines[Index].Text:= Text;

  371.   END;



  372. Constructor RScenCMD.Create(OrigLen, LineMax: Integer; PutLine:PPutLineProc; Var CMDString: ANSIString);

  373.   Var

  374.   Counter: Integer;

  375.   SizeCache: Integer;

  376.   J, K, L, M: Integer;

  377.   BEGIN

  378.   Inherited Create;



  379.   Source:= CMDString;

  380.   SizeCache:= Length(Source);

  381.   Offset:= OrigLen - SizeCache;



  382.   IF NOT Assigned(PutLine) then Fault(SeenCMDTextExtractNIL,0);

  383.   IF CMDString = '' then Fault(SeenCMDNIL,0);



  384.   Counter:= 1;

  385.   CMD:= ORD(Source[Counter]);

  386.   Inc(Counter);

  387.   Try

  388.     Case CMD of

  389.     $00, $01, $03, $06, $1A, $22..$29, $65:

  390.       BEGIN

  391.       Dec(Counter);

  392.       END;

  393.     $02, $04, $20, $30:

  394.       BEGIN

  395.       SCMD:= ORD(Source[Counter]);

  396.       END;

  397.     $05, $7F:

  398.       BEGIN

  399.       CMDIntR[1]:= ValueReader(Counter);

  400.       Inc(Counter,CMDIntR[1].Spacing-1);

  401.       END;

  402.     $08:

  403.       BEGIN

  404.       SCMD:= ORD(Source[Counter]);

  405.       Inc(Counter);

  406.       Case SCMD of

  407.         $01:

  408.         BEGIN

  409.           Dec(Counter);

  410.         END;

  411.         $10, $11:

  412.         BEGIN

  413.           CMDIntR[1]:= ValueReader(Counter);

  414.           Inc(Counter,CMDIntR[1].Spacing-1);

  415.         END;

  416.         ELSE Dec(Counter);

  417.       END;

  418.       END;

  419.     $0B:

  420.       BEGIN

  421.       SCMD:= ORD(Source[Counter]);

  422.       Inc(Counter);

  423.       Case SCMD of

  424.         $01, $03, $05, $09, $10, $54:

  425.         BEGIN

  426.           CMDStrR[1]:= TextReader(Counter);

  427.           Inc(Counter,CMDStrR[1].Spacing);



  428.           CMDIntR[1]:= ValueReader(Counter);

  429.           Inc(Counter,CMDIntR[1].Spacing-1);

  430.         END;

  431.         $02, $04, $06:

  432.         BEGIN

  433.           CMDStrR[1]:= TextReader(Counter);

  434.           Inc(Counter,CMDStrR[1].Spacing);



  435.           For J:= 1 to 15 do

  436.           BEGIN

  437.             CMDIntR[J]:= ValueReader(Counter);

  438.             Inc(Counter,CMDIntR[J].Spacing);

  439.           END;



  440.           Dec(Counter);

  441.         END;

  442.         $08, $13, $30, $50:

  443.         BEGIN

  444.           Dec(Counter);

  445.         END;

  446.         $11:

  447.         BEGIN

  448.           CMDStrR[1]:= TextReader(Counter);

  449.           Inc(Counter,CMDStrR[1].Spacing-1);

  450.         END;

  451.         $22:

  452.         BEGIN

  453.           K:= ORD(Source[Counter]);



  454.           SetLength(CMDAStrR,K);

  455.           SetLength(CMDAByte,K);

  456.           SetLength(CMDAIntDR,K,7);

  457.           Inc(Counter);



  458.           CMDStrR[1]:= TextReader(Counter);

  459.           Inc(Counter,CMDStrR[1].Spacing);



  460.           CMDIntR[1]:= ValueReader(Counter);

  461.           Inc(Counter,CMDIntR[1].Spacing);



  462.           For J:= 0 to K-1 do

  463.           BEGIN

  464.             L:= ORD(Source[Counter]);

  465.             Inc(Counter);



  466.             CMDAByte[J]:= L;

  467.             CMDAStrR[J]:= TextReader(Counter);

  468.             Inc(Counter,CMDAStrR[J].Spacing);



  469.             Case L of

  470.             $01:

  471.               BEGIN

  472.               { NOTHING }

  473.               END;

  474.             $02:

  475.               BEGIN

  476.               CMDAIntDR[J][0]:= ValueReader(Counter);

  477.               Inc(Counter,CMDAIntDR[J][0].Spacing);

  478.               END;

  479.             $03:

  480.               BEGIN

  481.               For M:= 0 to 5 do

  482.                 BEGIN

  483.                 CMDAIntDR[J][M]:= ValueReader(Counter);

  484.                 Inc(Counter,CMDAIntDR[J][M].Spacing);

  485.                 END;

  486.               END;

  487.             $04:

  488.               BEGIN

  489.               For M:= 0 to 6 do

  490.                 BEGIN

  491.                 CMDAIntDR[J][M]:= ValueReader(Counter);

  492.                 Inc(Counter,CMDAIntDR[J][M].Spacing);

  493.                 END;

  494.               END;

  495.             END;

  496.           END;

  497.           Dec(Counter);

  498.         END;

  499.         $24:

  500.         BEGIN

  501.           K:= ORD(Source[Counter]);



  502.           SetLength(CMDAStrR,K);

  503.           SetLength(CMDAByte,K);

  504.           SetLength(CMDAIntDR,K,7);

  505.           Inc(Counter);



  506.           CMDIntR[1]:= ValueReader(Counter);

  507.           Inc(Counter,CMDIntR[1].Spacing);



  508.           CMDIntR[2]:= ValueReader(Counter);

  509.           Inc(Counter,CMDIntR[2].Spacing);



  510.           For J:= 0 to K-1 do

  511.           BEGIN

  512.             L:= ORD(Source[Counter]);

  513.             Inc(Counter);



  514.             CMDAByte[J]:= L;

  515.             CMDAStrR[J]:= TextReader(Counter);

  516.             Inc(Counter,CMDAStrR[J].Spacing);



  517.             Case L of

  518.             $01:

  519.               BEGIN

  520.               { NOTHING }

  521.               END;

  522.             $02:

  523.               BEGIN

  524.               CMDAIntDR[J][0]:= ValueReader(Counter);

  525.               Inc(Counter,CMDAIntDR[J][0].Spacing);

  526.               END;

  527.             $03:

  528.               BEGIN

  529.               For M:= 0 to 5 do

  530.                 BEGIN

  531.                 CMDAIntDR[J][M]:= ValueReader(Counter);

  532.                 Inc(Counter,CMDAIntDR[J][M].Spacing);

  533.                 END;

  534.               END;

  535.             $04:

  536.               BEGIN

  537.               For M:= 0 to 6 do

  538.                 BEGIN

  539.                 CMDAIntDR[J][M]:= ValueReader(Counter);

  540.                 Inc(Counter,CMDAIntDR[J][M].Spacing);

  541.                 END;

  542.               END;

  543.             END;

  544.           END;

  545.           Dec(Counter);

  546.         END;

  547.         $31, $32, $33, $52:

  548.         BEGIN

  549.           CMDIntR[1]:= ValueReader(Counter);

  550.           Inc(Counter,CMDIntR[1].Spacing-1);

  551.         END;

  552.         ELSE Dec(Counter);

  553.       END;

  554.       END;

  555.     $0C:

  556.       BEGIN

  557.       SCMD:= ORD(Source[Counter]);

  558.       Inc(Counter);

  559.       Case SCMD of

  560.         $10:

  561.         BEGIN

  562.           CMDStrR[1]:= TextReader(Counter);

  563.           Inc(Counter,CMDStrR[1].Spacing);



  564.           CMDIntR[1]:= ValueReader(Counter);

  565.           Inc(Counter,CMDIntR[1].Spacing-1);

  566.         END;

  567.         $18:

  568.         BEGIN

  569.           CMDStrR[1]:= TextReader(Counter);

  570.           Inc(Counter,CMDStrR[1].Spacing);



  571.           CMDIntR[1]:= ValueReader(Counter);

  572.           Inc(Counter,CMDIntR[1].Spacing);



  573.           CMDStrR[2]:= TextReader(Counter);

  574.           Inc(Counter,CMDStrR[2].Spacing-1);

  575.         END;

  576.         $12, $30, $20, $24:

  577.         BEGIN

  578.           CMDStrR[1]:= TextReader(Counter);

  579.           Inc(Counter,CMDStrR[1].Spacing);



  580.           K:= 1; L:= 0;

  581.           While Source[Counter] <> #00 do

  582.           BEGIN

  583.             SetLength(CMDAIntR,K);

  584.             CMDAIntR[L]:= ValueReader(Counter);

  585.             Inc(Counter,CMDAIntR[L].Spacing);

  586.             Inc(K); Inc(L);

  587.           END;

  588.           Dec(Counter);

  589.         END;

  590.         $13, $21, $25:

  591.         BEGIN

  592.           Dec(Counter);

  593.         END;

  594.         $16:

  595.         BEGIN

  596.           CMDStrR[1]:= TextReader(Counter);

  597.           Inc(Counter,CMDStrR[1].Spacing);



  598.           CMDIntR[1]:= ValueReader(Counter);

  599.           Inc(Counter,CMDIntR[1].Spacing);



  600.           CMDStrR[2]:= TextReader(Counter);

  601.           Inc(Counter,CMDStrR[2].Spacing);



  602.           CMDIntR[2]:= ValueReader(Counter);

  603.           Inc(Counter,CMDIntR[2].Spacing-1);

  604.         END;

  605.         ELSE Dec(Counter);

  606.       END;

  607.       END;

  608.     $0E:

  609.       BEGIN

  610.       SCMD:= ORD(Source[Counter]);

  611.       Inc(Counter);

  612.       Case SCMD of

  613.         $01, $02, $03, $30, $32, $34:

  614.         BEGIN

  615.           CMDStrR[1]:= TextReader(Counter);

  616.           Inc(Counter,CMDStrR[1].Spacing-1);

  617.         END;

  618.         $05, $06, $07, $31, $33, $35:

  619.         BEGIN

  620.           CMDStrR[1]:= TextReader(Counter);

  621.           Inc(Counter,CMDStrR[1].Spacing);



  622.           CMDIntR[1]:= ValueReader(Counter);

  623.           Inc(Counter,CMDIntR[1].Spacing-1);

  624.         END;

  625.         $10, $20, $21, $37, $39, $40:

  626.         BEGIN

  627.           CMDIntR[1]:= ValueReader(Counter);

  628.           Inc(Counter,CMDIntR[1].Spacing-1);

  629.         END;

  630.         $11, $12, $36, $38:

  631.         BEGIN

  632.           Dec(Counter);

  633.         END;

  634.         $22:

  635.         BEGIN

  636.           CMDIntR[1]:= ValueReader(Counter);

  637.           Inc(Counter,CMDIntR[1].Spacing);



  638.           CMDIntR[2]:= ValueReader(Counter);

  639.           Inc(Counter,CMDIntR[2].Spacing-1);

  640.         END;

  641.         $50, $51, $52, $53:

  642.         BEGIN

  643.           CMDStrR[1]:= TextReader(Counter);

  644.           Inc(Counter,CMDStrR[1].Spacing);



  645.           For J:= 1 to 4 do

  646.           BEGIN

  647.             CMDIntR[J]:= ValueReader(Counter);

  648.             Inc(Counter,CMDIntR[J].Spacing);

  649.           END;

  650.           Dec(Counter);

  651.         END;

  652.         $54, $55:

  653.         BEGIN

  654.           CMDStrR[1]:= TextReader(Counter);

  655.           Inc(Counter,CMDStrR[1].Spacing);



  656.           CMDStrR[2]:= TextReader(Counter);

  657.           Inc(Counter,CMDStrR[2].Spacing);



  658.           For J:= 1 to 4 do

  659.           BEGIN

  660.             CMDIntR[J]:= ValueReader(Counter);

  661.             Inc(Counter,CMDIntR[J].Spacing);

  662.           END;

  663.           Dec(Counter);

  664.         END;

  665.         ELSE Dec(Counter);

  666.       END;

  667.       END;

  668.     $10:

  669.       BEGIN

  670.       SCMD:= ORD(Source[Counter]);

  671.       Inc(Counter);

  672.       Case SCMD of

  673.         $01, $03:

  674.         BEGIN

  675.           CMDIntR[1]:= ValueReader(Counter);

  676.           Inc(Counter,CMDIntR[1].Spacing-1);

  677.         END;

  678.         $02:

  679.         BEGIN

  680.           CMDIntR[1]:= ValueReader(Counter);

  681.           Inc(Counter,CMDIntR[1].Spacing);



  682.           CMDIntR[2]:= ValueReader(Counter);

  683.           Inc(Counter,CMDIntR[2].Spacing-1);

  684.         END;

  685.         ELSE Dec(Counter);

  686.       END;

  687.       END;

  688.     $13:

  689.       BEGIN

  690.       SCMD:= ORD(Source[Counter]);

  691.       Inc(Counter);

  692.       Case SCMD of

  693.         $01, $10:

  694.         BEGIN

  695.           CMDIntR[1]:= ValueReader(Counter);

  696.           Inc(Counter,CMDIntR[1].Spacing-1);

  697.         END;

  698.         $02:

  699.         BEGIN

  700.           CMDIntR[1]:= ValueReader(Counter);

  701.           Inc(Counter,CMDIntR[1].Spacing);



  702.           CMDIntR[2]:= ValueReader(Counter);

  703.           Inc(Counter,CMDIntR[2].Spacing-1);

  704.         END;

  705.         $03, $11:

  706.         BEGIN

  707.           CMDIntR[1]:= ValueReader(Counter);

  708.           Inc(Counter,CMDIntR[1].Spacing);



  709.           CMDIntR[2]:= ValueReader(Counter);

  710.           Inc(Counter,CMDIntR[2].Spacing);



  711.           CMDIntR[3]:= ValueReader(Counter);

  712.           Inc(Counter,CMDIntR[3].Spacing-1);

  713.         END;

  714.         $04:

  715.         BEGIN

  716.           CMDIntR[1]:= ValueReader(Counter);

  717.           Inc(Counter,CMDIntR[1].Spacing);



  718.           CMDIntR[2]:= ValueReader(Counter);

  719.           Inc(Counter,CMDIntR[2].Spacing);



  720.           CMDIntR[3]:= ValueReader(Counter);

  721.           Inc(Counter,CMDIntR[3].Spacing);



  722.           CMDIntR[4]:= ValueReader(Counter);

  723.           Inc(Counter,CMDIntR[4].Spacing-1);

  724.         END;

  725.         ELSE Dec(Counter);

  726.       END;

  727.       END;

  728.     $15:

  729.       BEGIN

  730.       SetLength(CMDACond,1);

  731.       CMDACond[0]:= Conditioner(Counter);

  732.       Inc(Counter,CMDACond[0].Spacing);



  733.       CMDInt[1]:= IntReader(Counter);

  734.       Inc(Counter,3);

  735.       END;

  736.     $16:

  737.       BEGIN

  738.       SCMD:= ORD(Source[Counter]);

  739.       Inc(Counter);



  740.       CMDIntR[1]:= ValueReader(Counter);

  741.       Inc(Counter,CMDIntR[1].Spacing-1);

  742.       END;

  743.     $17, $18, $2C, $31:

  744.       BEGIN

  745.       SCMD:= ORD(Source[Counter]);

  746.       Inc(Counter);

  747.       Case SCMD of

  748.         $01:

  749.         BEGIN

  750.           CMDIntR[1]:= ValueReader(Counter);

  751.           Inc(Counter,CMDIntR[1].Spacing-1);

  752.         END;

  753.         ELSE Dec(Counter);

  754.       END;

  755.       END;

  756.     $19:

  757.       BEGIN

  758.       SCMD:= ORD(Source[Counter]);

  759.       Inc(Counter);

  760.       Case SCMD of

  761.         $01, $04, $06:

  762.         BEGIN

  763.           CMDIntR[1]:= ValueReader(Counter);

  764.           Inc(Counter,CMDIntR[1].Spacing-1);

  765.         END;

  766.         $02, $05:

  767.         BEGIN

  768.           CMDIntR[1]:= ValueReader(Counter);

  769.           Inc(Counter,CMDIntR[1].Spacing);



  770.           CMDIntR[2]:= ValueReader(Counter);

  771.           Inc(Counter,CMDIntR[2].Spacing-1);

  772.         END;

  773.         $03, $10, $11, $12, $13:

  774.         BEGIN

  775.           Dec(Counter);

  776.         END;

  777.         ELSE Dec(Counter);

  778.       END;

  779.       END;

  780.     $1B, $1C:

  781.       BEGIN

  782.       CMDInt[1]:= IntReader(Counter);

  783.       Inc(Counter,3);

  784.       END;

  785.     $1D, $1E:

  786.       BEGIN

  787.       M:= ORD(Source[Counter]);

  788.       CMDInt[1]:= M;

  789.       Inc(Counter);



  790.       CMDIntR[1]:= ValueReader(Counter);

  791.       Inc(Counter,CMDIntR[1].Spacing);



  792.       SetLength(CMDAInt,M);

  793.       For L:= 0 to M-2 do

  794.         BEGIN

  795.         CMDAInt[L]:= IntReader(Counter);

  796.         Inc(Counter,4);

  797.         END;



  798.       CMDInt[2]:= IntReader(Counter);

  799.       Inc(Counter,3);

  800.       END;

  801.     $2D:

  802.       BEGIN

  803.       SCMD:= ORD(Source[Counter]);

  804.       Inc(Counter);

  805.       Case SCMD of

  806.         $01, $02:

  807.         BEGIN

  808.           CMDIntR[1]:= ValueReader(Counter);

  809.           Inc(Counter,CMDIntR[1].Spacing-1);

  810.         END;

  811.         $03, $04:

  812.         BEGIN

  813.           CMDIntR[1]:= ValueReader(Counter);

  814.           Inc(Counter,CMDIntR[1].Spacing);



  815.           CMDIntR[2]:= ValueReader(Counter);

  816.           Inc(Counter,CMDIntR[2].Spacing-1);

  817.         END;

  818.         ELSE Dec(Counter);

  819.       END;

  820.       END;

  821.     $2E:

  822.       BEGIN

  823.       SCMD:= ORD(Source[Counter]);

  824.       Inc(Counter);

  825.       Case SCMD of

  826.         $01:

  827.         BEGIN

  828.           CMDIntR[1]:= ValueReader(Counter);

  829.           Inc(Counter,CMDIntR[1].Spacing-1);

  830.         END;

  831.         $02:

  832.         BEGIN

  833.           CMDIntR[1]:= ValueReader(Counter);

  834.           Inc(Counter,CMDIntR[1].Spacing);



  835.           CMDIntR[2]:= ValueReader(Counter);

  836.           Inc(Counter,CMDIntR[2].Spacing-1);

  837.         END;

  838.         ELSE Dec(Counter);

  839.       END;

  840.       END;

  841.     $2F:

  842.       BEGIN

  843.       SCMD:= ORD(Source[Counter]);

  844.       Inc(Counter);

  845.       Case SCMD of

  846.         $01:

  847.         BEGIN

  848.           CMDIntR[1]:= ValueReader(Counter);

  849.           Inc(Counter,CMDIntR[1].Spacing);



  850.           CMDIntR[2]:= ValueReader(Counter);

  851.           Inc(Counter,CMDIntR[2].Spacing);



  852.           CMDIntR[3]:= ValueReader(Counter);

  853.           Inc(Counter,CMDIntR[3].Spacing-1);

  854.         END;

  855.         ELSE Dec(Counter);

  856.       END;

  857.       END;

  858.     $37, $39, $3B..$43, $49..$51:

  859.       BEGIN

  860.       CMDIntR[1]:= ValueReader(Counter);

  861.       Inc(Counter,CMDIntR[1].Spacing);



  862.       CMDIntR[2]:= ValueReader(Counter);

  863.       Inc(Counter,CMDIntR[2].Spacing-1);

  864.       END;

  865.     $56:

  866.       BEGIN

  867.       CMDIntR[1]:= ValueReader(Counter);

  868.       Inc(Counter,CMDIntR[1].Spacing-1);

  869.       END;

  870.     $57:

  871.       BEGIN

  872.       CMDIntR[1]:= ValueReader(Counter);

  873.       Inc(Counter,CMDIntR[1].Spacing);



  874.       CMDIntR[2]:= ValueReader(Counter);

  875.       Inc(Counter,CMDIntR[2].Spacing);



  876.       CMDIntR[3]:= ValueReader(Counter);

  877.       Inc(Counter,CMDIntR[3].Spacing-1);

  878.       END;

  879.     $58:

  880.       BEGIN

  881.       SCMD:= ORD(Source[Counter]);

  882.       Inc(Counter);

  883.       Case SCMD of

  884.         $01, $02:

  885.         BEGIN

  886.           CMDIntR[1]:= ValueReader(Counter);

  887.           Inc(Counter,CMDIntR[1].Spacing);

  888.          

  889.           SSCMD:= ORD(Source[Counter]);

  890.           Inc(Counter);

  891.           Case SSCMD of

  892.           $22:

  893.             BEGIN

  894.             L:= 0;

  895.             IF Source[Counter] = #$00 then Inc(Counter);

  896.             Repeat

  897.               SetLength(CMDASelR,L+1);

  898.               CMDASelR[L].Text:= '';



  899.               M:= ReadFString(Counter, True);

  900.               Inc(Counter,M);



  901.               IF Length(CMDACond) = 1 then

  902.               CMDASelR[L].Condition:= CMDACond[0].Condition;



  903.               For J:= 0 to High(CMDAStrR) do

  904.               CMDASelR[L].Text:= CMDASelR[L].Text + CMDAStrR[J].Text;



  905.             IF Source[Counter] = #$00 then Inc(Counter);

  906.             Until Source[Counter] = #$23;

  907.             END;

  908.           ELSE Fault(SeenCMDSelectListError,Counter);

  909.           END;

  910.         END;

  911.         $04:

  912.         BEGIN

  913.           CMDIntR[1]:= ValueReader(Counter);

  914.           Inc(Counter,CMDIntR[1].Spacing-1);

  915.         END;

  916.         ELSE Dec(Counter);

  917.       END;

  918.       END;

  919.     $59:

  920.       BEGIN

  921.       SCMD:= ORD(Source[Counter]);

  922.       Inc(Counter);



  923.       CMDIntR[1]:= ValueReader(Counter);

  924.       Inc(Counter,CMDIntR[1].Spacing);



  925.       Case SCMD of

  926.         $01:

  927.         BEGIN

  928.           CMDStrR[1]:= TextReader(Counter);

  929.           Inc(Counter,CMDStrR[1].Spacing-1);

  930.         END;

  931.         $02, $04, $05, $08:

  932.         BEGIN

  933.           CMDIntR[2]:= ValueReader(Counter);

  934.           Inc(Counter,CMDIntR[2].Spacing-1);

  935.         END;

  936.         $03, $06:

  937.         BEGIN

  938.           CMDIntR[2]:= ValueReader(Counter);

  939.           Inc(Counter,CMDIntR[2].Spacing);



  940.           CMDIntR[3]:= ValueReader(Counter);

  941.           Inc(Counter,CMDIntR[3].Spacing-1);

  942.         END;

  943.         $07:

  944.         BEGIN

  945.           Dec(Counter);

  946.         END;

  947.         ELSE Dec(Counter);

  948.       END;

  949.       END;

  950.     $5B:

  951.       BEGIN

  952.       SCMD:= ORD(Source[Counter]);

  953.       Inc(Counter);



  954.       CMDIntR[1]:= ValueReader(Counter);

  955.       Inc(Counter,CMDIntR[1].Spacing);



  956.       Case SCMD of

  957.         $01, $02:

  958.         BEGIN

  959.           L:= 0;

  960.           Repeat

  961.           SetLength(CMDAIntR,L+1);

  962.           CMDAIntR[L]:= ValueReader(Counter);

  963.           Inc(Counter,CMDAIntR[L].Spacing);

  964.           Until Source[Counter] = #$00;

  965.         END;

  966.         ELSE Dec(Counter);

  967.       END;

  968.       END;

  969.     $5C, $5D:

  970.       BEGIN

  971.       SCMD:= ORD(Source[Counter]);

  972.       Inc(Counter);



  973.       CMDIntR[1]:= ValueReader(Counter);

  974.       Inc(Counter,CMDIntR[1].Spacing);



  975.       CMDIntR[2]:= ValueReader(Counter);

  976.       Inc(Counter,CMDIntR[2].Spacing);



  977.       CMDIntR[3]:= ValueReader(Counter);

  978.       Inc(Counter,CMDIntR[3].Spacing-1);

  979.       END;

  980.     $5E:

  981.       BEGIN

  982.       SCMD:= ORD(Source[Counter]);

  983.       Inc(Counter);



  984.       CMDIntR[1]:= ValueReader(Counter);

  985.       Inc(Counter,CMDIntR[1].Spacing-1);

  986.       END;

  987.     $5F:

  988.       BEGIN

  989.       SCMD:= ORD(Source[Counter]);

  990.       Inc(Counter);

  991.       Case SCMD of

  992.         $01:

  993.         BEGIN

  994.           CMDIntR[1]:= ValueReader(Counter);

  995.           Inc(Counter,CMDIntR[1].Spacing);



  996.           L:= 0; M:= 0;

  997.           SetLength(CMDAByte,L+1);

  998.           CMDAByte[L]:= ORD(Source[Counter]);

  999.           Inc(Counter); Inc(L);

  1000.           Repeat

  1001.           Case CMDAByte[L-1] of

  1002.             $01, $11:

  1003.             BEGIN

  1004.               SetLength(CMDAIntR,M+1);

  1005.               CMDAIntR[M]:= ValueReader(Counter);

  1006.               Inc(Counter,CMDAIntR[M].Spacing); Inc(M);

  1007.             END;

  1008.             $02, $12:

  1009.             BEGIN

  1010.               SetLength(CMDAIntR,M+2);

  1011.               CMDAIntR[M]:= ValueReader(Counter);

  1012.               Inc(Counter,CMDAIntR[M].Spacing); Inc(M);

  1013.               CMDAIntR[M]:= ValueReader(Counter);

  1014.               Inc(Counter,CMDAIntR[M].Spacing); Inc(M);

  1015.             END;

  1016.             ELSE Fault(SeenCMDSumError,Counter);

  1017.           END;



  1018.           SetLength(CMDAByte,L+1);

  1019.           CMDAByte[L]:= ORD(Source[Counter]);

  1020.           Inc(Counter); Inc(L);

  1021.           Until CMDAByte[L-1] = 0;

  1022.           Dec(Counter);

  1023.         END;

  1024.         $10:

  1025.         BEGIN

  1026.           CMDIntR[1]:= ValueReader(Counter);

  1027.           Inc(Counter,CMDIntR[1].Spacing);



  1028.           CMDIntR[2]:= ValueReader(Counter);

  1029.           Inc(Counter,CMDIntR[2].Spacing);



  1030.           CMDIntR[3]:= ValueReader(Counter);

  1031.           Inc(Counter,CMDIntR[3].Spacing-1);

  1032.         END;

  1033.         $20:

  1034.         BEGIN

  1035.           M:= ORD(Source[Counter]);

  1036.           CMDInt[1]:= M;

  1037.           Inc(Counter);



  1038.           CMDIntR[1]:= ValueReader(Counter);

  1039.           Inc(Counter,CMDIntR[1].Spacing);



  1040.           CMDIntR[2]:= ValueReader(Counter);

  1041.           Inc(Counter,CMDIntR[2].Spacing);



  1042.           SetLength(CMDAIntR,M);

  1043.           For L:= 0 to M-1 do

  1044.           BEGIN

  1045.             CMDAIntR[L]:= ValueReader(Counter);

  1046.             Inc(Counter,CMDAIntR[L].Spacing);

  1047.           END;

  1048.           Dec(Counter);

  1049.         END;

  1050.         ELSE Dec(Counter);

  1051.       END;

  1052.       END;

  1053.     $60:

  1054.       BEGIN

  1055.       SCMD:= ORD(Source[Counter]);

  1056.       Inc(Counter);

  1057.       Case SCMD of

  1058.         $02, $03:

  1059.         BEGIN

  1060.           CMDIntR[1]:= ValueReader(Counter);

  1061.           Inc(Counter,CMDIntR[1].Spacing-1);

  1062.         END;

  1063.         $04:

  1064.         BEGIN

  1065.           M:= ReadFString(Counter);

  1066.           Inc(Counter, M);

  1067.         END;

  1068.         $05, $20:

  1069.         BEGIN

  1070.           Dec(Counter)

  1071.         END;

  1072.         $30, $31, $35, $36, $37:

  1073.         BEGIN

  1074.           CMDIntR[1]:= ValueReader(Counter);

  1075.           Inc(Counter,CMDIntR[1].Spacing);



  1076.           CMDIntR[2]:= ValueReader(Counter);

  1077.           Inc(Counter,CMDIntR[2].Spacing-1);

  1078.         END;

  1079.         ELSE Dec(Counter);

  1080.       END;

  1081.       END;

  1082.     $61:

  1083.       BEGIN

  1084.       SCMD:= ORD(Source[Counter]);

  1085.       Inc(Counter);

  1086.       Case SCMD of

  1087.         $01:

  1088.         BEGIN

  1089.           For L:= 1 to 10 do

  1090.           BEGIN

  1091.             CMDIntR[L]:= ValueReader(Counter);

  1092.             Inc(Counter,CMDIntR[L].Spacing);

  1093.           END;

  1094.           Dec(Counter);

  1095.         END;

  1096.         $02, $03, $20:

  1097.         BEGIN

  1098.           CMDIntR[1]:= ValueReader(Counter);

  1099.           Inc(Counter,CMDIntR[1].Spacing-1);

  1100.         END;

  1101.         $04:

  1102.         BEGIN

  1103.           Dec(Counter);

  1104.         END;

  1105.         $10,$11,$12:

  1106.         BEGIN

  1107.           CMDIntR[1]:= ValueReader(Counter);

  1108.           Inc(Counter,CMDIntR[1].Spacing);



  1109.           CMDIntR[2]:= ValueReader(Counter);

  1110.           Inc(Counter,CMDIntR[2].Spacing-1);

  1111.         END;

  1112.         $21:

  1113.         BEGIN

  1114.           CMDIntR[1]:= ValueReader(Counter);

  1115.           Inc(Counter,CMDIntR[1].Spacing);



  1116.           CMDStrR[1]:= TextReader(Counter);

  1117.           Inc(Counter,CMDStrR[1].Spacing);



  1118.           For L:= 2 to 10 do

  1119.           BEGIN

  1120.             CMDIntR[L]:= ValueReader(Counter);

  1121.             Inc(Counter,CMDIntR[L].Spacing);

  1122.           END;

  1123.           Dec(Counter);

  1124.         END;

  1125.         $24:

  1126.         BEGIN

  1127.           M:= ORD(Source[Counter]);

  1128.           CMDInt[1]:= M;

  1129.           Inc(Counter);



  1130.           SetLength(CMDAIntR,M);

  1131.           SetLength(CMDAStr,M);

  1132.           For L:= 0 to M-1 do

  1133.           BEGIN

  1134.             CMDAIntR[L]:= ValueReader(Counter);

  1135.             Inc(Counter,CMDAIntR[L].Spacing);



  1136.             J:= ReadFString(Counter);

  1137.             Inc(Counter,J);

  1138.             CMDAStr[L]:= '';

  1139.             For K:= 0 to High(CMDAStrR) do

  1140.             CMDAStr[L]:= CMDAStr[L] + CMDAStrR[K].Text;

  1141.             IF Source[Counter] = #00 then Inc(Counter);

  1142.           END;

  1143.           Dec(Counter);

  1144.         END;

  1145.         ELSE Dec(Counter);

  1146.       END;

  1147.       END;

  1148.     $63:

  1149.       BEGIN

  1150.       SCMD:= ORD(Source[Counter]);

  1151.       Inc(Counter);

  1152.       Case SCMD of

  1153.         $01:

  1154.         BEGIN

  1155.           For L:= 1 to 5 do

  1156.           BEGIN

  1157.             CMDIntR[L]:= ValueReader(Counter);

  1158.             Inc(Counter,CMDIntR[L].Spacing);

  1159.           END;

  1160.           Dec(Counter);

  1161.         END;

  1162.         $02:

  1163.         BEGIN

  1164.           For L:= 1 to 3 do

  1165.           BEGIN

  1166.             CMDIntR[L]:= ValueReader(Counter);

  1167.             Inc(Counter,CMDIntR[L].Spacing);

  1168.           END;

  1169.           Dec(Counter);

  1170.         END;

  1171.         $20:

  1172.         BEGIN

  1173.           CMDInt[1]:= ORD(Source[Counter]);

  1174.           Inc(Counter);



  1175.           CMDIntR[1]:= ValueReader(Counter);

  1176.           Inc(Counter,CMDIntR[1].Spacing-1);

  1177.         END;

  1178.         ELSE Dec(Counter);

  1179.       END;

  1180.       END;

  1181.     $64:

  1182.       BEGIN

  1183.       SCMD:= ORD(Source[Counter]);

  1184.       Inc(Counter);

  1185.       Case SCMD of

  1186.         $02, $04, $10:

  1187.         BEGIN

  1188.           For L:= 1 to 8 do

  1189.           BEGIN

  1190.             CMDIntR[L]:= ValueReader(Counter);

  1191.             Inc(Counter,CMDIntR[L].Spacing);

  1192.           END;

  1193.           Dec(Counter);

  1194.         END;

  1195.         $07, $11, $12, $20:

  1196.         BEGIN

  1197.           For L:= 1 to 5 do

  1198.           BEGIN

  1199.             CMDIntR[L]:= ValueReader(Counter);

  1200.             Inc(Counter,CMDIntR[L].Spacing);

  1201.           END;

  1202.           Dec(Counter);

  1203.         END;

  1204.         $15:

  1205.         BEGIN

  1206.           For L:= 1 to 9 do

  1207.           BEGIN

  1208.             CMDIntR[L]:= ValueReader(Counter);

  1209.             Inc(Counter,CMDIntR[L].Spacing);

  1210.           END;

  1211.           Dec(Counter);

  1212.         END;

  1213.         $30:

  1214.         BEGIN

  1215.           For L:= 1 to 10 do

  1216.           BEGIN

  1217.             CMDIntR[L]:= ValueReader(Counter);

  1218.             Inc(Counter,CMDIntR[L].Spacing);

  1219.           END;

  1220.           Dec(Counter);

  1221.         END;

  1222.         $32:

  1223.         BEGIN

  1224.           For L:= 1 to 16 do

  1225.           BEGIN

  1226.             CMDIntR[L]:= ValueReader(Counter);

  1227.             Inc(Counter,CMDIntR[L].Spacing);

  1228.           END;

  1229.           Dec(Counter);

  1230.         END;

  1231.         ELSE Dec(Counter);

  1232.       END;

  1233.       END;

  1234.     $66:

  1235.       BEGIN

  1236.       SCMD:= ORD(Source[Counter]);

  1237.       Inc(Counter);



  1238.       For L:= 1 to 6 do

  1239.         BEGIN

  1240.         CMDIntR[L]:= ValueReader(Counter);

  1241.         Inc(Counter,CMDIntR[L].Spacing);

  1242.         END;



  1243.       J:= ReadFString(Counter);

  1244.       CMDStr[1]:= '';

  1245.       For L:= 1 to High(CMDAStrR) do

  1246.         BEGIN

  1247.         CMDStr[1]:= CMDStr[1] + CMDAStrR[L].Text;

  1248.         END;

  1249.       Inc(Counter,J-1);

  1250.       END;

  1251.     $67:

  1252.       BEGIN

  1253.       SCMD:= ORD(Source[Counter]);

  1254.       Inc(Counter);

  1255.       Case SCMD of

  1256.         $00:

  1257.         BEGIN

  1258.           For L:= 1 to 6 do

  1259.           BEGIN

  1260.             CMDIntR[L]:= ValueReader(Counter);

  1261.             Inc(Counter,CMDIntR[L].Spacing);

  1262.           END;

  1263.           Dec(Counter);

  1264.         END;

  1265.         $01:

  1266.         BEGIN

  1267.           For L:= 1 to 9 do  { 8 for earlier than 3217D }

  1268.           BEGIN

  1269.             CMDIntR[L]:= ValueReader(Counter);

  1270.             Inc(Counter,CMDIntR[L].Spacing);

  1271.           END;

  1272.           Dec(Counter);

  1273.         END;

  1274.         $02:

  1275.         BEGIN

  1276.           For L:= 1 to 9 do { 8 for earlier than 3216M }

  1277.           BEGIN

  1278.             CMDIntR[L]:= ValueReader(Counter);

  1279.             Inc(Counter,CMDIntR[L].Spacing);

  1280.           END;

  1281.           Dec(Counter);

  1282.         END;

  1283.         $03:

  1284.         BEGIN

  1285.           For L:= 1 to 11 do

  1286.           BEGIN

  1287.             CMDIntR[L]:= ValueReader(Counter);

  1288.             Inc(Counter,CMDIntR[L].Spacing);

  1289.           END;

  1290.           Dec(Counter);

  1291.         END;

  1292.         $05:

  1293.         BEGIN

  1294.           For L:= 1 to 8 do

  1295.           BEGIN

  1296.             CMDIntR[L]:= ValueReader(Counter);

  1297.             Inc(Counter,CMDIntR[L].Spacing);

  1298.           END;

  1299.           Dec(Counter);

  1300.         END;

  1301.         $08:

  1302.         BEGIN

  1303.           For L:= 1 to 9 do

  1304.           BEGIN

  1305.             CMDIntR[L]:= ValueReader(Counter);

  1306.             Inc(Counter,CMDIntR[L].Spacing);

  1307.           END;

  1308.           Dec(Counter);

  1309.         END;

  1310.         $11:

  1311.         BEGIN

  1312.           For L:= 1 to 3 do  { 2 for earlier than 3217D }

  1313.           BEGIN

  1314.             CMDIntR[L]:= ValueReader(Counter);

  1315.             Inc(Counter,CMDIntR[L].Spacing);

  1316.           END;

  1317.           Dec(Counter);

  1318.         END;

  1319.         $12:

  1320.         BEGIN

  1321.           For L:= 1 to 3 do  { 2 for earlier than 3216M }

  1322.           BEGIN

  1323.             CMDIntR[L]:= ValueReader(Counter);

  1324.             Inc(Counter,CMDIntR[L].Spacing);

  1325.           END;

  1326.           Dec(Counter);

  1327.         END;

  1328.         $20:

  1329.         BEGIN

  1330.           For L:= 1 to 15 do

  1331.           BEGIN

  1332.             CMDIntR[L]:= ValueReader(Counter);

  1333.             Inc(Counter,CMDIntR[L].Spacing);

  1334.           END;

  1335.           Dec(Counter);

  1336.         END;

  1337.         $21:

  1338.         BEGIN

  1339.           For L:= 1 to 16 do

  1340.           BEGIN

  1341.             CMDIntR[L]:= ValueReader(Counter);

  1342.             Inc(Counter,CMDIntR[L].Spacing);

  1343.           END;

  1344.           Dec(Counter);

  1345.         END;

  1346.         $22:

  1347.         BEGIN

  1348.           For L:= 1 to 18 do

  1349.           BEGIN

  1350.             CMDIntR[L]:= ValueReader(Counter);

  1351.             Inc(Counter,CMDIntR[L].Spacing);

  1352.           END;

  1353.           Dec(Counter);

  1354.         END;

  1355.         ELSE Dec(Counter);

  1356.       END;

  1357.       END;

  1358.     $68:

  1359.       BEGIN

  1360.       SCMD:= ORD(Source[Counter]);

  1361.       Inc(Counter);

  1362.       Case SCMD of

  1363.         $01:

  1364.         BEGIN

  1365.           For L:= 1 to 4 do

  1366.           BEGIN

  1367.             CMDIntR[L]:= ValueReader(Counter);

  1368.             Inc(Counter,CMDIntR[L].Spacing);

  1369.           END;

  1370.           Dec(Counter);

  1371.         END;

  1372.         $10:

  1373.         BEGIN

  1374.           For L:= 1 to 5 do

  1375.           BEGIN

  1376.             CMDIntR[L]:= ValueReader(Counter);

  1377.             Inc(Counter,CMDIntR[L].Spacing);

  1378.           END;

  1379.           Dec(Counter);

  1380.         END;

  1381.         ELSE Dec(Counter);

  1382.       END;

  1383.       END;

  1384.     $69:

  1385.       BEGIN

  1386.       CMDInt[1]:= ORD(Source[Counter]);

  1387.       Inc(Counter);



  1388.       CMDInt[2]:= ORD(Source[Counter]);

  1389.       Inc(Counter);



  1390.       For L:= 1 to 6 do

  1391.         BEGIN

  1392.         CMDIntR[L]:= ValueReader(Counter);

  1393.         Inc(Counter,CMDIntR[L].Spacing);

  1394.         END;

  1395.       Dec(Counter);

  1396.       END;

  1397.     $6A:

  1398.       BEGIN

  1399.       SCMD:= ORD(Source[Counter]);

  1400.       Inc(Counter);

  1401.       Case SCMD of

  1402.         $10, $20, $30:

  1403.         BEGIN

  1404.           CMDInt[1]:= ORD(Source[Counter]);

  1405.           Inc(Counter);



  1406.           M:= ORD(Source[Counter]);

  1407.           CMDInt[2]:= M;

  1408.           Inc(Counter);



  1409.           CMDIntR[1]:= ValueReader(Counter);

  1410.           Inc(Counter,CMDIntR[1].Spacing);



  1411.           CMDIntR[2]:= ValueReader(Counter);

  1412.           Inc(Counter,CMDIntR[2].Spacing);



  1413.           CMDIntR[3]:= ValueReader(Counter);

  1414.           Inc(Counter,CMDIntR[3].Spacing);



  1415.           IF SCMD = $30 then

  1416.           BEGIN

  1417.             CMDIntR[4]:= ValueReader(Counter);

  1418.             Inc(Counter,CMDIntR[4].Spacing);

  1419.           END;



  1420.           SetLength(CMDAIntR, M);

  1421.           SetLength(CMDAStrR, M);



  1422.           For L:= 0 to M-1 do

  1423.           BEGIN

  1424.             CMDAStrR[L]:= TextReader(Counter);

  1425.             Inc(Counter,CMDAStrR[L].Spacing);



  1426.             CMDAIntR[L]:= ValueReader(Counter);

  1427.             Inc(Counter,CMDAIntR[L].Spacing);

  1428.           END;

  1429.           { 1 Byte Extra Intended }

  1430.         END;

  1431.         $03, $04:

  1432.         BEGIN

  1433.           M:= ORD(Source[Counter]);

  1434.           CMDInt[1]:= M;

  1435.           Inc(Counter);



  1436.           CMDIntR[1]:= ValueReader(Counter);

  1437.           Inc(Counter,CMDIntR[1].Spacing);



  1438.           CMDIntR[2]:= ValueReader(Counter);

  1439.           Inc(Counter,CMDIntR[2].Spacing);



  1440.           SetLength(CMDAIntR, M);

  1441.           SetLength(CMDAStrR, M);



  1442.           For L:= 0 to M-1 do

  1443.           BEGIN

  1444.             CMDAStrR[L]:= TextReader(Counter);

  1445.             Inc(Counter,CMDAStrR[L].Spacing);



  1446.             CMDAIntR[L]:= ValueReader(Counter);

  1447.             Inc(Counter,CMDAIntR[L].Spacing);

  1448.           END;

  1449.           { 1 Byte Extra Intended }

  1450.         END;

  1451.         $05:

  1452.         BEGIN

  1453.           Dec(Counter);

  1454.         END;

  1455.         ELSE Dec(Counter);

  1456.       END;

  1457.       END;

  1458.     $6C:

  1459.       BEGIN

  1460.       SCMD:= ORD(Source[Counter]);

  1461.       Inc(Counter);

  1462.       Case SCMD of

  1463.         $02:

  1464.         BEGIN

  1465.           CMDStrR[1]:= TextReader(Counter);

  1466.           Inc(Counter,CMDStrR[1].Spacing);



  1467.           CMDStrR[2]:= TextReader(Counter);

  1468.           Inc(Counter,CMDStrR[2].Spacing-1);

  1469.         END;

  1470.         $03:

  1471.         BEGIN

  1472.           Dec(Counter);

  1473.         END;

  1474.         $04, $20:

  1475.         BEGIN

  1476.           CMDIntR[1]:= ValueReader(Counter);

  1477.           Inc(Counter,CMDIntR[1].Spacing);



  1478.           CMDIntR[2]:= ValueReader(Counter);

  1479.           Inc(Counter,CMDIntR[2].Spacing-1);

  1480.         END;

  1481.         $05:

  1482.         BEGIN

  1483.           CMDIntR[1]:= ValueReader(Counter);

  1484.           Inc(Counter,CMDIntR[1].Spacing);



  1485.           CMDIntR[2]:= ValueReader(Counter);

  1486.           Inc(Counter,CMDIntR[2].Spacing);



  1487.           CMDIntR[3]:= ValueReader(Counter);

  1488.           Inc(Counter,CMDIntR[3].Spacing);



  1489.           CMDIntR[4]:= ValueReader(Counter);

  1490.           Inc(Counter,CMDIntR[4].Spacing-1);

  1491.         END;

  1492.         $10, $11:

  1493.         BEGIN

  1494.           CMDIntR[1]:= ValueReader(Counter);

  1495.           Inc(Counter,CMDIntR[1].Spacing-1);

  1496.         END;

  1497.         $15:

  1498.         BEGIN

  1499.           CMDIntR[1]:= ValueReader(Counter);

  1500.           Inc(Counter,CMDIntR[1].Spacing);



  1501.           CMDIntR[2]:= ValueReader(Counter);

  1502.           Inc(Counter,CMDIntR[2].Spacing);



  1503.           CMDIntR[3]:= ValueReader(Counter);

  1504.           Inc(Counter,CMDIntR[3].Spacing-1);

  1505.         END;

  1506.         ELSE Dec(Counter);

  1507.       END;

  1508.       END;

  1509.     $6D:

  1510.       BEGIN

  1511.       SCMD:= ORD(Source[Counter]);

  1512.       Inc(Counter);

  1513.       Case SCMD of

  1514.         $01, $02:

  1515.         BEGIN

  1516.           CMDIntR[1]:= ValueReader(Counter);

  1517.           Inc(Counter,CMDIntR[1].Spacing);



  1518.           CMDIntR[2]:= ValueReader(Counter);

  1519.           Inc(Counter,CMDIntR[2].Spacing);



  1520.           CMDIntR[3]:= ValueReader(Counter);

  1521.           Inc(Counter,CMDIntR[3].Spacing-1);

  1522.         END;

  1523.         $03, $20, $21:

  1524.         BEGIN

  1525.           Dec(Counter);

  1526.         END;

  1527.         ELSE Dec(Counter);

  1528.       END;

  1529.       END;

  1530.     $6E:

  1531.       BEGIN

  1532.       SCMD:= ORD(Source[Counter]);

  1533.       Inc(Counter);

  1534.       Case SCMD of

  1535.         $01..$04:

  1536.         BEGIN

  1537.           CMDIntR[1]:= ValueReader(Counter);

  1538.           Inc(Counter,CMDIntR[1].Spacing-1);

  1539.         END;

  1540.         $05:

  1541.         BEGIN

  1542.           CMDIntR[1]:= ValueReader(Counter);

  1543.           Inc(Counter,CMDIntR[1].Spacing);



  1544.           CMDIntR[2]:= ValueReader(Counter);

  1545.           Inc(Counter,CMDIntR[2].Spacing);



  1546.           CMDIntR[3]:= ValueReader(Counter);

  1547.           Inc(Counter,CMDIntR[3].Spacing-1);

  1548.         END;

  1549.         ELSE Dec(Counter);

  1550.       END;

  1551.       END;

  1552.     $6F:

  1553.       BEGIN

  1554.       CMDIntR[1]:= ValueReader(Counter);

  1555.       Inc(Counter,CMDIntR[1].Spacing);



  1556.       CMDIntR[2]:= ValueReader(Counter);

  1557.       Inc(Counter,CMDIntR[2].Spacing);



  1558.       CMDIntR[3]:= ValueReader(Counter);

  1559.       Inc(Counter,CMDIntR[3].Spacing);



  1560.       CMDIntR[4]:= ValueReader(Counter);

  1561.       Inc(Counter,CMDIntR[4].Spacing-1);

  1562.       END;

  1563.     $70:

  1564.       BEGIN

  1565.       SCMD:= ORD(Source[Counter]);

  1566.       Inc(Counter);

  1567.       Case SCMD of

  1568.         $01, $02:

  1569.         BEGIN

  1570.           CMDIntR[1]:= ValueReader(Counter);

  1571.           Inc(Counter,CMDIntR[1].Spacing);



  1572.           CMDIntR[2]:= ValueReader(Counter);

  1573.           Inc(Counter,CMDIntR[2].Spacing);



  1574.           CMDIntR[3]:= ValueReader(Counter);

  1575.           Inc(Counter,CMDIntR[3].Spacing);



  1576.           CMDIntR[4]:= ValueReader(Counter);

  1577.           Inc(Counter,CMDIntR[4].Spacing-1);

  1578.         END;

  1579.         $03..$06, $10, $11:

  1580.         BEGIN

  1581.           CMDIntR[1]:= ValueReader(Counter);

  1582.           Inc(Counter,CMDIntR[1].Spacing-1);

  1583.         END;

  1584.         ELSE Dec(Counter);

  1585.       END;

  1586.       END;

  1587.     $72:

  1588.       BEGIN

  1589.       SCMD:= ORD(Source[Counter]);

  1590.       Inc(Counter);

  1591.       Case SCMD of

  1592.         $01..$05, $11..$15:

  1593.         BEGIN

  1594.           CMDIntR[1]:= ValueReader(Counter);

  1595.           Inc(Counter,CMDIntR[1].Spacing);



  1596.           CMDIntR[2]:= ValueReader(Counter);

  1597.           Inc(Counter,CMDIntR[2].Spacing-1);

  1598.         END;

  1599.         ELSE Dec(Counter);

  1600.       END;

  1601.       END;

  1602.     $73:

  1603.       BEGIN

  1604.       SCMD:= ORD(Source[Counter]);

  1605.       Inc(Counter);

  1606.       Case SCMD of

  1607.         $01, $02, $05, $06, $31:

  1608.         BEGIN

  1609.           CMDIntR[1]:= ValueReader(Counter);

  1610.           Inc(Counter,CMDIntR[1].Spacing);



  1611.           CMDIntR[2]:= ValueReader(Counter);

  1612.           Inc(Counter,CMDIntR[2].Spacing-1);

  1613.         END;

  1614.         $10..$13, $16..$30, $32..$34:

  1615.         BEGIN

  1616.           CMDIntR[1]:= ValueReader(Counter);

  1617.           Inc(Counter,CMDIntR[1].Spacing-1);

  1618.         END;

  1619.         ELSE Dec(Counter);

  1620.       END;

  1621.       END;

  1622.     $74:

  1623.       BEGIN

  1624.       SCMD:= ORD(Source[Counter]);

  1625.       Inc(Counter);

  1626.       Case SCMD of

  1627.         $01, $02:

  1628.         BEGIN

  1629.           CMDIntR[1]:= ValueReader(Counter);

  1630.           Inc(Counter,CMDIntR[1].Spacing-1);

  1631.         END;

  1632.         $03, $04:

  1633.         BEGIN

  1634.           CMDIntR[1]:= ValueReader(Counter);

  1635.           Inc(Counter,CMDIntR[1].Spacing);



  1636.           CMDIntR[2]:= ValueReader(Counter);

  1637.           Inc(Counter,CMDIntR[2].Spacing-1);

  1638.         END;

  1639.         ELSE Dec(Counter);

  1640.       END;

  1641.       END;

  1642.     $75:

  1643.       BEGIN

  1644.       SCMD:= ORD(Source[Counter]);

  1645.       Inc(Counter);



  1646.       CMDIntR[1]:= ValueReader(Counter);

  1647.       Inc(Counter,CMDIntR[1].Spacing-1);

  1648.       END;

  1649.     $76:

  1650.       BEGIN

  1651.       SCMD:= ORD(Source[Counter]);

  1652.       Inc(Counter);

  1653.       Case SCMD of

  1654.         $01, $02:

  1655.         BEGIN

  1656.           CMDIntR[1]:= ValueReader(Counter);

  1657.           Inc(Counter,CMDIntR[1].Spacing-1);

  1658.         END;

  1659.         $04, $05:

  1660.         BEGIN

  1661.           Dec(Counter);

  1662.         END;

  1663.         ELSE Dec(Counter);

  1664.       END;

  1665.       END;

  1666.     $FE, $FF:

  1667.       BEGIN

  1668.       CMDInt[1]:= IntReader(Counter);

  1669.       IF (CMDInt[1] >= 0) AND (CMDInt[1] < LineMax) then

  1670.         BEGIN

  1671.         Inc(Counter,4);

  1672.         CMDStrR[1]:= TextReader(Counter);

  1673.         Inc(Counter,CMDStrR[1].Spacing-1);



  1674.         IF Assigned(PutLine) then

  1675.           IF CMD = $FE then PutLine(CMDInt[1],Han2Zen(CMDStrR[1].Text))

  1676.                       else PutLine(CMDInt[1],CMDStrR[1].Text);

  1677.         END

  1678.       else

  1679.         BEGIN

  1680.         CMDStrR[1]:= TextReader(Counter);

  1681.         Inc(Counter,CMDStrR[1].Spacing-1);

  1682.         END;

  1683.       END;

  1684.     ELSE

  1685.       BEGIN

  1686.       Dec(Counter);

  1687.       END;

  1688.     END;

  1689.   Finally

  1690.     Source:= Copy(Source,1,Counter);

  1691.     Delete(CMDString,1,Counter);

  1692.   END;

  1693.   END;



  1694. Destructor RScenCMD.Destroy;

  1695.   Var

  1696.   Count: Integer;

  1697.   BEGIN

  1698.   SetLength(CMDAInt,0);

  1699.   SetLength(CMDAByte,0);



  1700.   SetLength(CMDAIntR,0);

  1701.   SetLength(CMDAIntDR,0,0);

  1702.   SetLength(CMDAStrR,0);



  1703.   For Count:= High(CMDACond) downto 0 do

  1704.     SetLength(CMDACond[Count].Condition,0);

  1705.   SetLength(CMDACond,0);



  1706.   For Count:= High(CMDASelR) downto 0 do

  1707.     SetLength(CMDASelR[Count].Condition,0);

  1708.   SetLength(CMDASelR,0);



  1709.   Inherited;

  1710.   END;



  1711. Function RScenCMD.IntReader(Pos: Integer): Integer;

  1712.   Var

  1713.   Cache: RMixInt;

  1714.   BEGIN

  1715.   Cache.Bytes[0]:= Source[Pos];

  1716.   Cache.Bytes[1]:= Source[Pos+1];

  1717.   Cache.Bytes[2]:= Source[Pos+2];

  1718.   Cache.Bytes[3]:= Source[Pos+3];

  1719.   Result:= Cache.AInt;

  1720.   END;



  1721. Function RScenCMD.ValueReader(Pos: Integer): RValue;

  1722.   Var

  1723.   VHeader: Byte;

  1724.   Count: Byte;

  1725.   BEGIN

  1726.   With Result do

  1727.     BEGIN

  1728.     VHeader:= ORD(Source[Pos]);

  1729.     Spacing:= ((VHeader SHR 4) AND $7);

  1730.     IF (Spacing = 0) OR (Spacing > 5) then Fault(SeenCMDValueHeaderError,Pos);



  1731.     IsRegister:= (VHeader AND $80) <> 0;

  1732.     Value:= 0;

  1733.     For Count:= 1 to Spacing - 1 do

  1734.       Value:= (Value SHL 8) + ORD(Source[Pos+Count]);

  1735.     Value:= (Value SHL 4) OR (VHeader AND $F);

  1736.     END;

  1737.   END;



  1738. Function RScenCMD.TextReader(Pos: Integer): RText;

  1739.   Var

  1740.   ValueCache: RValue;

  1741.   BEGIN

  1742.   With Result do

  1743.     BEGIN

  1744.     Spacing:= 1;

  1745.     IF Source[Pos] = '@' then

  1746.       BEGIN

  1747.       IsRegister:= True;

  1748.       ValueCache:= ValueReader(Pos+Spacing);

  1749.       Inc(Spacing,ValueCache.Spacing);

  1750.       IsIndirect:= ValueCache.IsRegister;

  1751.       Value:= ValueCache.Value;

  1752.       END

  1753.     else

  1754.       BEGIN

  1755.       IsRegister:= False;

  1756.       Text:= PChar(Copy(Source,Pos,Length(Source)));

  1757.       Inc(Spacing,Length(Text));

  1758.       END;

  1759.     END;

  1760.   END;



  1761. Function RScenCMD.Conditioner(Pos: Integer; ExpectAttr: Boolean): RCond;

  1762.   Const

  1763.   MAXLevels = 256;

  1764.   Var

  1765.   LevelCnt, OutCnt: Integer;

  1766.   AppendCond: Array[1..MAXLevels] of Byte;

  1767.   PastChar: Char;

  1768.   AttrVal: RValue;

  1769.   CMPVal1, CMPVal2: RValue;



  1770.   BEGIN

  1771.   With Result do

  1772.     BEGIN

  1773.     Spacing:= 0;

  1774.     LevelCnt:= 0;

  1775.     OutCnt:= 0;

  1776.     PastChar:= #$00;

  1777.     Repeat

  1778.       Case Source[Pos+Spacing] of

  1779.       #$28:

  1780.         BEGIN

  1781.         Inc(LevelCnt);

  1782.         IF LevelCnt > 256 then Fault(SeenCMDConditionLevelOverflow,Pos+Spacing);

  1783.         AppendCond[LevelCnt]:= 0;

  1784.         END;

  1785.       #$29:

  1786.         BEGIN

  1787.         IF LevelCnt >= 1 then

  1788.           IF AppendCond[LevelCnt] <> 0 then

  1789.           BEGIN

  1790.             SetLength(Condition,OutCnt+1);

  1791.             Condition[OutCnt].CType:= CPLOp;

  1792.             Condition[OutCnt].CValue:= AppendCond[LevelCnt];

  1793.             Inc(OutCnt);

  1794.           END;

  1795.         Dec(LevelCnt);

  1796.         END;

  1797.       #$26, #$27:

  1798.         BEGIN

  1799.         IF LevelCnt < 0 then Fault(SeenCMDConditionLOperPosError,Pos+Spacing);

  1800.         IF AppendCond[LevelCnt] <> 0 then                // Slack Logic!! >_<

  1801.           BEGIN

  1802.           SetLength(Condition,OutCnt+1);

  1803.           Condition[OutCnt].CType:= CPLOp;

  1804.           Condition[OutCnt].CValue:= AppendCond[LevelCnt];

  1805.           Inc(OutCnt);

  1806.           END;

  1807.         AppendCond[LevelCnt]:= ORD(Source[Pos+Spacing]);

  1808.         END;

  1809.       #$58:

  1810.         BEGIN

  1811.         IF NOT ExpectAttr then Fault(SeenCMDConditionPropertyUnExp,Pos+Spacing);

  1812.         IF PastChar <> #$29 then Fault(SeenCMDConditionPropertyPosError,Pos+Spacing);



  1813.         SetLength(Condition,OutCnt+2);

  1814.         Condition[OutCnt+1].CType:= CPAttr;

  1815.         Condition[OutCnt+1].CValue:= ORD(Source[Pos+Spacing+1]);



  1816.         Case Source[Pos+Spacing+1] of

  1817.           #$20, #$22:

  1818.           BEGIN

  1819.             AttrVal:= ValueReader(Pos+Spacing+2);

  1820.             Condition[OutCnt].CType:= CPImm;

  1821.             Condition[OutCnt].CValue:= AttrVal.Value;

  1822.           END;

  1823.           #$21:

  1824.           BEGIN

  1825.             AttrVal.Spacing:= 0;

  1826.             Condition[OutCnt].CType:= CPImm;

  1827.             Condition[OutCnt].CValue:= 0;

  1828.           END;

  1829.           ELSE Fault(SeenCMDConditionPropertyError,Pos+Spacing);

  1830.         END;



  1831.         Inc(Spacing,AttrVal.Spacing+1);

  1832.         Inc(OutCnt,2);

  1833.         END;

  1834.         #$36..#$3B, #$41..#$49, #$4F..#$55:

  1835.         BEGIN

  1836.           CMPVal1:= ValueReader(Pos+Spacing+1);

  1837.           CMPVal2:= ValueReader(Pos+Spacing+CMPVal1.Spacing+1);



  1838.           SetLength(Condition,OutCnt+3);

  1839.           Condition[OutCnt].CValue:= CMPVal1.Value;

  1840.           Condition[OutCnt+1].CValue:= CMPVal2.Value;

  1841.           Condition[OutCnt+2].CValue:= ORD(Source[Pos+Spacing]);

  1842.           Condition[OutCnt+2].CType:= CPLOp;

  1843.           Case Source[Pos+Spacing] of

  1844.           #$36, #$37:

  1845.             BEGIN

  1846.             Condition[OutCnt].CType:= CPRBit;

  1847.             Condition[OutCnt+1].CType:= CPImm;

  1848.             END;

  1849.           #$38, #$39:

  1850.             BEGIN

  1851.             Condition[OutCnt].CType:= CPRBit;

  1852.             Condition[OutCnt+1].CType:= CPRBit

  1853.             END;

  1854.           #$3A, #$3B, #$41..#$47:

  1855.             BEGIN

  1856.             Condition[OutCnt].CType:= CPRInt;

  1857.             Condition[OutCnt+1].CType:= CPImm;

  1858.             END;

  1859.           #$48, #$49, #$4F..#$55:

  1860.             BEGIN

  1861.             Condition[OutCnt].CType:= CPRInt;

  1862.             Condition[OutCnt+1].CType:= CPRInt;

  1863.             END;

  1864.           END;

  1865.           Inc(Spacing,CMPVal1.Spacing+CMPVal2.Spacing);

  1866.           Inc(OutCnt,3);

  1867.         END;

  1868.       ELSE Fault(SeenCMDConditionError,Pos+Spacing);

  1869.       END;

  1870.       PastChar:= Source[Pos+Spacing];

  1871.       Inc(Spacing);

  1872.     Until (LevelCnt <= 0);

  1873.     END;

  1874.   END;



  1875. Function RScenCMD.ReadFString(Pos: Integer; ExpectAttr: Boolean = False): Integer;

  1876.   Var

  1877.   CondCounter: Integer;

  1878.   TextCounter: Integer;

  1879.   ValueCache: RValue;

  1880.   BEGIN

  1881.   SetLength(CMDAStrR,0);

  1882.   For CondCounter:= High(CMDACond) downto 0 do

  1883.     SetLength(CMDACond[CondCounter].Condition,0);

  1884.   SetLength(CMDACond,0);



  1885.   CondCounter:= 0;

  1886.   TextCounter:= 0;

  1887.   Result:= 0;



  1888.   Repeat

  1889.     Case Source[Pos+Result] of

  1890.     #$FF, #$FE:

  1891.       BEGIN

  1892.       SetLength(CMDAStrR,TextCounter+1);

  1893.       CMDAStrR[TextCounter].IsRegister:= False;

  1894.       CMDAStrR[TextCounter].Text:= PChar(Copy(Source,Pos+Result+1,Length(Source)));

  1895.       CMDAStrR[TextCounter].Spacing:= Length(CMDAStrR[TextCounter].Text);

  1896.       IF Source[Pos+Result] = #$FE then

  1897.         CMDAStrR[TextCounter].Text:= Han2Zen(CMDAStrR[TextCounter].Text);

  1898.       Inc(Result,CMDAStrR[TextCounter].Spacing+1);

  1899.       Inc(TextCounter);

  1900.       END;

  1901.     #$FD:

  1902.       BEGIN

  1903.       SetLength(CMDAStrR,TextCounter+1);

  1904.       CMDAStrR[TextCounter].IsRegister:= True;

  1905.       ValueCache:= ValueReader(Pos+Result+1);

  1906.       CMDAStrR[TextCounter].Spacing:= ValueCache.Spacing;

  1907.       CMDAStrR[TextCounter].IsIndirect:= ValueCache.IsRegister;

  1908.       CMDAStrR[TextCounter].Value:= ValueCache.Value;

  1909.       Inc(Result,CMDAStrR[TextCounter].Spacing+1);

  1910.       Inc(TextCounter);

  1911.       END;

  1912.     #$28:

  1913.       BEGIN

  1914.       IF CondCounter <> 0 then Fault(SeenCMDFStringConditionError,Pos+Result);

  1915.       SetLength(CMDACond,CondCounter+1);

  1916.       CMDACond[CondCounter]:= Conditioner(Pos+Result,ExpectAttr);

  1917.       Inc(Result,CMDACond[CondCounter].Spacing);

  1918.       Inc(CondCounter);

  1919.       END;

  1920.     #$10:

  1921.       BEGIN

  1922.       Inc(Result);

  1923.       Case Source[Result] of

  1924.         #$03:

  1925.         BEGIN

  1926.           SetLength(CMDAStrR,TextCounter+1);

  1927.           CMDAStrR[TextCounter].IsRegister:= True;

  1928.           ValueCache:= ValueReader(Pos+Result+1);

  1929.           CMDAStrR[TextCounter].Spacing:= ValueCache.Spacing;

  1930.           CMDAStrR[TextCounter].IsIndirect:= ValueCache.IsRegister;

  1931.           CMDAStrR[TextCounter].Value:= ValueCache.Value;

  1932.           Inc(Result,CMDAStrR[TextCounter].Spacing+1);

  1933.           Inc(TextCounter);

  1934.         END;

  1935.         ELSE Fault(SeenCMDFString10hSubCMDError,Pos+Result);

  1936.       END;

  1937.       END;

  1938.     ELSE Break; // Fault(SeenCMDFStringError,Pos+Result); { Allow for NO String }

  1939.     END;

  1940.     Inc(Result);

  1941.   Until Source[Pos+Result] = #0;

  1942.   END;



  1943. Function RScenCMD.Han2Zen(StrIn: ANSIString): ANSIString;

  1944.   Const

  1945.   H2ZTable: Array[#$20..#$7F] of Char = (

  1946.     #$40, #$49, #$68, #$94, #$90, #$93, #$95, #$66, #$69, #$6A, #$96, #$7B, #$43, #$7C, #$44, #$5E,

  1947.     #$4F, #$50, #$51, #$52, #$53, #$54, #$55, #$56, #$57, #$58, #$46, #$47, #$83, #$81, #$84, #$48,

  1948.     #$97, #$60, #$61, #$62, #$63, #$64, #$65, #$66, #$67, #$68, #$69, #$6A, #$6B, #$6C, #$6D, #$6E,

  1949.     #$6F, #$70, #$71, #$72, #$73, #$74, #$75, #$76, #$77, #$78, #$79, #$6D, #$8F, #$6E, #$4F, #$51,

  1950.     #$65, #$81, #$82, #$83, #$84, #$85, #$86, #$87, #$88, #$89, #$8A, #$8B, #$8C, #$8D, #$8E, #$8F,

  1951.     #$90, #$91, #$92, #$93, #$94, #$95, #$96, #$97, #$98, #$99, #$9A, #$6F, #$62, #$70, #$60, #$45

  1952.     );

  1953.   Var

  1954.   Count, Len: Integer;

  1955.   Ch: Char;

  1956.   BEGIN

  1957.   Len:= Length(StrIn);

  1958.   Result:= '';

  1959.   For Count:= 1 to Len do

  1960.     BEGIN

  1961.     Ch:= StrIn[Count];

  1962.     IF Ch in [#$20..#$80] then

  1963.       IF (Ch in ['0'..'9']) OR (Ch in ['0'..'9']) OR (Ch in ['0'..'9']) then

  1964.       Result:= Result + #$82 + H2ZTable[Ch]

  1965.       else Result:= Result + #$81 + H2ZTable[Ch]

  1966.     else Result:= Result + Ch;

  1967.     END;

  1968.   END;



  1969. Function RScenCMD.Explain(Detail: Boolean): String;

  1970.   BEGIN

  1971.   IF Source = '' then Result:= SeenCMDExpEmpty;



  1972.   Detail:= False;

  1973.   IF NOT Detail then

  1974.     Case CMD of

  1975.     $00: Result:= SeenCMDExpCat01;

  1976.     $01: Result:= SeenCMDExpCat02;

  1977.     $02: Result:= SeenCMDExpCat03;

  1978.     $03: Result:= SeenCMDExpCat04;

  1979.     $04: Result:= SeenCMDExpCat05;

  1980.     $05: Result:= SeenCMDExpCat06;

  1981.     $0B: Result:= SeenCMDExpCat07;

  1982.     $0C: Result:= SeenCMDExpCat08;

  1983.     $0E: Result:= SeenCMDExpCat09;

  1984.     $10: Result:= SeenCMDExpCat10;

  1985.     $13: Result:= SeenCMDExpCat11;

  1986.     $15: Result:= SeenCMDExpCat12;

  1987.     $16: Result:= SeenCMDExpCat13;

  1988.     $17: Result:= SeenCMDExpCat14;

  1989.     $18: Result:= SeenCMDExpCat15;

  1990.     $19: Result:= SeenCMDExpCat16;

  1991.     $1B: Result:= SeenCMDExpCat17;

  1992.     $1C: Result:= SeenCMDExpCat18;

  1993.     $1D: Result:= SeenCMDExpCat19;

  1994.     $1E: Result:= SeenCMDExpCat20;

  1995.     $20: Result:= SeenCMDExpCat21;

  1996.     $37: Result:= SeenCMDExpCat22;

  1997.     $39: Result:= SeenCMDExpCat23;

  1998.     $3B: Result:= SeenCMDExpCat24;

  1999.     $3C: Result:= SeenCMDExpCat25;

  2000.     $3D: Result:= SeenCMDExpCat26;

  2001.     $3E: Result:= SeenCMDExpCat27;

  2002.     $3F: Result:= SeenCMDExpCat28;

  2003.     $40: Result:= SeenCMDExpCat29;

  2004.     $41: Result:= SeenCMDExpCat30;

  2005.     $42: Result:= SeenCMDExpCat31;

  2006.     $43: Result:= SeenCMDExpCat32;

  2007.     $49: Result:= SeenCMDExpCat33;

  2008.     $4A: Result:= SeenCMDExpCat34;

  2009.     $4B: Result:= SeenCMDExpCat35;

  2010.     $4C: Result:= SeenCMDExpCat36;

  2011.     $4D: Result:= SeenCMDExpCat37;

  2012.     $4E: Result:= SeenCMDExpCat38;

  2013.     $4F: Result:= SeenCMDExpCat39;

  2014.     $50: Result:= SeenCMDExpCat40;

  2015.     $51: Result:= SeenCMDExpCat41;

  2016.     $56: Result:= SeenCMDExpCat42;

  2017.     $57: Result:= SeenCMDExpCat43;

  2018.     $58: Result:= SeenCMDExpCat44;

  2019.     $59: Result:= SeenCMDExpCat45;

  2020.     $5B: Result:= SeenCMDExpCat46;

  2021.     $5C: Result:= SeenCMDExpCat47;

  2022.     $5D: Result:= SeenCMDExpCat48;

  2023.     $5E: Result:= SeenCMDExpCat49;

  2024.     $5F: Result:= SeenCMDExpCat50;

  2025.     $60: Result:= SeenCMDExpCat51;

  2026.     $61: Result:= SeenCMDExpCat52;

  2027.     $63: Result:= SeenCMDExpCat53;

  2028.     $64: Result:= SeenCMDExpCat54;

  2029.     $66: Result:= SeenCMDExpCat55;

  2030.     $67: Result:= SeenCMDExpCat56;

  2031.     $68: Result:= SeenCMDExpCat57;

  2032.     $69: Result:= SeenCMDExpCat58;

  2033.     $6A: Result:= SeenCMDExpCat59;

  2034.     $6C: Result:= SeenCMDExpCat60;

  2035.     $6D: Result:= SeenCMDExpCat61;

  2036.     $6E: Result:= SeenCMDExpCat62;

  2037.     $70: Result:= SeenCMDExpCat63;

  2038.     $72: Result:= SeenCMDExpCat64;

  2039.     $73: Result:= SeenCMDExpCat65;

  2040.     $74: Result:= SeenCMDExpCat66;

  2041.     $75: Result:= SeenCMDExpCat67;

  2042.     $76: Result:= SeenCMDExpCat68;

  2043.     $FE: Result:= SeenCMDExpCat69;

  2044.     $FF: Result:= SeenCMDExpCat70;

  2045.     ELSE Result:= Format(SeenCMDExpCatXX, [ CMD, SCMD ]);

  2046.     END

  2047.   ELSE

  2048.     Result:= Format(SeenCMDExplainDetailUnImp, [ CMD, SCMD ]);



  2049.   Result:= '[' + IntToStr(Offset) + ':' + IntToStr(Length(Source))+ '] ' + Result;

  2050.   END;



  2051. Procedure RScenCMD.Fault(Error: String; Pos: Integer);

  2052.   Var

  2053.   RAWDump: String;

  2054.   Count, Len: Integer;

  2055.   BEGIN

  2056.   RAWDump:= '';

  2057.   IF Source <> '' then

  2058.     BEGIN

  2059.     RAWDump:= SeenCMDFaultHeader;

  2060.     Len:= Length(Source);

  2061.     For Count:= 1 to Pos do

  2062.       IF Count <= Len then

  2063.       RAWDump:= RAWDump + ' ' + IntToHex(ORD(Source[Count]),2);

  2064.     END;



  2065.   Raise Exception.Create('[' + IntToStr(Offset) + '] $' + IntToHex(CMD,2) + ':$' + IntToHex(SCMD,2) + ' ' + Error + ' | ' + RAWDump);

  2066.   END;



  2067. Procedure RScenCMD.ExpressTree(Tree: TTreeView; Root: TTreeNode);

  2068.   Var

  2069.   TempRoot: TTreeNode;

  2070.   TempChild: TTreeNode;

  2071.   BEGIN

  2072.   IF Source = '' then

  2073.     BEGIN

  2074.     TempRoot:= Tree.Items.AddChild(Root,SeenCMDExpEmpty);

  2075.     TempRoot.ImageIndex:= 3;

  2076.     TempRoot.SelectedIndex:= 3;

  2077.     Exit;

  2078.     END;



  2079.   TempRoot:= Tree.Items.AddChild(Root,Explain(True));

  2080.   Case CMD of

  2081.     $00:

  2082.     BEGIN

  2083.       TempRoot.ImageIndex:= 20;

  2084.       TempRoot.SelectedIndex:= 20;

  2085.     END;

  2086.     $01:

  2087.     BEGIN

  2088.       TempRoot.ImageIndex:= 6;

  2089.       TempRoot.SelectedIndex:= 6;

  2090.     END;

  2091.     $02:

  2092.     BEGIN

  2093.       TempRoot.ImageIndex:= 8;

  2094.       TempRoot.SelectedIndex:= 8;

  2095.     END;

  2096.     $03:

  2097.     BEGIN

  2098.       TempRoot.ImageIndex:= 6;

  2099.       TempRoot.SelectedIndex:= 6;

  2100.     END;

  2101.     $04:

  2102.     BEGIN

  2103.       TempRoot.ImageIndex:= 8;

  2104.       TempRoot.SelectedIndex:= 8;

  2105.     END;

  2106.     $05:

  2107.     BEGIN

  2108.       TempRoot.ImageIndex:= 8;

  2109.       TempRoot.SelectedIndex:= 8;

  2110.     END;

  2111.     $0B:

  2112.     BEGIN

  2113.       TempRoot.ImageIndex:= 2;

  2114.       TempRoot.SelectedIndex:= 10;

  2115.     END;

  2116.     $0C:

  2117.     BEGIN

  2118.       TempRoot.ImageIndex:= 9;

  2119.       TempRoot.SelectedIndex:= 10;

  2120.     END;

  2121.     $0E:

  2122.     BEGIN

  2123.       TempRoot.ImageIndex:= 0;

  2124.       TempRoot.SelectedIndex:= 10;

  2125.     END;

  2126.     $10:

  2127.     BEGIN

  2128.       TempRoot.ImageIndex:= 8;

  2129.       TempRoot.SelectedIndex:= 8;

  2130.     END;

  2131.     $13:

  2132.     BEGIN

  2133.       TempRoot.ImageIndex:= 2;

  2134.       TempRoot.SelectedIndex:= 10;

  2135.     END;

  2136.     $15:

  2137.     BEGIN

  2138.       TempRoot.ImageIndex:= 14;

  2139.       TempRoot.SelectedIndex:= 14;

  2140.     END;

  2141.     $16:

  2142.     BEGIN

  2143.       TempRoot.ImageIndex:= 14;

  2144.       TempRoot.SelectedIndex:= 14;

  2145.     END;

  2146.     $17:

  2147.     BEGIN

  2148.       TempRoot.ImageIndex:= 2;

  2149.       TempRoot.SelectedIndex:= 2;

  2150.     END;

  2151.     $18:

  2152.     BEGIN

  2153.       TempRoot.ImageIndex:= 8;

  2154.       TempRoot.SelectedIndex:= 8;

  2155.     END;

  2156.     $19:

  2157.     BEGIN

  2158.       TempRoot.ImageIndex:= 18;

  2159.       TempRoot.SelectedIndex:= 18;

  2160.     END;

  2161.     $1B:

  2162.     BEGIN

  2163.       TempRoot.ImageIndex:= 14;

  2164.       TempRoot.SelectedIndex:= 14;

  2165.     END;

  2166.     $1C:

  2167.     BEGIN

  2168.       TempRoot.ImageIndex:= 14;

  2169.       TempRoot.SelectedIndex:= 14;

  2170.     END;

  2171.     $1D:

  2172.     BEGIN

  2173.       TempRoot.ImageIndex:= 14;

  2174.       TempRoot.SelectedIndex:= 14;

  2175.     END;

  2176.     $1E:

  2177.     BEGIN

  2178.       TempRoot.ImageIndex:= 14;

  2179.       TempRoot.SelectedIndex:= 14;

  2180.     END;

  2181.     $20:

  2182.     BEGIN

  2183.       TempRoot.ImageIndex:= 14;

  2184.       TempRoot.SelectedIndex:= 14;

  2185.     END;

  2186.     $37:

  2187.     BEGIN

  2188.       TempRoot.ImageIndex:= 4;

  2189.       TempRoot.SelectedIndex:= 4;

  2190.     END;

  2191.     $39:

  2192.     BEGIN

  2193.       TempRoot.ImageIndex:= 4;

  2194.       TempRoot.SelectedIndex:= 4;

  2195.     END;

  2196.     $3B:

  2197.     BEGIN

  2198.       TempRoot.ImageIndex:= 4;

  2199.       TempRoot.SelectedIndex:= 4;

  2200.     END;

  2201.     $3C:

  2202.     BEGIN

  2203.       TempRoot.ImageIndex:= 4;

  2204.       TempRoot.SelectedIndex:= 4;

  2205.     END;

  2206.     $3D:

  2207.     BEGIN

  2208.       TempRoot.ImageIndex:= 4;

  2209.       TempRoot.SelectedIndex:= 4;

  2210.     END;

  2211.     $3E:

  2212.     BEGIN

  2213.       TempRoot.ImageIndex:= 4;

  2214.       TempRoot.SelectedIndex:= 4;

  2215.     END;

  2216.     $3F:

  2217.     BEGIN

  2218.       TempRoot.ImageIndex:= 4;

  2219.       TempRoot.SelectedIndex:= 4;

  2220.     END;

  2221.     $40:

  2222.     BEGIN

  2223.       TempRoot.ImageIndex:= 4;

  2224.       TempRoot.SelectedIndex:= 4;

  2225.     END;

  2226.     $41:

  2227.     BEGIN

  2228.       TempRoot.ImageIndex:= 4;

  2229.       TempRoot.SelectedIndex:= 4;

  2230.     END;

  2231.     $42:

  2232.     BEGIN

  2233.       TempRoot.ImageIndex:= 4;

  2234.       TempRoot.SelectedIndex:= 4;

  2235.     END;

  2236.     $43:

  2237.     BEGIN

  2238.       TempRoot.ImageIndex:= 4;

  2239.       TempRoot.SelectedIndex:= 4;

  2240.     END;

  2241.     $49:

  2242.     BEGIN

  2243.       TempRoot.ImageIndex:= 4;

  2244.       TempRoot.SelectedIndex:= 4;

  2245.     END;

  2246.     $4A:

  2247.     BEGIN

  2248.       TempRoot.ImageIndex:= 4;

  2249.       TempRoot.SelectedIndex:= 4;

  2250.     END;

  2251.     $4B:

  2252.     BEGIN

  2253.       TempRoot.ImageIndex:= 4;

  2254.       TempRoot.SelectedIndex:= 4;

  2255.     END;

  2256.     $4C:

  2257.     BEGIN

  2258.       TempRoot.ImageIndex:= 4;

  2259.       TempRoot.SelectedIndex:= 4;

  2260.     END;

  2261.     $4D:

  2262.     BEGIN

  2263.       TempRoot.ImageIndex:= 4;

  2264.       TempRoot.SelectedIndex:= 4;

  2265.     END;

  2266.     $4E:

  2267.     BEGIN

  2268.       TempRoot.ImageIndex:= 4;

  2269.       TempRoot.SelectedIndex:= 4;

  2270.     END;

  2271.     $4F:

  2272.     BEGIN

  2273.       TempRoot.ImageIndex:= 4;

  2274.       TempRoot.SelectedIndex:= 4;

  2275.     END;

  2276.     $50:

  2277.     BEGIN

  2278.       TempRoot.ImageIndex:= 4;

  2279.       TempRoot.SelectedIndex:= 4;

  2280.     END;

  2281.     $51:

  2282.     BEGIN

  2283.       TempRoot.ImageIndex:= 4;

  2284.       TempRoot.SelectedIndex:= 4;

  2285.     END;

  2286.     $56:

  2287.     BEGIN

  2288.       TempRoot.ImageIndex:= 4;

  2289.       TempRoot.SelectedIndex:= 4;

  2290.     END;

  2291.     $57:

  2292.     BEGIN

  2293.       TempRoot.ImageIndex:= 4;

  2294.       TempRoot.SelectedIndex:= 4;

  2295.     END;

  2296.     $58:

  2297.     BEGIN

  2298.       TempRoot.ImageIndex:= 22;

  2299.       TempRoot.SelectedIndex:= 10;

  2300.     END;

  2301.     $59:

  2302.     BEGIN

  2303.       TempRoot.ImageIndex:= 4;

  2304.       TempRoot.SelectedIndex:= 4;

  2305.     END;

  2306.     $5B:

  2307.     BEGIN

  2308.       TempRoot.ImageIndex:= 4;

  2309.       TempRoot.SelectedIndex:= 4;

  2310.     END;

  2311.     $5C:

  2312.     BEGIN

  2313.       TempRoot.ImageIndex:= 4;

  2314.       TempRoot.SelectedIndex:= 4;

  2315.     END;

  2316.     $5D:

  2317.     BEGIN

  2318.       TempRoot.ImageIndex:= 4;

  2319.       TempRoot.SelectedIndex:= 4;

  2320.     END;

  2321.     $5E:

  2322.     BEGIN

  2323.       TempRoot.ImageIndex:= 12;

  2324.       TempRoot.SelectedIndex:= 12;

  2325.     END;

  2326.     $5F:

  2327.     BEGIN

  2328.       TempRoot.ImageIndex:= 4;

  2329.       TempRoot.SelectedIndex:= 4;

  2330.     END;

  2331.     $60:

  2332.     BEGIN

  2333.       TempRoot.ImageIndex:= 13;

  2334.       TempRoot.SelectedIndex:= 13;

  2335.     END;

  2336.     $61:

  2337.     BEGIN

  2338.       TempRoot.ImageIndex:= 6;

  2339.       TempRoot.SelectedIndex:= 10;

  2340.     END;

  2341.     $63:

  2342.     BEGIN

  2343.       TempRoot.ImageIndex:= 2;

  2344.       TempRoot.SelectedIndex:= 2;

  2345.     END;

  2346.     $64:

  2347.     BEGIN

  2348.       TempRoot.ImageIndex:= 2;

  2349.       TempRoot.SelectedIndex:= 10;

  2350.     END;

  2351.     $66:

  2352.     BEGIN

  2353.       TempRoot.ImageIndex:= 2;

  2354.       TempRoot.SelectedIndex:= 2;

  2355.     END;

  2356.     $67:

  2357.     BEGIN

  2358.       TempRoot.ImageIndex:= 2;

  2359.       TempRoot.SelectedIndex:= 2;

  2360.     END;

  2361.     $68:

  2362.     BEGIN

  2363.       TempRoot.ImageIndex:= 2;

  2364.       TempRoot.SelectedIndex:= 2;

  2365.     END;

  2366.     $69:

  2367.     BEGIN

  2368.       TempRoot.ImageIndex:= 2;

  2369.       TempRoot.SelectedIndex:= 10;

  2370.     END;

  2371.     $6A:

  2372.     BEGIN

  2373.       TempRoot.ImageIndex:= 2;

  2374.       TempRoot.SelectedIndex:= 10;

  2375.     END;

  2376.     $6C:

  2377.     BEGIN

  2378.       TempRoot.ImageIndex:= 19;

  2379.       TempRoot.SelectedIndex:= 10;

  2380.     END;

  2381.     $6D:

  2382.     BEGIN

  2383.       TempRoot.ImageIndex:= 5;

  2384.       TempRoot.SelectedIndex:= 5;

  2385.     END;

  2386.     $6E:

  2387.     BEGIN

  2388.       TempRoot.ImageIndex:= 2;

  2389.       TempRoot.SelectedIndex:= 10;

  2390.     END;

  2391.     $70:

  2392.     BEGIN

  2393.       TempRoot.ImageIndex:= 7;

  2394.       TempRoot.SelectedIndex:= 10;

  2395.     END;

  2396.     $72:

  2397.     BEGIN

  2398.       TempRoot.ImageIndex:= 7;

  2399.       TempRoot.SelectedIndex:= 10;

  2400.     END;

  2401.     $73:

  2402.     BEGIN

  2403.       TempRoot.ImageIndex:= 7;

  2404.       TempRoot.SelectedIndex:= 10;

  2405.     END;

  2406.     $74:

  2407.     BEGIN

  2408.       TempRoot.ImageIndex:= 15;

  2409.       TempRoot.SelectedIndex:= 10;

  2410.     END;

  2411.     $75:

  2412.     BEGIN

  2413.       TempRoot.ImageIndex:= 11;

  2414.       TempRoot.SelectedIndex:= 11;

  2415.     END;

  2416.     $76:

  2417.     BEGIN

  2418.       TempRoot.ImageIndex:= 7;

  2419.       TempRoot.SelectedIndex:= 7;

  2420.     END;

  2421.     $FE:

  2422.     BEGIN

  2423.       TempRoot.ImageIndex:= 8;

  2424.       TempRoot.SelectedIndex:= 8;

  2425.     END;

  2426.     $FF:

  2427.     BEGIN

  2428.       TempRoot.ImageIndex:= 8;

  2429.       TempRoot.SelectedIndex:= 8;

  2430.     END;

  2431.     ELSE

  2432.     BEGIN

  2433.       TempRoot.ImageIndex:= 17;

  2434.       TempRoot.SelectedIndex:= 17;

  2435.     END;

  2436.   END;

  2437.   END;



  2438. END.

复制代码
注:
1. MD5什么的可以忽略不计,脚本中没有这个指令,引擎也不会做这个操作,是我后来(心血来潮)加进去的 =v=
2. Tree / Node什么的也可以忽略掉,这个是为了将指令映射到图形界面上,和引擎/指令没有关系。
3. 关键就在TScenario(分析脚本头部格式)和RScenCMD(对每个指令进行解码)。
  其中RScenCMD实现了对命令流的自动解析,在构建指令对象的时候,新的指令的类型和参数就被自动分析出来放到对应的成员中去了。
最后编辑Prz 最后编辑于 2007-07-17 13:56:30
飛べない翼に、意味はあるんでしょうか?
TOP

回复:請教如何解開SEEN.TXT

其他的还顺利,可是在最后一步出错了:
fatal error: exception Sys_error(&amp;quot;permission denied&amp;quot;)

怎么回事啊啊啊啊啊~又是哪里出错了???
最后编辑kizunaXD 最后编辑于 2007-07-23 16:22:08
TOP