repo2/firmware/pokey/uart.c @ 461
46 | markw | #include "uart.h"
|
|
#include "regs.h"
|
|||
void actions();
|
|||
int USART_Data_Needed()
|
|||
{
|
|||
int needed = 0==(0x10&(*zpu_pokey_irqen));
|
|||
if (needed)
|
|||
{
|
|||
*zpu_pokey_irqen = 0x28;
|
|||
*zpu_pokey_irqen = 0x38;
|
|||
}
|
|||
return needed;
|
|||
}
|
|||
int USART_Data_Ready()
|
|||
{
|
|||
int ready = 0==(0x20&(*zpu_pokey_irqen));
|
|||
if (ready)
|
|||
{
|
|||
*zpu_pokey_irqen = 0x18;
|
|||
*zpu_pokey_irqen = 0x38;
|
|||
}
|
|||
return ready;
|
|||
}
|
|||
void USART_Init( u08 value )
|
|||
{
|
|||
// value is pokey div + 6
|
|||
*zpu_pokey_skctl = 0;
|
|||
wait_us(10);
|
|||
USART_Receive_Mode(); // turn of reset and listen to commands
|
|||
*zpu_pokey_audctl = 0x78; // linked channels, fast clocked
|
|||
*zpu_pokey_audf1 = 0x00;
|
|||
*zpu_pokey_audf0 = value-6;
|
|||
*zpu_pokey_audf3 = 0x00;
|
|||
*zpu_pokey_audf2 = value-6;
|
|||
*zpu_pokey_irqen = 0x00;
|
|||
*zpu_pokey_irqen = 0x38;
|
|||
}
|
|||
void USART_Transmit_Byte( unsigned char data )
|
|||
{
|
|||
*zpu_pokey_serout = data;
|
|||
// wait until next byte is needed
|
|||
while (!USART_Data_Needed());
|
|||
}
|
|||
unsigned char USART_Receive_Byte( void )
|
|||
{
|
|||
// wait for data
|
|||
while (!USART_Data_Ready())
|
|||
{
|
|||
actions();
|
|||
}
|
|||
u08 res = *zpu_pokey_serout; //serin at same address
|
|||
return res;
|
|||
}
|
|||
void USART_Transmit_Mode()
|
|||
{
|
|||
*zpu_pokey_skctl = 0x23; // 010 for transmission
|
|||
*zpu_pokey_skrest = 0xff;
|
|||
*zpu_pokey_irqen = 0x28; // clear data needed
|
|||
*zpu_pokey_irqen = 0x38;
|
|||
}
|
|||
void USART_Receive_Mode()
|
|||
{
|
|||
*zpu_pokey_skctl = 0x13; // 001 for receiving
|
|||
*zpu_pokey_skrest = 0xff;
|
|||
}
|
|||
int USART_Framing_Error()
|
|||
{
|
|||
374 | markw | if (0x80&(*zpu_pokey_skctl))
|
|
46 | markw | {
|
|
return 0;
|
|||
}
|
|||
else
|
|||
{
|
|||
return 1;
|
|||
}
|
|||
}
|
|||
void USART_Wait_Transmit_Complete()
|
|||
{
|
|||
while (1)
|
|||
{
|
|||
int ready = 0==(0x08&(*zpu_pokey_irqen));
|
|||
if (ready)
|
|||
{
|
|||
*zpu_pokey_irqen = 0x30;
|
|||
*zpu_pokey_irqen = 0x38;
|
|||
return;
|
|||
}
|
|||
}
|
|||
}
|
|||
int USART_Command_Line()
|
|||
{
|
|||
return (1&(*zpu_sio));
|
|||
}
|