OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_008 / chnos / fifo.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/fifo.c b/CHNOSProject/chnos/tolset_chn_000/chnos_008/chnos/fifo.c
new file mode 100644 (file)
index 0000000..274791d
--- /dev/null
@@ -0,0 +1,62 @@
+\r
+#include "core.h"\r
+\r
+void fifo32_init(DATA_FIFO *fifo, uint size, uint *buf, UI_Task *task)\r
+{\r
+       fifo->size = size;\r
+       fifo->buf = buf;\r
+       fifo->free = size;      /*freesize*/\r
+       fifo->flags = 0;\r
+       fifo->p = 0;    /*write*/\r
+       fifo->q = 0;    /*read*/\r
+       fifo->task = task;\r
+       return;\r
+}\r
+\r
+int fifo32_put(DATA_FIFO *fifo, uint data)\r
+{\r
+       int eflags;\r
+\r
+       eflags = io_load_eflags();\r
+       io_cli();\r
+\r
+       if (fifo->free == 0 ) {\r
+               fifo->flags |= FIFO32_PUT_OVERFLOW;\r
+               return -1;\r
+               }\r
+       fifo->buf[fifo->p] = data;\r
+       fifo->p++;\r
+       if(fifo->p == fifo->size) {\r
+               fifo->p = 0;\r
+               }\r
+       fifo->free--;\r
+       if(fifo->task != 0){\r
+               if(fifo->task->flags != inuse) task_run(fifo->task, -1, 0);\r
+       }\r
+\r
+       io_store_eflags(eflags);\r
+\r
+       return 0;\r
+\r
+}\r
+\r
+uint fifo32_get(DATA_FIFO *fifo)\r
+{\r
+       int data;\r
+       if (fifo->free == fifo->size) {\r
+               if(fifo->q == 0) return fifo->buf[fifo->size];\r
+               return fifo->buf[fifo->q - 1];\r
+       }\r
+       data = fifo->buf[fifo->q];\r
+       fifo->q++;\r
+       if (fifo->q == fifo->size) {\r
+               fifo->q = 0;\r
+       }\r
+       fifo->free++;\r
+       return data;\r
+}\r
+\r
+uint fifo32_status(DATA_FIFO *fifo)\r
+{\r
+       return fifo->size - fifo->free;\r
+}\r