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