107 lines
1.7 KiB
C++
107 lines
1.7 KiB
C++
#ifndef FOOT_EMULATOR
|
|
#define FOOT_EMULATOR
|
|
|
|
#include <array>
|
|
#include <cstdint>
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
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 void 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<uint16_t>& program);
|
|
void map_device(std::unique_ptr<Device>&& device);
|
|
|
|
uint16_t& memory_at(uint16_t address);
|
|
uint16_t& decode_operand(Operand operand);
|
|
|
|
private:
|
|
std::array<uint16_t, 1 << 16> memory;
|
|
std::array<uint16_t, 1 << 5> registers;
|
|
enum class Status
|
|
{
|
|
Less,
|
|
Equal,
|
|
Greater
|
|
} status_register;
|
|
uint32_t instruction;
|
|
uint16_t configuration;
|
|
uint16_t dummy_value;
|
|
std::vector<std::unique_ptr<Device>> devices;
|
|
uint16_t mapped_base;
|
|
|
|
void read_instruction();
|
|
void run_instruction();
|
|
|
|
void CNST();
|
|
void CMPR();
|
|
void BWNG();
|
|
void ARNG();
|
|
void LONG();
|
|
void CONF();
|
|
void BWOR();
|
|
void BAND();
|
|
void BXOR();
|
|
void URSH();
|
|
void SRSH();
|
|
void ZLSH();
|
|
void CLSH();
|
|
void ADDI();
|
|
void SUBT();
|
|
void MULT();
|
|
void DIVI();
|
|
void MODU();
|
|
|
|
bool repeats();
|
|
uint8_t shift();
|
|
};
|
|
|
|
}
|
|
|
|
#endif//FOOT_EMULATOR
|