luxos/timer.c

52 lines
1.1 KiB
C

#include<system.h>
int timer_ticks = 0;
int timer_hz;
void timer_phase(int hz)
{
int divisor = 1193180/hz; // Calculate the divisor
outportb(0x43, 0x36); // Set our command byte 0x36
outportb(0x40, divisor&0xFF); // Set low byte
outportb(0x40, divisor>>8); // Set high byte
timer_hz = hz;
}
void timer_clock (int x, int y, int secs)
{
int s, m, h;
char arr[9] = {0,0,0,0,0,0,0,0,0};
s = secs%60;
m = (secs/60)%60;
h = secs/3600;
arr[0] = (h/10)%10 + '0'; if (arr[0]=='0') arr[0] = ' ';
arr[1] = h%10 + '0';
arr[3] = (m/10) + '0';
arr[4] = m%10 + '0';
arr[6] = s/10 + '0';
arr[7] = s%10 + '0';
if (secs%2 == 0) {
arr[2] = ' ';
arr[5] = ' ';
}
else {
arr[2] = ':';
arr[5] = ':';
}
puts_pos(x, y, arr);
}
void timer_handler(regs *r)
{
timer_ticks++;
if (timer_ticks % timer_hz) {
timer_clock (70, 0, timer_ticks / timer_hz);
}
}