/****************************************************************/
/*								*/
/* GAL-Software							*/
/*								*/
/* Soft- and Hardware is copyright (c) 1991			*/
/*	 by Christian Habermann					*/
/*	    Asamstr. 17						*/
/*	    W-8050 Freising (Germany)				*/
/*								*/
/* Dies ist Version 1.4 der GALer-Software.			*/
/*								*/
/* History:							*/
/*	V1.0:   Testversion					*/
/*	V1.1:   Intuition-Umgebung hinzugefügt			*/
/*	V1.2:   einige Fehler beseitigt				*/
/*	V1.3:   Fehler im GAL-Assembler beseitigt		*/
/*	V1.4:	Fehler beseitigt				*/
/*								*/
/* Compiler:    Aztec 3.6a					*/
/*								*/
/* compilieren: cc GALer.c					*/
/*		cc sub.c					*/
/*		cc jedec.c					*/
/*		cc pruefer.c					*/
/*		cc GAL.c					*/
/*		cc GALasm.c					*/
/*		cc Reasm.c					*/
/*		cc Optimizer.c					*/
/*		as -n -c -d port.asm				*/
/*		as -n -c -d reqglue.asm				*/
/* linken     : ln GALer.o Sub.o Port.o Jedec.o Pruefer.o GAL.o */
/*		   GAL2.o GALasm.o Reasm.o Optimizer.o		*/
/*		   reqglue.o -lc				*/
/*								*/
/* Source-Code von GAL2.c fehlt					*/
/****************************************************************/

#include <devices/parallel.h>
#include <exec/io.h>
#include <exec/memory.h>
#include <exec/ports.h>
#include <exec/types.h>
#include <graphics/gfxbase.h>
#include <graphics/text.h>
#include <intuition/intuition.h>
#include <libraries/dosextens.h>
#include <functions.h>

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



#define		Menu_1		0
#define		Menu_2		1
#define		Menu_3		2
#define		Menu_4		3
#define		Menu_5		4
#define		Menu_6		5

#define		Item_1		0
#define		Item_2		1
#define		Item_3		2
#define		Item_4		3
#define		Item_5		4
#define		Item_6		5
#define		Item_7		6
#define		Item_8		7
#define		Item_9		8



extern	struct	ReqFileRequester	MyFileReqStruct;


struct	IORequest	*CreateExtIO();
struct	IntuitionBase	*IntuitionBase;
struct	ReqLib		*ReqBase;
struct	GfxBase		*GfxBase;
struct	IntuiMessage	*message;
struct	Screen		*screen;
struct	Window		*window,*old_ReqWin;
struct	MsgPort		*timeport, *parport;
struct	timerequest	*timereq;
struct	IOExtPar	*parreq;
struct	TextFont	*txtfont;
struct	TextAttr	txtattr;



UWORD	MyColors[4]={0xAAA,0x000,0xFFF,0x688};

SHORT	vector3a[] = { 0,255,639,255,639,205 };
SHORT	vector3b[] = { 0,255,0,205,639,205 };

SHORT	vector2a[] = { 30,195,610,195,610,160 };
SHORT	vector2b[] = { 30,195,30,160,610,160 };

SHORT	vector1a[] = { 0,199,639,199,639,11 };
SHORT	vector1b[] = { 0,199,0,11,639,11 };


struct Border	border3b = { 0,0,2,3,JAM1,3,(SHORT *)vector3b,NULL };
struct Border	border3a = { 0,0,1,3,JAM1,3,(SHORT *)vector3a,&border3b };
struct Border	border2b = { 0,0,2,3,JAM1,3,(SHORT *)vector2b,&border3a };
struct Border	border2a = { 0,0,1,3,JAM1,3,(SHORT *)vector2a,&border2b };
struct Border	border1b = { 0,0,2,3,JAM1,3,(SHORT *)vector1b,&border2a };
struct Border	border1a = { 0,0,1,3,JAM1,3,(SHORT *)vector1a,&border1b };


UBYTE  title[] = "GALer V1.4  (c) 1993 by Christian Habermann                GAL16V8  ";


struct IntuiText MIText1a = {0,1,JAM1,0,1,NULL,
			     (UBYTE *)"Pinnamen zeigen",NULL};

struct IntuiText MIText1b = {0,1,JAM1,0,1,NULL,
			     (UBYTE *)"Pinnamen löschen",NULL};

struct IntuiText MIText1d = {0,1,JAM1,0,1,NULL,
			     (UBYTE *)"Optimizer",NULL};

struct IntuiText MIText1c = {0,1,JAM1,0,1,NULL,
			    (UBYTE *)"Prüfmuster",NULL};


struct IntuiText MIText3c = {0,1,JAM1,0,1,NULL,
		   	     (UBYTE *)"Reassembler",NULL};

struct IntuiText MIText3b = {0,1,JAM1,0,1,NULL,
		   	     (UBYTE *)"JEDEC-Datei Parameter",NULL};

struct IntuiText MIText3  = {0,1,JAM1,0,1,NULL,
		   	     (UBYTE *)"JEDEC-Datei erstellen",NULL};

struct IntuiText MIText3a = {0,1,JAM1,0,1,NULL,
		   	     (UBYTE *)"GAL-Info",NULL};

struct IntuiText MIText4b = {0,1,JAM1,0,1,NULL,
			     (UBYTE *)"ACW lesen",NULL};

struct IntuiText MIText4  = {0,1,JAM1,0,1,NULL,
			     (UBYTE *)"Signatur lesen",NULL};

struct IntuiText MIText5  = {0,1,JAM1,0,1,NULL,
			     (UBYTE *)"Datei assemblieren",NULL};

struct IntuiText MIText8  = {0,1,JAM1,0,1,NULL,
			     (UBYTE *)"setze Security-Bit",NULL};

struct IntuiText MIText8b = {0,1,JAM1,0,1,NULL,
			     (UBYTE *)"Schreibverhalten",NULL};

struct IntuiText MIText8a = {0,1,JAM1,0,1,NULL,
			     (UBYTE *)"teste Security-Bit",NULL};

struct IntuiText MIText9  = {0,1,JAM1,0,1,NULL,
			     (UBYTE *)"Leertest",NULL};

struct IntuiText MIText9a = {0,1,JAM1,0,1,NULL,
			     (UBYTE *)"vergleichen",NULL};

struct IntuiText MIText10 = {0,1,JAM1,0,1,NULL,
			     (UBYTE *)"kopieren",NULL};

struct IntuiText MIText11 = {0,1,JAM1,0,1,NULL,
			     (UBYTE *)"programmieren",NULL};

struct IntuiText MIText12 = {0,1,JAM1,0,1,NULL,
			     (UBYTE *)"löschen",NULL};

struct IntuiText MIText21 = {0,1,JAM1,20,1,NULL,
			     (UBYTE *)"A-Typ",NULL};

struct IntuiText MIText20a= {0,1,JAM1,20,1,NULL,
			     (UBYTE *)"Auto-A-Typ",NULL};

struct IntuiText MIText20 = {0,1,JAM1,20,1,NULL,
			     (UBYTE *)"Typ-Requester",NULL};

struct IntuiText MIText13 = {0,1,JAM1,20,1,NULL,
			     (UBYTE *)"GAL20V8",NULL};

struct IntuiText MIText14 = {0,1,JAM1,20,1,NULL,
			     (UBYTE *)"GAL16V8",NULL};

struct IntuiText MIText17 = {0,1,JAM1,0,1,NULL,
		  	     (UBYTE *)"Quit",NULL};

struct IntuiText MIText16 = {0,1,JAM1,0,1,NULL,
		  	     (UBYTE *)"Konfig. sichern",NULL};

struct IntuiText MIText15 = {0,1,JAM1,0,1,NULL,
		  	     (UBYTE *)"Über GALer",NULL};

struct IntuiText MITextP  = {0,1,JAM1,0,1,NULL,
		  	     (UBYTE *)"Prüfer verlassen",NULL};



struct MenuItem MenuItem1d= {NULL,0,35,180,10,
			     ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			     0,(APTR)&MIText1d,NULL,'o',NULL,MENUNULL};

struct MenuItem MenuItem1c= {&MenuItem1d,0,20,180,10,
			     ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			     0,(APTR)&MIText1c,NULL,'m',NULL,MENUNULL};

struct MenuItem MenuItem1b= {&MenuItem1c,0,10,180,10,
			     ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			     0,(APTR)&MIText1b,NULL,'c',NULL,MENUNULL};

struct MenuItem MenuItem1a= {&MenuItem1b,0,0,180,10,
			     ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			     0,(APTR)&MIText1a,NULL,'n',NULL,MENUNULL};

struct MenuItem MenuItem3c= {NULL,0,60,224,10,
			     ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			     0,(APTR)&MIText3c,NULL,'i',NULL,MENUNULL};

struct MenuItem MenuItem3b= {&MenuItem3c,0,45,224,10,
			     ITEMTEXT+ITEMENABLED+HIGHCOMP,
			     0,(APTR)&MIText3b,NULL,0,NULL,MENUNULL};

struct MenuItem MenuItem3 = {&MenuItem3b,0,35,224,10,
			     ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			     0,(APTR)&MIText3,NULL,'j',NULL,MENUNULL};

struct MenuItem MenuItem3a= {&MenuItem3,0,20,224,10,
			     ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			     0,(APTR)&MIText3a,NULL,'e',NULL,MENUNULL};

struct MenuItem MenuItem2b= {&MenuItem3a,0,10,224,10,
			     ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			     0,(APTR)&MIText4b,NULL,'w',NULL,MENUNULL};

struct MenuItem MenuItem2 = {&MenuItem2b,0,0,224,10,
			     ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			     0,(APTR)&MIText4,NULL,'r',NULL,MENUNULL};

struct MenuItem MenuItem7 = {NULL,0,0,200,10,
			     ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			     0,(APTR)&MIText5,NULL,'a',NULL,MENUNULL};


struct MenuItem MenuItem12b= {NULL,0,75,182,10,
			      ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			      0,(APTR)&MIText8b,NULL,'d',NULL,MENUNULL};

struct MenuItem MenuItem12a= {&MenuItem12b,0,60,182,10,
			      ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			      0,(APTR)&MIText8a,NULL,'v',NULL,MENUNULL};

struct MenuItem MenuItem12 = {&MenuItem12a,0,50,182,10,
			      ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			      0,(APTR)&MIText8,NULL,'s',NULL,MENUNULL};

struct MenuItem MenuItem11 = {&MenuItem12,0,40,182,10,
			      ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			      0,(APTR)&MIText9,NULL,'t',NULL,MENUNULL};

struct MenuItem MenuItem9c = {&MenuItem11,0,30,182,10,
			      ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			      0,(APTR)&MIText9a,NULL,'b',NULL,MENUNULL};

struct MenuItem MenuItem8  = {&MenuItem9c,0,20,182,10,
			      ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			      0,(APTR)&MIText12,NULL,'l',NULL,MENUNULL};

struct MenuItem MenuItem10 = {&MenuItem8,0,10,182,10,
			      ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			      0,(APTR)&MIText10,NULL,'k',NULL,MENUNULL};

struct MenuItem MenuItem9  = {&MenuItem10,0,0,182,10,
			      ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			      0,(APTR)&MIText11,NULL,'p',NULL,MENUNULL};

struct MenuItem MenuItem14 = {NULL,0,45,130,10,
			      MENUTOGGLE+CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
			      0,(APTR)&MIText20,NULL,0,NULL,MENUNULL};

struct MenuItem MenuItem14a= {&MenuItem14,0,35,130,10,
			      MENUTOGGLE+CHECKIT+ITEMTEXT+ITEMENABLED+HIGHCOMP,
			      0,(APTR)&MIText20a,NULL,0,NULL,MENUNULL};

struct MenuItem MenuItem14b= {&MenuItem14a,0,20,130,10,
			      MENUTOGGLE+CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			      0,(APTR)&MIText21,NULL,'3',NULL,MENUNULL};

struct MenuItem MenuItem13b= {&MenuItem14b,0,10,130,10,
			      CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			      0xFFE1,(APTR)&MIText13,NULL,'2',NULL,MENUNULL};

struct MenuItem MenuItem13 = {&MenuItem13b,0,0,130,10,
			      CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			      0xFFE2,(APTR)&MIText14,NULL,'1',NULL,MENUNULL};

struct MenuItem MenuItem17 = {NULL,0,25,172,10,
			      ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			      0,(APTR)&MIText17,NULL,'q',NULL,MENUNULL};

struct MenuItem MenuItem16 = {&MenuItem17,0,10,172,10,
			      ITEMTEXT+ITEMENABLED+HIGHCOMP,
			      0,(APTR)&MIText16,NULL,0,NULL,MENUNULL};

struct MenuItem MenuItem15 = {&MenuItem16,0,0,172,10,
			      ITEMTEXT+ITEMENABLED+HIGHCOMP,
			      0,(APTR)&MIText15,NULL,0,NULL,MENUNULL};






struct Menu Menu6 = {NULL,438,0,87,0,MENUENABLED,
		     "Tools",&MenuItem1a};

struct Menu Menu5 = {&Menu6,296,0,135,0,MENUENABLED,
		     "GAL-Disassembler",&MenuItem2};

struct Menu Menu4 = {&Menu5,178,0,111,0,MENUENABLED,
		     "GAL-Assembler",&MenuItem7};

struct Menu Menu3 = {&Menu4,140,0,31,0,MENUENABLED,
		     "GAL",&MenuItem9};

struct Menu Menu2 = {&Menu3,70,0,63,0,MENUENABLED,
		     "GAL-Typ",&MenuItem13};

struct Menu Menu1 = {&Menu2,0,0,63,0,MENUENABLED,
		     "Projekt",&MenuItem15};



struct MenuItem MenuItemP = {NULL,0,0,175,10,
			      ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			      0,(APTR)&MITextP,NULL,'x',NULL,MENUNULL};

struct Menu MenuP = {NULL,0,0,87,0,MENUENABLED,
		     "GAL-Prüfer",&MenuItemP};








SHORT  BorderVectors1[]  = {0,0,17,0,17,9,0,9,0,0};
struct Border    Border1 = {-1,-1,2,3,JAM1,5,BorderVectors1,NULL};
struct Border    Border2 = {-1,-1,3,3,JAM1,5,BorderVectors1,NULL};


struct IntuiText IText35 = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText34 = {2,0,JAM2,4,0,NULL,(UBYTE *)"A",NULL};
struct IntuiText IText33 = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText32 = {2,0,JAM2,4,0,NULL,(UBYTE *)"A",NULL};
struct IntuiText IText31 = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText30 = {2,0,JAM2,4,0,NULL,(UBYTE *)"A",NULL};
struct IntuiText IText29 = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText28 = {2,0,JAM2,4,0,NULL,(UBYTE *)"A",NULL};
struct IntuiText IText27 = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText26 = {2,0,JAM2,4,0,NULL,(UBYTE *)"A",NULL};
struct IntuiText IText25 = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText24 = {2,0,JAM2,4,0,NULL,(UBYTE *)"A",NULL};
struct IntuiText IText23 = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText22 = {2,0,JAM2,4,0,NULL,(UBYTE *)"A",NULL};
struct IntuiText IText21 = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText20 = {2,0,JAM2,4,0,NULL,(UBYTE *)"A",NULL};

struct IntuiText IText13 = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText12 = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText11 = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText10 = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText9  = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText8  = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText7  = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText6  = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText5  = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText4  = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};

struct IntuiText IText1c = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText3  = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText2  = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};
struct IntuiText IText1  = {2,0,JAM2,4,0,NULL,(UBYTE *)"L",NULL};


struct Gadget    Gadget35= {NULL,382,120,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border2,NULL,&IText35,NULL,NULL,15,NULL};
struct Gadget    Gadget34= {&Gadget35,340,120,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText34,NULL,NULL,30,NULL};
struct Gadget    Gadget33= {&Gadget34,382,110,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border2,NULL,&IText33,NULL,NULL,16,NULL};
struct Gadget    Gadget32= {&Gadget33,340,110,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText32,NULL,NULL,31,NULL};
struct Gadget    Gadget31= {&Gadget32,382,100,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border2,NULL,&IText31,NULL,NULL,17,NULL};
struct Gadget    Gadget30= {&Gadget31,340,100,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText30,NULL,NULL,32,NULL};
struct Gadget    Gadget29= {&Gadget30,382,90,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border2,NULL,&IText29,NULL,NULL,18,NULL};
struct Gadget    Gadget28= {&Gadget29,340,90,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText28,NULL,NULL,33,NULL};
struct Gadget    Gadget27= {&Gadget28,382,80,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border2,NULL,&IText27,NULL,NULL,19,NULL};
struct Gadget    Gadget26= {&Gadget27,340,80,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText26,NULL,NULL,34,NULL};
struct Gadget    Gadget25= {&Gadget26,382,70,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border2,NULL,&IText25,NULL,NULL,20,NULL};
struct Gadget    Gadget24= {&Gadget25,340,70,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText24,NULL,NULL,35,NULL};
struct Gadget    Gadget23= {&Gadget24,382,60,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border2,NULL,&IText23,NULL,NULL,21,NULL};
struct Gadget    Gadget22= {&Gadget23,340,60,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText22,NULL,NULL,36,NULL};
struct Gadget    Gadget21= {&Gadget22,382,50,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border2,NULL,&IText21,NULL,NULL,22,NULL};
struct Gadget    Gadget20= {&Gadget21,340,50,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText20,NULL,NULL,37,NULL};

struct Gadget    Gadget13= {&Gadget20,382,130,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText13,NULL,NULL,10,NULL};
struct Gadget    Gadget12= {&Gadget13,242,120,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText12,NULL,NULL,9,NULL};
struct Gadget    Gadget11= {&Gadget12,242,110,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText11,NULL,NULL,8,NULL};
struct Gadget    Gadget10= {&Gadget11,242,100,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText10,NULL,NULL,7,NULL};
struct Gadget    Gadget9 = {&Gadget10,242,90,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText9,NULL,NULL,6,NULL};
struct Gadget    Gadget8 = {&Gadget9,242,80,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText8,NULL,NULL,5,NULL};
struct Gadget    Gadget7 = {&Gadget8,242,70,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText7,NULL,NULL,4,NULL};
struct Gadget    Gadget6 = {&Gadget7,242,60,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText6,NULL,NULL,3,NULL};
struct Gadget    Gadget5 = {&Gadget6,242,50,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText5,NULL,NULL,2,NULL};
struct Gadget    Gadget4 = {&Gadget5,242,40,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText4,NULL,NULL,1,NULL};

struct Gadget    Gadget1c= {NULL,382,120,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText1c,NULL,NULL,14,NULL};
struct Gadget    Gadget3 = {&Gadget1c,242,30,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText3,NULL,NULL,13,NULL};
struct Gadget    Gadget2 = {&Gadget3,382,30,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText2,NULL,NULL,12,NULL};
struct Gadget    Gadget1 = {&Gadget2,242,20,16,8,NULL,
			    GADGIMMEDIATE+RELVERIFY,BOOLGADGET,
			    (APTR)&Border1,NULL,&IText1,NULL,NULL,11,NULL};



struct NewScreen MyScreen={ 0,0,640,256,2,2,3,HIRES,CUSTOMSCREEN,&txtattr,
			    (UBYTE *)title,
			    NULL,NULL} ;

struct NewWindow MyWindow={ 0,11,640,245,1,2,
			    GADGETUP|MENUPICK|VANILLAKEY,
			    ACTIVATE|BORDERLESS,
			    NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN };


struct	Process		*myproc;

struct	RastPort	*rp;
struct	ViewPort	*vp;

int	pruef_mode =	0;


extern 	int		GALType, MaxFuseAdr, SigAdr;

extern	struct	Configuration	Config;



main()
{
ULONG	class;
USHORT	code,	gadID;
struct	Gadget	*gad;


 OpenStuff();					/*Libs, Windows... öffnen*/

 rp = &(screen->RastPort);
 vp = &screen->ViewPort;

 LoadRGB4(vp,&MyColors,4L);
 DrawBorder(rp,&border1a,0L,0L);		/*Umrandungen,... zeichnen*/


 if (GetParPort()) {			/*Druckerport frei?*/
   puts("Parallel-Port ist belegt");
   CloseStuff();
   exit(0);
  }

 if (GetTimer()) {				/*Timer holen*/
   FreeParPort();
   puts("kann Timer nicht finden");
   CloseStuff;
   exit(0);    
  }


 InitGALer();					/*Ausgänge von IC3,4,5 auf*/
 EnableOutput();				/*LOW schalten*/

 LoadConfig();					/* Voreinstellung laden */


 for (;;)  {
   Wait(1L<<window->UserPort->mp_SigBit);
   if (message=(struct IntuiMessage *)GetMsg(window->UserPort)) {
     class = message->Class;
     code  = message->Code;
     if (class == GADGETUP) {
       gad   = (struct Gadget *)message->IAddress;
       gadID = gad->GadgetID; }
     ReplyMsg(message);

     switch(class) {
	case MENUPICK:	if (MENUNUM(code) != MENUNULL)
			  ExecuteMenu(MENUNUM(code),ITEMNUM(code));	  
			break;
	case GADGETUP:	if ((gadID < 100) && (pruef_mode == ON))
			  Pruefer(gad,gadID);
			break;
      }
    }
  }

}	 /*end of main*/






/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*				Subroutinen				*/
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


/*aufgerufenes Menü ausführen*/
void ExecuteMenu(menu,item)
int menu,item;
{
 if (pruef_mode==ON) {
   if ((menu == Menu_1) && (item == Item_1)) TogglePruefer();
  }
 else {
  switch (menu) {
     case Menu_1:					/*Projekt*/
       switch (item) {
	 case Item_1:
	   About();
	   break;
	 case Item_2:
	   SaveConfig();
	   break;
	 case Item_3:
	   CloseStuff();
	   FreeTimer();
	   FreeParPort();
	   exit(0);
	   break;
	}
       break;
     case Menu_2:					/*GAL-Typ*/
       switch (item) {
	 case Item_1:
	    SetGALType(GAL16V8,Config.AType);
	    break;
	 case Item_2:
	    SetGALType(GAL20V8,Config.AType);
	    break;
	 case Item_3:
	    SetGALType(GALType,!Config.AType);
	    break;
	 case Item_4:
	    Config.AutoAType = !Config.AutoAType;
	    if (Config.AutoAType)
	      MenuItem14b.Flags &= ~ITEMENABLED;	 /*A-Typ-Menü*/
	    else
	      MenuItem14b.Flags |= ITEMENABLED;		  /*A-Typ-Menü*/
	    break;
	 case Item_5:
	    Config.GALTypeReq = !Config.GALTypeReq;
	    break;
	}
       break;
     case Menu_3:					/*GAL*/
       switch (item) {
	 case Item_1:
	   ProgramGAL();				/*programmieren*/
	   break;
	 case Item_2:					/*kopieren*/
	   CopyGAL();
	   break;
	 case Item_3:					/*löschen*/
	   Loeschen();
	   break;
	 case Item_4:					/*vergleichen*/
	   Compare();
	   break;
	 case Item_5:					/*Leertest*/
	   Leertest();
	   break;
	 case Item_6:					/*setze Sec.*/
	   SetSecurity(YES);
	   break;
	 case Item_7:
	   TestSecurity();				/*teste Sec.*/
	   break;
	 case Item_8:
	   Schreibverhalten();
	   break;
        }
       break;
     case Menu_4:					/*GAL-Assembler*/
	 if (item == Item_1) {
	   AssembleInputFile(ASSEMBLER);	/*Eingabe-Datei assemblieren*/
	   break;
	  }
       break;
     case Menu_5:					/*GAL-Disassembler*/
       switch (item) {
	 case Item_1:
	   PrintSignature();
	   break;
	 case Item_2:
	   PrintACW();
	   break;
	 case Item_3:
	   GALInfo();
	   break;
	 case Item_4:
	   PutJedec();
	   break;
	 case Item_5:
	   JedecRequester();
	   break;
	 case Item_6:
	   Reassembler();
	   break;
	}
       break;
     case Menu_6:					/*Tools*/
       switch (item) {
	 case Item_1:
	   PrintPinNames();
	   break;
	 case Item_2:
	   ClearPinNames();
	   break;
	 case Item_3:
	   TogglePruefer();
	   break;
	 case Item_4:
	   Optimizer();
	   break;
	}
    }
  }   
}



/* PAL oder NTSC?
*/
void PAL_NTSC()
{
 if (GfxBase->DisplayFlags & NTSC) {	/*wenn NTSC, dann anpassen*/
   MyScreen.Height = 200;
   MyWindow.Height = 189;
   border2b.NextBorder = NULL;		/*unteren Kasten weglassen*/
  }
}




int GetParPort()				/*Druckerport belegen*/
{

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

 parreq = (struct IOExtPar *) CreateExtIO(parport,(long)sizeof(struct IOExtPar));
 if (parreq == NULL) {
   DeletePort(parport);
   return(-1);
  }

 if (OpenDevice((UBYTE *)"parallel.device",0L,parreq,0L)) {
   DeleteExtIO(parreq,(long)sizeof(struct IOExtPar));
   DeletePort(parport);
   return(-1);
  }

 InitParPort();				/*Datenrichtungsregister der CIAs*/
					/*initialisieren*/
 return(0);
}


void FreeParPort()			/*Druckerport wieder freigeben*/
{
 RestoreParPort();		/*Datenrichtungsregister der CIAs restau-*/
				/*rieren, nicht aber den Zustand der Aus-*/
				/*gänge, da sonst der angeschlossene Brenner*/
				/*einen ungewollten Befehl erhalten könnte*/
				/*(Vcc on, VEdit on,...).*/
 CloseDevice(parreq);		/* Port wieder freigeben */
 DeleteExtIO(parreq,(long)sizeof(struct IOExtPar));
 DeletePort(parport);
}


GetTimer()				/*Timer holen*/
{

 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,timereq,0L)) {
   FreeMem(&timereq,(long)sizeof(struct timerequest));
   DeletePort(timeport);
   return(-1);
  }

 return(0);
}


void FreeTimer()			/*Timer wieder freigeben*/
{
 CloseDevice(timereq);
 FreeMem(timereq,(long)sizeof(struct timerequest));
 DeletePort(timeport);
}


/*micro: microsec. to wait
  secs: seconds to wait
*/
void WaitForTimer(micro)
ULONG micro;
{
 timereq->tr_node.io_Command=TR_ADDREQUEST;
 timereq->tr_time.tv_secs=0;
 timereq->tr_time.tv_micro=micro;
 DoIO(timereq);
}




void OpenStuff()
{

 if ((IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0L))==NULL) {
   puts("kann intuition.library nicht öffnen");
   exit(0);
  }

 if((GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0L))==NULL) {
   puts("kann graphics.library nicht öffnen");
   CloseStuff();
   exit(0);
  }
 PAL_NTSC();					/*Fenstergröße usw. anpassen*/

 if ((ReqBase=(struct ReqLib *)OpenLibrary("req.library",0L))==NULL) {
   puts("kann req.library nicht finden");
   CloseStuff();
   exit(0);
  }


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

 if (!(txtfont = (struct TextFont *)OpenFont(&txtattr))) {
   puts("kann topaz.font 8 nicht finden");
   CloseStuff();
   exit(0);
  }


 if (!(screen=(struct Screen *)OpenScreen(&MyScreen))) {
   puts("kann meinen Screen nicht öffnen");
   CloseStuff();
   exit(0);
  }

 MyWindow.Screen=screen;
 if ((window=(struct Window *)OpenWindow(&MyWindow))==NULL) {
   puts("kann mein Window nicht öffnen");
   CloseStuff();
   exit(0);
  }
 SetMenuStrip(window,&Menu1);

 myproc     = (struct Process *)FindTask(0L);		/*Requester umleiten*/
 old_ReqWin = (struct Window *)myproc->pr_WindowPtr;
 myproc->pr_WindowPtr = (APTR)window;

}




void CloseStuff()
{

  if (ReqBase)
    PurgeFiles(&MyFileReqStruct);	  /*Speicher für File-Req. freigeben*/

  myproc->pr_WindowPtr=(APTR)old_ReqWin;  /*Req. auf ursprüngliches Window*/

  if (txtfont) CloseFont(txtfont);
  if (window) {
    ClearMenuStrip(window);
    CloseWindow(window);
   }
  if (screen) CloseScreen(screen);
  if (IntuitionBase) CloseLibrary (IntuitionBase);
  if (GfxBase) CloseLibrary (GfxBase);
  if (ReqBase) CloseLibrary (ReqBase);

}


