/**************************************************************************\

                          B E N C H M A R K  V 2.0

                               Geschrieben von

                            S A U E R   F R A N Z


Arbeitszeiten :			07-01-89			 5		Std.

\**************************************************************************/



/**************************************************************************\
Include:                Includieren der .h Files
\**************************************************************************/


#include <exec/types.h>
#include <exec/memory.h>
#include <exec/interrupts.h>
#include <exec/nodes.h>
#include <exec/io.h>
#include <exec/devices.h>
#include <devices/input.h>
#include <devices/conunit.h>
#include <devices/inputevent.h>
#include <intuition/intuitionbase.h>
#include <libraries/dos.h>
#include <intuition/intuition.h>
#include <stdio.h>

/**************************************************************************\
                   Definieren der Wichtigsten Konstanten
\**************************************************************************/

#define OK					0
#define NOK					1
#define BILDHOEHE     256			/* Höhe des Screens 					*/
#define BILDBREITE    640 			/* Breite des Screens				*/
#define TIEFE           2       	/* Anzahl der BitPlanes				*/
#define FARBEN          4       	/* Anzahl der Farben					*/
#define SCHWARZ         0       	/* Register für Farbe Schwarz		*/
#define WEISS           1
#define ORANGE          2
#define ROT             3
#define FADEOFFSPEED    3       /* Bildschirmausblendverzögerung			*/
#define FADEINSPEED   500       /* Bildschirmeinblendverzögerung			*/

#define AGWNR		 		 4
#define AGWXPOS        100
#define AGWYPOS        100
#define AGWBREITE      460
#define AGWHOEHE       100

/**************************************************************************\
IntuiGlobalVar:   Deklarieren der Globalen Intuition Variablen
\**************************************************************************/

struct IntuitionBase *IntuitionBase;
struct GfxBase       *GfxBase;
struct DosBase       *DosBase;
struct ExecBase      *ExecBase;
struct IntuiMessage  *message;
struct FileHandle    *fh, *fp, *Open(), *Output(), *confh;
struct TextFont      *myfont;
struct TextAttr      textattr;
struct RastPort      *rp;
struct Window        *w;
struct Window        *agw[30];
struct ViewPort      *vp;
struct Screen        *screen;
struct Window        *OpenWindow();
struct Message       *GetMsg();
struct TmpRas        tmp;
struct AreaInfo      areainfo;

void   *OpenLibrary();

ULONG  DiskfontBase;
WORD   areabuffer[50];           /* Buffer fuer Areas */
LONG   fuellmem;
int    Flags[8190];

char  name[256];

FLOAT Zeit,Faktor,Originalzeit;
LONG Tage,Minute,Ticks;
struct DateStamp stoppuhrzeit;    /*** DateStamp-Struktur für Systemzeit ***/


/*****************************************************************************\
StructScreens:          S C R E E N      S T R U K T U R
\*****************************************************************************/

struct NewScreen ns = {
   0, 0,BILDBREITE,BILDHOEHE,TIEFE,SCHWARZ,WEISS,HIRES,CUSTOMSCREEN | SCREENBEHIND,NULL,
" GRAFIK und INTUITION BENCHMARK ============ Geschrieben von Sauer Franz ",
   NULL,NULL };

/*****************************************************************************\
StructWindow:        N E W     W I N D O W     S T R U K T U R E N
\*****************************************************************************/

struct NewWindow nw = {  0,10,BILDBREITE,BILDHOEHE-10,SCHWARZ,WEISS,
  /* IDCMP Flags */
  MOUSEBUTTONS | MOUSEMOVE  | GADGETUP | MENUPICK |
  ACTIVEWINDOW | VANILLAKEY | REFRESHWINDOW,
  /* Flags 			*/
  BACKDROP | BORDERLESS | SMART_REFRESH | ACTIVATE,

   NULL,	/* First gadget in list									*/
   NULL,							/* User checkmark											*/
   NULL,							/* Window Title											*/
   NULL,							/* Der Pointer zur Screenstructure kann erst		*/
									/* nach dem öffnen des Screen zugewiesen werden	*/
									/* da es ihn jetzt noch nicht gibt.					*/
   NULL,							/* Superbitmap pointer									*/
   0, 0, 0, 0,					/* Ignored because not sizeable						*/
   CUSTOMSCREEN				/* Screenart												*/
   };


struct NewWindow nagw = {  AGWXPOS,AGWYPOS,AGWBREITE,AGWHOEHE,SCHWARZ,WEISS,
  /* IDCMP Flags 	*/
  CLOSEWINDOW,
  /* Flags 			*/
  SIMPLE_REFRESH | WINDOWSIZING | WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE |
  ACTIVATE,
   NULL,					/* First gadget in list									*/
   NULL,					/* User checkmark											*/
   "Ausgabefenster",	/* Window Title											*/
   NULL,					/* Der Pointer zur Screenstructure kann erst		*/
							/* nach dem öffnen des Screen zugewiesen werden	*/
							/* da es ihn jetzt noch nicht gibt.					*/
   NULL,					/* Superbitmap pointer									*/
   50, 20, 1008, 880,/* Ignored because not sizeable						*/
   CUSTOMSCREEN		/* Screenart												*/
   };


/****************************************************************************\
main:                 M A I N     P R O G R A M M    M O D U L
\****************************************************************************/

main()


{

/*****************************************************************************\
OpenLibraries:                  ÖFFNEN DER LIBRARIES
\*****************************************************************************/

if(!(ExecBase=OpenLibrary("exec.library",0)))  Alles_Schliessen();
if(!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0)))  Alles_Schliessen();
if(!(IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0))) Alles_Schliessen();
if(!(DosBase=OpenLibrary("dos.library",0)))  Alles_Schliessen();


/*****************************************************************************\
Font:                       LADEN DES SIESTA FONTS
\*****************************************************************************/

if (!(DiskfontBase=OpenLibrary("diskfont.library",0L)))
   {
   puts ("LIBS:diskfont.library leider nicht verfügbar");
   Alles_Schliessen();
   }

textattr.ta_Name = "siesta.font";
textattr.ta_YSize = 8;
textattr.ta_Style = 0;

myfont = (struct TextFont *)OpenDiskFont (&textattr);

if ( myfont == 0 )
   {
   textattr.ta_Name = "topaz.font";
   textattr.ta_YSize = 8;
   myfont = (struct TextFont *)OpenDiskFont (&textattr);
   }

if ( myfont == 0 ) Alles_Schliessen ();


/*****************************************************************************\
OpenScreen:          ICH EROEFFNE NUN MEINEN EIGENEN SCREEN
\*****************************************************************************/

if(!(screen=(struct Screen *)OpenScreen(&ns)))
  {
  puts ("Konnte meinen Screen leider nicht öffnen !");
  Alles_Schliessen();
  }


/*****************************************************************************\
OpenWindow:         ERöFFNE EIN WINDOW AUF MEINEN EIGENEN SCREEN
\*****************************************************************************/


nw.Screen   = screen;  /*   Hier wird der Pointer auf den Screen zugewiesen */
vp = &screen->ViewPort;

if(!(w=(struct Window *)OpenWindow(&nw)))
  {
  puts ("Konnte mein Window leider nicht öffnen");
  Alles_Schliessen();
  }


/*****************************************************************************\
PortPointer:       ERMITTELN VON RASTPORT UND VIEWPORTPOINTER
\*****************************************************************************/

rp = w->RPort;
fuellmem = AllocRaster(640,256);
InitArea (&areainfo,areabuffer,20);

/* Zum füllen von Flächen wird diese Öffnungssequence benötigt */

if (!(rp->TmpRas=(struct TmpRas *)InitTmpRas(&tmp,fuellmem,RASSIZE(640,256))))
   {
   puts ("Leider nicht genug CHIP-RAM frei !");
   Alles_Schliessen();
   }

rp->AreaInfo = &areainfo;

SetFont (rp,myfont);
ScreenToFront (screen);

printf ("\nGrafik und Intuition Benchmark ============ Geschrieben von Franz Sauer\n");

printf ("\n");
printf ("OZ     = Originalzeit 68000 / 7.14 MHz\n");
printf ("TZ     = Testzeit des getesteten Rechners\n");
printf ("Faktor = Geschwindigkeit in Bezug auf Original 68000/7.14 MHz\n");
printf ("\n");

StartUhr();
Siebdesera();
StoppUhr("Siebdesera <8190 * 50              ",21.98);


StartUhr();
FensterOeffnen();
StoppUhr("20 Windows öffnen                  ",12.74);

StartUhr();
FensterSchliessen();
StoppUhr("20 Windows schließen               ",15.54);

StartUhr();
TextTest();
StoppUhr("Textausgabe von 35000 Zeichen      ",7.98);

StartUhr();
Schreiben();
StoppUhr("Schreiben von 35000 Zeichen        ",8.16);

SetRast(rp,0);
StartUhr();
TestBox();
StoppUhr("14400 * 100x50 Rechtecke (4 Farben)",21.46);

SetRast(rp,0);
StartUhr();
TestRahmen();
StoppUhr("14400 * 100x50 Rahmen (4 Farben)   ",52.80);

SetRast(rp,0);
StartUhr();
TestKasten();
StoppUhr("14400 * 100x50 Kasten (4 Farben)   ",42.02);

SetRast(rp,0);
StartUhr();
TestPfeile();
StoppUhr("3120 Pfeile (4 Farben)             ",18.08);

SetRast(rp,0);
StartUhr();
TestFuellen();
StoppUhr("60 * 600x210 Füllen (4 Farben)     ",24.24);

Alles_Schliessen();

}                                /* main */



/*****************************************************************************\
                    ALLES SCHLIESSEN UND PROGRAMM BEENDEN
\*****************************************************************************/

_abort()

{
Alles_Schliessen();
}

Alles_Schliessen()

{

if ( fp )            Close        (fp);
if ( w )             CloseWindow  (w);
if ( fuellmem )      FreeRaster   (fuellmem,640,256);
if ( screen )        CloseScreen  (screen);
if ( myfont )        CloseFont    (myfont);
if ( GfxBase )       CloseLibrary (GfxBase);
if ( IntuitionBase ) CloseLibrary (IntuitionBase);
if ( DosBase )       CloseLibrary (DosBase);
if ( ExecBase )      CloseLibrary (ExecBase);

exit (0);

}




FensterOeffnen()

{

int register pos;

UBYTE nr;

nr=0;
nagw.Screen   = screen;
nagw.Width    = 200;
nagw.Height   =  50;

for ( pos=0 ; pos<200 ; pos+=10 )
    {
    nagw.LeftEdge = pos+pos;
    nagw.TopEdge  = pos;
    if(!(agw[nr]=(struct Window *)OpenWindow(&nagw)))
      {
      printf ("Konnte leider das Testfenster nicht öffnen !!\n");
      return;
      }
    nr++;
    }

}

FensterSchliessen()

{
int register nr;

for ( nr=0; nr<30 ; nr++ )
    {
    if (agw[nr])
       CloseWindow(agw[nr]);
    }
}

TextTest()

{
int register y,hfarbe,vfarbe;

SetDrMd (rp,JAM2);

for (hfarbe=0 ; hfarbe<4 ; hfarbe++)
    {
    SetBPen (rp,hfarbe);
    for (vfarbe=0 ; vfarbe<4 ; vfarbe++)
        {
        SetAPen (rp,vfarbe);
        for (y=10 ; y<240 ; y+=8 )
            {
            Move (rp,10,y);
            Text (rp,"Das ist ein ganz langer Demotext ..........................................",75);
            }
        }
    }
}

Schreiben ()


{
int register y,hfarbe,vfarbe;


for (hfarbe=0 ; hfarbe<4 ; hfarbe++)
    {
    for (vfarbe=0 ; vfarbe<4 ; vfarbe++)
        {
        for (y=10 ; y<240 ; y+=8 )
            Schreibe (rp,10,y,"Das ist ein ganz langer Demotext ..........................................",vfarbe,hfarbe);
        }
    }
}

TestBox()

{
int register y,x,farbe;

for ( x=0 ; x<20 ; x++ )
    {
    for ( y=20 ; y<200 ; y++ )
        {
        for ( farbe=0 ; farbe<4 ; farbe++ )
            Box (rp,y+y+x,y,y+y+100+x,y+50,farbe);
        }
    }
}

TestRahmen()

{
int register y,x,farbe;

for ( x=0 ; x<20 ; x++ )
    {
    for ( y=20 ; y<200 ; y++ )
        {
        for ( farbe=0 ; farbe<4 ; farbe++ )
            Rahmen (rp,y+y+x,y,y+y+100+x,y+50,farbe);
        }
    }
}

TestFuellen()

{
int register x,farbe;

Rahmen (rp,20,20,620,230,3);
for ( x=0 ; x<20 ; x++ )
    {
    for ( farbe=0 ; farbe<3 ; farbe++ )
        Fuellen(rp,25,25,JAM1,farbe);
    }
}


TestKasten()

{
int register y,x,farbe;

for ( x=0 ; x<20 ; x++ )
    {
    for ( y=20 ; y<200 ; y++ )
        {
        for ( farbe=0 ; farbe<4 ; farbe++ )
            Kasten (rp,y+y+x,y,y+y+100+x,y+50,farbe,3-farbe);
        }
    }
}

TestPfeile()

{
int register y,x,farbe;

for ( farbe=1 ; farbe<4 ; farbe++ )
    {
    for ( x=10 ; x<620 ; x+=15 )
        {
        for ( y=15 ; y<220 ; y+=15 )
            PfeilRechts (rp,x,y,farbe);
        }
    for ( x=10 ; x<620 ; x+=15 )
        {
        for ( y=15 ; y<220 ; y+=15 )
            PfeilAb (rp,x,y,farbe);
        }
    }
}


Kasten (rp,x,y,x1,y1,randfarbe,boxfarbe)

UWORD x,y,x1,y1,randfarbe,boxfarbe;
ULONG rp;

{
SetAPen (rp,randfarbe);
RectFill (rp,x,y,x1,y1);
SetAPen (rp,boxfarbe);
RectFill (rp,x+2,y+1,x1-2,y1-1);
}

Rahmen (rp,x,y,x1,y1,farbe)

UWORD x,y,x1,y1,farbe;
ULONG rp;

{
SetAPen (rp,farbe);
Move (rp,x1,y);
Draw (rp,x1,y1);
Draw (rp,x,y1);
Draw (rp,x,y);
Draw (rp,x1-1,y);
Draw (rp,x1-1,y1-1);
Move (rp,x+1,y1-1);
Draw (rp,x+1,y+1);
}


Box (rp,x,y,x1,y1,farbe)

UWORD x,y,x1,y1,farbe;
ULONG rp;

{
SetAPen (rp,farbe);
RectFill (rp,x,y,x1,y1);
}


Schattenschrift (rp,x,y,text)

ULONG rp;
UWORD x,y;
char text[];


{
UWORD laenge;
laenge = strlen(text);
SetAPen (rp,ROT);
SetDrMd (rp,JAM1);
Move (rp,x+2,y);
Text (rp,text,laenge);
SetAPen (rp,WEISS);
Move (rp,x,y);
Text (rp,text,laenge);
}



Schreibe (rp,x,y,text,schreibfarbe,hintergrund)

ULONG rp;
UWORD x,y,schreibfarbe,hintergrund;
char text[];

{
SetAPen (rp,schreibfarbe);
SetBPen (rp,hintergrund);
SetDrMd (rp,JAM2);
Move (rp,x,y);
Text (rp,text,strlen(text));
}


Schreibzentriert (rp,x,y,breite,text,schreibfarbe,hintergrund)

ULONG rp;
UWORD x,y,breite,schreibfarbe,hintergrund;
char text[];

{
WORD textstart;

textstart = (x+(breite/2))-(strlen(text)*8/2);
SetAPen (rp,schreibfarbe);
SetBPen (rp,hintergrund);
SetDrMd (rp,JAM1);
Move (rp,textstart,y);
Text (rp,text,strlen(text));
}


Fuellen (rp,x,y,mode,farbe)

UWORD x,y,mode,farbe;
ULONG rp;

{
SetAPen (rp,farbe);
Flood (rp,mode,x,y);
}

/* Löscht ein Feld auf pos x,y mit 14*8 Pixel und zeichnet Pfeil nach */
/* Links in der Farbe die angegeben wurde */


PfeilAb (rp,x,y,farbe)

ULONG rp;
USHORT farbe,x,y;

{
SetDrMd (rp,JAM1);
SetAPen (rp,0);
RectFill (rp,x+2,y+1,x+16,y+9);
SetAPen (rp,farbe);
AreaMove (rp,x+5,y+2);
AreaDraw (rp,x+5,y+5);
AreaDraw (rp,x+2,y+5);
AreaDraw (rp,x+9,y+8);
AreaDraw (rp,x+16,y+5);
AreaDraw (rp,x+13,y+5);
AreaDraw (rp,x+13,y+2);
AreaDraw (rp,x+5,y+2);
AreaEnd (rp);
}


/* Löscht ein Feld auf pos x,y mit 14*8 Pixel und zeichnet Pfeil nach */
/* Rechts in der Farbe die angegeben wurde */


PfeilRechts (rp,x,y,farbe)

ULONG rp;
USHORT farbe,x,y;

{
SetDrMd (rp,JAM1);
SetAPen (rp,0);
RectFill (rp,x+2,y+1,x+16,y+9);
SetAPen (rp,farbe);
AreaMove (rp,x+7,y+2);
AreaDraw (rp,x+14,y+5);
AreaDraw (rp,x+7,y+8);
AreaDraw (rp,x+7,y+7);
AreaDraw (rp,x+3,y+7);
AreaDraw (rp,x+3,y+3);
AreaDraw (rp,x+7,y+3);
AreaDraw (rp,x+7,y+2);
AreaEnd (rp);
}

Siebdesera ()

{

int register I,K,Prime,Iter,Count;

for ( Iter=1 ; Iter <= 50 ; Iter++ )
    {
    Count=0;
    for ( I=0 ; I <= 8190 ; I++ )
        Flags[I]=1;
    for ( I=0 ; I <= 8190 ; I++ )
        {
        if ( Flags[I] )
           {
           Prime = I + I + 3;
           K = I + Prime;
           while ( K <= 8190 )
                 {
                 Flags[K] = 0;
                 K = K + Prime;
                 }
           Count +=1;
           }
        }
    }
}


StartUhr()

{
Forbid();
DateStamp(&stoppuhrzeit);           /*** Zeit lesen ***/
Tage   = stoppuhrzeit.ds_Days;      /*** Tageszahl merken ***/
Minute = stoppuhrzeit.ds_Minute;    /*** Minuten merken ***/
Ticks  = stoppuhrzeit.ds_Tick;      /*** Ticks merken (1 Tick = 0,02 Sek.) ***/

}

StoppUhr(befehltext,originalzeit)

UBYTE *befehltext;
FLOAT originalzeit;

{
DateStamp(&stoppuhrzeit);
Permit();
Zeit = ((((stoppuhrzeit.ds_Days - Tage) * 24 * 60) + stoppuhrzeit.ds_Minute - Minute) * 3000) + stoppuhrzeit.ds_Tick - Ticks;
Zeit = Zeit/50;
printf ("'%s' OZ= %.2f  TZ= %.2f  Faktor= %.1f\n",befehltext,originalzeit,Zeit,originalzeit/Zeit);
}


