#include "arch/Timer.h"
#include "arch/x86_64/IO.h"

#define PIT_CHANNEL_0 0x40

const u64 base_frequency = 1193182;
const usize ARCH_TIMER_FREQ = 10;

void Timer::arch_init()
{
    constexpr u16 divisor = (u16)(base_frequency / (ARCH_TIMER_FREQ * 1000));
    static_assert(divisor >= 100);
    IO::outb(PIT_CHANNEL_0, (u8)(divisor & 0xFF));
    IO::outb(0x80, 0); // short delay
    IO::outb(PIT_CHANNEL_0, (u8)((divisor & 0xFF00) >> 8));
}