--- /dev/null
+\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