#pragma once #include #include #include #include #include #include #include class Device; class machine { public: // Register indices static const int A = 0; static const int X = 1; static const int L = 2; static const int B = 3; static const int S = 4; static const int T = 5; static const int F = 6; static const int PC = 8; static const int SW = 9; // Condition codes static const int CC_LT = 0x00; static const int CC_EQ = 0x40; static const int CC_GT = 0x80; static const int MAX_ADRESS = 1048575; private: std::array registri{}; double F_val = 0.0; std::array pomnilnik{}; std::array, 256> naprave{}; std::unordered_map> ukaziF2; std::unordered_map> ukaziSICF3F4; public: machine(); // getters-setters int getA(); void setA(int a); int getX(); void setX(int x); int getL(); void setL(int l); int getB(); void setB(int b); int getS(); void setS(int s); int getT(); void setT(int t); double getF(); void setF(double f); int getPC(); void setPC(int pc); int getSW(); void setSW(int sw); int getReg(int r); void setReg(int r, int val); // memory int getByte(int adr); void setByte(int adr, int val); int getWord(int adr); void setWord(int adr, int val); int getUN(int n, int x, int b, int p, int e, int operand); // devices Device& getDevice(uint8_t dev); void setDevice(uint8_t num, std::unique_ptr dev); void setFileDevice(uint8_t num, const std::string& filename); // error helpers void notImplemented(const std::string& mnemonic); void invalidOpcode(int opcode); void invalidAdressing(); void invalidRegister(const std::string& mnemonic, int r1, int r2); void outOfMemoryRange(int mem); void divisionByZero(); // execution uint8_t fetch(); void execute(); bool execF1(uint8_t opcode, const std::string& mnemonic); bool execF2(uint8_t opcode, uint8_t operand, const std::string& mnemonic); bool execSIC_F3_F4(uint8_t b1, uint8_t b2, uint8_t b3, const std::string& mnemonic); };