/* -FIFO.C */ /*****************FIFO.C stuff*********************************/ #define FifoSize 10 // number of 8 bit data in the Fifo #define START_CRITICAL() asm(" tpa\n staa %SaveSP\n sei") #define END_CRITICAL() asm(" ldaa %SaveSP\n tap") char *PUTPT; // Pointer of where to put next char *GETPT; // Pointer of where to get next // FIFO is empty if PUTPT=GETPT // FIFO is full if PUTPT+1=GETPT char Fifo[FifoSize]; // The statically allocated fifo data void InitFifo(void) { unsigned char SaveSP; START_CRITICAL(); // make atomic, entering critical section PUTPT=GETPT=&Fifo[0]; // Empty when PUTPT=GETPT END_CRITICAL(); // end critical section } int PutFifo (char data) { char *Ppt; // Temporary put pointer unsigned char SaveSP; START_CRITICAL(); // make atomic, entering critical section Ppt=PUTPT; // Copy of put pointer *(Ppt++)=data; // Try to put data into fifo [MIDE comments - isn this kinda stupid??? // cuz it writes data to a mem location that might have something valuable] if (Ppt == &Fifo[FifoSize]) Ppt = &Fifo[0]; // Wrap if (Ppt == GETPT ) { END_CRITICAL(); // end critical section return(0); // Failed, fifo was full [MIDE comments -this will like happen if u keep // putting stuff in and not getting it out. PUTPT will loop round to meet GETPT] } else { PUTPT=Ppt; END_CRITICAL(); // end critical section return(-1); // Successful } } int GetFifo (char *datapt) { unsigned char SaveSP; if (PUTPT == GETPT) return(0); // Empty if PUTPT=GETPT else { START_CRITICAL(); // make atomic, entering critical section *datapt = *(GETPT++); if (GETPT == &Fifo[FifoSize]) GETPT = &Fifo[0]; END_CRITICAL(); // end critical section return(-1); } } /***************************************************************/