diff options
Diffstat (limited to 'src/core/vmrunner.hpp')
-rw-r--r-- | src/core/vmrunner.hpp | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/core/vmrunner.hpp b/src/core/vmrunner.hpp new file mode 100644 index 0000000..60bc2ce --- /dev/null +++ b/src/core/vmrunner.hpp @@ -0,0 +1,48 @@ +#ifndef VMRUNNER_H +#define VMRUNNER_H +#include "smelt.hpp" +#include "smrandom.hpp" +#include "scriptshared.hpp" +const Idata ione=Idata(0,1),izero=Idata(0,0); +const Idata rone=Idata(1,1),rzero=Idata(1,0); +template<class memb> +class callStack//a queue, in fact. +{ +private: + int l,r; + memb data[16]; +public: + callStack(){clear();} + void clear(){l=0;r=-1;} + int size(){return r-l+1;} + bool empty(){return size()==0;} + void push(memb a){data[++r]=a;if(r>15)throw;} + memb pop(){if(l<=r+1)return data[l++];else throw;} + memb front(){return data[l];} + memb back(){return data[r];} +}; +callStack<Idata> callStk; +typedef struct _fncEntry{int hash,pos;}fncEntry; +class blrScriptVM +{ +private: + smRandomEngine* re; + Idata ir[101],ia[10000]; + Idata rr[103],ra[10000]; + SInst inst[65537]; + int ic,fncnt,pinst; + fncEntry fncent[8]; + const char *sbyte,*cbyte; + DWORD fsize; + void readPara(SPara *para); + int mgetc(); + Idata& fetchData(SPara para,bool forcerw=false); +public: + blrScriptVM(){ic=fncnt=pinst=0;} + int loadLSBFromMemory(const char* ptr,DWORD size); + int getInstCount(); + void runFunction(const char *fncnym); + void vmInit(); + void vmDeinit(); +}; +#endif |