summaryrefslogtreecommitdiff
path: root/src/pim/Machine.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/pim/Machine.h')
-rw-r--r--src/pim/Machine.h120
1 files changed, 120 insertions, 0 deletions
diff --git a/src/pim/Machine.h b/src/pim/Machine.h
new file mode 100644
index 0000000..3bf1131
--- /dev/null
+++ b/src/pim/Machine.h
@@ -0,0 +1,120 @@
+#pragma once
+
+#include <vector>
+#include <string>
+#include <cstring>
+
+class Simulation;
+namespace pim
+{
+ union Word
+ {
+ int Integer;
+ float Decimal;
+
+ Word(int integer) : Integer(integer) {}
+ Word(float decimal) : Decimal(decimal) {}
+ Word() {}
+ };
+ struct Instruction
+ {
+ int Opcode;
+ Word Parameter;
+ };
+ class InvalidProgramException: public std::exception
+ {
+ public:
+ InvalidProgramException() { }
+ const char * what() const throw()
+ {
+ return "Invalid program";
+ }
+ ~InvalidProgramException() throw() {};
+ };
+ class UnresolvedValueException: public std::exception
+ {
+ char * error;
+ public:
+ UnresolvedValueException(std::string value) {
+ error = strdup(std::string("Unresolved value: " + value).c_str());
+ }
+ const char * what() const throw()
+ {
+ return error;
+ }
+ ~UnresolvedValueException() throw() {};
+ };
+ class VirtualMachine
+ {
+
+ #define WORDSIZE 4
+
+ //#define OPDEF(name) void op##name(int parameter);
+ //#include "Opcodes.inl"
+ //#undef OPDEF
+
+ Simulation * sim;
+
+ Instruction * rom;
+ int romSize;
+ int romMask;
+
+ unsigned char * compiledRom;
+ int compiledRomSize;
+
+ unsigned char * ram;
+ int ramSize;
+ int ramMask;
+
+ #define CSA(argument) (*((Word*)&ram[framePointer-argument]))
+ #define CS() (*((Word*)&ram[callStack]))
+ #define PS() (*((Word*)&ram[programStack]))
+ #define PPROP(index, property) (*((Word*)(((char*)&sim->parts[(index)])+property)))
+
+ int programStack; //Points to the item on top of the Program Stack
+ int callStack; //Points to the item on top of the call stack
+ int framePointer; //Points to the bottom (first item) on the current frame of the call stack
+
+ //Instruction * instructions;
+
+ int programCounter;
+
+ void emit(std::string opcode);
+ void emit(int constant);
+ public:
+ VirtualMachine(Simulation * sim);
+ int OpcodeArgSize(int opcode);
+ void LoadProgram(std::vector<unsigned char> programData);
+ void Run();
+ void Compile();
+ void CallCompiled(std::string entryPoint);
+ void CallCompiled(int entryPoint);
+ void Call(std::string entryPoint);
+ void Call(int entryPoint);
+ inline void PSPush(Word word)
+ {
+ programStack -= WORDSIZE;
+ PS() = word;
+ }
+
+ inline Word PSPop()
+ {
+ Word word = PS();
+ programStack += WORDSIZE;
+ return word;
+ }
+
+ inline void CSPush(Word word)
+ {
+ callStack -= WORDSIZE;
+ CS() = word;
+ }
+
+ inline Word CSPop()
+ {
+ Word word = CS();
+ callStack += WORDSIZE;
+ return word;
+ }
+ };
+} \ No newline at end of file