diff --git a/src/simulation/elements/TEST.cpp b/src/simulation/elements/TEST.cpp new file mode 100644 index 000000000..25b8f64c3 --- /dev/null +++ b/src/simulation/elements/TEST.cpp @@ -0,0 +1,100 @@ +#include "simulation/Elements.h" +#include "virtualmachine/VirtualMachine.h" +//#TPT-Directive ElementClass Element_TEST PT_TEST 255 +static vm::VirtualMachine * vMachine; +Element_TEST::Element_TEST() +{ + Identifier = "DEFAULT_PT_TEST"; + Name = "TEST"; + Colour = PIXPACK(0x407020); + MenuVisible = 1; + MenuSection = SC_POWDERS; + Enabled = 1; + + Advection = 0.4f; + AirDrag = 0.01f * CFDS; + AirLoss = 0.99f; + Loss = 0.95f; + Collision = 0.0f; + Gravity = 0.4f; + Diffusion = 0.00f; + HotAir = 0.000f * CFDS; + Falldown = 1; + + Flammable = 0; + Explosive = 0; + Meltable = 0; + Hardness = 0; + + Weight = 90; + + Temperature = R_TEMP+4.0f +273.15f; + HeatConduct = 251; + Description = "Heavy particles. Fissile. Generates neutrons under pressure."; + + State = ST_SOLID; + Properties = TYPE_PART|PROP_NEUTPENETRATE|PROP_RADIOACTIVE; + + LowPressure = IPL; + LowPressureTransition = NT; + HighPressure = IPH; + HighPressureTransition = NT; + LowTemperature = ITL; + LowTemperatureTransition = NT; + HighTemperature = ITH; + HighTemperatureTransition = NT; + + + vMachine = new vm::VirtualMachine(2); + vMachine->LoadProgram("test.qvm"); + //if(vMachine->Compile()) + /*{ + Update = &Element_TEST::updateCompiled; + } + else*/ + { + Update = &Element_TEST::updateInterpreted; + } +} + +//#TPT-Directive ElementHeader Element_TEST static int updateCompiled(UPDATE_FUNC_ARGS) +int Element_TEST::updateCompiled(UPDATE_FUNC_ARGS) +{ + //vMachine->CallCompiled(0); + return 0; +} + +//#TPT-Directive ElementHeader Element_TEST static int updateInterpreted(UPDATE_FUNC_ARGS) +int Element_TEST::updateInterpreted(UPDATE_FUNC_ARGS) +{ + vm::word w; + int argAddr = 0, argCount = 5; + vMachine->sim = sim; + + /* Set up call. */ + vMachine->OpPUSH(w); //Pointless null in stack + w.int4 = (argCount + 2) * sizeof(vm::word); + vMachine->OpENTER(w); + argAddr = 8; + + //Arguments + w.int4 = i; vMachine->Marshal(argAddr, w); argAddr += 4; + w.int4 = x; vMachine->Marshal(argAddr, w); argAddr += 4; + w.int4 = y; vMachine->Marshal(argAddr, w); argAddr += 4; + w.int4 = nt; vMachine->Marshal(argAddr, w); argAddr += 4; + w.int4 = surround_space; vMachine->Marshal(argAddr, w); argAddr += 4; + + w.int4 = 0; + vMachine->Push(w); + + vMachine->OpCALL(w); + vMachine->Run(); + w.int4 = (argCount + 2) * sizeof(vm::word); + vMachine->OpLEAVE(w); + vMachine->OpPOP(w); //Pop pointless null + vMachine->End(); + return 0; +} + + +Element_TEST::~Element_TEST() {} \ No newline at end of file diff --git a/src/virtualmachine/VirtualMachine.h b/src/virtualmachine/VirtualMachine.h index 287e9aaec..1f5b088a5 100644 --- a/src/virtualmachine/VirtualMachine.h +++ b/src/virtualmachine/VirtualMachine.h @@ -123,6 +123,7 @@ namespace vm int syscall(int programCounter); //Used by the JIT + #ifdef VMJIT int constant4(); int constant1(); void emit1(int v); @@ -133,9 +134,14 @@ namespace vm void emitMovEAXEDI(); bool emitMovEBXEDI(int andit); static int hex(int c); + #endif public: + #ifdef VMJIT static void callFromCompiled(); static void callSyscall(); + bool Compile(); + int CallCompiled(int address); + #endif Simulation * sim; Renderer * ren; @@ -146,11 +152,9 @@ public: VirtualMachine(int hunkMbytes); virtual ~VirtualMachine(); - bool Compile(); int LoadProgram(char * filename); int Run(); int CallInterpreted(int address); - int CallCompiled(int address); void End(); void Marshal(int address, word element) {