Website Summary Files Commits Branches @commit @diff @stats
path: root / spasm / src / spasm.cpp
diff options
context:
space:
mode:
1 files changed, 16 insertions, 12 deletions
-rw-r--r--spasm/src/spasm.cpp28
diff --git a/spasm/src/spasm.cpp b/spasm/src/spasm.cpp
index d06552d..8e5e36d 100644
--- a/spasm/src/spasm.cpp
+++ b/spasm/src/spasm.cpp
@@ -55,23 +55,30 @@ Spasm::RunResult Spasm::run()
dup();
break;
case OpCodes::Pop:
- pop();
+ {
+ const auto count = PC_t(read_reg(size));
+ assert(m_SP - count >= m_FP);
+ m_SP -= count;
break;
+ }
case OpCodes::PopTo:
+ {
+ const auto arg0 = read_reg(size);
+ popto(arg0);
break;
- case OpCodes::Push:
+ }
+ case OpCodes::PushFrom:
{
const auto arg0 = read_reg(size);
push(arg0);
break;
}
- case OpCodes::Alloc:
+ case OpCodes::Push:
{
const auto count = PC_t(read_reg(size));
- for (PC_t i = 0; i < count; ++i)
- {
- push_data(0);
- }
+ assert(m_SP + count <= &data_stack[data_stack.size() - 1]);
+ std::fill(m_SP, m_SP + count, 0);
+ m_SP += count;
break;
}
case OpCodes::Print:
@@ -199,12 +206,9 @@ void Spasm::push(reg_t reg)
push_data(get_local(reg));
}
-/*!
-** Pops a data_t object from the data stack.
-*/
-void Spasm::pop()
+void Spasm::popto(reg_t reg)
{
- --m_SP;
+ m_FP[reg] = *(--m_SP);
}
/*!