#pragma once /** * Ports provide communication with devices on the x86 IO bus. */ template struct Port { /** * Read value from port */ static T in(unsigned short offset = 0) { if constexpr (sizeof(T) == sizeof(unsigned char)) return inb(port + offset); else if constexpr (sizeof(T) == sizeof(unsigned short)) return inw(port + offset); else if constexpr (sizeof(T) == sizeof(unsigned int)) return inl(port + offset); } /** * Write value to port */ static void out(T val, unsigned short offset = 0) { if constexpr (sizeof(T) == sizeof(unsigned char)) outb(val, port + offset); else if constexpr (sizeof(T) == sizeof(unsigned short)) outw(val, port + offset); else if constexpr (sizeof(T) == sizeof(unsigned int)) outl(val, port + offset); } };