Website Summary Files Commits Branches @commit @diff @stats
path: root / spasm / src
diff options
context:
space:
mode:
Commit7f2b2038c600f5a482ee84b04b922637f757c649 (patch)
Author
 Dimitar Trendafilov <dimitar@coherent-labs.com>
2018-11-13 20:20:50 +0200
Committer
 Dimitar Trendafilov <dimitar@coherent-labs.com>
2018-11-13 20:23:14 +0200
Files0365e95c2df07c250a6b610fe55e46530f82b875 /spasm/src
IPL-7f2b2038c600f5a482ee84b04b922637f757c649.tar
IPL-7f2b2038c600f5a482ee84b04b922637f757c649.tar.gz
IPL-7f2b2038c600f5a482ee84b04b922637f757c649.zip
Parentf34366feaf1a3625cedc6548a9c5828b65be3a19 (diff)
Fixed windows build and added const instruction
4 files changed, 30 insertions, 12 deletions
-rw-r--r--spasm/src/main.cpp3
-rw-r--r--spasm/src/spasm.cpp32
-rw-r--r--spasm/src/spasm.hpp1
-rw-r--r--spasm/src/spasm_impl.hpp6
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