#include <iotiny2313.h>
#include <inavr.h>

#include <tiny2313.h>

#define b(n)     (1<<n)
#define Set(m,n)   (m|=b(n))
#define Clr(m,n)   (m&=~b(n))
#define b_CDATA    4  // PB4
#define b_CCLK     7  // PB7
#define b_LATCH    5  // PB5
#define SetCDATA   Set(PORTB,b_CDATA)
#define ClrCDATA   Clr(PORTB,b_CDATA)
#define SetLATCH   Set(PORTB,b_LATCH)
#define ClrLATCH   Clr(PORTB,b_LATCH)
#define SetCCLK    Set(PORTB,b_CCLK)
#define ClrCCLK    Clr(PORTB,b_CCLK)
#define CCLK       {SetCCLK;ClrCCLK;}
#define b_Mute     0  // PA0
#define b_Reset    1  // PA1
#define SetMute    Set(PORTA,b_Mute)
#define ClrMute    Clr(PORTA,b_Mute)
#define SetReset   Clr(PORTA,b_Reset)
#define ClrReset   Set(PORTA,b_Reset)

#define Mask1      0x7f
#define Mask2      0x0f

void SPI(unsigned int Data)
{ unsigned int mask=0x8000;
  char i;
  for (i=0;i<16;i++)
  {
    if (Data & mask) SetCDATA;
    else ClrCDATA;
    CCLK;
    mask>>=1;
  }
  ClrCDATA;
}

void out(unsigned int Data)
{unsigned int t=0;
  if (Data & b(8))  Set(t,12); // Data Format PCM / External DF
  if (Data & b(9))  Set(t,10); // Output Format 0
  if (Data & b(10)) Set(t,11); // Output Format 1
  if (Data & b(11)) Set(t,8); // PCM Sample Rate 0
  if (Data & b(12)) Set(t,9); // PCM Sample Rate 1
  if (Data & b(13)) Set(t,4); // PCM/EF Serial Data Format 0
  if (Data & b(14)) Set(t,5); // PCM/EF Serial Data Format 1
  if (Data & b(2))  Set(t,2); // PCM/EF Serial Data Width 0
  if (Data & b(3))  Set(t,3); // PCM/EF Serial Data Width 1
  ClrLATCH;
  SPI(t);
  SetLATCH;
  t=1;
  if (Data & b(0)) Set(t,9); // MCLK Mode 0
  if (Data & b(1)) Set(t,10); // MCLK Mode 1
  ClrLATCH;
  SPI(t);
  SetLATCH;
}

void main(void)
{
  unsigned int t;
  unsigned char x,y;

PORTA=3;
DDRA=3;

PORTB=0x7c;
DDRB=0xb0;

PORTD=0xff;
DDRD=0;

TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

GIMSK=0x00;
MCUCR=0x00;

TIMSK=0x00;

USICR=0x00;

ACSR=0x80;
  
  SetReset;
  for(t=0;t<10000;t++);
  ClrReset;
  for(t=0;t<10000;t++);
   SetMute;
   x=PIND;
   y=PINB;
   t=((Mask1 & x)<<8) + (Mask2 & y);
   out(t);
   ClrMute;
//  MCUCR|=b(SM0);
//  __sleep();
}
