1
by Chris Anderson
Import upstream version 3.3.6 |
1 |
#ifndef _RAR_VM_
|
2 |
#define _RAR_VM_
|
|
3 |
||
4 |
#define VM_STANDARDFILTERS
|
|
5 |
||
6 |
#ifndef SFX_MODULE
|
|
7 |
#define VM_OPTIMIZE
|
|
8 |
#endif
|
|
9 |
||
10 |
||
11 |
#define VM_MEMSIZE 0x40000
|
|
12 |
#define VM_MEMMASK (VM_MEMSIZE-1)
|
|
13 |
#define VM_GLOBALMEMADDR 0x3C000
|
|
14 |
#define VM_GLOBALMEMSIZE 0x2000
|
|
15 |
#define VM_FIXEDGLOBALSIZE 64
|
|
16 |
||
17 |
enum VM_Commands |
|
18 |
{
|
|
19 |
VM_MOV, VM_CMP, VM_ADD, VM_SUB, VM_JZ, VM_JNZ, VM_INC, VM_DEC, |
|
20 |
VM_JMP, VM_XOR, VM_AND, VM_OR, VM_TEST, VM_JS, VM_JNS, VM_JB, |
|
21 |
VM_JBE, VM_JA, VM_JAE, VM_PUSH, VM_POP, VM_CALL, VM_RET, VM_NOT, |
|
22 |
VM_SHL, VM_SHR, VM_SAR, VM_NEG, VM_PUSHA,VM_POPA, VM_PUSHF,VM_POPF, |
|
23 |
VM_MOVZX,VM_MOVSX,VM_XCHG, VM_MUL, VM_DIV, VM_ADC, VM_SBB, VM_PRINT, |
|
24 |
||
25 |
#ifdef VM_OPTIMIZE
|
|
26 |
VM_MOVB, VM_MOVD, VM_CMPB, VM_CMPD, |
|
27 |
||
28 |
VM_ADDB, VM_ADDD, VM_SUBB, VM_SUBD, VM_INCB, VM_INCD, VM_DECB, VM_DECD, |
|
29 |
VM_NEGB, VM_NEGD, |
|
30 |
#endif
|
|
31 |
||
32 |
VM_STANDARD
|
|
33 |
};
|
|
34 |
||
35 |
enum VM_StandardFilters { |
|
36 |
VMSF_NONE, VMSF_E8, VMSF_E8E9, VMSF_ITANIUM, VMSF_RGB, VMSF_AUDIO, |
|
37 |
VMSF_DELTA, VMSF_UPCASE |
|
38 |
};
|
|
39 |
||
40 |
enum VM_Flags {VM_FC=1,VM_FZ=2,VM_FS=0x80000000}; |
|
41 |
||
42 |
enum VM_OpType {VM_OPREG,VM_OPINT,VM_OPREGMEM,VM_OPNONE}; |
|
43 |
||
44 |
struct VM_PreparedOperand |
|
45 |
{
|
|
46 |
VM_OpType Type; |
|
47 |
uint Data; |
|
48 |
uint Base; |
|
49 |
uint *Addr; |
|
50 |
};
|
|
51 |
||
52 |
struct VM_PreparedCommand |
|
53 |
{
|
|
54 |
VM_Commands OpCode; |
|
55 |
bool ByteMode; |
|
56 |
VM_PreparedOperand Op1,Op2; |
|
57 |
};
|
|
58 |
||
59 |
||
60 |
struct VM_PreparedProgram |
|
61 |
{
|
|
1.2.4
by Martin Meredith
Import upstream version 3.9.3 |
62 |
VM_PreparedProgram() |
63 |
{
|
|
64 |
AltCmd=NULL; |
|
65 |
FilteredDataSize=0; |
|
66 |
CmdCount=0; |
|
67 |
}
|
|
1
by Chris Anderson
Import upstream version 3.3.6 |
68 |
|
69 |
Array<VM_PreparedCommand> Cmd; |
|
70 |
VM_PreparedCommand *AltCmd; |
|
71 |
int CmdCount; |
|
72 |
||
73 |
Array<byte> GlobalData; |
|
1.1.5
by Martin Meredith
Import upstream version 3.7.2 |
74 |
Array<byte> StaticData; // static data contained in DB operators |
1
by Chris Anderson
Import upstream version 3.3.6 |
75 |
uint InitR[7]; |
76 |
||
77 |
byte *FilteredData; |
|
1.2.4
by Martin Meredith
Import upstream version 3.9.3 |
78 |
uint FilteredDataSize; |
1
by Chris Anderson
Import upstream version 3.3.6 |
79 |
};
|
80 |
||
1.1.2
by Jeroen van Wolffelaar
Import upstream version 3.5.2 |
81 |
class RarVM:private BitInput |
1
by Chris Anderson
Import upstream version 3.3.6 |
82 |
{
|
83 |
private: |
|
84 |
inline uint GetValue(bool ByteMode,uint *Addr); |
|
85 |
inline void SetValue(bool ByteMode,uint *Addr,uint Value); |
|
86 |
inline uint* GetOperand(VM_PreparedOperand *CmdOp); |
|
87 |
void DecodeArg(VM_PreparedOperand &Op,bool ByteMode); |
|
88 |
#ifdef VM_OPTIMIZE
|
|
89 |
void Optimize(VM_PreparedProgram *Prg); |
|
90 |
#endif
|
|
1.2.4
by Martin Meredith
Import upstream version 3.9.3 |
91 |
bool ExecuteCode(VM_PreparedCommand *PreparedCode,uint CodeSize); |
1
by Chris Anderson
Import upstream version 3.3.6 |
92 |
#ifdef VM_STANDARDFILTERS
|
1.2.4
by Martin Meredith
Import upstream version 3.9.3 |
93 |
VM_StandardFilters IsStandardFilter(byte *Code,uint CodeSize); |
1
by Chris Anderson
Import upstream version 3.3.6 |
94 |
void ExecuteStandardFilter(VM_StandardFilters FilterType); |
1.2.4
by Martin Meredith
Import upstream version 3.9.3 |
95 |
uint FilterItanium_GetBits(byte *Data,int BitPos,int BitCount); |
96 |
void FilterItanium_SetBits(byte *Data,uint BitField,int BitPos,int BitCount); |
|
1
by Chris Anderson
Import upstream version 3.3.6 |
97 |
#endif
|
98 |
||
99 |
byte *Mem; |
|
100 |
uint R[8]; |
|
101 |
uint Flags; |
|
102 |
public: |
|
103 |
RarVM(); |
|
104 |
~RarVM(); |
|
105 |
void Init(); |
|
1.2.4
by Martin Meredith
Import upstream version 3.9.3 |
106 |
void Prepare(byte *Code,uint CodeSize,VM_PreparedProgram *Prg); |
1
by Chris Anderson
Import upstream version 3.3.6 |
107 |
void Execute(VM_PreparedProgram *Prg); |
1.1.6
by Martin Meredith
Import upstream version 3.7.3 |
108 |
void SetLowEndianValue(uint *Addr,uint Value); |
1.2.4
by Martin Meredith
Import upstream version 3.9.3 |
109 |
void SetMemory(uint Pos,byte *Data,uint DataSize); |
1
by Chris Anderson
Import upstream version 3.3.6 |
110 |
static uint ReadData(BitInput &Inp); |
111 |
};
|
|
112 |
||
113 |
#endif
|