/* File name: UARTsupport.c

    28Mar2004 .. initial version .. KM
    
*/

#include <extaddr.h>

#define FOREVER 1

#define UART 0x500200
#define RBR (UART+0x00)
#define THR (UART+0x00)
#define DLL (UART+0x00)
#define DLM (UART+0x02)
#define IER (UART+0x02)
#define ISR (UART+0x04)
#define FCR (UART+0x04)
#define LCR (UART+0x06)
#define MCR (UART+0x08)
#define LSR (UART+0x0A)
#define MSR (UART+0x0C)
#define SPR (UART+0x0E)


#define IER0 ((unsigned long)0x00)
#define IFR0 ((unsigned long)0x01)
#define IVPD ((unsigned long)0x49)
#define IVPH ((unsigned long)0x4A)
#define INT0 0x0008
#define INT0_BIT 0x0004


interrupt void UART1int(void);
void resetv();

unsigned volatile U1RxChar;
unsigned volatile U1RxFlag;
unsigned volatile U1TxChar;


void UART1setup(void)
{
    unsigned long resetloc;
    
    resetloc = (long)resetv;
    far_poke(IVPD, (unsigned)(resetloc>>8));
    far_poke(IVPH, (unsigned)(resetloc>>8));
    far_poke((resetloc>>1)+INT0, (unsigned)((unsigned long)UART1int>>16));
    far_poke((resetloc>>1)+INT0+1, (unsigned)((unsigned long)UART1int));
    far_poke(IER0, far_peek(IER0)|INT0_BIT);
    far_poke(IFR0, INT0_BIT);
    U1RxFlag = 0;
    far_poke(IER, 0x01); // have UART generate receive interrupts
    far_poke(MCR, 0x08); // make UART int outputs active
    far_peek(RBR);       // clear receiver buffer
    return;
}

interrupt void UART1int(void)
{
   if ((far_peek(LSR)&0x01)==1) {        // test is Rx interrupt
            U1RxChar = far_peek(RBR);    // read character
            U1RxFlag = 1;                // set flag
   }        
    return;
}
