X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fcommon%2FScriptRunner.cpp;h=947ded712b5a59912552b6de19593190dfbbe5f6;hb=a3ba4dc677ad7c92eeb78b20b642241563605c9d;hp=98fd4fbdc9a3dfec83b812e0d662377a5e600706;hpb=8060b9ee74a24fe33a874732035dc8b74003439f;p=l2e.git diff --git a/src/common/ScriptRunner.cpp b/src/common/ScriptRunner.cpp index 98fd4fb..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,6 @@ ScriptRunner::ScriptRunner() : host(0) , script(0) , cursor(0) -, address0(0) -, address1(0) -, integer0(0) -, integer1(0) -, vector0(0, 0) -, vector1(0, 0) , compare(0) { } @@ -44,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; @@ -54,118 +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(); - break; - case Script::CODE_MOVE_A1: - address1 = PopAddress(); - break; - case Script::CODE_MOVE_I0: - integer0 = PopInt(); - break; - case Script::CODE_MOVE_I1: - integer1 = PopInt(); - break; - case Script::CODE_MOVE_V0: - vector0 = PopVector(); - break; - case Script::CODE_MOVE_V1: - vector1 = PopVector(); - break; - case Script::CODE_ADD_I0: - integer0 += PopInt(); +void ScriptRunner::Exec(Script::Code code) { + switch (code.command) { + case Script::COMMAND_NOOP: break; - case Script::CODE_ADD_I1: - integer1 += PopInt(); - break; - case Script::CODE_ADD_V0: - vector0 += PopVector(); - break; - case Script::CODE_ADD_V1: - vector1 += PopVector(); - break; - case Script::CODE_MOD_I0: - integer0 %= PopInt(); - break; - case Script::CODE_MOD_I1: - integer1 %= PopInt(); - break; - case Script::CODE_RAND_I0: - integer0 = std::rand(); + + 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_RAND_I1: - integer1 = std::rand(); + + 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_CMP_I0: - Compare(integer0, 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_CMP_I1: - Compare(integer1, PopInt()); + } + + case Script::COMMAND_RAND: + if (code.reg1 >= numRegisters) { + break; + } + integer[code.reg1] = std::rand(); break; - case Script::CODE_CMP_I0_I1: - Compare(integer0, integer1); + + 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_JUMP: + } + + case Script::COMMAND_JMP: cursor = PopInt(); break; - case Script::CODE_JUMP_EQUAL: { + case Script::COMMAND_JEQ: { int addr(PopInt()); if (compare == COMPARE_EQUAL) { cursor = addr; } break; } - case Script::CODE_JUMP_NOT_EQUAL: { + case Script::COMMAND_JNE: { int addr(PopInt()); if (compare != COMPARE_EQUAL) { cursor = addr; } break; } - case Script::CODE_JUMP_LESS: { + case Script::COMMAND_JL: { int addr(PopInt()); if (compare == COMPARE_LESS) { cursor = addr; } break; } - case Script::CODE_JUMP_LESS_EQUAL: { + case Script::COMMAND_JLE: { int addr(PopInt()); if (compare != COMPARE_GREATER) { cursor = addr; } break; } - case Script::CODE_JUMP_GREATER: { + case Script::COMMAND_JG: { int addr(PopInt()); if (compare == COMPARE_GREATER) { cursor = addr; } break; } - case Script::CODE_JUMP_GREATER_EQUAL: { + case Script::COMMAND_JGE: { int addr(PopInt()); if (compare != COMPARE_LESS) { cursor = addr; } break; } - case Script::CODE_SYSCALL: + 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 *);