#pragma once #include #include namespace hw { template class port { private: uint16_t mp; public: explicit port(uint16_t p) : mp(p) { } port_size_t operator*(void) const { static_assert( types::is_same::value || types::is_same::value, "this type is not implemented yet."); port_size_t ret; if constexpr (types::is_same::value) asm volatile( "inb %1, %0" : "=a"(ret) : "d"(mp)); if constexpr (types::is_same::value) asm volatile( "inw %1, %0" : "=a"(ret) : "d"(mp)); return ret; } port_size_t operator=(port_size_t n) const { static_assert( types::is_same::value || types::is_same::value, "this type is not implemented yet."); if constexpr (types::is_same::value) asm volatile( "outb %1, %0" : : "d"(mp), "a"(n)); if constexpr (types::is_same::value) asm volatile( "outw %1, %0" : : "d"(mp), "a"(n)); return n; } }; using p8 = port; using p8r = port; using p8w = port; using p16 = port; using p16r = port; using p16w = port; template <> uint8_t p8r::operator=(uint8_t n) const = delete; template <> uint8_t p8w::operator*(void) const = delete; template <> uint16_t p16r::operator=(uint16_t n) const = delete; template <> uint16_t p16w::operator*(void) const = delete; } // namespace hw