X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fcommon%2FScriptRunner.cpp;h=947ded712b5a59912552b6de19593190dfbbe5f6;hb=a3ba4dc677ad7c92eeb78b20b642241563605c9d;hp=110b702b88a86aad29297759e5b666940d203da5;hpb=6e88a625710c7936f87b38ecf6094472f3a49f4f;p=l2e.git diff --git a/src/common/ScriptRunner.cpp b/src/common/ScriptRunner.cpp index 110b702..947ded7 100644 --- a/src/common/ScriptRunner.cpp +++ b/src/common/ScriptRunner.cpp @@ -1,10 +1,3 @@ -/* - * ScriptRunner.cpp - * - * Created on: Oct 13, 2012 - * Author: holy - */ - #include "ScriptRunner.h" #include "Script.h" @@ -12,7 +5,7 @@ #include -using geometry::Vector; +using math::Vector; namespace common { @@ -20,12 +13,7 @@ ScriptRunner::ScriptRunner() : host(0) , script(0) , cursor(0) -, address0(0) -, address1(0) -, integer0(0) -, integer1(0) -, vector0(0, 0) -, vector1(0, 0) { +, compare(0) { } @@ -43,9 +31,7 @@ void ScriptRunner::Run(ScriptHost &h, const Script &s) { script = &s; Reset(); while (cursor < script->textlen) { - unsigned char code(script->text[cursor]); - ++cursor; - Exec(code); + Exec(PopCode()); } host = 0; script = 0; @@ -53,58 +39,139 @@ void ScriptRunner::Run(ScriptHost &h, const Script &s) { void ScriptRunner::Reset() { cursor = 0; - address0 = 0; - address1 = 0; - integer0 = 0; - integer1 = 0; - vector0 = Vector(0, 0); - vector1 = Vector(0, 0); + for (int i(0); i < numRegisters; ++i) { + address[i] = 0; + integer[i] = 0; + vector[i] = Vector(0, 0); + } } -void ScriptRunner::Exec(unsigned char code) { - switch (code) { - case Script::CODE_MOVE_A0: - address0 = PopAddress(); +void ScriptRunner::Exec(Script::Code code) { + switch (code.command) { + case Script::COMMAND_NOOP: break; - case Script::CODE_MOVE_A1: - address1 = PopAddress(); + + case Script::COMMAND_MOVE: + if (code.reg1 >= numRegisters) { + break; + } + switch (code.type) { + case Script::TYPE_ADDRESS: { + void *value(code.reg2 < numRegisters ? address[code.reg2] : PopAddress()); + address[code.reg1] = value; + break; + } + case Script::TYPE_INTEGER: { + int value(code.reg2 < numRegisters ? integer[code.reg2] : PopInt()); + integer[code.reg1] = value; + break; + } + case Script::TYPE_VECTOR: { + Vector value(code.reg2 < numRegisters ? vector[code.reg2] : PopVector()); + vector[code.reg1] = value; + break; + } + } break; - case Script::CODE_MOVE_I0: - integer0 = PopInt(); + + case Script::COMMAND_ADD: + if (code.reg1 >= numRegisters) { + break; + } + switch (code.type) { + case Script::TYPE_INTEGER: { + int value(code.reg2 < numRegisters ? integer[code.reg2] : PopInt()); + integer[code.reg1] += value; + break; + } + case Script::TYPE_VECTOR: { + Vector value(code.reg2 < numRegisters ? vector[code.reg2] : PopVector()); + vector[code.reg1] += value; + break; + } + } break; - case Script::CODE_MOVE_I1: - integer1 = PopInt(); + + case Script::COMMAND_MOD: { + if (code.reg1 >= numRegisters) { + break; + } + int value(code.reg2 < numRegisters ? integer[code.reg2] : PopInt()); + integer[code.reg1] %= value; break; - case Script::CODE_MOVE_V0: - vector0 = PopVector(); + } + + case Script::COMMAND_RAND: + if (code.reg1 >= numRegisters) { + break; + } + integer[code.reg1] = std::rand(); break; - case Script::CODE_MOVE_V1: - vector1 = PopVector(); + + case Script::COMMAND_CMP: { + int lhs(code.reg1 < numRegisters ? integer[code.reg1] : PopInt()); + int rhs(code.reg2 < numRegisters ? integer[code.reg2] : PopInt()); + Compare(lhs, rhs); break; - case Script::CODE_ADD_I0: - integer0 += PopInt(); + } + + case Script::COMMAND_JMP: + cursor = PopInt(); break; - case Script::CODE_ADD_I1: - integer1 += PopInt(); + case Script::COMMAND_JEQ: { + int addr(PopInt()); + if (compare == COMPARE_EQUAL) { + cursor = addr; + } break; - case Script::CODE_ADD_V0: - vector0 += PopVector(); + } + case Script::COMMAND_JNE: { + int addr(PopInt()); + if (compare != COMPARE_EQUAL) { + cursor = addr; + } break; - case Script::CODE_ADD_V1: - vector1 += PopVector(); + } + case Script::COMMAND_JL: { + int addr(PopInt()); + if (compare == COMPARE_LESS) { + cursor = addr; + } break; - case Script::CODE_RAND_I0: - integer0 = std::rand(); + } + case Script::COMMAND_JLE: { + int addr(PopInt()); + if (compare != COMPARE_GREATER) { + cursor = addr; + } break; - case Script::CODE_RAND_I1: - integer1 = std::rand(); + } + case Script::COMMAND_JG: { + int addr(PopInt()); + if (compare == COMPARE_GREATER) { + cursor = addr; + } break; - case Script::CODE_SYSCALL: + } + case Script::COMMAND_JGE: { + int addr(PopInt()); + if (compare != COMPARE_LESS) { + cursor = addr; + } + break; + } + case Script::COMMAND_SYSC: host->HandleSyscall(*this); break; } } +Script::Code ScriptRunner::PopCode() { + const Script::Code *i(reinterpret_cast(script->text + cursor)); + cursor += sizeof(Script::Code); + return *i; +} + void *ScriptRunner::PopAddress() { void *const *addr(reinterpret_cast(script->text + cursor)); cursor += sizeof(void *); @@ -123,4 +190,14 @@ const Vector &ScriptRunner::PopVector() { return *vec; } +void ScriptRunner::Compare(int lhs, int rhs) { + if (lhs < rhs) { + compare = COMPARE_LESS; + } else if (lhs > rhs) { + compare = COMPARE_GREATER; + } else { + compare = COMPARE_EQUAL; + } +} + }