+++ /dev/null
-\r
-#include "core.h"\r
-\r
-void inthandler20(int *esp)\r
-{\r
- UI_Timer *timer;\r
- char ts = 0;\r
-\r
- system.ui.timer.ctrl.count++;\r
- io_out8(PIC0_OCW2, 0x60); /* IRQ-00\8eó\95t\8a®\97¹\82ðPIC\82É\92Ê\92m \81B0x60+\94Ô\8d\86\81B*/\r
- if(system.ui.timer.ctrl.next_count > system.ui.timer.ctrl.count) return;\r
- timer = system.ui.timer.ctrl.timers;\r
- for(;;){\r
- if(timer->timeout > system.ui.timer.ctrl.count) break;\r
- timer->flags = allocated;\r
- if(timer != system.ui.timer.taskswitch){\r
- fifo32_put(timer->fifo, timer->data);\r
- } else {\r
- ts = 1;\r
- }\r
- timer = timer->next_timer;\r
- }\r
- system.ui.timer.ctrl.timers = timer;\r
- system.ui.timer.ctrl.next_count = timer->timeout;\r
- if(ts != 0) task_switch();\r
- return;\r
-}\r
-\r
-void init_pit(void)\r
-{\r
- int i;\r
- UI_Timer *watch;\r
- for(i = 0; i < MAX_TIMER; i++) {\r
- system.ui.timer.ctrl.timer[i].flags = initialized;\r
- }\r
- watch = timer_alloc();\r
- watch->timeout = 0xffffffff;\r
- watch->flags = inuse;\r
- watch->next_timer = 0;\r
- system.ui.timer.ctrl.timers = watch;\r
- system.ui.timer.ctrl.next_count = 0xffffffff;\r
- io_out8(PIT_CTRL, 0x34);\r
- io_out8(PIT_CNT0, 0x9c);\r
- io_out8(PIT_CNT0, 0x2e);\r
- set_gatedesc(system.io.interrupt.idt + 0x20, (int) asm_inthandler20, 2 * 8, AR_INTGATE32);\r
- io_out8(PIC0_IMR, io_in8(PIC0_IMR) & 0xfe);\r
- system.ui.timer.ctrl.count = 0;\r
- return;\r
-}\r
-\r
-UI_Timer *timer_alloc(void)\r
-{\r
- int i;\r
- for(i = 0; i < MAX_TIMER; i++){\r
- if(system.ui.timer.ctrl.timer[i].flags == initialized){\r
- system.ui.timer.ctrl.timer[i].flags = allocated;\r
- return &system.ui.timer.ctrl.timer[i];\r
- }\r
- }\r
- return 0;\r
-}\r
-\r
-void timer_free(UI_Timer *timer)\r
-{\r
- timer->flags = initialized;\r
- return;\r
-}\r
-\r
-void timer_init(UI_Timer *timer, DATA_FIFO *fifo, uint data)\r
-{\r
- timer->fifo = fifo;\r
- timer->data = data;\r
- return;\r
-}\r
-\r
-void timer_settime(UI_Timer *timer, uint timeout)\r
-{\r
- int ef;\r
- UI_Timer *t, *s;\r
-\r
- timer->timeout = timeout + system.ui.timer.ctrl.count;\r
- timer->flags = inuse;\r
- ef = io_load_eflags();\r
- io_cli();\r
- t = system.ui.timer.ctrl.timers;\r
- if(timer->timeout <= t->timeout){\r
- system.ui.timer.ctrl.timers = timer;\r
- timer->next_timer = t;\r
- system.ui.timer.ctrl.next_count = timer->timeout;\r
- io_store_eflags(ef);\r
- return;\r
- }\r
- for(;;){\r
- s = t;\r
- t = t->next_timer;\r
- if(timer->timeout <= t->timeout){\r
- s->next_timer = timer;\r
- timer->next_timer = t;\r
- io_store_eflags(ef);\r
- return; \r
- }\r
- }\r
-}\r
-\r
-void timer_settime_millisec(UI_Timer *timer, uint timeout_ms)\r
-{\r
- timer_settime(timer, timeout_ms / 10);\r
- return;\r
-}\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r