24 #include "common/array.h" 25 #include "common/hashmap.h" 31 static constexpr
const uint THREADS_COUNT = 2;
32 static constexpr
const uint STACK_SIZE = 0x100;
33 static constexpr
const uint STACK_POS = 0x80;
34 static constexpr
const uint MEMTYPE_SHIFT = 30;
35 static constexpr
const uint ADDRESS_MASK = (1 << MEMTYPE_SHIFT) - 1;
52 OP_MOV_EDI_ECX_AL = 14,
53 OP_MOV_EBX_ECX_AL = 15,
54 OP_MOV_EDI_ECX_EAX = 16,
55 OP_MOV_EBX_ECX_EAX = 17,
73 OP_LOAD_OFFSET_EDI = 35,
74 OP_LOAD_OFFSET_EDI2 = 36,
75 OP_LOAD_OFFSET_EBX = 37,
76 OP_LOAD_OFFSET_ESP = 38,
77 OP_MOV_PTR_EDX_AL = 39,
78 OP_MOV_PTR_EDX_EAX = 40,
85 OP_MOV_EAX_BPTR_EDI = 47,
86 OP_MOV_EAX_BPTR_EBX = 48,
87 OP_MOV_EAX_DPTR_EDI = 49,
88 OP_MOV_EAX_DPTR_EBX = 50,
89 OP_MOV_EAX_BPTR_EAX = 51,
90 OP_MOV_EAX_DPTR_EAX = 52,
91 OP_PUSH_ESI_ADD_EDI = 53,
93 OP_PUSH_ESI_SET_EDX_EDI = 55,
108 inline uint32 getVal()
const {
return value; };
109 inline void setVal(uint32 v) { value = v; };
111 inline uint32 getOffset()
const {
return value & ADDRESS_MASK; };
112 inline uint getMemType()
const {
return (value >> MEMTYPE_SHIFT ) & 3; };
114 inline void setMemType(uint tp) { value = (value & ADDRESS_MASK) | ((tp & 3) << MEMTYPE_SHIFT); };
115 inline void setOffset(uint32 offset) { value = (value & (~ADDRESS_MASK)) | (offset & ADDRESS_MASK); };
117 inline void setAddress(uint tp, uint32 offset) { value = (offset & ADDRESS_MASK) | ((tp & 3) << MEMTYPE_SHIFT); };
126 memset(data, 0,
sizeof(data));
142 uint8 getU8(uint32 address);
143 uint32 getU32(uint32 address);
145 void setU8(uint32 address, uint8 val);
146 void setU32(uint32 address, uint32 val);
149 _currentBlock =
nullptr;
155 Context(
VM &vm): _vm(vm), _readAccess(vm), _writeAccess(vm) {};
157 Common::String getString(
int memtype, uint32 offset, uint32 maxLen = 256);
160 uint32 execute(uint32 scriptAddress, byte *storage =
nullptr);
162 void push32(uint32 val);
168 uint32 getMem32(
int memtype, uint32 offset);
169 uint32 getMem32(
const ValAddr& addr);
170 uint8 getMem8(
int memtype, uint32 offset);
171 uint8 getMem8(
const ValAddr& addr);
173 void setMem32(
int memtype, uint32 offset, uint32 val);
174 void setMem32(
const ValAddr& addr, uint32 val);
175 void setMem8(
int memtype, uint32 offset, uint8 val);
176 void setMem8(
const ValAddr& addr, uint8 val);
188 byte _stack[STACK_SIZE];
195 typedef void (* CallDispatcher)(
void *object,
Context *state, uint32 funcID);
201 VM(
void *obj, CallDispatcher dispatcher): _memAccess(*
this), _threads{*
this, *
this}, _callFuncs(dispatcher), _callingObject(obj) {};
208 void writeMemory(uint32 address,
const byte* data, uint32 dataSize);
210 void zeroMemory(uint32 address, uint32 count);
217 void readMemBlocks(byte *dst, uint32 address, uint32 count);
219 Common::String readMemString(uint32 address, uint32 maxLen = 256);
221 uint32 doScript(uint32 scriptAddress, byte *storage =
nullptr);
223 static int32 getS32(
const void *);
224 static uint32 getU32(
const void *);
225 static void setU32(
void *, uint32 val);
232 void printDisassembly(uint32 address);
239 Context _threads[THREADS_COUNT];
241 CallDispatcher
const _callFuncs =
nullptr;
242 void *
const _callingObject =
nullptr;
246 bool _interrupt =
false;