--- /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