OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_009 / chnos / fifo.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/fifo.c b/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/fifo.c
new file mode 100644 (file)
index 0000000..323d329
--- /dev/null
@@ -0,0 +1,108 @@
+\r
+#include "core.h"\r
+\r
+int FIFO32_Initialise(DATA_FIFO *fifo, uint size)\r
+{\r
+       fifo->size = size;\r
+       fifo->buf = MemoryBlock_Allocate_System(size * 4);\r
+       MemoryBlock_Write_Description(fifo->buf, "FIFO_BUFFER");\r
+       fifo->free = size;      /*freesize*/\r
+       fifo->flags = 0;\r
+       fifo->p = 0;    /*write*/\r
+       fifo->q = 0;    /*read*/\r
+       fifo->task = 0;\r
+       return 0;\r
+}\r
+\r
+int FIFO32_Put(DATA_FIFO *fifo, uint data)\r
+{\r
+       uint 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->state != inuse){\r
+                       MultiTask_Task_Run(fifo->task);\r
+               }\r
+       }\r
+       IO_Store_EFlags(eflags);\r
+\r
+       return 0;\r
+}\r
+\r
+int FIFO32_Put_Arguments(DATA_FIFO *fifo, uint args, ...)\r
+{\r
+       int i;\r
+       va_list ap;\r
+       uint eflags;\r
+\r
+       eflags = IO_Load_EFlags();\r
+       IO_CLI();\r
+\r
+       va_start(ap, args);\r
+\r
+       for(i = 0; i < args; i++){\r
+               if(fifo->free <= 1){\r
+                       i = -1;\r
+                       break;\r
+               }\r
+               FIFO32_Put(fifo, va_arg(ap, uint));\r
+       }\r
+       FIFO32_Put(fifo, SIGNAL_ARGUMENTS_END);\r
+\r
+       va_end(ap);\r
+       IO_Store_EFlags(eflags);\r
+\r
+       return i; \r
+}\r
+\r
+void FIFO32_Set_Task(DATA_FIFO *fifo, UI_Task *task)\r
+{\r
+       fifo->task = task;\r
+       return;\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
+\r
+int FIFO32_Free(DATA_FIFO *fifo)\r
+{\r
+       if(fifo->buf == 0){\r
+               return -1;\r
+       }\r
+       fifo->size = 0;\r
+       fifo->free = 0;\r
+       fifo->flags = 0;\r
+       fifo->p = 0;\r
+       fifo->q = 0;\r
+       return MemoryBlock_Free(fifo->buf);\r
+}\r