#pragma once #if !defined(BAD_APPLE_OS_KERNEL_PIC_HPP_INCLUDED) #define BAD_APPLE_OS_KERNEL_PIC_HPP_INCLUDED #include #include "os/interrupt.hpp" #include "os/port.hpp" inline constexpr std::uint16_t PORT_PIC1 = 0x20; inline constexpr std::uint16_t PORT_PIC2 = 0xA0; inline constexpr std::uint8_t PIC_CMD_EOI = 0x20; [[nodiscard]] bool initPICs(std::uint8_t masterOffset, std::uint8_t slaveOffset) noexcept; __attribute__((no_caller_saved_registers)) void sendEndOfInterrupt(std::uint8_t irq) noexcept; void maskIRQ(std::uint8_t irq) noexcept; void unmaskIRQ(std::uint8_t irq) noexcept; [[nodiscard]] std::uint16_t readPICIRR() noexcept; [[nodiscard]] std::uint16_t readPICISR() noexcept; [[nodiscard]] constexpr bool isValidPICOffset(std::uint8_t offset) noexcept { return (offset & 7) == 0; } #endif // !defined(BAD_APPLE_OS_KERNEL_PIC_HPP_INCLUDED)