foot/emulator/foot-emulator.h
shylie 9e2604855e
All checks were successful
Build / build (push) Successful in 4s
Add initial working version
2025-07-07 09:24:19 -04:00

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