4 * Created on: Oct 13, 2012
8 #include "ScriptRunner.h"
11 #include "ScriptHost.h"
15 using geometry::Vector;
19 ScriptRunner::ScriptRunner()
32 ScriptRunner::~ScriptRunner() {
37 bool ScriptRunner::Running() const {
38 return script && cursor < script->textlen;
41 void ScriptRunner::Run(ScriptHost &h, const Script &s) {
45 while (cursor < script->textlen) {
46 unsigned char code(script->text[cursor]);
54 void ScriptRunner::Reset() {
60 vector0 = Vector<int>(0, 0);
61 vector1 = Vector<int>(0, 0);
64 void ScriptRunner::Exec(unsigned char code) {
66 case Script::CODE_MOVE_A0:
67 address0 = PopAddress();
69 case Script::CODE_MOVE_A1:
70 address1 = PopAddress();
72 case Script::CODE_MOVE_I0:
75 case Script::CODE_MOVE_I1:
78 case Script::CODE_MOVE_V0:
79 vector0 = PopVector();
81 case Script::CODE_MOVE_V1:
82 vector1 = PopVector();
84 case Script::CODE_ADD_I0:
87 case Script::CODE_ADD_I1:
90 case Script::CODE_ADD_V0:
91 vector0 += PopVector();
93 case Script::CODE_ADD_V1:
94 vector1 += PopVector();
96 case Script::CODE_RAND_I0:
97 integer0 = std::rand();
99 case Script::CODE_RAND_I1:
100 integer1 = std::rand();
102 case Script::CODE_SYSCALL:
103 host->HandleSyscall(*this);
108 void *ScriptRunner::PopAddress() {
109 void *const *addr(reinterpret_cast<void *const *>(script->text + cursor));
110 cursor += sizeof(void *);
114 int ScriptRunner::PopInt() {
115 const int *i(reinterpret_cast<const int *>(script->text + cursor));
116 cursor += sizeof(int);
120 const Vector<int> &ScriptRunner::PopVector() {
121 const Vector<int> *vec(reinterpret_cast<const Vector<int> *>(script->text + cursor));
122 cursor += sizeof(Vector<int>);