From b9d2cef90451fae9ab7e10f5f11b8840e9bfe67d Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Sat, 28 Sep 2024 17:04:46 -0400 Subject: create Port interface --- portio.hpp | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) (limited to 'portio.hpp') diff --git a/portio.hpp b/portio.hpp index 0a10651..7636c14 100644 --- a/portio.hpp +++ b/portio.hpp @@ -5,20 +5,68 @@ inline void outb(std::uint16_t port, std::uint8_t val) { - asm volatile("outb %b0, %w1" :: "a"(val), "Nd"(port) : "memory"); + asm volatile("out %%al, %%dx" :: "a"(val), "Nd"(port) : "memory"); } inline std::uint8_t inb(std::uint16_t port) { std::uint8_t val; - asm volatile("inb %w1, %b0" : "=a"(val) : "Nd"(port) : "memory"); + asm volatile("inb %%dx" : "=a"(val) : "Nd"(port) : "memory"); return val; } - + +inline void outw(std::uint16_t port, std::uint16_t val) +{ + asm volatile("out %%ax, %%dx" :: "a"(val), "Nd"(port) : "memory"); +} + +inline std::uint16_t inw(std::uint16_t port) +{ + std::uint16_t val; + asm volatile("inw %%dx" : "=a"(val) : "Nd"(port) : "memory"); + return val; +} + inline void io_wait() { outb(0x80, 0); } +template +struct Port +{ + Port() = default; + + template + auto operator=(T val) noexcept { + if constexpr (sizeof(T) == 1) + outb(Addr, val); + else if constexpr (sizeof(T) == 2) + outw(Addr, val); + + return *this; + } + + template + operator T() const noexcept { + if constexpr (sizeof(T) == 1) + return inb(Addr); + else if constexpr (sizeof(T) == 2) + return inw(Addr); + } + + template + bool operator==(T val) const noexcept { + T dat = *this; + return dat == val; + } + + template + auto operator&(T val) const noexcept { + T dat = *this; + return dat & val; + } +}; + #endif // PORTIO_HPP -- cgit v1.2.3