// CC BY // code by SASANO Takayoshi #include static __inline uint8_t in_b(uint16_t port) { uint8_t data; __asm volatile("inb %1, %0" : "=a"(data) : "d"(port)); return data; } static __inline void out_b(uint16_t port, uint8_t data) { __asm volatile("outb %0, %1" :: "a"(data), "d"(port)); } static __inline uint16_t in_h(uint16_t port) { uint16_t data; __asm volatile("inw %1, %0" : "=a"(data) : "d"(port)); return data; } static __inline void out_h(uint16_t port, uint16_t data) { __asm volatile("outw %0, %1" :: "a"(data), "d"(port)); } static __inline uint32_t in_w(uint16_t port) { uint32_t data; __asm volatile("inl %1, %0" : "=a"(data) : "d"(port)); return data; } static __inline void out_w(uint16_t port, uint32_t data) { __asm volatile("outl %0, %1" :: "a"(data), "d"(port)); }