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

//Macros to interface to the AES block
#define AES_WRITE(addr,data) IOWR_32DIRECT(AES128_BASE,(addr*4),data)
#define AES_READ(addr) IORD_32DIRECT(AES128_BASE,(addr*4))
//Macros to write into SRAM
#define SRAM_WRITE(addr, data) IOWR_16DIRECT(VGASRAM_BASE,(addr*2),data)
#define SRAM_READ(addr) IORD_16DIRECT(VGASRAM_BASE,(addr*2))
//Macros to write into VGA
#define VGA_NO(addr)  IOWR_129DIRECT(VGASRAM_BASE,addr&0x3FFF,SRAM_READ(addr))  //Tell VGA to not read data
//#define VGA_GO(addr)  IOWR_16DIRECT(VGASRAM_BASE,0x80000,SRAM_READ(addr))  //Tell VGA that it should start displaying image

unsigned long int read_4_byte(int addr)
{
  int i;
  int x;
  int y;
      
    IOWR_32DIRECT(SPI_BASE, 2*4, addr); // addr
//    IOWR_32DIRECT(SPI_BASE, 4*4, 31); // size
    IOWR_32DIRECT(SPI_BASE, 1*4, 1); // start
    IOWR_32DIRECT(SPI_BASE, 1*4, 0);
    
    while (1)
    {                
        y = IORD_32DIRECT(SPI_BASE, 16*4);               
        if (y == 1)
        {
            //x = IORD_32DIRECT(SPI_BASE, 8*4);
            x = IORD_32DIRECT(SPI_BASE, 32*4);
            //printf("Data is %X\n", x);  // read
            
            break;
        }      
        //printf("waiting again...%X\n", x);
    }    
}

void printFormattedData(unsigned long int data)
{
    printf("Data Read:");
    /*printf("\t%X",   ((data & 0xFF000000) >> 24));
    printf("\t%X",   ((data & 0x00FF0000) >> 16));
    printf("\t%X",   ((data & 0x0000FF00) >> 8));
    printf("\t%X\n", ((data & 0x000000FF) >> 0));*/
    printf("%lx\n",data);
}

int main()
{
  //int = 32 bits; long int = 64 bits(?); short int = 16 bits; char = 8 bits
  unsigned long int i = 0, addr=0;
  int j =0,count=0;
  unsigned int data = 0;
  unsigned short int t0,t1;
  int size = 4646;
  
  //VGA_NO(addr);
  
  printf("\nWelcome to the AES 128-bit decryption project!\n\nWriting into SRAM");
  
    for(i = 0; i <= 0x04B440; i = i+4)
  {
    data=read_4_byte(i);
    
    //printf("read_sd %d address -> %lx\n",i,data);
    AES_WRITE(count,data);
    count++;
    //printFormattedData(data);
  
    if(count==4) {
        for (j=0;j<4;j++)
            {
            data = AES_READ(j);
            SRAM_WRITE(addr++,(data&0xFFFF0000)>>16);
            SRAM_WRITE(addr++,(data&0x0000FFFF));
            if((addr % 0x1440) == 0)      printf(".");
            }  
        count=0;
    }
  }
      
   printf("\nData ready. Toggle go.\n");

  return 0;
}
