]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.bin/doscmd/timer.c
This commit was generated by cvs2svn to compensate for changes in r82367,
[FreeBSD/FreeBSD.git] / usr.bin / doscmd / timer.c
1 /*
2 ** No copyright?!
3 **
4 ** $FreeBSD$
5 */
6 #include "doscmd.h"
7
8 static void
9 int08(regcontext_t *REGS)
10 {
11     *(u_long *)&BIOSDATA[0x6c] += 1;    /* ticks since midnight */
12     while (*(u_long *)&BIOSDATA[0x6c] >= 24*60*6*182) {
13         *(u_long *)&BIOSDATA[0x6c] -= 24*60*6*182;
14         BIOSDATA[0x70]++;               /* # times past mn */
15     }
16
17     softint(0x1c);
18 }
19
20 static void
21 int1c(regcontext_t *REGS)
22 {
23 }
24
25 unsigned char timer;
26
27 static u_char
28 inb_timer(int port)
29 {
30     return (--timer);
31 }
32
33 void
34 timer_init(void)
35 {
36     u_long              vec;
37     struct itimerval    itv;
38     struct timeval      tv;
39     time_t              tv_sec;
40     struct timezone     tz;
41     struct tm           tm;
42
43     vec = insert_hardint_trampoline();
44     ivec[0x08] = vec;
45     register_callback(vec, int08, "int 08");
46     
47     vec = insert_softint_trampoline();
48     ivec[0x1c] = vec;
49     register_callback(vec, int1c, "int 1c");
50
51     define_input_port_handler(0x42, inb_timer);
52     define_input_port_handler(0x40, inb_timer);
53     
54     /* Initialize time counter BIOS variable. */
55     gettimeofday(&tv, &tz);
56     tv_sec = tv.tv_sec;
57     tm = *localtime(&tv_sec);
58     *(u_long *)&BIOSDATA[0x6c] =
59         (((tm.tm_hour * 60 + tm.tm_min) * 60) + tm.tm_sec) * 182 / 10;
60
61     itv.it_interval.tv_sec = 0;
62     itv.it_interval.tv_usec = 54925; /* 1193182/65536 times per second */
63     itv.it_value.tv_sec = 0;
64     itv.it_value.tv_usec = 54925;        /* 1193182/65536 times per second */
65     if (! timer_disable)
66         setitimer(ITIMER_REAL, &itv, 0);
67 }