/****************************************************************/
/*								*/
/* Sub.c - dieses Modul enthält Unterroutinen für den GALer	*/
/*								*/
/* compilieren: cc sub.c					*/
/*								*/
/****************************************************************/



#include <exec/types.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <exec/memory.h>
#include <intuition/intuition.h>
#include <stdio.h>
#include <ctype.h>
#include <functions.h>

#include "GALer.h"
#include "reqbase.h"


#define	YES_GADID	1
#define	NO_GADID	2

#define	GALGAL_GADID	3
#define	GALJEDEC_GADID	4
#define	JEDECGAL_GADID	5

#define JEDEC_GADID	1
#define FUSE_GADID	2
#define CHIP_GADID	3
#define PIN_GADID	4
#define AUTOSAVE_GADID	5
#define AUTOGAL_GADID	6
#define WEITER_GADID	7
#define ABBRUCH_GADID	8

#define	JED_SEC_GADID	3
#define	JED_FSCHK_GADID	4
#define	JED_FLCHK_GADID	5


extern	struct	Window	 *window;
extern	struct	RastPort *rp;
extern	struct	MenuItem MenuItem13, MenuItem13b;
extern	struct	MenuItem MenuItem14, MenuItem14a, MenuItem14b;

extern	int	GALType, MaxFuseAdr, SigAdr;
extern	UBYTE	title[];

int	ytxt = 160;				/*Startpos. für PrintText*/


						/*Voreinstellungen*/
struct	Configuration Config = { GAL16V8,	/*GAL16V8*/
				 NO,		/*kein A-Typ*/
				 YES,		/*Requester für Typ*/
				 YES,		/*auto. A-Typ-Erkennung*/
				 YES,		/*Jedec erzeugen*/
				 NO,		/*kein Fuse-File*/
				 NO,		/*kein Chip-File*/
				 NO,		/*kein Pin-File*/
				 NO,		/*kein Auto-Save*/
				 YES,		/*autom. GALTyp einstellen*/
				 YES,		/*Leertest vor GAL-Prog.*/
				 YES,		/*Verify nach GAL-Prog.*/
				 YES,		/*Leertest vor Copy-GAL*/
				 YES,		/*Verify nach Copy-GAL*/
				 YES,		/*Leertest nach GAL-Löschen*/
				 NO,		/*Sec.Bit der Jedec-Datei*/
				 YES,		/*Fuse-Checksumme der Jedec*/
				 NO		/*File-Checksumme der Jedec*/
			    		};


struct	Configuration DummyConfig;		/*für LoadConfig*/




UBYTE	ErrorLineStr[] = {"Fehler in Zeile ....:"};



SHORT BorderVectorsRa[] = { 0,14,82,14,82,0 };
SHORT BorderVectorsRb[] = { 0,14,0,0,82,0 };

struct Border BorderRb  = {-1,-1,2,0,JAM1,3,BorderVectorsRb,NULL};
struct Border BorderRa  = {-1,-1,1,0,JAM1,3,BorderVectorsRa,&BorderRb};


struct IntuiText ITextN = {2,0,JAM1,14,3,NULL,NULL,NULL};
struct IntuiText ITextY = {2,0,JAM1,16,3,NULL,NULL,NULL};


struct Gadget GadgetN = {NULL,206,53,81,13,NULL,RELVERIFY,
			 BOOLGADGET+REQGADGET,
			 (APTR)&BorderRa,NULL,&ITextN,NULL,NULL,NO_GADID,NULL};
struct Gadget GadgetY = {&GadgetN,26,53,81,13,NULL,RELVERIFY,
			 BOOLGADGET+REQGADGET,
			 (APTR)&BorderRa,NULL,&ITextY,NULL,NULL,YES_GADID,NULL};



struct IntuiText ITextW = {2,0,JAM1,19,15,NULL,NULL,NULL};




SHORT SBorderVectors1a[] = { 0,12,73,12,73,0 };
SHORT SBorderVectors1b[] = { 0,12,0,0,73,0 };

SHORT SBorderVectors2a[] = { 0,14,85,14,85,0 };
SHORT SBorderVectors2b[] = { 0,14,0,0,85,0 };

SHORT SBorderVectors3a[] = { 0,8,14,8,14,0 };
SHORT SBorderVectors3b[] = { 0,8,0,0,14,0 };


struct Border SBorder1b    = { -1,-1,2,0,JAM1,3,SBorderVectors1b,NULL };
struct Border SBorder1a    = { -1,-1,1,0,JAM1,3,SBorderVectors1a,&SBorder1b };

struct Border SBorder2b    = { -1,-1,2,0,JAM1,3,SBorderVectors2b,NULL };
struct Border SBorder2a    = { -1,-1,1,0,JAM1,3,SBorderVectors2a,&SBorder2b };

struct Border SBorder3b    = { -1,-1,2,0,JAM1,3,SBorderVectors3b,NULL};
struct Border SBorder3a    = { -1,-1,1,0,JAM1,3,SBorderVectors3a,&SBorder3b};




struct IntuiText SIText1 = { 2,0,JAM1,9,2,NULL,
			    (UBYTE *)"Abbruch",NULL };

struct IntuiText SIText2 = { 2,0,JAM1,13,2,NULL,
			    (UBYTE *)"Weiter",NULL };

struct IntuiText SIText4 = { 2,0,JAM1,22,0,NULL,
			    (UBYTE *)"GAL-Typ übernehmen",NULL };

struct IntuiText SIText8 = { 2,0,JAM1,22,0,NULL,
			    (UBYTE *)"automatisch schreiben",NULL };

struct IntuiText SIText9 = { 2,0,JAM1,22,0,NULL,
			    (UBYTE *)"Pin-Diagramm",NULL };

struct IntuiText SIText10= { 2,0,JAM1,22,0,NULL,
			     (UBYTE *)"Chip-Diagramm",NULL };

struct IntuiText SIText11= { 2,0,JAM1,22,0,NULL,
			    (UBYTE *)"Fuse-Matrix",NULL };

struct IntuiText SIText12= { 2,0,JAM1,22,0,NULL,
			    (UBYTE *)"JEDEC",NULL };

struct IntuiText SIText13= { 2,0,JAM1,15,18,NULL,
			    (UBYTE *)"zu erstellende Files:", NULL };

struct IntuiText SIText14= { 2,0,JAM1,14,3,NULL,
			    (UBYTE *)"Abbruch",NULL };

struct IntuiText SIText15= { 2,0,JAM1,6,3,NULL,
			    (UBYTE *)"GAL20V8 A",NULL };

struct IntuiText SIText16= { 2,0,JAM1,14,3,NULL,
			    (UBYTE *)"GAL20V8",NULL };

struct IntuiText SIText17= { 2,0,JAM1,6,3,NULL,
			    (UBYTE *)"GAL16V8 A",NULL };

struct IntuiText SIText18= { 2,0,JAM1,14,3,NULL,
			    (UBYTE *)"GAL16V8",NULL };

struct IntuiText SIText20= { 2,0,JAM1,0,15,NULL,NULL,NULL };

struct IntuiText SIText19= { 2,0,JAM1,8,30,NULL,
			    (UBYTE *)"Bitte GAL in Fassung stecken und GAL-Typ auswählen.",&SIText20 };

struct IntuiText SIText21= { 2,0,JAM1,21,2,NULL,
			     (UBYTE *)"O.K.",NULL };


struct IntuiText SIText30= { 2,0,JAM1,6,3,NULL,
			    (UBYTE *)" GAL-GAL",NULL };

struct IntuiText SIText31= { 2,0,JAM1,6,3,NULL,
			    (UBYTE *)"GAL-JEDEC",NULL };

struct IntuiText SIText32= { 2,0,JAM1,6,3,NULL,
			    (UBYTE *)"JEDEC-GAL",NULL };

struct IntuiText SIText33= { 2,0,JAM1,19,20,NULL,
			    (UBYTE *)"Bitte die Art des Vergleichs auswählen.",NULL };


struct IntuiText SIText44= { 2,0,JAM1,22,0,NULL,
			    (UBYTE *)"mit Verify",NULL };

struct IntuiText SIText43= { 2,0,JAM1,22,0,NULL,
			    (UBYTE *)"mit Leertest",NULL };

struct IntuiText SIText42= { 2,0,JAM1,15,10,NULL,
			    (UBYTE *)"programmieren:", NULL };

struct IntuiText SIText41= { 2,0,JAM1,15,45,NULL,
			    (UBYTE *)"kopieren:", &SIText42 };

struct IntuiText SIText40= { 2,0,JAM1,15,80,NULL,
			    (UBYTE *)"löschen:", &SIText41 };



struct IntuiText SIText53= { 2,0,JAM1,22,0,NULL,
			    (UBYTE *)"File-Check-Summe",NULL };

struct IntuiText SIText52= { 2,0,JAM1,22,0,NULL,
			    (UBYTE *)"Fuse-Check-Summe",NULL };

struct IntuiText SIText51= { 2,0,JAM1,22,0,NULL,
			    (UBYTE *)"Security-Bit",NULL };

struct IntuiText SITextJR= { 2,0,JAM1,15,10,NULL,
			    (UBYTE *)"JEDEC-File schreiben:",NULL };



struct IntuiText AboutTxt6 = {2,0,JAM1,177,70,NULL,
			      (UBYTE *)"85356 Freising (Germany)",NULL };

struct IntuiText AboutTxt5 = {2,0,JAM1,177,55,NULL,
			      (UBYTE *)"Asamstr. 17",&AboutTxt6 };

struct IntuiText AboutTxt4 = {2,0,JAM1,25,45,NULL,
			      (UBYTE *)"Meine Adresse:     Christian Habermann",&AboutTxt5 };

struct IntuiText AboutTxt3 = {2,0,JAM1,25,30,NULL,
			      (UBYTE *)"senden Sie mir bitte 20,- DM zu. Vielen Dank!",&AboutTxt4 };

struct IntuiText AboutTxt2 = {2,0,JAM1,25,20,NULL,
			      (UBYTE *)"Programm und / oder die  Hardware gebrauchen können,",&AboutTxt3 };

struct IntuiText AboutTxt1 = {2,0,JAM1,25,10,NULL,
			      (UBYTE *)"Das Projekt 'GALer' ist  SHAREWARE.  Wenn Sie dieses",&AboutTxt2 };

struct IntuiText ATypeTxt  = {2,0,JAM1,75,30,NULL,
			      (UBYTE *)"und GAL-Typ auswählen." };



struct Gadget SGadget12 = { NULL,179,120,72,11,
			    NULL,
			    RELVERIFY,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder1a,NULL,
			    &SIText1,NULL,NULL,ABBRUCH_GADID,NULL };

struct Gadget SGadget11 = { &SGadget12,18,120,72,11,
			    NULL,
			    RELVERIFY,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder1a,NULL,
			    &SIText2,NULL,NULL,WEITER_GADID,NULL };

struct Gadget SGadget9  = { &SGadget11,18,91,13,7,
			    NULL,
			    RELVERIFY+TOGGLESELECT,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder3a,NULL,
			    &SIText4,NULL,NULL,AUTOGAL_GADID,NULL };

struct Gadget SGadget5  = { &SGadget9,62,72,13,7,
			    NULL,
			    RELVERIFY+TOGGLESELECT,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder3a,NULL,
			    &SIText8,NULL,NULL,AUTOSAVE_GADID,NULL };

struct Gadget SGadget4  = { &SGadget5,62,59,13,7,
			    NULL,
			    RELVERIFY+TOGGLESELECT,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder3a,NULL,
			    &SIText9,NULL,NULL,PIN_GADID,NULL };

struct Gadget SGadget3  = { &SGadget4,62,49,13,7,
			    NULL,
			    RELVERIFY+TOGGLESELECT,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder3a,NULL,
			    &SIText10,NULL,NULL,CHIP_GADID,NULL };

struct Gadget SGadget2  = { &SGadget3,62,39,13,7,
			    NULL,
			    RELVERIFY+TOGGLESELECT,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder3a,NULL,
			    &SIText11,NULL,NULL,FUSE_GADID,NULL };

struct Gadget SGadget1  = { &SGadget2,62,29,13,7,
			    NULL,
			    RELVERIFY+TOGGLESELECT,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder3a,NULL,
			    &SIText12,NULL,NULL,JEDEC_GADID,NULL };



struct Gadget SGadget24 = { NULL,164,77,84,13,NULL,
			    RELVERIFY,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder2a,NULL,
			    &SIText14,NULL,NULL,NO_GADID,NULL };

struct Gadget SGadget23 = { &SGadget24,312,50,84,13,NULL,
			    RELVERIFY,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder2a,NULL,
			    &SIText15,NULL,NULL,6,NULL };

struct Gadget SGadget22 = { &SGadget23,216,50,84,13,NULL,
			    RELVERIFY,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder2a,NULL,
			    &SIText16,NULL,NULL,5,NULL };

struct Gadget SGadget21 = { &SGadget22,121,50,84,13,NULL,
			    RELVERIFY,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder2a,NULL,
			    &SIText17,NULL,NULL,4,NULL };

struct Gadget SGadget20 = { &SGadget21,25,50,84,13,NULL,
			    RELVERIFY,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder2a,NULL,
			    &SIText18,NULL,NULL,3,NULL };



struct Gadget SGadget33 = { NULL,133,77,84,13,NULL,
			    RELVERIFY,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder2a,NULL,
			    &SIText14,NULL,NULL,NO_GADID,NULL };

struct Gadget SGadget32 = { &SGadget33,240,50,84,13,NULL,
			    RELVERIFY,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder2a,NULL,
			    &SIText32,NULL,NULL,JEDECGAL_GADID,NULL };

struct Gadget SGadget31 = { &SGadget32,133,50,84,13,NULL,
			    RELVERIFY,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder2a,NULL,
			    &SIText31,NULL,NULL,GALJEDEC_GADID,NULL };

struct Gadget SGadget30 = { &SGadget31,25,50,84,13,NULL,
			    RELVERIFY,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder2a,NULL,
			    &SIText30,NULL,NULL,GALGAL_GADID,NULL };



struct Gadget SGadget46 = { NULL,45,90,13,7,
			    NULL,
			    RELVERIFY+TOGGLESELECT,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder3a,NULL,
			    &SIText43,NULL,NULL,7,NULL };

struct Gadget SGadget45 = { &SGadget46,45,65,13,7,
			    NULL,
			    RELVERIFY+TOGGLESELECT,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder3a,NULL,
			    &SIText44,NULL,NULL,6,NULL };

struct Gadget SGadget44 = { &SGadget45,45,55,13,7,
			    NULL,
			    RELVERIFY+TOGGLESELECT,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder3a,NULL,
			    &SIText43,NULL,NULL,5,NULL };

struct Gadget SGadget43 = { &SGadget44,45,30,13,7,
			    NULL,
			    RELVERIFY+TOGGLESELECT,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder3a,NULL,
			    &SIText44,NULL,NULL,4,NULL };

struct Gadget SGadget42 = { &SGadget43,45,20,13,7,
			    NULL,
			    RELVERIFY+TOGGLESELECT,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder3a,NULL,
			    &SIText43,NULL,NULL,3,NULL };

struct Gadget SGadget40 = { &SGadget42,98,115,72,11,
			    NULL,
			    RELVERIFY,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder1a,NULL,
			    &SIText21,NULL,NULL,YES_GADID,NULL };



struct Gadget SGadget53 = { NULL,25,42,13,7,
			    NULL,
			    RELVERIFY+TOGGLESELECT,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder3a,NULL,
			    &SIText53,NULL,NULL,JED_FLCHK_GADID,NULL };

struct Gadget SGadget52 = { &SGadget53,25,32,13,7,
			    NULL,
			    RELVERIFY+TOGGLESELECT,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder3a,NULL,
			    &SIText52,NULL,NULL,JED_FSCHK_GADID,NULL };

struct Gadget SGadget51 = { &SGadget52,25,22,13,7,
			    NULL,
			    RELVERIFY+TOGGLESELECT,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder3a,NULL,
			    &SIText51,NULL,NULL,JED_SEC_GADID,NULL };

struct Gadget SGadget50 = { &SGadget51,71,62,72,11,
			    NULL,
			    RELVERIFY,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder1a,NULL,
			    &SIText21,NULL,NULL,YES_GADID,NULL };


struct Gadget AboutGad = {  NULL,198,95,72,11,NULL,
			    RELVERIFY,
			    BOOLGADGET+REQGADGET,
			    (APTR)&SBorder1a,NULL,
			    &SIText21,NULL,NULL,1,NULL };



SHORT ReqBorVeca[]   = { 0,75,309,75,309,0 };
SHORT ReqBorVecb[]   = { 0,75,0,0,309,0 };

SHORT cmpBorVeca[]   = { 0,96,349,96,349,0 };
SHORT cmpBorVecb[]   = { 0,96,0,0,349,0 };

SHORT asmBorVeca[]   = { 0,139,271,139,271,0 };
SHORT asmBorVecb[]   = { 0,139,0,0,271,0 };

SHORT VerBorVeca[]   = { 0,139,271,139,271,0 };
SHORT VerBorVecb[]   = { 0,139,0,0,271,0 };

SHORT TypeBorVeca[]  = { 0,96,423,96,423,0 };
SHORT TypeBorVecb[]  = { 0,96,0,0,423,0 };

SHORT AboutBorVeca[] = { 0,117,467,117,467,0 };
SHORT AboutBorVecb[] = { 0,117,0,0,467,0 };

SHORT JedecBorVeca[] = { 0,79,204,79,204,0 };
SHORT JedecBorVecb[] = { 0,79,0,0,204,0 };


struct Border ReqBorderb    = { 0,0,2,0,JAM1,3,ReqBorVecb,NULL};
struct Border ReqBordera    = { 0,0,1,0,JAM1,3,ReqBorVeca,&ReqBorderb};

struct Border cmpBorderb    = { 0,0,2,0,JAM1,3,cmpBorVecb,NULL};
struct Border cmpBordera    = { 0,0,1,0,JAM1,3,cmpBorVeca,&cmpBorderb};

struct Border asmBorderb    = { 0,0,2,0,JAM1,3,asmBorVecb,NULL};
struct Border asmBordera    = { 0,0,1,0,JAM1,3,asmBorVeca,&asmBorderb};

struct Border TypeBorderb   = { 0,0,2,0,JAM1,3,TypeBorVecb,NULL};
struct Border TypeBordera   = { 0,0,1,0,JAM1,3,TypeBorVeca,&TypeBorderb};

struct Border AboutBorderb  = { 0,0,2,0,JAM1,3,AboutBorVecb,NULL};
struct Border AboutBordera  = { 0,0,1,0,JAM1,3,AboutBorVeca,&AboutBorderb};

struct Border JedecBorderb  = { 0,0,2,0,JAM1,3,JedecBorVecb,NULL};
struct Border JedecBordera  = { 0,0,1,0,JAM1,3,JedecBorVeca,&JedecBorderb};



struct Requester req     = { NULL,170,40,310,76,0,0,
			    &GadgetY,&ReqBordera,&ITextW,
			    NOISYREQ,3,NULL,NULL,NULL };


struct Requester cmpreq  = { NULL,145,30,350,97,0,0,
			    &SGadget30,&cmpBordera,&SIText33,
			    NOISYREQ,3,NULL,NULL,NULL };


struct Requester asmreq  = { NULL,184,20,272,140,0,0,
			    &SGadget1,&asmBordera,&SIText13,
			    NOISYREQ,3,NULL,NULL,NULL };


struct Requester VerReq  = { NULL,184,20,272,140,0,0,
			    &SGadget40,&asmBordera,&SIText40,
			    NOISYREQ,3,NULL,NULL,NULL };


struct Requester TypeReq = { NULL,114,30,424,97,0,0,
			    &SGadget20,&TypeBordera,&SIText19,
			    NOISYREQ,3,NULL,NULL,NULL };


struct Requester AboutReq={ NULL,86,18,468,118,0,0,
			    &AboutGad,&AboutBordera,&AboutTxt1,
			    NOISYREQ,3,NULL,NULL,NULL };


struct Requester JedecReq={ NULL,217,30,205,80,0,0,
			    &SGadget50,&JedecBordera,&SITextJR,
			    NOISYREQ,3,NULL,NULL,NULL };




char	filename[FCHARS+4];			/*Puffer für Filenamen*/
char	directoryname[DSIZE];			/*Puffer für Directory*/
char	path[DSIZE+FCHARS+4];			/*Puffer für Dir+File*/
						/*+4 für Suffix*/

struct ReqFileRequester	MyFileReqStruct =	/*FileRequester aus req.lib*/
			{ 
			 REQVERSION, NULL,
			 (char *)&directoryname,
			 (char *)&filename,
			 (char *)&path,
			 NULL,
			 0,12,32,10,
			 FRQCACHINGM|FRQINFOGADGETM|FRQABSOLUTEXYM,
			 1,2,2,0,0,		/*Dir,File,Dev,Font,Fontsize*/
			 2,1,			/*Detail,Block-Farben*/
			 2,2,2,2,		/*GadTxt,Text,String,StrnGad*/
			 2,2,			/*Border,Gadget-Farben*/
			};





/* Schreibverhalten: Läßt Requester erscheinen, in dem eingestellt werden
		     kann ob ein Leertest und/oder Verify nach einem
		     schreibenden Zugriff auf ein GAL gemacht werden soll.
   Aufruf   : Schreibverhalten();
   Parameter: ---
   Ergebnis : --- 
*/
void Schreibverhalten()
{
struct	IntuiMessage	*imsg;
ULONG	class;
USHORT	code,gadID;

 if (Request(&VerReq,window)) {
     for (;;) {
       imsg = (struct IntuiMessage *) GetMsg(window->UserPort); 
       if (!imsg) WaitPort (window->UserPort);
       else {
         class = imsg->Class;
	 code  = imsg->Code;
	 if (class==GADGETUP) gadID=((struct Gadget *)imsg->IAddress)->GadgetID;
   	 ReplyMsg(imsg);
	 if (class == VANILLAKEY) {
	   if (code == 'w') {
	     EndRequest(&VerReq,window);
	     return;
	    }
	  }
	 if (class == GADGETUP) {
	   switch (gadID) {
	     case YES_GADID:
		EndRequest(&VerReq,window);
		return;
	     case 3:
		Config.ProgEmptyTest = !Config.ProgEmptyTest;
		break;
	     case 4:
		Config.ProgVerify = !Config.ProgVerify;
		break;
	     case 5:
		Config.CopyEmptyTest = !Config.CopyEmptyTest;
		break;
	     case 6:
		Config.CopyVerify = !Config.CopyVerify;
		break;
	     case 7:
		Config.EraseEmptyTest = !Config.EraseEmptyTest;
		break;
	    }
	  }
        }
      }
  }
}



/* JedecRequster: Läßt Requester erscheinen, in dem eingestellt werden kann,
	     was wie im Jedec-File stehen soll.
   Aufruf   : JedecReq();
   Parameter: ---
   Ergebnis : --- 
*/
void JedecRequester()
{
struct	IntuiMessage	*imsg;
ULONG	class;
USHORT	code,gadID;

 if (Request(&JedecReq,window)) {
     for (;;) {
       imsg = (struct IntuiMessage *) GetMsg(window->UserPort); 
       if (!imsg) WaitPort (window->UserPort);
       else {
         class = imsg->Class;
	 code  = imsg->Code;
	 if (class==GADGETUP) gadID=((struct Gadget *)imsg->IAddress)->GadgetID;
   	 ReplyMsg(imsg);
	 if (class == VANILLAKEY) {
	   if (code == 'w') {
	     EndRequest(&JedecReq,window);
	     return;
	    }
	  }
	 if (class == GADGETUP) {
	   switch (gadID) {
	     case YES_GADID:
		EndRequest(&JedecReq,window);
		return;
	     case JED_SEC_GADID:
		Config.JedecSecBit = !Config.JedecSecBit;
		break;
	     case JED_FSCHK_GADID:
		Config.JedecFuseChk = !Config.JedecFuseChk;
		break;
	     case JED_FLCHK_GADID:
		Config.JedecFileChk = !Config.JedecFileChk;
		break;
	    }
	  }
        }
      }
  }
}




/* About: zeigt About-Text
   Aufruf   : About();
   Parameter: ---
   Ergebnis : --- 
*/
void About()
{
struct	IntuiMessage	*imsg;
ULONG	class;
USHORT	gadID;

 if (Request(&AboutReq,window)) {
     for (;;) {
       imsg = (struct IntuiMessage *) GetMsg(window->UserPort); 
       if (!imsg) WaitPort (window->UserPort);
       else {
         class = imsg->Class;
	 if (class==GADGETUP) gadID=((struct Gadget *)imsg->IAddress)->GadgetID;
   	 ReplyMsg(imsg);
	 if (class == VANILLAKEY) {
	   EndRequest(&AboutReq,window);
	   return;
	  }
	 if (class == GADGETUP) {
	   if (gadID == 1) {
	     EndRequest(&AboutReq,window);
	     return;
	    }
	  }
        }
      }
  }
}




/* mystrcmp: wie strcmp, aber keine Unterscheidung zwischen Groß- und
   Kleinschreibung
   Aufruf: result = mystrcmp(cptr1, cptr2);
	   cptr1: Zeiger auf 1. String
	   cptr2: Zeiger auf 2. String
   Ergebnis: 
	   result = 1: nicht gleich
	  	  = 0: gleich
*/
int mystrcmp(cptr1, cptr2)
char *cptr1, *cptr2;
{
  while (*cptr1 && *cptr2) {
    if (_tolower(*cptr1) != _tolower(*cptr2))
      return(1);
    cptr1++;
    cptr2++;
   }

  if (!*cptr1 && !*cptr2)
    return(0);
  else
    return(1);
}


/* MyFileReq: öffnet den FileRequester aus der "req.library"
   Aufruf: antwort = MyFileReq((char *)headtxt, (char *)showtxt, int showreq);
   	 	 headtxt: Zeiger auf File-Requester-Titel
		 showtxt: Zeiger auf Suffix
		 showreq: YES: FileRequester zeigen; NO: keinen Requester
   Ergebnis: 1 : O.K. wurde angeklickt
	     0 : Cancel wurde angeklickt
*/
int MyFileReq(headtxt,showtxt,showreq)
char *headtxt, *showtxt;
int  showreq;
{
char	*pos1, *pos2;
int	freq = YES;

 MyFileReqStruct.WindowLeftEdge = 124;

 MyFileReqStruct.Title = headtxt;			/*Überschrift*/
 MyFileReqStruct.Show[0]='#';				/*Show-Text*/
 MyFileReqStruct.Show[1]='?';
 MyFileReqStruct.Show[2]=0;
 strcat(&MyFileReqStruct.Show[0],showtxt);

					/*falls vorhanden, Suffix löschen*/
 if (strlen(&filename[0])>=4) {		/*und "showtxt" anhängen */
   pos1 = (char *)(&filename[0] + (long)strlen(&filename[0]) - (long)strlen(showtxt));
   if ((!mystrcmp(pos1,(char *)".pld")) || (!mystrcmp(pos1,(char *)".jed")) ||
       (!mystrcmp(pos1,(char *)".pin")) || (!mystrcmp(pos1,(char *)".chp")) ||
       (!mystrcmp(pos1,(char *)".fus"))) {
     *pos1 = 0;
     strcat(&filename[0], showtxt);
    }
  }


 if (showreq)					/*FileRequester zeigen?*/
   freq = FileRequester(&MyFileReqStruct);

 if ((showreq && freq) || !showreq) {
   if (strlen(&filename[0])>=4) {			/*Suffix anhängen*/
     pos1 = (char *)(&filename[0]+(long)strlen(&filename[0])-(long)strlen(showtxt));
       if (mystrcmp(pos1,showtxt)) {		/*Suffix nur anhängen, wenn*/
         strcat(&filename[0], showtxt);		/*es nicht schon da steht  */
         strcat(&path[0], showtxt);
	}
    }
   else {
    if (!strlen(&filename[0]))			/*kein File angegeben?*/
      return(0);				/*dann Abbruch*/
    strcat(&filename[0], showtxt);
    strcat(&path[0], showtxt);
    }
					    /*Wenn kein Requester gezeigt  */
					    /*wurde (showreq = NO), muß	   */
   if (!showreq) {			    /*der Pfad "von Hand" zusammen-*/
     strcpy(&path[0],&directoryname[0]);    /*gestellt werden.*/
     pos1 = (char *)(&directoryname[0]+((long)strlen(&directoryname[0])-1L));
     pos2 = (char *)(&path[0]+((long)strlen(&path[0])));
     if (!((*pos1 == ':') || (*pos1 == '/') || !*pos1)) {
       *pos2++ = '/';
       *pos2   = 0x00;				/*Stringende*/
      }
     strcat(&path[0],&filename[0]);	   
    }
   return(1);
  }
 else
   return(0);
}



/* CompareRequester: öffnet den Requester für die Art des Vergleichs
   Parameter: keine
   Ergebnis : 0 : Abbruch
	      1 : GAL   - GAL
	      2 : GAL   - Jedec
	      3 : Jedec - GAL
*/
int CompareRequester()
{
struct	IntuiMessage	*imsg;
ULONG	class;
USHORT	code,gadID;

 if (Request(&cmpreq,window)) {
     for (;;) {
       imsg = (struct IntuiMessage *) GetMsg(window->UserPort); 
       if (!imsg) WaitPort (window->UserPort);
       else {
         class = imsg->Class;
	 code  = imsg->Code;
	 if (class==GADGETUP) gadID=((struct Gadget *)imsg->IAddress)->GadgetID;
   	 ReplyMsg(imsg);
	 if (class == VANILLAKEY) {
	   switch(code) {
	     case '1':
			EndRequest(&cmpreq,window);
			return(1);
	     case '2':
			EndRequest(&cmpreq,window);
			return(2);
	     case '3':
			EndRequest(&cmpreq,window);
			return(3);
	     case 0x1B:
	     case 'a' :
	  		EndRequest(&cmpreq,window);
			return(0);
	    }
	  }
	 if (class == GADGETUP) {
	   switch (gadID) {
	     case NO_GADID: {
		EndRequest(&cmpreq,window);
		return(0);
	      }
	     case GALGAL_GADID: {
		EndRequest(&cmpreq,window);
		return(1);
	      }
	     case GALJEDEC_GADID: {
		EndRequest(&cmpreq,window);
		return(2);
	      }
	     case JEDECGAL_GADID: {
		EndRequest(&cmpreq,window);
		return(3);
	      }
	    }
	  }
        }
      }
   }
 else
   return(0);
}



/* MyRequest:
   öffnet einen Requester und wartet auf die Antwort
   Aufruf: antwort = MyRequest(mode,text);
	   mode: CONT_REQ : Requester mit Weiter/Abbruch-Gadgets
		 ERR_REQ  : Requester für Fehlermeldungen (Abbruch/Abbruch)
		 INFO_REQ : Requester für Informationen (Weiter/Weiter)
		 ATYPE_REQ: Requester für A-Typ oder nicht
		 GALTYPE_REQ: Öffnet Requester in dem der GAL-Typ eingestellt
		   werden kann, falls im Menü "Typ-Requester" eingestellt ist.
		   Wenn dies nicht der Fall ist, dann wird ein normaler	
		   Frage-Requester ("CONT_REQ") ausgegeben.
	   text: Zeiger auf Requester-Text
	   antwort: 0=Abbruch oder Fehler, 1=Bestätigung
		    bei GALTYPE_REQ:   1 = GAL16V8
				       2 = GAL16V8A
				       3 = GAL20V8
				       4 = GAL20V8A
*/
int MyRequest(mode,text)
int	mode;
UBYTE	*text;
{
struct	IntuiMessage	*imsg;
struct	Requester	*myreq;
ULONG	class;
USHORT	code,gadID;
int	width;


 ITextW.NextText  = NULL;			/*für AType-Req.*/

 if (mode == GALTYPE_REQ) {			/* wenn autom. A-Typ, dann*/
   if (Config.AutoAType) {			/* die A-Typ-Gadgets de-*/
     SGadget23.Flags = SGadget23.Flags | GADGDISABLED;	/*aktivieren, sonst*/
     SGadget21.Flags = SGadget21.Flags | GADGDISABLED;	/*aktivieren*/
    }
   else {
     SGadget23.Flags = SGadget23.Flags & ~GADGDISABLED;
     SGadget21.Flags = SGadget21.Flags & ~GADGDISABLED;
    }
  }

 if (Config.GALTypeReq && (mode == GALTYPE_REQ)) {
   myreq = &TypeReq;
   SIText20.LeftEdge=(SHORT)(212-strlen(text)*8/2);
   SIText20.IText = text;
  }
 else {
   if (mode == ERASE_REQ) {
     ITextY.IText = (UBYTE *)"Löschen";
     ITextN.IText = (UBYTE *)"Abbruch";
    }
   if (mode == ATYPE_REQ) {
     ITextY.IText = (UBYTE *)"A-Typ";
     ITextN.IText = (UBYTE *)"normal";
     ITextW.NextText  = &ATypeTxt;
    }
   if (mode == ERR_REQ) {
     ITextY.IText = (UBYTE *)"Abbruch";
     ITextN.IText = (UBYTE *)"Abbruch";
     }   
   if ((mode == CONT_REQ) || (mode == GALTYPE_REQ)) {
     ITextY.IText = (UBYTE *)"Weiter";
     ITextN.IText = (UBYTE *)"Abbruch";
    }   
   if (mode == INFO_REQ) {
     ITextY.IText = (UBYTE *)"Weiter";
     ITextN.IText = (UBYTE *)"Weiter";
    }

   if (strlen(text) < 39)
     width = 310;
   else
     width = (int)(strlen(text))*8+10;

   ITextW.LeftEdge  = (SHORT)(width/2-strlen(text)*8/2);
   ITextW.IText     = text;
   req.LeftEdge     = 320-width/2;
   req.Width	    = width;
   GadgetN.LeftEdge = width-104;
   ReqBorVeca[2] = ReqBorVeca[4] = ReqBorVecb[4] = width-1;
   myreq = &req;
  }

 if (Request(myreq,window)) {
     for (;;) {
       imsg = (struct IntuiMessage *) GetMsg(window->UserPort); 
       if (!imsg) WaitPort (window->UserPort);
       else {
         class = imsg->Class;
	 code  = imsg->Code;
	 if (class==GADGETUP) gadID=((struct Gadget *)imsg->IAddress)->GadgetID;
   	 ReplyMsg(imsg);
	 if (class == VANILLAKEY) {
	   if (Config.GALTypeReq && (mode == GALTYPE_REQ)) {
	     switch (code) {
	       case '1':
		  EndRequest(myreq,window);
		  SetGALType (GAL16V8,NO);
		  return(1);
	       case '2':
		  if (!Config.AutoAType) {
		    EndRequest(myreq,window);
		    SetGALType (GAL16V8,YES);
		    return(2);
		   }
		  break;
	       case '3':
		  EndRequest(myreq,window);
		  SetGALType (GAL20V8,NO);
		  return(3);
	       case '4':
		  if (!Config.AutoAType) {
		    EndRequest(myreq,window);
		    SetGALType (GAL20V8,YES);
		    return(4);
		   }
		  break;
	      }
	    }
           else
	     if (code == 'w') {				/*weiter ?*/
	       EndRequest(myreq,window);
	       return(1);
	      }						/*ESC oder Abbruch?*/
	   if ((code == 0x1B) || (code == 'a')) {
	     EndRequest(myreq,window);
	     return(0);
	    }
	  }
	 if (class == GADGETUP) {
	   switch (gadID) {
	     case YES_GADID:
	  	EndRequest(myreq,window);
		return(1);
	     case NO_GADID:
		EndRequest(myreq,window);
		return(0);
	     case 3:
		EndRequest(myreq,window);
		SetGALType (GAL16V8,NO);
		return(1);
	     case 4:
		EndRequest(myreq,window);
		SetGALType (GAL16V8,YES);
		return(2);
	     case 5:
		EndRequest(myreq,window);
		SetGALType (GAL20V8,NO);
		return(3);
	     case 6:
		EndRequest(myreq,window);
		SetGALType (GAL20V8,YES);
		return(4);
	    }
	  }
        }
      }
   }
 else
   return(0);
}




/* AsmRequester: öffnet den Requester mit den Assembler-Optionen
   Parameter: keine
   Ergebnis : 0 : Abbruch
	      1 : Weiter
*/
int AsmRequester()
{
struct	IntuiMessage	*imsg;
ULONG	class;
USHORT	code,gadID;

 if (Request(&asmreq,window)) {
     for (;;) {
       imsg = (struct IntuiMessage *) GetMsg(window->UserPort); 
       if (!imsg) WaitPort (window->UserPort);
       else {
         class = imsg->Class;
	 code  = imsg->Code;
	 if (class==GADGETUP) gadID=((struct Gadget *)imsg->IAddress)->GadgetID;
   	 ReplyMsg(imsg);
	 if (class == VANILLAKEY) {
	   if (code == 'w') {				/*Weiter ?*/
	     EndRequest(&asmreq,window);
	     return(1);
	    }						/*ESC oder Abbruch?*/
	   if ((code == 0x1B) || (code == 'a')) {
	     EndRequest(&asmreq,window);
	     return(0);
	    }
	  }
	 if (class == GADGETUP) {
	   switch (gadID) {
	     case WEITER_GADID:
		EndRequest(&asmreq,window);
		return(1);
		break;
	     case ABBRUCH_GADID:
		EndRequest(&asmreq,window);
		return(0);
		break;
	     case JEDEC_GADID:
		Config.GenJedec = !Config.GenJedec;
		break;
	     case FUSE_GADID:
		Config.GenFuse = !Config.GenFuse;
		break;
	     case CHIP_GADID:
		Config.GenChip = !Config.GenChip;
		break;
	     case PIN_GADID:
		Config.GenPin = !Config.GenPin;
		break;
	     case AUTOSAVE_GADID:
		Config.AutoSave = !Config.AutoSave;
		break;
	     case AUTOGAL_GADID:
		Config.AutoGAL = !Config.AutoGAL;
		break;
	    }
	  }
        }
      }
   }
 else
   return(0);
}




/* FileSize:
   gibt die Länge einer Datei zurück
   Aufruf: size=FileSize(filename);
           filename: Zeiger auf Filenamen
   Ergebnis: -1 : File existiert nicht
	     -2 : kein Speicher für FileInfoBlock
	    size: Filelänge
*/
long FileSize(filename)
UBYTE	*filename;
{
struct	FileInfoBlock	*fib;
struct	FileLock	*lock;
LONG	filesize;

 if((lock=(struct FileLock *) Lock(filename,ACCESS_READ))) {
   fib=(struct FileInfoBlock *)AllocMem((long)sizeof(struct FileInfoBlock),MEMF_CHIP);
   if (fib!=NULL) {
     if (Examine(lock,fib))
       filesize=fib->fib_Size;
     else filesize=-1L;
     UnLock(lock);
     FreeMem(fib,(long)sizeof(struct FileInfoBlock));
     return(filesize);
    }
   else
     return(-2L);				/*Mem-Error*/
  }
 else
   return(-1L);					/*File existiert nicht*/
}


/* ReadFile
   File einlesen
   Aufruf: error=ReadFile(filename,filesize,filebuff)
           filename: Zeiger auf Filenamen
	   filesize: Größe der Datei in Bytes
	   filebuff: Adresse, an die die Datei gelesen werden soll
   Ergebnis: error: 1=kein Fehler, 0=Fehler
*/
int ReadFile(filename,filesize,filebuff)
UBYTE	*filename,*filebuff;
LONG	filesize;
{
long 	actlength;
struct	FileHandle	*fh;

 if ((fh=Open(filename,MODE_OLDFILE))) {
   actlength=Read(fh,filebuff,filesize);
   Close(fh);
   if (actlength==-1L) return(0);
   else return(1);
  }
 else
  return(0);
}




/*ErrorReq
  gibt zu einer Fehlernummer den entsprechenden Requester aus
  Aufruf: ErrorReq(errornum);
	  errornum: Fehlernummer
*/
void ErrorReq(errornum)
int errornum;
{
 switch (errornum) {
   case  1:  MyRequest(ERR_REQ,(UBYTE*)"Kann Datei leider nicht finden!");
	     break;
   case  2:  MyRequest(ERR_REQ,(UBYTE*)"Nicht genug freier Speicher vorhanden!");
	     break;
   case  3:  MyRequest(ERR_REQ,(UBYTE*)"Kann Datei leider nicht laden!");
	     break;
   case  4:  MyRequest(ERR_REQ,(UBYTE*)"Datei ist leer!");
	     break;
   case  5:  MyRequest(ERR_REQ,(UBYTE*)"Fehler in JEDEC-Datei!");
	     break;
   case  6:  MyRequest(ERR_REQ,(UBYTE*)"GAL ist NICHT leer!");
	     break;
   case  7:  MyRequest(ERR_REQ,(UBYTE*)"Keine gültigen Pinnamen vorhanden.");
	     break;
   case  8:  MyRequest(ERR_REQ,(UBYTE*)"Datei läßt sich nicht schließen!");
	     break;
   case  9:  MyRequest(ERR_REQ,(UBYTE*)"Falsches GAL eingestellt!");
	     break;
   case 10:  MyRequest(ERR_REQ,(UBYTE*)"Kann 's:GALer.config' nicht laden!");
	     break;
   case 11:  MyRequest(ERR_REQ,(UBYTE*)"Kann 's:GALer.config' nicht schreiben!");
	     break;
   case 12:  MyRequest(ERR_REQ,(UBYTE*)"Kann Fenster nicht öffnen!");
	     break;
   case 13:  MyRequest(ERR_REQ,(UBYTE*)"Kann Datei nicht schreiben!");
	     break;
  }
}




/* PrintText
   gibt Text im Text-Feld aus
   Aufruf: PrintText(text);
	   text   : Zeiger auf Text
	   newline: 1: ypos auf nächste Zeile
		    0: ypos nicht auf nächste Zeile
		       Aufruf mit newline = 0 eigentlich nur sinnvoll wenn
		       zuvor schon mal mit newline = 1 aufgerufen wurde
		       Anwendungsbeispiel:
			 PrintText("führe Verify durch...",1);
			 Nach erfolgreichem Verify: PrintText(" O.K.",0);
			 =>  "führe Verify durch... O.K."
*/
void PrintText(text, newline)
UBYTE	*text;
int	newline;
{
static	long  delta_x;

 if (newline)
   if (ytxt<190)
     ytxt+=10;
   else
     ScrollRaster(rp,0L,10L,31L,162L,609L,194L);

 if (newline)
   Move(rp,40L,(long)ytxt);
 else
   Move(rp,40L+delta_x,(long)ytxt);

 Text(rp,text,(long)strlen(text));
 delta_x = (long)strlen(text)*8L;
}



/*gibt "Fehler in Zeile xyz" aus
  Aufruf: PrintErrorLine(line);
	  line: Zeilennummer
*/
void PrintErrorLine(line)
int line;
{
 sprintf(&ErrorLineStr[16],"%4d:",line);
 PrintText(&ErrorLineStr[0],1);
}






/* Voreinstellungen laden ("s:GALer.config") und Menüs, Gadgets, usw.
   entsprechend einstellen
*/
void LoadConfig()
{
long 	filelength;
struct	FileHandle	*fh;

 if ((fh = Open((UBYTE *)"s:GALer.config",MODE_OLDFILE))) {
   filelength = Read(fh,&DummyConfig,(long)sizeof(struct Configuration));
   Close(fh);
   if (filelength == -1L)
     ErrorReq(10); 
   else					/* kein Fehler beim Lesen?*/
     Config = DummyConfig;		/* dann Config übernehmen*/
  }

  GALType = Config.GALType;				/*GAL-Typ einstellen*/

  if (GALType == GAL16V8) {
    GALType = GAL16V8;
    MaxFuseAdr = MAX_FUSE_ADR16;
    SigAdr     = SIG_ADR16;
    SetGAL  (GAL16V8);
    DrawGAL (GAL16V8);
    strncpy (&title[59], (char *)"GAL16V8", 7);
    MenuItem13.Flags |= CHECKED;		/*GAL16V8-Menü*/
   } 
  else {
    GALType = GAL20V8;
    MaxFuseAdr = MAX_FUSE_ADR20;
    SigAdr     = SIG_ADR20;
    SetGAL  (GAL20V8);
    DrawGAL (GAL20V8);
    strncpy (&title[59], (char *)"GAL20V8", 7);
    MenuItem13b.Flags |= CHECKED;		     /*GAL20V8-Menü*/
   }

  if (Config.AType)
    title[67] = 'A';
  else
    title[67] = ' ';
  SetWindowTitles(window,-1L,(UBYTE*)title);

  if (Config.AType)
    MenuItem14b.Flags |= CHECKED;		     /*A-Typ-Menü*/

  if (Config.AutoAType) {				/*Auto-A-Typ*/
    MenuItem14b.Flags = MenuItem14b.Flags & ~ITEMENABLED; /*A-Typ-Menü*/
    MenuItem14a.Flags |= CHECKED;		      /*Auto A-Typ-Menü*/
   }

  if (Config.GALTypeReq)
    MenuItem14.Flags |= CHECKED; 	    /*Typ-Requester-Menü*/

  if (Config.GenJedec)
    SGadget1.Flags  |= SELECTED;
  if (Config.GenFuse)
    SGadget2.Flags  |= SELECTED;
  if (Config.GenChip)
    SGadget3.Flags  |= SELECTED;
  if (Config.GenPin)
    SGadget4.Flags  |= SELECTED;
  if (Config.AutoSave)
    SGadget5.Flags  |= SELECTED;
  if (Config.AutoGAL)
    SGadget9.Flags  |= SELECTED;
  if (Config.JedecSecBit)
    SGadget51.Flags |= SELECTED;
  if (Config.JedecFuseChk)
    SGadget52.Flags |= SELECTED;
  if (Config.JedecFileChk)
    SGadget53.Flags |= SELECTED;

  if (Config.ProgEmptyTest)
    SGadget42.Flags |=  SELECTED;
  if (Config.ProgVerify)
    SGadget43.Flags |= SELECTED;
  if (Config.CopyEmptyTest)
    SGadget44.Flags |= SELECTED;
  if (Config.CopyVerify)
    SGadget45.Flags |= SELECTED;
  if (Config.EraseEmptyTest)
    SGadget46.Flags |= SELECTED;

}


/* Voreinstellungen sichern -  File "s:GALer.config"*/
void SaveConfig()
{
long 	filelength;
struct	FileHandle	*fh;

 Config.GALType = GALType;
 if ((fh = Open((UBYTE *)"s:GALer.config",MODE_NEWFILE))) {
   filelength = Write(fh,&Config,(long)sizeof(struct Configuration));
   Close(fh);
   if (filelength == -1L)
     ErrorReq(11);
  }
 else
  ErrorReq(11);

}



/* SetGALType: alle Variablen usw. auf den gewünschten GAL-Typ einstellen
   Aufruf:     SetGALType(galtype, atype);
   Parameter:  galtype = GAL16V8 oder GAL20V8
	       atype   = YES : GAL vom Typ A
			 NO  : "normales" GAL
*/
void SetGALType(galtype, atype)
int	galtype, atype;
{

 if ((galtype == GAL16V8) && (GALType != GAL16V8)) {
   GALType = GAL16V8;
   MaxFuseAdr = MAX_FUSE_ADR16;
   SigAdr     = SIG_ADR16;
   SetGAL  (GAL16V8);
   DrawGAL (GAL16V8);
   strncpy (&title[59], (char *)"GAL16V8", 7);
   MenuItem13.Flags  |= CHECKED;		/*GAL16V8-Menü*/
   MenuItem13b.Flags &= (~CHECKED);		/*GAL20V8-Menü*/
  }
 if ((galtype == GAL20V8) && (GALType != GAL20V8)) {
   GALType = GAL20V8;
   MaxFuseAdr = MAX_FUSE_ADR20;
   SigAdr     = SIG_ADR20;
   SetGAL  (GAL20V8);
   DrawGAL (GAL20V8);
   strncpy (&title[59], (char *)"GAL20V8", 7);
   MenuItem13.Flags  &= (~CHECKED);		/*GAL20V8-Menü*/
   MenuItem13b.Flags |= CHECKED;		/*GAL20V8-Menü*/
  }

 if (!Config.AutoAType) {		/*A-Typ nur ändern, wenn keine*/
   Config.AType = atype;		/*autom. A-Typ-Einstellung*/
   if (Config.AType) {
     title[67] = 'A';
     MenuItem14b.Flags |= CHECKED;		/*A-Typ-Menü*/
    }
   else {
     title[67] = ' ';
     MenuItem14b.Flags &= (~CHECKED);		/*A-Typ-Menü*/
    }
  }

 SetWindowTitles(window,-1L,(UBYTE*)title);
}






/* Die Routienen  "AddByte", "AddString", "IncPointer", "DecPointer" und
   "FreeBuffer" erleichtern die Erstellung und Bearbeitung von verketteten
   Speicherlisten.
*/


/*AddByte:   Schreibt das Byte "code" in den Puffer. Wenn das Ende des
	     Puffers erreicht ist, wird ein neuer erstellt
	     (Struktur Buffer).
  Aufruf   : result = AddByte(buff,code);
  Einsprung: code: Byte das in den Puffer an die Position "buff"
	     geschrieben werden soll, "buff" wird anschließend um eins erhöht
	     buff: Zeiger auf ActBuffer-Struktur
  Ergebnis:  Returnwert = 0: alles o.k.    sonst: Fehler (kein Speicher)
	     buff enthält neuen Entry-Zeiger und den entsprechenden Puffer-
	     Anfang und das Ende
*/
int AddByte(buff,code)
struct	ActBuffer	*buff;
UBYTE	code;
{
struct	Buffer	*mybuff;

 if ((buff->Entry) < (buff->BuffEnd)) {		/*noch im Puffer?*/
   *buff->Entry++ = code;			/*ja, dann Byte eintragen*/
  }
 else {					/*nein, dann neuen Puffer erstellen*/
   if (!(mybuff = (struct Buffer *)AllocMem((long)sizeof(struct Buffer),MEMF_PUBLIC|MEMF_CLEAR))) {
     ErrorReq(2);			/*kein Speicher mehr->Fehlermeldung*/
     return(-1);
    }
   buff->ThisBuff->Next   = mybuff;	/*neuer Puffer ist aktueller*/
   mybuff->Prev   = buff->ThisBuff;	/*vorheriger Puffer ist alter*/
   buff->ThisBuff = mybuff;		/*aktueller Puffer ist neuer*/
   buff->Entry    = (UBYTE *)(&mybuff->Entries[0]);
   buff->BuffEnd  = (UBYTE *)mybuff + (long)sizeof(struct Buffer);
   *buff->Entry++ = code;
  }
 return(0);
}



/*AddString: Schreibt den String "strnptr" in den Puffer. Wenn das Ende des
	     Puffers erreicht ist, wird ein neuer erstellt.
	     (Struktur Buffer).
  Aufruf   : result = AddString(buff,strnptr);
  Einsprung: strnptr: Zeiger auf String der in den Puffer an die Position
	     "buff" geschrieben werden soll, "buff" zeigt zum Schluß auf
	     das lezte Zeichen im String + 1.
	     buff: Zeiger auf ActBuffer-Struktur
  Ergebnis:  Returnwert = 0: alles o.k.    sonst: Fehler (kein Speicher)
	     buff enthält neuen Entry-Zeiger und den entsprechenden Puffer-
	     Anfang und das Ende
*/
int AddString(buff, strnptr)
struct	ActBuffer *buff;
UBYTE	*strnptr;
{
  while (*strnptr) {
    if (AddByte(buff,*strnptr++))
      return(-1);
   }
}


/*IncPointer:   Zeiger  auf nächsten Eintrag im verketten Puffer

   Aufruf:     IncPointer(buff);
   Parameter:	buff  	      : Zeiger auf ActBuffer-Struktur
   Ergebnis :	buff->Entry   : zeigt auf nächstes Zeichen im Puffer
		buff->BuffEnd : zeigt auf das Ende des Puffers, in den
			        Entry zeigt
		buff->ThisBuff: zeigt auf Puffer-Anfang
ACHTUNG: es erfolgt keine Abfrage, ob das Ende des gesamten Puffers
	 schon erreicht ist
*/
void IncPointer(buff)
struct	ActBuffer	*buff;
{

 buff->Entry++;
 if (buff->Entry == buff->BuffEnd) {	/*Pufferende erreicht?*/
   buff->ThisBuff = buff->ThisBuff->Next; /*ja, dann auf nächsten Puffer*/
   buff->Entry    = (UBYTE *)(&buff->ThisBuff->Entries[0]);
   buff->BuffEnd  = (UBYTE *)buff->ThisBuff + (long)sizeof(struct Buffer);
  }

}


/*DecPointer:   Zeiger  auf vorigen Eintrag im verketten Puffer

   Aufruf:      IncPointer(buff);
   Parameter:	buff  	      : Zeiger auf ActBuffer-Struktur
   Ergebnis :	buff->Entry   : zeigt auf voriges Zeichen im Puffer
		buff->BuffEnd : zeigt auf das Ende des Puffers, in den
			        Entry zeigt
		buff->ThisBuff : zeigt auf Puffer-Anfang
ACHTUNG: es erfolgt keine Abfrage, ob der Anfang des gesamten Puffers
	 schon erreicht ist
*/
void DecPointer(buff)
struct	ActBuffer  *buff;
{

 buff->Entry--;
 if (buff->Entry < &buff->ThisBuff->Entries[0]) { /*Pufferanfang erreicht?*/
   buff->ThisBuff = buff->ThisBuff->Prev;	/*dann auf vorigen Puffer*/
   buff->BuffEnd  = (UBYTE *)buff->ThisBuff + (long)sizeof(struct Buffer);
   buff->Entry    = (UBYTE *)((buff->BuffEnd)-1L);
  }

}


/*FreeBuffer:   gibt die verketteten Puffer wieder frei
 Aufruf:      FreeBuffer(buff);
 Einsprung:   buff: Zeiger auf ersten Speicherblock
 Ergebnis :   ---
*/
void FreeBuffer(buff)
struct	Buffer	*buff;
{
struct	Buffer	*nextbuff;

 do {
   nextbuff = buff->Next;
   FreeMem(buff,(long)sizeof(struct Buffer)); }
 while (buff = nextbuff);
}




