/****************************************************************/
/*								*/
/* GAL-Software							*/
/*								*/
/* Soft- and Hardware  copyright (c)1991			*/
/*	 by Christian Habermann					*/
/*	    Asamstr. 17						*/
/*	    W-8050 Freising (Germany)				*/
/*								*/
/* Dies ist Version 1.3 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		*/
/*								*/
/*								*/
/* Compiler:    Aztec 3.6a					*/
/*								*/
/* compilieren: cc GALer.c					*/
/*		cc sub.c					*/
/*		cc jedec.c					*/
/*		cc pruefer.c					*/
/*		cc GAL.c					*/
/*		cc GALasm.c					*/
/*		as -n -c -d port.asm				*/
/* linken     : ln GALer sub port jedec pruefer GAL GALasm -lc  */
/*								*/
/****************************************************************/

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

#include "GALer.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



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




UWORD	MyColors[4]={0x000,0x777,0x999,0x00A};


SHORT  vector2[10] = {30,160,610,160,610,195,30,195,30,160};
SHORT  vector1[10] = {0,11,639,11,639,255,0,255,0,11};

struct Border	border2 = {0,0,2,3,JAM1,5,(SHORT *)vector2,NULL};
struct Border	border1 = {0,0,2,3,JAM1,5,(SHORT *)vector1,&border2};



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

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

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

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

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

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

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

struct IntuiText MIText6b={0,1,JAM1,20,0,NULL,
			   (UBYTE *)"Pin-Belegung",NULL};

struct IntuiText MIText6a={0,1,JAM1,20,0,NULL,
			   (UBYTE *)"Chip-Diagramm",NULL};

struct IntuiText MIText6= {0,1,JAM1,20,0,NULL,
			   (UBYTE *)"Fuse-Matrix",NULL};

struct IntuiText MIText7= {0,1,JAM1,20,0,NULL,
			   (UBYTE *)"Jedec-Datei",NULL};

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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

struct MenuItem MenuItem6b= {&MenuItem7,0,30,200,8,
			     CHECKIT+ITEMTEXT+MENUTOGGLE+ITEMENABLED+HIGHCOMP+CHECKED,
			     0,(APTR)&MIText6b,NULL,NULL,NULL,MENUNULL};

struct MenuItem MenuItem6a= {&MenuItem6b,0,20,200,8,
			     CHECKIT+ITEMTEXT+MENUTOGGLE+ITEMENABLED+HIGHCOMP+CHECKED,
			     0,(APTR)&MIText6a,NULL,NULL,NULL,MENUNULL};

struct MenuItem MenuItem6 = {&MenuItem6a,0,10,200,8,
			     CHECKIT+ITEMTEXT+MENUTOGGLE+ITEMENABLED+HIGHCOMP+CHECKED,
			     0,(APTR)&MIText6,NULL,NULL,NULL,MENUNULL};

struct MenuItem MenuItem5 = {&MenuItem6,0,0,200,8,
			     CHECKIT+ITEMTEXT+MENUTOGGLE+ITEMENABLED+HIGHCOMP+CHECKED,
			     0,(APTR)&MIText7,NULL,NULL,NULL,MENUNULL};

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

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

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

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

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

struct MenuItem MenuItem14 = {NULL,0,10,120,8,
			      CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			      0xFFFD,(APTR)&MIText13,NULL,'2',NULL,MENUNULL};

struct MenuItem MenuItem13 = {&MenuItem14,0,0,120,8,
			      CHECKIT+ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP+CHECKED,
			      0xFFFE,(APTR)&MIText14,NULL,'1',NULL,MENUNULL};

struct MenuItem MenuItem15 = {NULL,0,0,84,8,
			      ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP,
			      0,(APTR)&MIText15,NULL,'q',NULL,MENUNULL};



struct Menu Menu6 = {NULL,438,0,87,0,MENUENABLED,
		     "GAL-Prüfer",&MenuItem1a};

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

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

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

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

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

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


USHORT im_GAL20Dat[] = {
	0x0FF8,0x03E0,0x7F80,0x3F00,0xFC1F,0x87E3,0xF000,0x3FFE,
	0x07F0,0x7F80,0xFFC3,0xFF1F,0x87EF,0xFC00,0x7C1F,0x07F0,
	0x1E01,0xFFE7,0xCF8F,0x03DF,0xFE00,0xF80F,0x8FF8,0x1E01,
	0xE3E7,0x878F,0x03DF,0x3E00,0xF000,0x0F78,0x1E00,0x03E7,
	0x878F,0x03DF,0x3E00,0xF000,0x1E3C,0x1E00,0x03E7,0x878F,
	0x03DF,0x3E00,0xF000,0x1E3C,0x1E00,0x03E7,0x8F8F,0x87DF,
	0x3E00,0xF000,0x3C1E,0x1E00,0x03E7,0x9F8F,0x87DF,0xFE00,
	0xF03F,0xBC1E,0x1E00,0x03E7,0xBF87,0xCF8F,0xFC00,0xF03F,
	0xFC1F,0x1E00,0x07C7,0xF787,0xCF87,0xF800,0xF00F,0x7FFF,
	0x1E00,0x0F87,0xE783,0xFF0F,0xFC00,0xF00F,0x7FFF,0x1E00,
	0x1F07,0xC783,0xFF1F,0x3E00,0xF00F,0x780F,0x1E00,0x3E07,
	0x8781,0xFE1F,0x3E00,0xF80F,0x780F,0x1E00,0x7C07,0x8781,
	0xFE1F,0x3E00,0xFC1F,0x780F,0x1E00,0xF867,0x8780,0xFC1F,
	0x3E00,0x7E3E,0x780F,0x1E0F,0xF1E7,0xCF80,0xFC1F,0xFE00,
	0x3FFC,0xFC3F,0xFFFF,0xFFE3,0xFF00,0x780F,0xFC00,0x0FF0,
	0xFC3F,0xFFFF,0xFFE0,0xFC00,0x7803,0xF000
};


USHORT im_GAL16Dat[] = {
	0x0FF8,0x03E0,0x7F80,0x1F00,0x3E1F,0x87E3,0xF000,0x3FFE,
	0x07F0,0x7F80,0x3F00,0xFF1F,0x87EF,0xFC00,0x7C1F,0x07F0,
	0x1E01,0xFF01,0xF80F,0x03DF,0xFE00,0xF80F,0x8FF8,0x1E01,
	0xFF03,0xE00F,0x03DF,0x3E00,0xF000,0x0F78,0x1E00,0x1F07,
	0xC00F,0x03DF,0x3E00,0xF000,0x1E3C,0x1E00,0x1F07,0xC00F,
	0x03DF,0x3E00,0xF000,0x1E3C,0x1E00,0x1F07,0xC00F,0x87DF,
	0x3E00,0xF000,0x3C1E,0x1E00,0x1F07,0xC00F,0x87DF,0xFE00,
	0xF03F,0xBC1E,0x1E00,0x1F07,0xFC07,0xCF8F,0xFC00,0xF03F,
	0xFC1F,0x1E00,0x1F07,0xFF07,0xCF87,0xF800,0xF00F,0x7FFF,
	0x1E00,0x1F07,0xFF83,0xFF0F,0xFC00,0xF00F,0x7FFF,0x1E00,
	0x1F07,0xCF83,0xFF1F,0x3E00,0xF00F,0x780F,0x1E00,0x1F07,
	0xCF81,0xFE1F,0x3E00,0xF80F,0x780F,0x1E00,0x1F07,0xCF81,
	0xFE1F,0x3E00,0xFC1F,0x780F,0x1E00,0x1F07,0xCF80,0xFC1F,
	0x3E00,0x7E3E,0x780F,0x1E0F,0x1F07,0xFF80,0xFC1F,0xFE00,
	0x3FFC,0xFC3F,0xFFFF,0xFFE3,0xFF00,0x780F,0xFC00,0x0FF0,
	0xFC3F,0xFFFF,0xFFE0,0xFC00,0x7803,0xF000
};

struct Image im_GAL16 = { 0, 0, 103, 18, 1,
			  NULL, 0x0001, 0x0000, NULL };

struct Image im_GAL20 = { 0, 0, 103, 18, 1,
			  NULL, 0x0001, 0x0000, NULL };




struct NewScreen MyScreen={ 0,0,640,256,2,2,3,HIRES,CUSTOMSCREEN,NULL,
			    (UBYTE *)"GALer V1.3  (c)1991 by Christian Habermann",
			    NULL,NULL} ;

struct NewWindow MyWindow={ 0,11,640,245,1,2,
			    GADGETUP|MENUPICK|REQCLEAR,
			    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;
int	GenJedec = YES, GenFuse = YES, GenChip = YES, GenPin = YES;

USHORT	*im_ptr16, *im_ptr20;

extern 	int		GALType, MaxFuseAdr, SigAdr;



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


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


 CopyMem(&im_GAL16Dat[0], im_ptr16, (long)sizeof(im_GAL16Dat));
 CopyMem(&im_GAL20Dat[0], im_ptr20, (long)sizeof(im_GAL20Dat));

 im_GAL16.ImageData = im_ptr16;
 im_GAL20.ImageData = im_ptr20;

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

 LoadRGB4(vp,&MyColors,4L);
 DrawBorder(rp,&border1,0L,0L);			/*Umrandungen,... zeichnen*/
 SetAPen(rp,2L);
 Move(rp,0L,199L); Draw(rp,639L,199L);
 SetAPen(rp,1L);
 DrawImage(rp, &im_GAL16, 35L, 35L);
 DrawGAL(GAL16V8);				/*IC zeichnen*/


 if(GetParPort()!=0) {				/*Druckerport frei?*/
    puts("Parallel-Port ist belegt");
    CloseStuff();
    exit(1L);
   }
 if(GetTimer()!=0) {				/*Timer holen*/
    FreeParPort();
    puts("kann Timer nicht finden");
    CloseStuff;
    exit(1L);    
   }



 InitGALer();					/*Ausgänge von IC3,4,5 auf*/
 EnableOutput();				/*LOW schalten*/
 SetGAL(GAL16V8);
 MaxFuseAdr = MAX_FUSE_ADR16;
 SigAdr     = SIG_ADR16;


 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*/
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*/
       if (item == Item_1) {
	 CloseStuff();
	 FreeTimer();
	 FreeParPort();
	 exit(0L);
	}
       break;
      }
     case Menu_2: {					/*GAL-Typ*/
       if ((item == Item_1) && (GALType != GAL16V8)) {
	 MaxFuseAdr = MAX_FUSE_ADR16;
	 SigAdr     = SIG_ADR16;
	 SetGAL  (GAL16V8);
	 DrawImage(rp, &im_GAL16, 35L, 35L);
	 DrawGAL (GAL16V8);
	}
       if ((item == Item_2) && (GALType != GAL20V8)) {
	 MaxFuseAdr = MAX_FUSE_ADR20;
	 SigAdr     = SIG_ADR20;
	 SetGAL  (GAL20V8);
	 DrawImage(rp, &im_GAL20, 35L, 35L);
	 DrawGAL (GAL20V8);
        }
       break;
      }
     case Menu_3: {					/*GAL*/
       switch (item) {
	 case Item_1: {
	   Loeschen();
	   break;
	  }
	 case Item_2: {
	   ProgramGAL();
	   break;
	  }
	 case Item_3: {
	   CopyGAL();
	   break;
	  }
	 case Item_4: {
	   Leertest();
	   break;
	  }
	 case Item_5: {
	   SetSecurity();
	   break;
	  }
        }
       break;
      }
     case Menu_4: {					/*GAL-Assembler*/
       switch (item) {
	 case Item_1: {
	   if (GenJedec==YES) GenJedec=NO;	/*Jedec-Datei erstellen*/
	   else GenJedec=YES;
	   break;
	  }
	 case Item_2: {
	   if (GenFuse==YES) GenFuse=NO;	/*Fuse-Matrix erstellen*/
	   else GenFuse=YES;
	   break;
	  }
	 case Item_3: {
	   if (GenChip==YES) GenChip=NO;	/*Chip-Diagramm erstellen*/
	   else GenChip=YES;
	   break;
	  }
	 case Item_4: {
	   if (GenPin==YES) GenPin=NO;		/*Pin-Belegung erstellen*/
	   else GenPin=YES;
	   break;
	  }
	 case Item_5: {
	   AssembleInputFile();			/*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: {
	   PutJedec();
	   break;
	  }
	}
       break;
      }
     case Menu_6: {					/*GAL-Prüfer*/
       switch (item) {
	 case Item_1: {
	   PrintPinNames();
	   break;
	  }
	 case Item_2: {
	   ClearPinNames();
	   break;
	  }
	 case Item_3: {
	   TogglePruefer();
	   break;
	  }
	}
      }
    }
  }   
}








GetParPort()				/*Druckerport belegen*/
{
 int error;

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

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


FreeParPort()				/*Druckerport wieder freigeben*/
{
 CloseDevice(parreq);
 DeleteExtIO(parreq,(long)sizeof(struct IOExtPar));
 DeletePort(parport);
}



GetTimer()				/*Timer holen*/
{
 int error;

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

 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;
 error=OpenDevice(TIMERNAME,UNIT_MICROHZ,timereq,0L);
 if(error!=0) {
    FreeMem(&timereq,(long)sizeof(struct timerequest));
    DeletePort(timeport);
    return(-3);
   }

 return(error);
}


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


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




OpenStuff()
{
   IntuitionBase = 0;
   GfxBase	 = 0;
   screen	 = 0;
   window	 = 0;
   im_ptr16	 = 0;
   im_ptr20	 = 0;

   if((IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0L))==NULL)
     exit(FALSE);

   if((GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0L))==NULL) {
     CloseStuff();
     exit(FALSE);
    }
   if(!(screen=(struct Screen *)OpenScreen(&MyScreen))) {
     CloseStuff();
     exit(FALSE);
    }

   MyWindow.Screen=screen;
   if((window=(struct Window *)OpenWindow(&MyWindow))==NULL) {
     CloseStuff();
     exit(FALSE);
    }
   SetMenuStrip(window,&Menu1);
						/*Speicher für Images holen*/
   if (!(im_ptr16 = AllocMem((long)sizeof(im_GAL16Dat),MEMF_CHIP))) {
     puts("nicht genug freies Chip-Memory");
     CloseStuff();
     exit(1L);
    }
   if (!(im_ptr20 = AllocMem((long)sizeof(im_GAL20Dat),MEMF_CHIP))) {
     puts("nicht genug freies Chip-Memory");
     CloseStuff();
     exit(1L);
    }

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


CloseStuff()
{
  myproc->pr_WindowPtr=(APTR)old_ReqWin;		/*Req. auf ursprüngliches Window*/
  if(window) {
    ClearMenuStrip(window);
    CloseWindow(window);
   }
  if(screen) CloseScreen(screen);
  if(IntuitionBase) CloseLibrary (IntuitionBase);
  if(GfxBase) CloseLibrary (GfxBase);
  if(im_ptr16) FreeMem(im_ptr16, (long)sizeof(im_GAL16Dat));
  if(im_ptr20) FreeMem(im_ptr20, (long)sizeof(im_GAL20Dat));
}


