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