Code: Select all
//Pic.cpp
#include "io.h"
#include "datatypes.h"
#include "idt.h"
#include "video.h"
void (*irq_routines[16])(struct regs *r) =
{
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
void irq_handler(struct regs *r)
{
void (*handler)(struct regs *r);
handler = *(irq_routines+(r->int_no - 32));
if (handler)
{
handler(r);
}
if (r->int_no >= 40)
{
outb(0xA0, 0x20);
}
outb(0x20, 0x20);
}
void irq0(){
regs r;
r.int_no=32;
irq_handler(&r);
};
void irq1(){
regs r;
r.int_no=33;
irq_handler(&r);
};
void irq2(){
regs r;
r.int_no=34;
irq_handler(&r);
};
void irq3(){
regs r;
r.int_no=35;
irq_handler(&r);
};
void irq4(){
regs r;
r.int_no=36;
irq_handler(&r);
};
void irq5(){
regs r;
r.int_no=37;
irq_handler(&r);
};
void irq6(){
regs r;
r.int_no=38;
irq_handler(&r);
};
void irq7(){
regs r;
r.int_no=39;
irq_handler(&r);
};
void irq8(){
regs r;
r.int_no=40;
irq_handler(&r);
};
void irq9(){
regs r;
r.int_no=41;
irq_handler(&r);
};
void irq10(){
regs r;
r.int_no=42;
irq_handler(&r);
};
void irq11(){
regs r;
r.int_no=43;
irq_handler(&r);
};
void irq12(){
regs r;
r.int_no=44;
irq_handler(&r);
};
void irq13(){
regs r;
r.int_no=45;
irq_handler(&r);
};
void irq14(){
regs r;
r.int_no=46;
irq_handler(&r);
};
void irq15(){
regs r;
r.int_no=47;
irq_handler(&r);
};
void irq_install_handler(int irq, void (*handler)(struct regs *r))
{
irq_routines[irq] = handler;
}
void irq_uninstall_handler(int irq)
{
irq_routines[irq] = 0;
}
void irq_remap()
{
outb(0x20, 0x11);
outb(0xA0, 0x11);
outb(0x21, 0x20);
outb(0xA1, 0x28);
outb(0x21, 0x04);
outb(0xA1, 0x02);
outb(0x21, 0x01);
outb(0xA1, 0x01);
outb(0x21, 0x0);
outb(0xA1, 0x0);
}
void irq_install()
{
irq_remap();
idt_set_gate(32, (unsigned)irq0, 0x08, 0x8E);
idt_set_gate(33, (unsigned)irq1, 0x08, 0x8E);
idt_set_gate(34, (unsigned)irq2, 0x08, 0x8E);
idt_set_gate(35, (unsigned)irq3, 0x08, 0x8E);
idt_set_gate(36, (unsigned)irq4, 0x08, 0x8E);
idt_set_gate(37, (unsigned)irq5, 0x08, 0x8E);
idt_set_gate(38, (unsigned)irq6, 0x08, 0x8E);
idt_set_gate(39, (unsigned)irq7, 0x08, 0x8E);
idt_set_gate(40, (unsigned)irq8, 0x08, 0x8E);
idt_set_gate(41, (unsigned)irq9, 0x08, 0x8E);
idt_set_gate(42, (unsigned)irq10, 0x08, 0x8E);
idt_set_gate(43, (unsigned)irq11, 0x08, 0x8E);
idt_set_gate(44, (unsigned)irq12, 0x08, 0x8E);
idt_set_gate(45, (unsigned)irq13, 0x08, 0x8E);
idt_set_gate(46, (unsigned)irq14, 0x08, 0x8E);
idt_set_gate(47, (unsigned)irq15, 0x08, 0x8E);
}
Code: Select all
//Pic.h
#ifndef PIC_H
#define PIC_H
#include "datatypes.h"
void irq0();
void irq1();
void irq2();
void irq3();
void irq4();
void irq5();
void irq6();
void irq7();
void irq8();
void irq9();
void irq10();
void irq11();
void irq12();
void irq13();
void irq14();
void irq15();
void irq_install_handler(int irq, void (*handler)(struct regs *r));
void irq_uninstall_handler(int irq);
void irq_remap();
void irq_install();
void irq_handler(struct regs *r);
#endif
Code: Select all
//Pit.cpp
#include "Video.h"
#include "io.h"
#include "datatypes.h"
#include "idt.h"
#include "isrs.h"
#include "pic.h"
#include "pit.h"
int timer_ticks = 0;
/* Handles the timer. In this case, it's very simple: We
* increment the 'timer_ticks' variable every time the
* timer fires. By default, the timer fires 18.222 times
* per second. Why 18.222Hz? Some engineer at IBM must've
* been smoking something funky */
void timer_handler(struct regs *r)
{
Video vid;
/* Increment our 'tick count' */
timer_ticks++;
/* Every 18 clocks (approximately 1 second), we will
* display a message on the screen */
if (timer_ticks % 18 == 0)
{
vid.puts("One second has passed\n", ALERT);
}
}
/* This will continuously loop until the given time has
* been reached */
void timer_wait(int ticks)
{
unsigned long eticks;
eticks = timer_ticks + ticks;
while(timer_ticks < eticks);
}
/* Sets up the system clock by installing the timer handler
* into IRQ0 */
void timer_install()
{
/* Installs 'timer_handler' to IRQ0 */
irq_install_handler(0, timer_handler);
}
Code: Select all
//Pit.h
#ifndef PIT_H
#define PIT_H
#include "datatypes.h"
void timer_handler(struct regs *r);
void timer_wait(int ticks);
void timer_install();
#endif