EightBit/inc/InputOutput.h
Adrian Conlon 6261807344 More C++17 tidying up. Should be no user visible changes.
Signed-off-by: Adrian Conlon <adrian.conlon@gmail.com>
2021-01-06 15:30:26 +00:00

51 lines
1.6 KiB
C++

#pragma once
#include <cstdint>
#include "Memory.h"
#include "Ram.h"
namespace EightBit {
class InputOutput final : public Memory {
public:
enum class AccessType { Unknown, Reading, Writing };
[[nodiscard]] size_t size() const noexcept override;
[[nodiscard]] uint8_t peek(uint16_t address) const override;
[[nodiscard]] uint8_t& reference(uint16_t address) override;
int load(std::ifstream& file, int writeOffset = 0, int readOffset = 0, int limit = -1) override;
int load(std::string path, int writeOffset = 0, int readOffset = 0, int limit = -1) override;
int load(const std::vector<uint8_t>& bytes, int writeOffset = 0, int readOffset = 0, int limit = -1) override;
[[nodiscard]] const AccessType& accessType() const noexcept { return m_access; }
[[nodiscard]] AccessType& accessType() noexcept { return m_access; }
[[nodiscard]] auto readPort(uint8_t port, AccessType access) {
accessType() = access;
return reference(port);
}
[[nodiscard]] auto readInputPort(uint8_t port) { return readPort(port, AccessType::Reading); }
[[nodiscard]] auto readOutputPort(uint8_t port) { return readPort(port, AccessType::Writing); }
void writePort(uint8_t port, uint8_t value, AccessType access) {
accessType() = access;
reference(port) = value;
}
void writeInputPort(uint8_t port, uint8_t value) { writePort(port, value, AccessType::Reading); }
void writeOutputPort(uint8_t port, uint8_t value) { writePort(port, value, AccessType::Writing); }
protected:
void poke(uint16_t address, uint8_t value) override;
private:
Ram m_input = 0x100;
Ram m_output = 0x100;
AccessType m_access = AccessType::Unknown;
};
}