#include <stdio.h>
#include "swis.h"
#include <kernel.h>

// SWI Registers
extern _kernel_swi_regs inreg;
extern _kernel_swi_regs outreg;

extern unsigned char *buffer;
unsigned char screen = 1;

// Loads sprite file into buffer
void load_sprites(char* filename)
{
  int length;

  // Attempt to get file info
  inreg.r[0] = 13;
  inreg.r[1] = (int) filename;
  _kernel_swi(OS_File,&inreg,&outreg);

  // Length will be in R4 if it exists
  length = outreg.r[4];

  // If it's <1 it's fil not found
  if(outreg.r[0] < 1)
  {         
    printf("Sprite file %s not found",filename);
    exit(0);
  }

  // Stops us trying to mallocsomething mad if file is too big.
  if(length > 200000)
  {         
    printf("Sprite file %s seems unreasonably large at %i bytes",filename, length);
    exit(0);
  }

  // Attempt malloc, die if we cant
  buffer = (unsigned char *) malloc(length + 4);

  if(buffer==NULL)
  {
    printf("Couldn't malloc %i bytes for sprite buffer",length);
    exit(0);
  }

  // Store size and other info as required for SpriteOp 9 to init sprite area
  *(unsigned int *)buffer = length + 4;
  *(unsigned int *)(buffer + 4) = 16;
  inreg.r[0] = 256+9;
  inreg.r[1] = (unsigned int) buffer;
  _kernel_swi(OS_SpriteOp,&inreg,&outreg);

  // Load sprite file into buffer
  inreg.r[0] = 256+10;
  inreg.r[1] = (int) buffer;
  inreg.r[2] = (int) filename;
  _kernel_swi(OS_SpriteOp,&inreg,&outreg);
}

void display_mode(int mode)
{
  inreg.r[0] = 0;
  inreg.r[1] = mode;
  _kernel_swi(OS_ScreenMode,&inreg,&outreg);
}

void draw_line(int x1,int y1,int x2,int y2)
{
  inreg.r[0] = 4;
  inreg.r[1] = x1;
  inreg.r[2] = y1;
  _kernel_swi(OS_Plot,&inreg,&outreg);
  inreg.r[0] = 5;
  inreg.r[1] = x2;
  inreg.r[2] = y2;
  _kernel_swi(OS_Plot,&inreg,&outreg);
}
void draw_sprite(char* spritename,int x, int y)
{
  // SpriteOp 34 to put sprite at a location
  inreg.r[0] = 256+34;
  inreg.r[1] = (int) buffer;
  inreg.r[2] = (int) spritename;
  inreg.r[3] = x;
  inreg.r[4] = y;
  inreg.r[5] = 8; // GCOL dest=source and sprite mask
  _kernel_swi(OS_SpriteOp,&inreg,&outreg);
}

void screen_flipbuffer()
{
   inreg.r[0] = 19;
  _kernel_swi(OS_Byte,&inreg,&outreg);
  
/*   inreg.r[0] = 114;
   inreg.r[1] = 1;
  _kernel_swi(OS_Byte,&inreg,&outreg);

   inreg.r[0] = 113;
   inreg.r[1] = screen;
  _kernel_swi(OS_Byte,&inreg,&outreg);
  
  screen++;
  if(screen > 3)
    screen = 1;
  inreg.r[0] = 112;
  inreg.r[1] = screen;
  _kernel_swi(OS_Byte,&inreg,&outreg);*/
}

void screen_clear()
{
    inreg.r[0] = 12;
  _kernel_swi(OS_WriteC,&inreg,&outreg);
}
