Subversion Repositories NaviCtrl

Rev

Rev 272 | Rev 378 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
41 ingob 1
#include "fifo.h"
362 holgerb 2
#include "main.h"
41 ingob 3
 
244 killagreg 4
u8 fifo_init (fifo_t* f, u8* buffer, const u16 size, u16 putvicsource, u16 getvicsource)
41 ingob 5
{
6
        if(f == NULL) return(0);
7
        f->buffer = buffer;
153 killagreg 8
        f->size = size;
244 killagreg 9
        f->putvicsource = putvicsource;
10
        f->getvicsource = getvicsource;
153 killagreg 11
        fifo_purge(f);
41 ingob 12
        return(1);
13
}
14
 
15
u8 fifo_put (fifo_t *f, const u8 data)
16
{
272 killagreg 17
        if(f->buffer == 0) return(0);
41 ingob 18
        if (f->count >= f->size) return(0);     // return 0 in case of FIFO overflow.
244 killagreg 19
        if(f->putvicsource != NO_ITLine) VIC_ITCmd(f->putvicsource, DISABLE);
20
        *(f->pwrite++) = data;      // copy data byte to buffer
21
        if(f->pwrite >= f->buffer + f->size) f->pwrite = f->buffer; // start at the begining after reaching the end 
41 ingob 22
        f->count++;
244 killagreg 23
        if(f->putvicsource != NO_ITLine) VIC_ITCmd(f->putvicsource, ENABLE);
24
        return(1);
41 ingob 25
}
26
 
27
u8 fifo_get (fifo_t *f, u8 *pdata)
28
{
272 killagreg 29
        if(f->buffer == 0) return(0);
41 ingob 30
        if(!f->count) return(0);
244 killagreg 31
        if(f->getvicsource != NO_ITLine) VIC_ITCmd(f->getvicsource, DISABLE);
32
        *pdata = *(f->pread++);
33
        if(f->pread >= f->buffer + f->size) f->pread = f->buffer; // start at the begining after reaching the end 
41 ingob 34
        f->count--;
244 killagreg 35
        if(f->getvicsource != NO_ITLine) VIC_ITCmd(f->getvicsource, ENABLE);
41 ingob 36
        return(1);
37
}
38
 
39
u8 fifo_get_wait (fifo_t *f, u8 *pdata)
40
{
362 holgerb 41
        while (!f->count && (SD_WatchDog));
41 ingob 42
 
43
        return fifo_get(f, pdata);
44
}
153 killagreg 45
 
46
void fifo_purge(fifo_t* f)
47
{
48
        if((f == NULL)) return;
49
        f->count = 0;
50
        f->pread = f->buffer;
51
        f->pwrite = f->buffer;
52
        return;
53
}