#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;
    int x_ball=312;// x location of ball
    int y_ball=232;// 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 l; //delay counter
    int x_lpad=0;//x location of left paddle
    int y_lpad=150;//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=150;//y location of right paddle
    int deltax_rpad=1;// delta x of right paddle 
    int deltay_rpad=1;// delta y of right paddle

//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);
    //Rotary Right
    if(flag_right_left==1)
    {   
        if(y_rpad>5)
        {
        y_rpad=y_rpad-5;
        y_lpad=y_lpad-5;
        }
        printf ("Left\n");}
    //Rotary Right
    if(flag_right_left==2)
    {
        if(y_rpad<355)
        {
        y_lpad=y_lpad+5;
        y_rpad=y_rpad+5;
        }
        printf ("Right\n");}
    // reset the interrupt request
    IOWR_16DIRECT(ROTARY_BASE, 0, 0);  
}

int main()
{

   
    alt_irq_register( ROTARY_IRQ, NULL,(void*)interrupt_rotary ); // register IRQSOURCE
      
    for(;;)
    {
        for(k=0;k<3500;k++)
        {;}//delay
   
    x_ball=x_ball+delta_x;
    y_ball=y_ball+delta_y;      

    if( x_ball==21)
    {
        if(y_ball>=y_lpad & y_ball<=(y_lpad+120))
        {
            delta_x=1;
        }
        else
        {
            x_ball=312;
            y_ball=232;
            IOWR_VGA_DATA(VGA_BASE, 0, x_ball);  // ball h
            IOWR_VGA_DATA(VGA_BASE, 1, y_ball);  // ball v 
            for(k=0;k<2000;k++)
            {
                for(l=0;l<200;l++)
            {;}//delay}//delay
            }
        }
        
    }
    
    if( x_ball==603)
    {
            if(y_ball>=y_rpad & y_ball<=(y_rpad+120))
        {
            delta_x=-1;
        }
        else
        {
            x_ball=312;
            y_ball=232;
            IOWR_VGA_DATA(VGA_BASE, 0, x_ball);  // ball h
            IOWR_VGA_DATA(VGA_BASE, 1, y_ball);  // ball v 
            for(k=0;k<2000;k++)
            {
                for(l=0;l<200;l++)
            {;}//delay}//delay
            }
        }
    }
 
    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 
    IOWR_VGA_DATA(VGA_BASE, 2, x_lpad);  // plot x_lpad
    IOWR_VGA_DATA(VGA_BASE, 3, y_lpad);  // 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));
  }
}
