OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_008 / chnos / timer.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/timer.c b/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/timer.c
new file mode 100644 (file)
index 0000000..dff8773
--- /dev/null
@@ -0,0 +1,116 @@
+\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Ê\92\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