81 lines
3.0 KiB
C++
81 lines
3.0 KiB
C++
|
|
#pragma once
|
|
|
|
#if !defined(BAD_APPLE_OS_PORT_HPP_INCLUDED)
|
|
#define BAD_APPLE_OS_PORT_HPP_INCLUDED
|
|
|
|
#include <cstdint>
|
|
|
|
#define writePort8(port, value) \
|
|
{ \
|
|
__asm__ __volatile__( \
|
|
"outb %0, %1" \
|
|
: \
|
|
: "a"(static_cast<std::uint8_t>(value)), \
|
|
"Nd"(static_cast<std::uint16_t>(port)) \
|
|
); \
|
|
}
|
|
|
|
#define readPort8(port) \
|
|
[&]() \
|
|
{ \
|
|
std::uint8_t value = 0; \
|
|
__asm__ __volatile__( \
|
|
"inb %1, %0" \
|
|
: "=a"(value) \
|
|
: "Nd"(static_cast<std::uint16_t>(port)) \
|
|
); \
|
|
return value; \
|
|
}()
|
|
|
|
#define writePort16(port, value) \
|
|
{ \
|
|
__asm__ __volatile__( \
|
|
"outw %0, %1" \
|
|
: \
|
|
: "a"(static_cast<std::uint16_t>(value)), \
|
|
"Nd"(static_cast<std::uint16_t>(port)) \
|
|
); \
|
|
}
|
|
|
|
#define readPort16(port) \
|
|
[&]() \
|
|
{ \
|
|
std::uint16_t value = 0; \
|
|
__asm__ __volatile__( \
|
|
"inw %1, %0" \
|
|
: "=a"(value) \
|
|
: "Nd"(static_cast<std::uint16_t>(port)) \
|
|
); \
|
|
return value; \
|
|
}()
|
|
|
|
#define writePort32(port, value) \
|
|
{ \
|
|
__asm__ __volatile__( \
|
|
"outl %0, %1" \
|
|
: \
|
|
: "a"(static_cast<std::uint32_t>(value)), \
|
|
"Nd"(static_cast<std::uint16_t>(port)) \
|
|
); \
|
|
}
|
|
|
|
#define readPort32(port) \
|
|
[&]() \
|
|
{ \
|
|
std::uint32_t value = 0; \
|
|
__asm__ __volatile__( \
|
|
"inl %1, %0" \
|
|
: "=a"(value) \
|
|
: "Nd"(static_cast<std::uint32_t>(port)) \
|
|
); \
|
|
return value; \
|
|
}()
|
|
|
|
inline void ioWait() noexcept
|
|
{
|
|
writePort8(0x80, 0);
|
|
}
|
|
|
|
#endif // !defined(BAD_APPLE_OS_PORT_HPP_INCLUDED)
|