ExpComb.inc
上传用户:yj_qiu
上传日期:2022-08-08
资源大小:23636k
文件大小:9k
源码类别:

游戏引擎

开发平台:

Delphi

  1. procedure TOberonVM.RunTimeError(ErrorNumber: Integer);
  2. var s: string;
  3. begin
  4.   s := 'Runtime error #' + IntToStr(ErrorNumber)+#13;
  5.   case ErrorNumber of
  6.     rteRangeError: MessageDlg(s+'Range check error', mtError, [mbOK], 0);
  7.     rteStackEmpty: MessageDlg(s+'Stack is empty', mtError, [mbOK], 0);
  8.   end;
  9. end;
  10. function TOberonVM.AddII(Value1, Value2: Integer): Integer;
  11. begin {$Q-} Result := Value1 + Value2; end;
  12. function TOberonVM.AddRR(Value1, Value2: Single): Single;
  13. begin Result := Value1 + Value2; end;
  14. function TOberonVM.AddIR(Value1: Integer; Value2: Single): Single;
  15. begin Result := Value1 + Value2; end;
  16. function TOberonVM.AddRI(Value1: Single; Value2: Integer): Single;
  17. begin Result := Value1 + Value2; end;
  18. function TOberonVM.AddSS(Value1, Value2: Integer): Integer;
  19. begin Result := Value1 or Value2; end;
  20. function TOberonVM.AddStrStr(Value1, Value2: Integer): Integer;
  21. begin
  22. {  Move(Pointer(Int32(Comp.Data)+Value1)^, Len1, 2);
  23.   Move(Pointer(Int32(Comp.Data)+Value2)^, Len2, 2);
  24.   SetLength(Buf, Len1+Len2);
  25.   if Len1 > 0 then Move(Pointer(Int32(Comp.Data)+Item1.Value+2)^, Buf[1], Len1);
  26.   if Len2 > 0 then Move(Pointer(Int32(Comp.Data)+Item2.Value+2)^, Buf[1+Len1], Len2);
  27.   Comp.SetSValue(Result, Buf);}
  28.   Result := -1;
  29. end;
  30. function TOberonVM.SubII(Value1, Value2: Integer): Integer;
  31. begin {$Q-} Result := Value1 - Value2; end;
  32. function TOberonVM.SubRR(Value1, Value2: Single): Single;
  33. begin Result := Value1 - Value2; end;
  34. function TOberonVM.SubIR(Value1: Integer; Value2: Single): Single;
  35. begin Result := Value1 - Value2; end;
  36. function TOberonVM.SubRI(Value1: Single; Value2: Integer): Single;
  37. begin Result := Value1 - Value2; end;
  38. function TOberonVM.SubSS(Value1, Value2: Integer): Integer;
  39. begin Result := Value1 and not Value2; end;
  40. function TOberonVM.MulII(Value1, Value2: Integer): Integer;
  41. begin {$Q-} Result := Value1 * Value2; end;
  42. function TOberonVM.MulRR(Value1, Value2: Single): Single;
  43. begin Result := Value1 * Value2; end;
  44. function TOberonVM.MulIR(Value1: Integer; Value2: Single): Single;
  45. begin Result := Value1 * Value2; end;
  46. function TOberonVM.MulRI(Value1: Single; Value2: Integer): Single;
  47. begin Result := Value1 * Value2; end;
  48. function TOberonVM.MulSS(Value1, Value2: Integer): Integer;
  49. begin Result := Value1 and Value2; end;
  50. function TOberonVM.DivII(Value1, Value2: Integer): Single;
  51. begin Result := Value1 / Value2; end;
  52. function TOberonVM.DivRR(Value1, Value2: Single): Single;
  53. begin Result := Value1 / Value2; end;
  54. function TOberonVM.DivIR(Value1: Integer; Value2: Single): Single;
  55. begin Result := Value1 / Value2; end;
  56. function TOberonVM.DivRI(Value1: Single; Value2: Integer): Single;
  57. begin Result := Value1 / Value2; end;
  58. function TOberonVM.DivSS(Value1, Value2: Integer): Integer;
  59. begin Result := Value1 xor Value2; end;
  60. function TOberonVM.OrII(Value1, Value2: Integer): Integer;
  61. begin Result := Value1 or Value2; end;
  62. function TOberonVM.AndII(Value1, Value2: Integer): Integer;
  63. begin Result := Value1 and Value2; end;
  64. function TOberonVM.IDivII(Value1, Value2: Integer): Integer;
  65. begin Result := Value1 div Value2; end;
  66. function TOberonVM.ModII(Value1, Value2: Integer): Integer;
  67. begin Result := Value1 mod Value2; end;
  68. function TOberonVM.NegI(Value1: Integer): Integer;
  69. begin Result := -Value1; end;
  70. function TOberonVM.NegR(Value1: Single): Single;
  71. begin Result := -Value1; end;
  72. function TOberonVM.NegS(Value1: Integer): Integer;
  73. begin Result := not Value1; end;
  74. function TOberonVM.InvI(Value1: Integer): Integer;
  75. begin Result := not Value1; end;
  76. function TOberonVM.InvB(Value1: Integer): Integer;
  77. begin Result := Integer(not Boolean(Value1)); end;
  78. function TOberonVM.Equal(Value1, Value2: Integer): Integer;
  79. begin Result := Integer(Boolean(Value1 = Value2)); end;
  80. function TOberonVM.EqualRI(Value1: Single; Value2: Integer): Integer;
  81. begin Result := Integer(Boolean(Value1 = Value2)); end;
  82. function TOberonVM.GreaterII(Value1, Value2: Integer): Integer;
  83. begin Result := Integer(Boolean(Value1 > Value2)); end;
  84. function TOberonVM.GreaterIR(Value1: Integer; Value2: Single): Integer;
  85. begin Result := Integer(Boolean(Value1 > Value2)); end;
  86. function TOberonVM.GreaterRI(Value1: Single; Value2: Integer): Integer;
  87. begin Result := Integer(Boolean(Value1 > Value2)); end;
  88. function TOberonVM.GreaterRR(Value1, Value2: Single): Integer;
  89. begin Result := Integer(Boolean(Value1 > Value2)); end;
  90. function TOberonVM.LessII(Value1, Value2: Integer): Integer;
  91. begin Result := Integer(Boolean(Value1 < Value2)); end;
  92. function TOberonVM.LessIR(Value1: Integer; Value2: Single): Integer;
  93. begin Result := Integer(Boolean(Value1 < Value2)); end;
  94. function TOberonVM.LessRI(Value1: Single; Value2: Integer): Integer;
  95. begin Result := Integer(Boolean(Value1 < Value2)); end;
  96. function TOberonVM.LessRR(Value1, Value2: Single): Integer;
  97. begin Result := Integer(Boolean(Value1 < Value2)); end;
  98. function TOberonVM.GreaterEqualII(Value1, Value2: Integer): Integer;
  99. begin Result := Integer(Boolean(Value1 >= Value2)); end;
  100. function TOberonVM.GreaterEqualIR(Value1: Integer; Value2: Single): Integer;
  101. begin Result := Integer(Boolean(Value1 >= Value2)); end;
  102. function TOberonVM.GreaterEqualRI(Value1: Single; Value2: Integer): Integer;
  103. begin Result := Integer(Boolean(Value1 >= Value2)); end;
  104. function TOberonVM.GreaterEqualRR(Value1, Value2: Single): Integer;
  105. begin Result := Integer(Boolean(Value1 >= Value2)); end;
  106. function TOberonVM.LessEqualII(Value1, Value2: Integer): Integer;
  107. begin Result := Integer(Boolean(Value1 <= Value2)); end;
  108. function TOberonVM.LessEqualIR(Value1: Integer; Value2: Single): Integer;
  109. begin Result := Integer(Boolean(Value1 <= Value2)); end;
  110. function TOberonVM.LessEqualRI(Value1: Single; Value2: Integer): Integer;
  111. begin Result := Integer(Boolean(Value1 <= Value2)); end;
  112. function TOberonVM.LessEqualRR(Value1, Value2: Single): Integer;
  113. begin Result := Integer(Boolean(Value1 <= Value2)); end;
  114. function TOberonVM.NotEqual(Value1, Value2: Integer): Integer;
  115. begin Result := Integer(Boolean(Value1 <> Value2)); end;
  116. function TOberonVM.NotEqualRI(Value1: Single; Value2: Integer): Integer;
  117. begin Result := Integer(Boolean(Value1 <> Value2)); end;
  118. function TOberonVM.GreaterEqual(Value1, Value2: Integer): Integer;
  119. begin Result := Integer(Boolean(Value1 >= Value2)); end;
  120. function TOberonVM.LessEqual(Value1, Value2: Integer): Integer;
  121. begin Result := Integer(Boolean(Value1 <= Value2)); end;
  122. function TOberonVM.TestIn(Value1, Value2: Integer): Integer;
  123. begin Result := Integer((El2Set[Value1] and Value2) > 0); end;
  124. procedure TOberonVM.DoAssign4(Value1, Value2: Integer);
  125. begin
  126.   {dtBoolean = 0; dtChar = 1;
  127.   dtInt8 = 2; dtInt16 = 3; dtInt32 = 4; dtInt = 5;
  128.   dtNat8 = 6; dtNat16 = 7; dtNat32 = 8; dtNat = 9;
  129.   dtSingle = 10; dtReal = 11; dtDouble = 12;
  130.   dtString = 13;
  131.   dtSet = 14;
  132.   dtArray = 16;
  133.   dtRecord = 17;
  134.   dtPointer = 18;
  135.   dtProcedure = 19;}
  136. {  case Data.Variables[Value1].VType of
  137.     dtBoolean, dtChar, dtInt8, dtNat8: elSize := 1;
  138.     dtInt16, dtNat16: elSize := 2;
  139.     dtInt32, dtInt, dtNat32, dtNat, dtSingle, dtReal, dtSet, dtPointer, dtProcedure: elSize := 4;
  140.     dtDouble: elSize := 8;
  141.     dtString:;
  142.   end;
  143.   case elSize of
  144.     1: TByteArray(Data.Data)[Data.Variables[Value1].Index] := Value2;
  145.     2: Word((@TByteArray(Data.Data)[Data.Variables[Value1].Index])^) := Value2;
  146.     4: Int32((@TByteArray(Data.Data)[Data.Variables[Value1].Index])^) := Value2;
  147.     else Int32((@TByteArray(Data.Data)[Data.Variables[Value1].Index])^) := Value2;
  148.   end;}
  149.   Int32((@Data.Data[Value1])^) := Value2;
  150. end;
  151. procedure TOberonVM.DoExtAssign4(Value1, Value2: Integer);
  152. begin
  153.   Int32((@Data.BaseData[Value1])^) := Value2;
  154. end;
  155. procedure TOberonVM.DoStackAssign4(Value1, Value2: Integer);
  156. begin
  157.   Stack[StackBase+Value1] := Value2;
  158. end;
  159. procedure TOberonVM.DoGoto(var IP: Integer);
  160. begin
  161.   IP := Data.PIN[IP+1];
  162. end;
  163. procedure TOberonVM.DoZeroJump(Value1: Integer; var IP: Integer);
  164. begin
  165.   Inc(IP);
  166.   if Value1 = 0 then IP := Data.PIN[IP];
  167. end;
  168. procedure TOberonVM.DoCall(const Dest: Integer; var IP: Integer);
  169. begin
  170.   Push(IP);
  171.   IP := Dest;
  172. end;
  173. procedure TOberonVM.DoReturn(var IP: Integer);
  174. var Temp: Integer;
  175. begin
  176.   Inc(IP);
  177.   Temp := Data.PIN[IP];
  178.   Dec(TotalStack, Data.PIN[IP+1]-Temp);             // Pop all local variables
  179.   StackBase := Pop;                                 // Pop old stack base
  180.   IP := Pop;                                        // Pop return address
  181.   Dec(TotalStack, Temp);                            // Pop parameters
  182. end;
  183. procedure TOberonVM.DoExit(const Dest: Integer; var IP: Integer);
  184. begin
  185.   IP := Dest;
  186. end;
  187. function TOberonVM.ConstructSet(const TotalElements: Integer): Integer;
  188. var i: Integer; El: Longword;
  189. begin
  190.   Result := 0;
  191.   if TotalElements = -1 then Result := Pop else for i := 0 to TotalElements-1 do begin
  192.     El := Pop;
  193.     if El > MaxSet then RunTimeError(rteRangeError) else Result := Result or Integer(El2Set[El]);
  194.   end;
  195. end;