/****************************************************************/
/*								*/
/* GALerTest - testprogram for the hardware			*/
/*								*/
/* Soft- and Hardware  copyright (c)1991-1993			*/
/*	 by Christian Habermann					*/
/*	    Asamstr. 17						*/
/*	    85356 Freising					*/
/*	    Germany						*/
/*								*/
/* used Compiler: SAS-C 6.3					*/
/*								*/
/****************************************************************/




#define	 STRINGARRAY	1


#include <exec/memory.h>
#include <exec/ports.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <libraries/locale.h>
#include <libraries/reqtools.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <proto/locale.h>
#include <proto/reqtools.h>
#include <proto/graphics.h>
#include <proto/intuition.h>
#include <proto/exec.h>

#include "GALer.h"
#include "LocGT.h"



#ifdef LATTICE
int CXBRK(void)    { return(0); }  /* Disable Lattice CTRL/C handling */
int chkabort(void) { return(0); }  /* really */
#endif



#define	 YPOS		30
#define  WIN_WIDTH	640
#define  WIN_HEIGHT	200



void Clear(void);

void Print(UBYTE *text);

void WaitForAction(void);

void closestuff(void);

void openstuff(void);

void FreeTimer(void);

void LocalizeText(void);

int  GetTimer(void);



extern	int	hw_version;


struct	MsgPort		*timeport;
struct	timerequest	*timereq;
struct	LocaleBase	*LocaleBase = 0;
struct	ReqToolsBase	*ReqToolsBase = 0;
struct	IntuitionBase	*IntuitionBase = 0;
struct	GfxBase		*GfxBase = 0;
struct	IntuiMessage	*message;
struct	Window		*window = 0;
struct	RastPort	*rp;
struct	TextFont	*txtfont;
struct	TextAttr	txtattr;
struct	Catalog		*catalog = 0;



SHORT BorderVectors1a[] = { 0,15,81,15,81,0 };
SHORT BorderVectors1b[] = { 0,15,0,0,81,0 };

struct Border Border1b    = { -1,-1,2,0,JAM1,3,BorderVectors1b,NULL };
struct Border Border1a    = { -1,-1,1,0,JAM1,3,BorderVectors1a,&Border1b };



struct IntuiText GadIText3 = { 1, 0, JAM2, 4, 4, &txtattr, NULL, NULL };

struct IntuiText GadIText2 = { 1, 0, JAM2, 4, 4, &txtattr, NULL, NULL };

struct IntuiText GadIText1 = { 1, 0, JAM2, 8, 4, &txtattr, NULL, NULL };



struct Gadget CancelGad = { NULL, 522, 180, 80, 14,
			    NULL,
			    RELVERIFY,
			    BOOLGADGET+REQGADGET,
			    (APTR)&Border1a,NULL,
			    &GadIText2,NULL,NULL,1,NULL };

struct Gadget ContGad   = { &CancelGad, 40, 180, 80, 14,
			    NULL,
			    RELVERIFY,
			    BOOLGADGET+REQGADGET,
			    (APTR)&Border1a,NULL,
			    &GadIText1,NULL,NULL,0,NULL };




struct NewWindow MyWin =  { 0, 0, WIN_WIDTH, WIN_HEIGHT,
			    0, 1,
			    CLOSEWINDOW|GADGETUP,
			    ACTIVATE|WINDOWCLOSE|WINDOWDRAG|WINDOWDEPTH,
			    &ContGad, NULL,
			    (UBYTE *)"GALerTest V1.5  (c) 1991-1993 by Christian Habermann",
			    NULL, NULL,
			    0, 0, 0, 0,
			    WBENCHSCREEN
			  };



int	prog_volt = 0;			/* Dummy for port.o module */

int	GALType, outIC1, outIC3, outIC4, outIC5;

int	ytxt = YPOS;





void main(void)
{

int errorIC6a, errorIC6c, errorIC7;


  openstuff();


  if (GetTimer()) {				/* get timer*/
    puts(AppStrings[MSG_ERR_TIMER].as_Str);
    closestuff();
    exit(FALSE);    
   }


  rp = window -> RPort;

  SetAPen(rp, 1L);
  SetFont(rp, txtfont);				/* get font */


  Print(AppStrings[MSG_INTRO_TXT].as_Str);
  WaitForAction();


  OffGadget(&ContGad,   window, NULL);		/* disable gadgets */
  OffGadget(&CancelGad, window, NULL);
						/* get version of hardware */

  switch (rtEZRequestTags(AppStrings[MSG_HARDWARE_TXT].as_Str,
		   "V1.0, V1.1 | V1.2 | V1.3", NULL, NULL, RT_ReqPos,
		   REQPOS_CENTERSCR, TAG_END)) {
    case 1:
      hw_version = HW_GALER_1_0;
      break;

    case 2:
      hw_version = HW_GALER_1_2;
      break;

    case 0:
      hw_version = HW_GALER_1_3;
      break;

    default:
      closestuff();
      exit(FALSE);
  }


  OnGadget(&ContGad,   window, NULL);		/* enable gadgets */
  OnGadget(&CancelGad, window, NULL);

  SetAPen(rp, 0L);
  RectFill(rp, 30L, 180L, 620L, 195L);
  SetAPen(rp, 1L);

  RefreshGadgets(&ContGad, window, NULL);



  InitParPort();				/* set CIAs */

  InitGALer();					/* initialize GALer */


  Clear();
  Print(AppStrings[MSG_TEST1_TXT].as_Str);
  EnableOutput();
  WriteByte(0x00, IC3);
  WriteByte(0x00, IC4);
  WriteByte(0x00, IC5);
  WaitForAction();


  Clear();
  Print(AppStrings[MSG_TEST2_TXT].as_Str);
  LED(ON);
  WaitForAction();


  Clear();
  Print(AppStrings[MSG_TEST3_TXT].as_Str);
  LED(OFF);
  WaitForAction();


  Clear();
  Print(AppStrings[MSG_TEST4_TXT].as_Str);
  SetGAL(GAL20V8);
  EnableVcc();
  WaitForAction();


  Clear();
  Print(AppStrings[MSG_TEST5_TXT].as_Str);
  DisableVcc();
  SetGAL(GAL16V8);
  EnableVcc();
  WaitForAction();


  Clear();
  Print(AppStrings[MSG_TEST6_TXT].as_Str);
  InitGALer();
  EnableOutput();
  WriteByte(0xff, IC3);
  WriteByte(0xff, IC4);
  WriteByte(0xff, IC5);
  WaitForAction();


  Clear();
  Print(AppStrings[MSG_TEST7_TXT].as_Str);
  SetGAL(GAL20V8);
  EnableVcc();
  WriteByte(0x55, IC3);
  WriteByte(0x55, IC4);
  WriteByte(0x55, IC5);
  WaitForAction();


  Clear();
  Print(AppStrings[MSG_TEST8_TXT].as_Str);
  DisableVcc();
  WriteByte(0xaa, IC3);
  WriteByte(0xaa, IC4);
  WriteByte(0xaa, IC5);
  WaitForAction();

  DisableVcc();
  InitGALer();
  EnableOutput();
  VeditOn();


						/* adjust edit voltages */
  switch (hw_version) {
  
    case HW_GALER_1_2:
    case HW_GALER_1_3:

      Clear();
      Print(AppStrings[MSG_TEST9_TXT].as_Str);
      SetVolt(0);
      SetGAL(GAL20V8);
      EnableVEdit();
      WaitForAction();

      Clear();
      Print(AppStrings[MSG_TEST10_TXT].as_Str);
      SetVolt(1);
      WaitForAction();

      Clear();
      Print(AppStrings[MSG_TEST11_TXT].as_Str);
      SetVolt(2);
      WaitForAction();

      Clear();
      Print(AppStrings[MSG_TEST12_TXT].as_Str);
      SetVolt(3);
      WaitForAction();

      Clear();
      Print(AppStrings[MSG_TEST13_TXT].as_Str);
      SetVolt(4);
      WaitForAction();

      Print(AppStrings[MSG_TEST14_TXT].as_Str);
      WaitForAction();

      Clear();
      Print(AppStrings[MSG_TEST15_TXT].as_Str);
      DisableVEdit();
      SetGAL(GAL16V8);
      EnableVEdit();
      WaitForAction();

      break;


    case HW_GALER_1_0:

      Clear();
      Print(AppStrings[MSG_TEST22_TXT].as_Str);
      SetVolt(0);
      SetGAL(GAL20V8);
      EnableVEdit();
      WaitForAction();

      Clear();
      Print(AppStrings[MSG_TEST23_TXT].as_Str);
      DisableVEdit();
      SetGAL(GAL16V8);
      EnableVEdit();
      WaitForAction();

      break;

  }


				/* check GALer's read functions */
  Clear();

  if (hw_version >= HW_GALER_1_3)
    Print(AppStrings[MSG_TEST16_TXT].as_Str);
  else
    Print(AppStrings[MSG_TEST25_TXT].as_Str);

  SetGAL(GAL20V8);
  InitGALer();
  EnableVcc();
  EnableOutput();

  errorIC6a = errorIC6c = errorIC7 = 0;

					/* test IC6a */
  WriteByte(0x40, IC3);
  if (!ReadByte(IC6a))
    errorIC6a = 1;

  WriteByte(0x00, IC3);
  if (ReadByte(IC6a))
    errorIC6a = 1;


					/* test IC6c */
  if (hw_version >= HW_GALER_1_3) {
    WriteByte(0x80, IC3);
    if (!ReadByte(IC6c))
      errorIC6c = 1;

    WriteByte(0x00, IC3);
    if (ReadByte(IC6c))
      errorIC6c = 1;
  }


					/* test IC7 */
  WriteByte(0x00, IC5);
  if (ReadByte(IC7))
    errorIC7 = 1;

  WriteByte(0x2A, IC3);
  WriteByte(0x20, IC5);
  if (ReadByte(IC7) != 0xAA)
    errorIC7 = 1;

  WriteByte(0x15, IC3);
  WriteByte(0x10, IC5);
  if (ReadByte(IC7) != 0x55)
    errorIC7 = 1;



  DisableVcc();
  DisableOutput(); 




  if (errorIC6c || errorIC6a || errorIC7) {

    Print(AppStrings[MSG_TEST17_TXT].as_Str);

    if (errorIC6a) {
      Print(AppStrings[MSG_TEST18_TXT].as_Str);
    }

    if (errorIC7) {
      Print(AppStrings[MSG_TEST19_TXT].as_Str);
    }

    if  (errorIC6c) {
      Print(AppStrings[MSG_TEST20_TXT].as_Str);
    }

  }
  else {
    if (hw_version == HW_GALER_1_0)
      Print(AppStrings[MSG_TEST24_TXT].as_Str);
    else
      Print(AppStrings[MSG_TEST21_TXT].as_Str);
  }


  CancelGad.GadgetText = &GadIText3;
  OffGadget(&ContGad, window, NULL);
  RefreshGList(&ContGad, window, NULL, -1);

  WaitForAction();


  RestoreParPort();

  FreeTimer();

  closestuff();
}





/* get timer
*/
int GetTimer(void)
{

 timeport = CreatePort(0L,0L);
 if (timeport == NULL)
   return(-1);

 timereq=(struct timerequest *)AllocMem(
			(long)sizeof(struct timerequest),MEMF_PUBLIC);
 if (timereq == NULL) {
   DeletePort(timeport);
   return(-1);
  }

 timereq->tr_node.io_Message.mn_Node.ln_Type=NT_MESSAGE;
 timereq->tr_node.io_Message.mn_Node.ln_Pri=0;
 timereq->tr_node.io_Message.mn_ReplyPort=timeport;

 if (OpenDevice(TIMERNAME, UNIT_MICROHZ, (struct IORequest *)timereq, 0L)) {
   FreeMem(&timereq, (long)sizeof(struct timerequest));
   DeletePort (timeport);
   return(-1);
  }

 return(0);
}




/* free timer
*/
void FreeTimer(void)
{
 CloseDevice((struct IORequest *)timereq);

 FreeMem(timereq, (long)sizeof(struct timerequest));

 DeletePort(timeport);
}



/*micro: microsec. to wait
  secs: seconds to wait
*/
void WaitForTimer(ULONG micro)
{

  timereq->tr_node.io_Command=TR_ADDREQUEST;
  timereq->tr_time.tv_secs=0;
  timereq->tr_time.tv_micro=micro;

  DoIO((struct IORequest *)timereq);

}




/* clear window
*/
void Clear(void)
{

  ytxt = YPOS;

  SetAPen(rp, 0L);

  RectFill(rp, 10L, 22L, 630L, 170L);

  SetAPen(rp, 1L);

}




/* print text
*/
void Print(UBYTE *text)
{
UBYTE *ptr;
int   notready;


  ptr = text;

  notready = 1;

  while (notready) {
						/* search CR or end of */
    while ((*ptr != 0x00) && (*ptr != 0x0A))	/* string              */
      ptr++;


    if (ytxt < 160)
      ytxt += 10;
    else
      ScrollRaster(rp,0L,10L,10L,22L,630L,170L);


    if (*text != 0x0A) {
      Move(rp, 20L, (long)ytxt);		/* print string */
      Text(rp, text, (long)(ptr - text));
    }

    if (!*ptr)
      notready = 0;

    text = ++ptr;

  }

}





/* wait until gadget is selected
*/
void WaitForAction(void)
{
ULONG	class;
USHORT	code,gadID;

 for(;;) {

   Wait(1L << window->UserPort->mp_SigBit);

   while (message = (struct IntuiMessage *)GetMsg(window->UserPort)) {

     class = message -> Class;
     code  = message -> Code;

     if (class == GADGETUP)
       gadID = ((struct Gadget *)message->IAddress)->GadgetID;

     ReplyMsg((struct Message *)message);

     switch(class) {

						/* exit GALerTest */
	case CLOSEWINDOW: DisableVcc();
			  DisableOutput(); 
			  LED(OFF);
			  closestuff();
			  FreeTimer();
			  RestoreParPort();
			  exit(0);
			  break;

	case GADGETUP:    if (!gadID)
			    return;			    
			  else {		/* cancel selected */
			    DisableVcc();
			    DisableOutput(); 
			    LED(OFF);
			    closestuff();
			    FreeTimer();
			    RestoreParPort();
			    exit (0);
			  }
			  break;
     }
   }
 }
}





/* close window, libs...
*/
void closestuff(void)
{
  if (window) CloseWindow(window);

  if (GfxBase) CloseLibrary((struct Library *)GfxBase);

  if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);

  if (ReqToolsBase) CloseLibrary ((struct Library *)ReqToolsBase);

  if (LocaleBase) {
    CloseCatalog(catalog);
    CloseLibrary((struct Library *)LocaleBase);
  }

}




/* open window, libs...
*/
void openstuff(void)
{
struct Screen  *WBscreen;


  if (LocaleBase = (struct LocaleBase *)OpenLibrary("locale.library", 38L))
    catalog = OpenCatalog(NULL, (STRPTR)"GALerTest.catalog", OC_Version, 1, TAG_DONE);

  LocalizeText();


  if (!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 37L))) {
    puts (AppStrings[MSG_ERR_INTLIB].as_Str);
    closestuff();
    exit(FALSE);
  }

  if (!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 37L))) {
    puts (AppStrings[MSG_ERR_GRAPHLIB].as_Str);
    closestuff();
    exit(FALSE);
  }

  if (!(ReqToolsBase = (struct ReqToolsBase *)OpenLibrary(REQTOOLSNAME, REQTOOLSVERSION))) {
    puts((char *)AppStrings[MSG_ERR_REQTOOLSLIB].as_Str);
    closestuff();
    exit(FALSE);
  }


  txtattr.ta_Name  = (STRPTR)"topaz.font";		/* get font */
  txtattr.ta_YSize = 8;
  txtattr.ta_Style = 0;
  txtattr.ta_Flags = 0;

  if (!(txtfont = (struct TextFont *)OpenFont(&txtattr))) {
    puts(AppStrings[MSG_ERR_FONT].as_Str);
    closestuff();
    exit(FALSE);
  }

							/* center GALerTest's */
							/* window */
  if (WBscreen = LockPubScreen((UBYTE *)"Workbench")) {

    if (WBscreen->Width > WIN_WIDTH)
      MyWin.LeftEdge = (WBscreen->Width - WIN_WIDTH ) / 2;

    if (WBscreen->Height > WIN_HEIGHT)
      MyWin.TopEdge  = (WBscreen->Height- WIN_HEIGHT) / 2;

    UnlockPubScreen(NULL, WBscreen);
  }

  if (!(window = (struct Window *)OpenWindow(&MyWin))) {	/* open window */
    puts (AppStrings[MSG_ERR_WIN].as_Str);
    closestuff();
    exit(FALSE);
  }
}




/* localize text
*/
void LocalizeText(void)
{

  if (LocaleBase && catalog) {

    AppStrings[MSG_END_GAD].as_Str = GetCatalogStr(catalog, MSG_END_GAD, AppStrings[MSG_END_GAD].as_Str);
    AppStrings[MSG_CANCEL_GAD].as_Str = GetCatalogStr(catalog, MSG_CANCEL_GAD, AppStrings[MSG_CANCEL_GAD].as_Str);
    AppStrings[MSG_CONT_GAD].as_Str = GetCatalogStr(catalog, MSG_CONT_GAD, AppStrings[MSG_CONT_GAD].as_Str);
    AppStrings[MSG_ERR_TIMER].as_Str = GetCatalogStr(catalog, MSG_ERR_TIMER, AppStrings[MSG_ERR_TIMER].as_Str);
    AppStrings[MSG_ERR_INTLIB].as_Str = GetCatalogStr(catalog, MSG_ERR_INTLIB, AppStrings[MSG_ERR_INTLIB].as_Str);
    AppStrings[MSG_ERR_FONT].as_Str = GetCatalogStr(catalog, MSG_ERR_FONT, AppStrings[MSG_ERR_FONT].as_Str);
    AppStrings[MSG_ERR_GRAPHLIB].as_Str = GetCatalogStr(catalog, MSG_ERR_GRAPHLIB, AppStrings[MSG_ERR_GRAPHLIB].as_Str);
    AppStrings[MSG_ERR_REQTOOLSLIB].as_Str = GetCatalogStr(catalog, MSG_ERR_REQTOOLSLIB, AppStrings[MSG_ERR_REQTOOLSLIB].as_Str);
    AppStrings[MSG_ERR_WIN].as_Str = GetCatalogStr(catalog, MSG_ERR_WIN, AppStrings[MSG_ERR_WIN].as_Str);
    AppStrings[MSG_HARDWARE_TXT].as_Str = GetCatalogStr(catalog, MSG_HARDWARE_TXT, AppStrings[MSG_HARDWARE_TXT].as_Str);
    AppStrings[MSG_INTRO_TXT].as_Str = GetCatalogStr(catalog, MSG_INTRO_TXT, AppStrings[MSG_INTRO_TXT].as_Str);
    AppStrings[MSG_TEST1_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST1_TXT, AppStrings[MSG_TEST1_TXT].as_Str);
    AppStrings[MSG_TEST2_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST2_TXT, AppStrings[MSG_TEST2_TXT].as_Str);
    AppStrings[MSG_TEST3_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST3_TXT, AppStrings[MSG_TEST3_TXT].as_Str);
    AppStrings[MSG_TEST4_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST4_TXT, AppStrings[MSG_TEST4_TXT].as_Str);
    AppStrings[MSG_TEST5_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST5_TXT, AppStrings[MSG_TEST5_TXT].as_Str);
    AppStrings[MSG_TEST6_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST6_TXT, AppStrings[MSG_TEST6_TXT].as_Str);
    AppStrings[MSG_TEST7_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST7_TXT, AppStrings[MSG_TEST7_TXT].as_Str);
    AppStrings[MSG_TEST8_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST8_TXT, AppStrings[MSG_TEST8_TXT].as_Str);
    AppStrings[MSG_TEST9_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST9_TXT, AppStrings[MSG_TEST9_TXT].as_Str);
    AppStrings[MSG_TEST10_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST10_TXT, AppStrings[MSG_TEST10_TXT].as_Str);
    AppStrings[MSG_TEST11_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST11_TXT, AppStrings[MSG_TEST11_TXT].as_Str);
    AppStrings[MSG_TEST12_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST12_TXT, AppStrings[MSG_TEST12_TXT].as_Str);
    AppStrings[MSG_TEST13_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST13_TXT, AppStrings[MSG_TEST13_TXT].as_Str);
    AppStrings[MSG_TEST14_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST14_TXT, AppStrings[MSG_TEST14_TXT].as_Str);
    AppStrings[MSG_TEST15_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST15_TXT, AppStrings[MSG_TEST15_TXT].as_Str);
    AppStrings[MSG_TEST16_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST16_TXT, AppStrings[MSG_TEST16_TXT].as_Str);
    AppStrings[MSG_TEST17_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST17_TXT, AppStrings[MSG_TEST17_TXT].as_Str);
    AppStrings[MSG_TEST18_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST18_TXT, AppStrings[MSG_TEST18_TXT].as_Str);
    AppStrings[MSG_TEST19_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST19_TXT, AppStrings[MSG_TEST19_TXT].as_Str);
    AppStrings[MSG_TEST20_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST20_TXT, AppStrings[MSG_TEST20_TXT].as_Str);
    AppStrings[MSG_TEST21_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST21_TXT, AppStrings[MSG_TEST21_TXT].as_Str);
    AppStrings[MSG_TEST22_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST22_TXT, AppStrings[MSG_TEST22_TXT].as_Str);
    AppStrings[MSG_TEST23_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST23_TXT, AppStrings[MSG_TEST23_TXT].as_Str);
    AppStrings[MSG_TEST24_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST24_TXT, AppStrings[MSG_TEST24_TXT].as_Str);
    AppStrings[MSG_TEST25_TXT].as_Str = GetCatalogStr(catalog, MSG_TEST25_TXT, AppStrings[MSG_TEST25_TXT].as_Str);

  }


				/* localize gadgets */

  GadIText3.IText = AppStrings[MSG_END_GAD].as_Str;

  GadIText2.IText = AppStrings[MSG_CANCEL_GAD].as_Str;

  GadIText1.IText = AppStrings[MSG_CONT_GAD].as_Str;


}


