DragonVM/src/hardware/VirtualIODevices.hpp

209 lines
No EOL
6 KiB
C++

#pragma once
#include "IMemoryDevice.hpp"
#include "../tools/GlobalData.hpp"
#include <ostd/Serial.hpp>
#include <fstream>
namespace dragon
{
namespace hw
{
class VirtualHardDrive;
class MemoryMapper;
class VirtualCPU;
class VirtualRAM;
class VirtualBIOS : public IMemoryDevice
{
public:
inline VirtualBIOS(void) { m_initialized = 0; }
inline VirtualBIOS(const ostd::String& biosFilePath) { init(biosFilePath); }
void init(const ostd::String& biosFilePath);
int8_t read8(uint16_t addr) override;
int16_t read16(uint16_t addr) override;
int8_t write8(uint16_t addr, int8_t value) override;
int16_t write16(uint16_t addr, int16_t value) override;
ostd::ByteStream* getByteStream(void) override;
private:
ostd::ByteStream m_bios;
bool m_initialized { false };
};
class InterruptVector : public IMemoryDevice
{
public:
InterruptVector(void);
int8_t read8(uint16_t addr) override;
int16_t read16(uint16_t addr) override;
int8_t write8(uint16_t addr, int8_t value) override;
int16_t write16(uint16_t addr, int16_t value) override;
ostd::ByteStream* getByteStream(void) override;
private:
ostd::ByteStream m_data;
};
class VirtualKeyboard : public IMemoryDevice
{
public:
VirtualKeyboard(void);
int8_t read8(uint16_t addr) override;
int16_t read16(uint16_t addr) override;
int8_t write8(uint16_t addr, int8_t value) override;
int16_t write16(uint16_t addr, int16_t value) override;
ostd::ByteStream* getByteStream(void) override;
private:
};
class VirtualMouse : public IMemoryDevice
{
public:
VirtualMouse(void);
int8_t read8(uint16_t addr) override;
int16_t read16(uint16_t addr) override;
int8_t write8(uint16_t addr, int8_t value) override;
int16_t write16(uint16_t addr, int16_t value) override;
ostd::ByteStream* getByteStream(void) override;
private:
};
class VirtualBootloader : public IMemoryDevice
{
public:
VirtualBootloader(void);
int8_t read8(uint16_t addr) override;
int16_t read16(uint16_t addr) override;
int8_t write8(uint16_t addr, int8_t value) override;
int16_t write16(uint16_t addr, int16_t value) override;
ostd::ByteStream* getByteStream(void) override;
private:
ostd::ByteStream m_mbr;
};
namespace interface
{
class Disk : public IMemoryDevice
{
public: struct tRegisters
{
inline static constexpr uint16_t Signal = 0x00;
inline static constexpr uint16_t ModeSelector = 0x01;
inline static constexpr uint16_t DiskSelector = 0x02;
inline static constexpr uint16_t SectorSelector = 0x03;
inline static constexpr uint16_t AddressSelector = 0x05;
inline static constexpr uint16_t DataSize = 0x07;
inline static constexpr uint16_t DataSourceAddress = 0x09;
inline static constexpr uint16_t FirstReadOnly = 0x0B;
inline static constexpr uint16_t Status = 0x0B;
inline static constexpr uint16_t CurrentDisk = 0x0C;
inline static constexpr uint16_t CurrentSector = 0x0D;
inline static constexpr uint16_t CurrentAddress = 0x0F;
inline static constexpr uint16_t RestDataSize = 0x11;
inline static constexpr uint16_t SourceData = 0x13;
};
public: struct tSignalValues
{
inline static constexpr uint8_t Start = 0x00;
inline static constexpr uint8_t Cancel = 0x01;
inline static constexpr uint8_t Ignore = 0xFF;
};
public: struct tModeValues
{
inline static constexpr uint8_t Read = 0x00;
inline static constexpr uint8_t Write = 0x01;
};
public: struct tStatusValues
{
inline static constexpr uint8_t Free = 0x00;
inline static constexpr uint8_t Writing = 0x01;
inline static constexpr uint8_t Reading = 0x02;
};
public:
Disk(MemoryMapper& memory, VirtualCPU& cpu);
int8_t read8(uint16_t addr) override;
int16_t read16(uint16_t addr) override;
int8_t write8(uint16_t addr, int8_t value) override;
int16_t write16(uint16_t addr, int16_t value) override;
ostd::ByteStream* getByteStream(void) override;
void cycleStep(void);
data::VDiskID connectDisk(VirtualHardDrive& hdd);
bool disconnectDisk(data::VDiskID diskID);
inline bool isBusy(void) const { return m_busy; }
private:
ostd::serial::SerialIO m_data { data::MemoryMapAddresses::DiskInterface_End - data::MemoryMapAddresses::DiskInterface_Start };
bool m_busy { false };
std::unordered_map<data::VDiskID, VirtualHardDrive*> m_connectedDisks;
MemoryMapper& m_memory;
VirtualCPU& m_cpu;
inline static data::VDiskID s_nextDiskID = 0;
};
class Graphics : public IMemoryDevice
{
public:
Graphics(void);
int8_t read8(uint16_t addr) override;
int16_t read16(uint16_t addr) override;
int8_t write8(uint16_t addr, int8_t value) override;
int16_t write16(uint16_t addr, int16_t value) override;
ostd::ByteStream* getByteStream(void) override;
private:
};
class SerialPort : public IMemoryDevice
{
public:
SerialPort(void);
int8_t read8(uint16_t addr) override;
int16_t read16(uint16_t addr) override;
int8_t write8(uint16_t addr, int8_t value) override;
int16_t write16(uint16_t addr, int16_t value) override;
ostd::ByteStream* getByteStream(void) override;
private:
};
class CMOS : public IMemoryDevice
{
public:
inline CMOS(void) { m_initialized = false; }
inline CMOS(const ostd::String& cmosFilePath) { init(cmosFilePath); }
void init(const ostd::String& cmosFilePath);
int8_t read8(uint16_t addr) override;
int16_t read16(uint16_t addr) override;
int8_t write8(uint16_t addr, int8_t value) override;
int16_t write16(uint16_t addr, int16_t value) override;
ostd::ByteStream* getByteStream(void) override;
private:
ostd::ByteStream m_data;
uint16_t m_size { 0 };
std::fstream m_dataFile;
bool m_initialized { false };
uint64_t m_fileSize { 0 };
};
}
}
}