/**************************************************************************
* Programma di esempio che utilizza la libreria OperBlitting              *
* by Giuseppe Ligorio                                                     *
**************************************************************************/

/* inclusione file di supporto vari */
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/graphics.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <libraries/dos.h>
#include <graphics/gfxbase.h>
#include <math.h>
/* includere sempre operblitting.h */
#include "operblitting.h"

struct GfxBase *GfxBase;
UBYTE *mem;

void main()
{
  UBYTE *pp;
  struct DateStamp data;
  ULONG Times,ips,ll;

  /* aprire sempre la graphics.library per usare OperBlitting */
  if ((GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L)) == NULL)
  {
    printf("Non posso aprire graphics library.\n");
    Exit(0);
  }

  /* blocco di memoria con i dati delle operazione, SEMPRE CHIP */
  if ((mem = (UBYTE *)AllocMem(360000,MEMF_CHIP|MEMF_CLEAR|MEMF_PUBLIC)) == NULL)
  {
    printf("Non posso allocare il buffer.\n");
    CloseLibrary((struct Library *)GfxBase);
    Exit(0);
  }

  /* memoria utilizzata come MemUse nelle chiamate; l'operazione piu' lunga
     come numero di chiamate e' il prodotto di parole a 48 bit che richiede
     2*nbit*nbit + 6*nbit = 2*48*48 + 6*48 = 4896 chiamate! */
  if ((pp = (UBYTE *)AllocMem(SOMMSPACE*5000,MEMF_PUBLIC|MEMF_CLEAR)) == NULL)
  {
    printf("Non posso allocare il buffer.\n");
    FreeMem(mem,360000);
    CloseLibrary((struct Library *)GfxBase);
    Exit(0);
  }

  printf("OperBlitting test velocita' (IPS):\n");
  printf("                Byte          Word          Word long     Word 48bits\n");
  printf("Addizione       ");
  for (ll=1; ll<=6; (ll==1) ? (ll=2):(ll+=2))
  {
    SetNumOper(0);
    DateStamp((ULONG *)&data);
    Times = data.ds_Tick;
    BlittAdd(pp,mem,mem+120000,mem+240000,60000/ll,ll,0,0,0);
    BlittAdd(pp+SOMMSPACE*ll*8,mem+60000,mem+180000,mem+300000,60000/ll,ll,0,0,0);
    while (GetNumOper() <= 1) ;
    DateStamp((ULONG *)&data);
    Times = data.ds_Tick - Times;
    ips = ((120000L/ll)*50L)/Times;
    printf("%-14ld",ips);
  }
  printf("\nComplemento     ");
  for (ll=1; ll<=6; (ll==1) ? (ll=2):(ll+=2))
  {
    SetNumOper(0);
    DateStamp((ULONG *)&data);
    Times = data.ds_Tick;
    BlittComplement(pp,mem,mem+240000,60000/ll,ll,0,0);
    BlittComplement(pp+SOMMSPACE*ll*8,mem+60000,mem+300000,60000/ll,ll,0,0);
    while (GetNumOper() <= 1) ;
    DateStamp((ULONG *)&data);
    Times = data.ds_Tick - Times;
    ips = ((120000L/ll)*50L)/Times;
    printf("%-14ld",ips);
  }
  printf("\nMoltiplicazione ");
  for (ll=1; ll<=6; (ll==1) ? (ll=2):(ll+=2))
  {
    SetNumOper(0);
    DateStamp((ULONG *)&data);
    Times = data.ds_Tick;
    if (ll == 1) BlittMulByte(pp,mem,mem+60000,mem+120000,1200);
    else BlittMul(pp,mem,mem+60000,mem+120000,1200/ll,ll);
    while (GetNumOper() == 0) ;
    DateStamp((ULONG *)&data);
    Times = data.ds_Tick - Times;
    ips = ((1200L/ll)*50L)/Times;
    printf("%-14ld",ips);
  }
  printf("\n");

  FreeMem(pp,SOMMSPACE*5000);
  FreeMem(mem,360000);
  CloseLibrary((struct Library *)GfxBase);
}
