diff --git a/src/spider/runtime/cpu/CPU_test.cpp b/src/spider/runtime/cpu/CPU_test.cpp new file mode 100644 index 0000000..def7101 --- /dev/null +++ b/src/spider/runtime/cpu/CPU_test.cpp @@ -0,0 +1,25 @@ +#include "CPU.hpp" + +namespace spider { + + CPU::CPU() + : RA{}, RB{}, RC{}, RD{}, + RX{}, RY{}, R0{}, R1{}, + R2{}, R3{}, R4{}, R5{}, + R6{}, R7{}, R8{}, R9{}, + RF{}, RI{}, RS{}, RZ{}, + RE{}, RN{}, RV{}, RM{} + {} + + CPU::~CPU() {} + + // Stubs for testing + void CPU::fetchOperDst() { /* _dst already set manually in tests */ } + void CPU::fetchOperSrc() { /* _src already set manually in tests */ } + void CPU::imp() { /* no-op post action */ } + void CPU::hookRAM(RAM*) {} + void CPU::hookInstrReel(InstrReel*) {} + void CPU::fetchInstr() {} + void CPU::execute() {} + void CPU::psw() {} +} \ No newline at end of file diff --git a/src/spider/test_instrucciones.cpp b/src/spider/test_instrucciones.cpp new file mode 100644 index 0000000..dab20b6 --- /dev/null +++ b/src/spider/test_instrucciones.cpp @@ -0,0 +1,118 @@ +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif +#ifndef M_E +#define M_E 2.71828182845904523536 +#endif + +#include +#include +#include + +using namespace spider; + +void check(const char* name, double result, double expected, double tolerance = 1e-9) { + bool ok = std::abs(result - expected) <= tolerance; + std::cout << (ok ? "[PASS] " : "[FAIL] ") << name + << " = " << result + << " (expected " << expected << ")\n"; +} + +int main() { + std::cout << "=== Spider VM Instruction Test: 0x068-0x079 ===\n\n"; + + CPU cpu; + cpu._post = &CPU::imp; + + std::cout << "-- Cast Instructions --\n"; + + cpu.RA._f64 = 3.9; + cpu._dst = &cpu.RA; + cpu.D2I(); + check("D2I (3.9 -> 3)", cpu.RA._u32, 3.0); + + cpu.RA._f64 = 1e12; + cpu._dst = &cpu.RA; + cpu.D2L(); + check("D2L (1e12)", (double)cpu.RA._u64, 1e12); + + std::cout << "\n-- Trigonometric Instructions --\n"; + + cpu.RA._f64 = M_PI / 2.0; + cpu._dst = &cpu.RA; + cpu.SIN(); + check("SIN(pi/2)", cpu.RA._f64, 1.0); + + cpu.RA._f64 = 0.0; + cpu._dst = &cpu.RA; + cpu.COS(); + check("COS(0)", cpu.RA._f64, 1.0); + + cpu.RA._f64 = M_PI / 4.0; + cpu._dst = &cpu.RA; + cpu.TAN(); + check("TAN(pi/4)", cpu.RA._f64, 1.0); + + cpu.RA._f64 = 1.0; + cpu._dst = &cpu.RA; + cpu.ASIN(); + check("ASIN(1.0)", cpu.RA._f64, M_PI / 2.0); + + cpu.RA._f64 = 1.0; + cpu._dst = &cpu.RA; + cpu.ACOS(); + check("ACOS(1.0)", cpu.RA._f64, 0.0); + + cpu.RA._f64 = 1.0; + cpu._dst = &cpu.RA; + cpu.ATAN(); + check("ATAN(1.0)", cpu.RA._f64, M_PI / 4.0); + + cpu.RA._f64 = 1.0; + cpu.RB._f64 = 1.0; + cpu._dst = &cpu.RA; + cpu._src = &cpu.RB; + cpu.ATAN2(); + check("ATAN2(1,1)", cpu.RA._f64, M_PI / 4.0); + + std::cout << "\n-- Exponential Instructions --\n"; + + cpu.RA._f64 = 1.0; + cpu._dst = &cpu.RA; + cpu.EXP(); + check("EXP(1)", cpu.RA._f64, M_E); + + cpu.RA._f64 = M_E; + cpu._dst = &cpu.RA; + cpu.LOG(); + check("LOG(e)", cpu.RA._f64, 1.0); + + cpu.RA._f64 = 100.0; + cpu.RB._f64 = 10.0; + cpu._dst = &cpu.RA; + cpu._src = &cpu.RB; + cpu.LOGAB(); + check("LOGAB(100,10)", cpu.RA._f64, 2.0); + + cpu.RA._f64 = 2.0; + cpu.RB._f64 = 10.0; + cpu._dst = &cpu.RA; + cpu._src = &cpu.RB; + cpu.POW(); + check("POW(2,10)", cpu.RA._f64, 1024.0); + + cpu.RA._f64 = 9.0; + cpu._dst = &cpu.RA; + cpu.SQRT(); + check("SQRT(9)", cpu.RA._f64, 3.0); + + cpu.RA._f64 = 27.0; + cpu.RB._f64 = 3.0; + cpu._dst = &cpu.RA; + cpu._src = &cpu.RB; + cpu.ROOT(); + check("ROOT(27,3)", cpu.RA._f64, 3.0); + + std::cout << "\n=== Tests complete ===\n"; + return 0; +} \ No newline at end of file