U1Fifo *NewU1Fifo(U8 size,TssStruct *tss=NULL) { U1Fifo *f; if (!tss) tss=Fs; f=MAlloc(sizeof(U1Fifo),tss); f->mem_tss=tss; f->buf=MAlloc(size,tss); f->mask=size-1; f->in_ptr=0; f->out_ptr=0; return f; } void DelU1Fifo(U1Fifo *f) { Free(f->buf,f->mem_tss); Free(f,f->mem_tss); } BoolU8 U1FifoInsert(U1Fifo *f,U1 ch) { U8 old_flags=GetFlags, new_in_ptr; Cli; new_in_ptr=(f->in_ptr+1)&f->mask; if (new_in_ptr==f->out_ptr) { SetFlags(old_flags); return FALSE; } else { f->buf[f->in_ptr]=ch; f->in_ptr=new_in_ptr; SetFlags(old_flags); return TRUE; } } BoolU8 U1FifoRemove(U1Fifo *f,U1 *ch) { U8 old_flags=GetFlags; Cli; if (f->in_ptr==f->out_ptr) { SetFlags(old_flags); return FALSE; } else { *ch=f->buf[f->out_ptr]; f->out_ptr=(f->out_ptr+1)&f->mask; SetFlags(old_flags); return TRUE; } } BoolU8 U1FifoPeek(U1Fifo *f,U1 *ch) { U8 old_flags=GetFlags; Cli; if (f->in_ptr==f->out_ptr) { SetFlags(old_flags); return FALSE; } else { *ch=f->buf[f->out_ptr]; SetFlags(old_flags); return TRUE; } } void U1FifoFlush(U1Fifo *f) { U8 old_flags=GetFlags; Cli; f->out_ptr=f->in_ptr; SetFlags(old_flags); } U8 U1FifoCnt(U1Fifo *f) { U8 result,old_flags=GetFlags; Cli; if (f->out_ptr>f->in_ptr) result=f->mask+1-(f->out_ptr-f->in_ptr); else result=f->in_ptr-f->out_ptr; SetFlags(old_flags); return result; } U8Fifo *NewU8Fifo(U8 size,TssStruct *tss=NULL) { U8Fifo *f; if (!tss) tss=Fs; f=MAlloc(sizeof(U8Fifo),tss); f->mem_tss=tss; f->buf=MAlloc(size*sizeof(U8),tss); f->mask=size-1; f->in_ptr=0; f->out_ptr=0; return f; } void DelU8Fifo(U8Fifo *f) { Free(f->buf,f->mem_tss); Free(f,f->mem_tss); } BoolU8 U8FifoInsert(U8Fifo *f,U8 d) { U8 old_flags=GetFlags, new_in_ptr; Cli; new_in_ptr=(f->in_ptr+1)&f->mask; if (new_in_ptr==f->out_ptr) { SetFlags(old_flags); return FALSE; } else { f->buf[f->in_ptr]=d; f->in_ptr=new_in_ptr; SetFlags(old_flags); return TRUE; } } BoolU8 U8FifoRemove(U8Fifo *f,U8 *d) { U8 old_flags=GetFlags; Cli; if (f->in_ptr==f->out_ptr) { SetFlags(old_flags); return FALSE; } else { *d=f->buf[f->out_ptr]; f->out_ptr=(f->out_ptr+1)&f->mask; SetFlags(old_flags); return TRUE; } } BoolU8 U8FifoPeek(U8Fifo *f,U8 *d) { U8 old_flags=GetFlags; Cli; if (f->in_ptr==f->out_ptr) { SetFlags(old_flags); return FALSE; } else { *d=f->buf[f->out_ptr]; SetFlags(old_flags); return TRUE; } } void U8FifoFlush(U8Fifo *f) { U8 old_flags=GetFlags; Cli; f->out_ptr=f->in_ptr; SetFlags(old_flags); } U8 U8FifoCnt(U8Fifo *f) { U8 result,old_flags=GetFlags; Cli; if (f->out_ptr>f->in_ptr) result=f->mask+1-(f->out_ptr-f->in_ptr); else result=f->in_ptr-f->out_ptr; SetFlags(old_flags); return result; }