#include <io.h>
#include <system.h>
#include <stdio.h>


#define IOWR_VGA_DATA(base, offset, data) \
  IOWR_16DIRECT(base, (offset) * 2, data) 
#define IORD_VGA_DATA(base, offset) \
  IORD_16DIRECT(base, (offset) * 2)  
  
int counter=0;

//Rotary Controller Interrupt 
static void interrupt_rotary (void * context, alt_u32 id)
{
  int flag_right_left;    
  counter ++;
  printf ("%d\n",counter); 
  flag_right_left=IORD_16DIRECT(ROTARY_BASE, 0);
  
  if(flag_right_left==1)
  {printf ("Left\n");}
  
  if(flag_right_left==2)
  {printf ("Right\n");}
  
  IOWR_16DIRECT(ROTARY_BASE, 0, 0);  // reset the interrupt request
}

int main()
{
  int x_ball=21;// x location of ball
  int y_ball=0;// y location of ball
  int delta_x=1;// delta x of ball
  int delta_y=1;// delta y of ball
  int k; //delay counter
  int m=0;//x location of left paddle
  int n=0;//y location of left paddle
  int t=1;// delta x of left paddle 
  int o=1;// delta y of left paddle
  int x_rpad=619;//x location of right paddle
  int y_rpad=0;//y location of right paddle
  int deltax_rpad=1;// delta x of right paddle 
  int deltay_rpad=1;// delta y of right paddle
   
  alt_irq_register( ROTARY_IRQ, NULL,(void*)interrupt_rotary ); // register IRQSOURCE
      
 for(;;)
 {
 for(k=0;k<5000;k++)
 {
  ;   
 }
   
 x_ball=x_ball+delta_x;
 y_ball=y_ball+delta_y;      

 if( x_ball==21)
 delta_x=1;
 if( x_ball==603)
 delta_x=-1; 
 if(y_ball==0)
 delta_y=1;
 if(y_ball==464)
 delta_y=-1;  
   IOWR_VGA_DATA(VGA_BASE, 0, x_ball);  // ball h
   IOWR_VGA_DATA(VGA_BASE, 1, y_ball);  // ball v
   //printf ("ball h : %d \n", IORD_VGA_DATA(VGA_BASE, 0));
   //printf ("ball v : %d \n", IORD_VGA_DATA(VGA_BASE, 1));
   
 //m=m+t;
 n=n+o;      

 //if(m==21)
 //t=1;
 //if(m==619)
 //t=-1; 
 if(n==0)
 o=1;
 if(n==360)
 o=-1;  
 
 
 //x_rpad=x_rpad+deltax_rpad;
 y_rpad=y_rpad+deltay_rpad;
 if(y_rpad==0)
 deltay_rpad=1;
 if(y_rpad==360)
 deltay_rpad=-1;
 
 
   IOWR_VGA_DATA(VGA_BASE, 2, m);  // plot x_lpad
   IOWR_VGA_DATA(VGA_BASE, 3, n);  // plot y_lpad
   IOWR_VGA_DATA(VGA_BASE, 4, x_rpad);  // plot x_rpad
   IOWR_VGA_DATA(VGA_BASE, 5, y_rpad);  // plot y_rpad
   printf ("ball h : %d \n", IORD_VGA_DATA(VGA_BASE, 2));
   printf ("ball v : %d \n", IORD_VGA_DATA(VGA_BASE, 3));
   //printf("reading %x = %x\n", i, IORD_VGA_DATA(VGA_BASE, 0));
   //printf("reading %x = %x\n", j, IORD_VGA_DATA(VGA_BASE, 1));      
  }
}
