diff options
| Commit | 7f2b2038c600f5a482ee84b04b922637f757c649 (patch) | |
|---|---|---|
| Author | 2018-11-13 20:20:50 +0200 | |
| Committer | 2018-11-13 20:23:14 +0200 | |
| Files | 0365e95c2df07c250a6b610fe55e46530f82b875 /spasm/src | |
| IPL-7f2b2038c600f5a482ee84b04b922637f757c649.tar IPL-7f2b2038c600f5a482ee84b04b922637f757c649.tar.gz IPL-7f2b2038c600f5a482ee84b04b922637f757c649.zip | ||
| Parent | f34366feaf1a3625cedc6548a9c5828b65be3a19 (diff) | |
Fixed windows build and added const instruction
4 files changed, 30 insertions, 12 deletions
| -rw-r--r-- | spasm/src/main.cpp | 3 | ||||
| -rw-r--r-- | spasm/src/spasm.cpp | 32 | ||||
| -rw-r--r-- | spasm/src/spasm.hpp | 1 | ||||
| -rw-r--r-- | spasm/src/spasm_impl.hpp | 6 |
diff --git a/spasm/src/main.cpp b/spasm/src/main.cpp index 17bb322..cc2c831 100644 --- a/spasm/src/main.cpp +++ b/spasm/src/main.cpp @@ -23,7 +23,8 @@ int main(int argc, const char* argv[]) std::cout << std::hex << (int)bytecode[i] << ' '; std::cout << std::endl; - Spasm::Spasm vm(len, bytecode.get()); + Spasm::Spasm vm; + vm.Initialize(len, bytecode.get()); vm.run(); diff --git a/spasm/src/spasm.cpp b/spasm/src/spasm.cpp index 60f7531..79c72a7 100644 --- a/spasm/src/spasm.cpp +++ b/spasm/src/spasm.cpp @@ -16,15 +16,16 @@ Spasm::Spasm() {} ** \param _istr - input stream for the machine ** \param _ostr - output stream for the machine */ -Spasm::Spasm(PC_t _bc_size, +void Spasm::Initialize(PC_t _bc_size, const byte* _bytecode, std::istream& _istr, std::ostream& _ostr) - : m_PC(0), - m_ByteCode(_bytecode, _bytecode + _bc_size), - istr(&_istr), - ostr(&_ostr) + { + m_PC = 0; + m_ByteCode.assign(_bytecode, _bytecode + _bc_size); + istr = &_istr; + ostr = &_ostr; data_stack.resize(1024); m_SP = &data_stack[0]; m_FP = &data_stack[0]; @@ -39,14 +40,13 @@ Spasm::~Spasm() {} */ Spasm::RunResult Spasm::run() { - const auto size = m_ByteCode.size(); - while (m_PC < size) + const auto codeSize = m_ByteCode.size(); + while (m_PC < codeSize) { const auto instruction = m_ByteCode[m_PC++]; const auto opcode = OpCodes(instruction & 0x3f); const auto size = instruction >> 6; assert(size == 0 && "no long args yet"); - (void)size; switch (opcode) { case OpCodes::Halt: @@ -97,6 +97,13 @@ Spasm::RunResult Spasm::run() gofalse(arg0, arg1); break; } + case OpCodes::Const: + { + const auto reg = read_reg(size); + const auto value = read_number(size); + set_local(reg, value); + break; + } case OpCodes::Add: { const auto arg0 = read_reg(size); @@ -381,10 +388,17 @@ void Spasm::push_data(data_t data) *(m_SP++) = data; } -reg_t Spasm::read_reg(int size) +reg_t Spasm::read_reg(size_t size) { assert(size == 0); return m_ByteCode[m_PC++]; } +data_t Spasm::read_number(size_t size) +{ + assert(size == 0); + return m_ByteCode[m_PC++]; +} + + } // namespace SpasmImpl diff --git a/spasm/src/spasm.hpp b/spasm/src/spasm.hpp index 7468bd8..85b2e8d 100644 --- a/spasm/src/spasm.hpp +++ b/spasm/src/spasm.hpp @@ -8,6 +8,7 @@ namespace Spasm using SpasmImpl::byte; using SpasmImpl::PC_t; using SpasmImpl::Spasm; +using SpasmImpl::OpCodes; } // namespace Spasm #endif // #ifndef SPASM_HPP diff --git a/spasm/src/spasm_impl.hpp b/spasm/src/spasm_impl.hpp index 487f130..1e1d3ef 100644 --- a/spasm/src/spasm_impl.hpp +++ b/spasm/src/spasm_impl.hpp @@ -22,6 +22,7 @@ enum OpCodes : char Jump, JumpT, JumpF, + Const, Add, Sub, Mul, @@ -40,7 +41,7 @@ class Spasm { public: Spasm(); - Spasm(PC_t, + void Initialize(PC_t, const byte*, std::istream& = std::cin, std::ostream& = std::cout); @@ -116,7 +117,8 @@ class Spasm void set_local(reg_t reg, data_t data); data_t pop_data(); void push_data(data_t); - reg_t read_reg(int size); + reg_t read_reg(size_t size); + data_t read_number(size_t size); }; } // namespace SpasmImpl |
