blob: 59af51da96e7dce0c5e223f2dee0f3b8fe208e50 [file] [log] [blame]
swissChilidefeb0d2021-02-18 15:28:36 -08001#include "timer.h"
swissChilidefeb0d2021-02-18 15:28:36 -08002#include "io.h"
swissChili825d46b2021-02-21 10:14:16 -08003#include "log.h"
4#include "pic.h"
5#include "registers.h"
swissChilief97c262021-04-04 10:20:21 -07006#include "task.h"
swissChilidefeb0d2021-02-18 15:28:36 -08007
swissChili19ef4182021-02-21 17:45:51 -08008static void timer_cb(struct registers *regs)
swissChilidefeb0d2021-02-18 15:28:36 -08009{
swissChiliaed6ff32021-05-29 17:51:04 -070010 if (tasks_initialized)
11 {
12 // Preemptive multitasking!
swissChili1e8b7562021-12-22 21:22:57 -080013 switch_task(*regs);
swissChiliaed6ff32021-05-29 17:51:04 -070014 }
swissChilidefeb0d2021-02-18 15:28:36 -080015}
16
17void init_timer(uint hz)
18{
19 add_interrupt_handler(IRQ_TO_INT(0), timer_cb);
20
21 uint divisor = TIMER_FREQ / hz;
22
swissChilidefeb0d2021-02-18 15:28:36 -080023 outb(0x43, 0x36);
swissChili825d46b2021-02-21 10:14:16 -080024 uchar l = divisor & 0xff, h = (divisor >> 8) & 0xff;
swissChilidefeb0d2021-02-18 15:28:36 -080025
26 outb(0x40, l);
swissChilidefeb0d2021-02-18 15:28:36 -080027 outb(0x40, h);
swissChilidefeb0d2021-02-18 15:28:36 -080028}