#ifndef FOOT_EMULATOR #define FOOT_EMULATOR #include #include #include #include namespace foot { struct Operand { Operand(uint8_t bits); enum class AddressingMode { Immediate = 0, Direct, IndirectAutoIncrement, IndirectAutoDecrement, Indirect, IndirectOffset1Word, IndirectOffset2Word, IndirectOffset3Word } addressing_mode; uint8_t register_index; }; class Device { friend class Emulator; public: virtual ~Device() = default; virtual bool update() = 0; virtual uint16_t mapped_memory_size() const { return assigned_memory_size; } protected: Device(uint16_t size); uint16_t& memory(uint16_t index); private: uint16_t* assigned_memory_base; uint16_t assigned_memory_size; }; class Emulator { public: static constexpr uint8_t PC = 31; static constexpr uint8_t LC = 30; Emulator(); void run(const std::vector& program); void map_device(std::unique_ptr&& device); uint16_t& memory_at(uint16_t address); uint16_t& decode_operand(Operand operand); uint16_t& register_at(uint8_t index); void run_instruction(); private: std::array memory; std::array registers; enum class Status { Less, Equal, Greater } status_register; uint32_t instruction; uint16_t configuration; uint16_t dummy_value; std::vector> devices; uint16_t mapped_base; bool keep_running; void read_instruction(); void CNST(); void CMPR(); void BWNG(); void ARNG(); void LONG(); void CONF(); void BWOR(); void BAND(); void BXOR(); void SRSH(); void ZLSH(); void CLSH(); void ADDI(); void SUBT(); void MULT(); void DIVI(); void MODU(); bool repeats(); uint8_t shift(); }; } #endif//FOOT_EMULATOR