85 lines
2.3 KiB
C++
85 lines
2.3 KiB
C++
#pragma once
|
|
|
|
#include <array>
|
|
#include <memory>
|
|
#include <stdexcept>
|
|
#include <string>
|
|
#include <cstdint>
|
|
#include <unordered_map>
|
|
#include <functional>
|
|
|
|
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<int, 10> registri{};
|
|
double F_val = 0.0;
|
|
|
|
std::array<uint8_t, MAX_ADRESS> pomnilnik{};
|
|
std::array<std::unique_ptr<Device>, 256> naprave{};
|
|
std::unordered_map<std::string, std::function<bool(int,int)>> ukaziF2;
|
|
std::unordered_map<std::string, std::function<bool(int)>> 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<Device> 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);
|
|
};
|