4 void inthandler20(int *esp)
\r
9 system.ui.timer.ctrl.count++;
\r
10 io_out8(PIC0_OCW2, 0x60); /* IRQ-00
\8eó
\95t
\8a®
\97¹
\82ðPIC
\82É
\92Ê
\92m
\81B0x60+
\94Ô
\8d\86\81B*/
\r
11 if(system.ui.timer.ctrl.next_count > system.ui.timer.ctrl.count) return;
\r
12 timer = system.ui.timer.ctrl.timers;
\r
14 if(timer->timeout > system.ui.timer.ctrl.count) break;
\r
15 timer->flags = allocated;
\r
16 if(timer != system.ui.timer.taskswitch){
\r
17 fifo32_put(timer->fifo, timer->data);
\r
21 timer = timer->next_timer;
\r
23 system.ui.timer.ctrl.timers = timer;
\r
24 system.ui.timer.ctrl.next_count = timer->timeout;
\r
25 if(ts != 0) task_switch();
\r
33 for(i = 0; i < MAX_TIMER; i++) {
\r
34 system.ui.timer.ctrl.timer[i].flags = initialized;
\r
36 watch = timer_alloc();
\r
37 watch->timeout = 0xffffffff;
\r
38 watch->flags = inuse;
\r
39 watch->next_timer = 0;
\r
40 system.ui.timer.ctrl.timers = watch;
\r
41 system.ui.timer.ctrl.next_count = 0xffffffff;
\r
42 io_out8(PIT_CTRL, 0x34);
\r
43 io_out8(PIT_CNT0, 0x9c);
\r
44 io_out8(PIT_CNT0, 0x2e);
\r
45 set_gatedesc(system.io.interrupt.idt + 0x20, (int) asm_inthandler20, 2 * 8, AR_INTGATE32);
\r
46 io_out8(PIC0_IMR, io_in8(PIC0_IMR) & 0xfe);
\r
47 system.ui.timer.ctrl.count = 0;
\r
51 UI_Timer *timer_alloc(void)
\r
54 for(i = 0; i < MAX_TIMER; i++){
\r
55 if(system.ui.timer.ctrl.timer[i].flags == initialized){
\r
56 system.ui.timer.ctrl.timer[i].flags = allocated;
\r
57 return &system.ui.timer.ctrl.timer[i];
\r
63 void timer_free(UI_Timer *timer)
\r
65 timer->flags = initialized;
\r
69 void timer_init(UI_Timer *timer, DATA_FIFO *fifo, uint data)
\r
76 void timer_settime(UI_Timer *timer, uint timeout)
\r
81 timer->timeout = timeout + system.ui.timer.ctrl.count;
\r
82 timer->flags = inuse;
\r
83 ef = io_load_eflags();
\r
85 t = system.ui.timer.ctrl.timers;
\r
86 if(timer->timeout <= t->timeout){
\r
87 system.ui.timer.ctrl.timers = timer;
\r
88 timer->next_timer = t;
\r
89 system.ui.timer.ctrl.next_count = timer->timeout;
\r
90 io_store_eflags(ef);
\r
96 if(timer->timeout <= t->timeout){
\r
97 s->next_timer = timer;
\r
98 timer->next_timer = t;
\r
99 io_store_eflags(ef);
\r
105 void timer_settime_millisec(UI_Timer *timer, uint timeout_ms)
\r
107 timer_settime(timer, timeout_ms / 10);
\r