/******************************************************************************
** GALer.c
*******************************************************************************
**
** author:   Christian Habermann, (c)1991-96 by Christian Habermann
**           Asamstr. 17
**           85356 Freising
**           Germany
** version:  2.1
** date:     27.04.1996
**
** used compiler: SAS-C 6.51
**
*******************************************************************************
**
** description:
** This is the software which is necessary to read/program GALs via
** GALer's hardware.
**
** Both the hardware and the software of the GALer project are copyright
** by Christian Habermann.
**
*******************************************************************************
**
** changes:
** date     |     author     |  comment
**          |                |
**          |                |
******************************************************************************/
 





/********************************* includes **********************************/


#define  STRINGARRAY    1

#include <libraries/mui.h>

#include <devices/parallel.h>
#include <exec/io.h>
#include <exec/memory.h>
#include <exec/ports.h>
#include <exec/types.h>
#include <exec/interrupts.h>
#include <libraries/reqtools.h>
#include <libraries/locale.h>
#include <libraries/gadtools.h>
#include <resources/misc.h>
#include <resources/cia.h>
#include <hardware/cia.h>

#include <clib/alib_protos.h>
#include <proto/asl.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/locale.h>
#include <proto/muimaster.h>
#include <proto/reqtools.h> 
#include <proto/misc.h>
#include <proto/cia.h>

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#include "GALer.h"
#include "Localize.h"






/********************************** defines **********************************/

#define REG(x) register __ ## x
#define ASM    __asm
#define SAVEDS __saveds

#ifndef MAKE_ID
#define MAKE_ID(a,b,c,d) ((ULONG) (a)<<24 | (ULONG) (b)<<16 | \
                          (ULONG) (c)<<8  | (ULONG) (d))
#endif
 

#define ciaa  (*((struct CIA *)0xbfe001))
#define ciab  (*((struct CIA *)0xbfd000))
 

#define HELP_FILE       "PROGDIR:Doc/GALer.guide"





/******************************** functions **********************************/

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

static void  ExecuteMenu(int menu_id);
static int   GetParPort(void);
static void  FreeParPort(void);
static int   GetCIATimer(void);
static void  FreeCIATimer(void);
static void  dummy_interrupt(void);
static int   GetTimer(void);
static void  FreeTimer(void);
static int   OpenStuff(void);
static void  CloseStuff(void);

void main(void);
 





/******************************** variables **********************************/

extern  struct  ReqFileRequester        MyFileReqStruct;

extern  struct  NewGadget WriteNGad[], JEDNGad[], AsmNGad[], OptNGad[];
extern  struct  NewGadget RAsm16NGad[], RAsm20NGad[], SelectEditorNGad[];

extern  UWORD   WriteGTypes[], JEDGTypes[], AsmGTypes[], OptGTypes[];
extern  UWORD   RAsm16GTypes[], RAsm20GTypes[], SelectEditorGTypes[];

extern  ULONG   WriteGTags[], JEDGTags[], AsmGTags[], OptGTags[];
extern  ULONG   RAsm16GTags[], RAsm20GTags[], SelectEditorGTags[];

extern  struct  SysBase       *SysBase;        /* let the compiler's autoinit */
extern  struct  GfxBase       *GfxBase;        /* and autotermination code    */
extern  struct  IntuitionBase *IntuitionBase;  /* open/close this libraries   */

extern  int     GALType, MaxFuseAdr, SigAdr, hw_version;

extern  struct  Configuration   Config;
 
extern  char    *cia_timer_low, *cia_timer_high, *cia_timer_cr;

extern  char    cia_timer_start, cia_timer_stop;



struct  IORequest       *CreateExtIO();
struct  Library         *MUIMasterBase;
struct  Library         *LocaleBase;
struct  Library         *MiscBase; 
struct  Library         *CIABase;
struct  ReqToolsBase    *ReqToolsBase;
struct  MsgPort         *timeport;
struct  timerequest     *timereq;
struct  rtFileRequester *filereq;

struct  Catalog         *catalog;



static struct Interrupt CIATimerInterrupt =
              {{0, 0, NT_INTERRUPT, 0, "GALer"}, NULL, &dummy_interrupt};
 


struct NewMenu MainMenu[] =
    {
        /* Project menu */
        NM_TITLE, NULL, NULL, 0, NULL, (APTR)MEN_PROJECT,
        NM_ITEM,  NULL, NULL, 0, 0L,   (APTR)MEN_ABOUT,
        NM_ITEM,  NULL, NULL, 0, NULL, (APTR)MEN_HARDVER,
        NM_SUB, (STRPTR)"V1.0, V1.1", NULL, CHECKIT, 14L, (APTR)MEN_VER11,
        NM_SUB, (STRPTR)"V1.2", NULL, CHECKIT, 13L, (APTR)MEN_VER12,
        NM_SUB, (STRPTR)"V1.3", NULL, CHECKIT, 11L, (APTR)MEN_VER13,

    /*  support of elektor's GAL programming device is prepared
        to implement it, add the following line to the source code
        and adjust the menu localisation in the file Localize.c
        NOTE: only the second version of elektor's device is supported !!!

        NM_SUB, (STRPTR)"elektor II", NULL, CHECKIT, 7L, (APTR)MEN_VERELEKTOR,
    */
        NM_ITEM,  NULL, NULL, 0, 0L,   (APTR)MEN_SAVECONFIG,
        NM_ITEM,  (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
        NM_ITEM,  NULL, NULL, 0, 0L,   (APTR)MEN_QUIT,

        /* GAL-Type menu */
        NM_TITLE, NULL, NULL, 0, NULL, (APTR)MEN_GALTYPE,
        NM_ITEM,  NULL, NULL, CHECKIT, 14L, (APTR)MEN_16V8,
        NM_ITEM,  NULL, NULL, CHECKIT, 13L, (APTR)MEN_20V8,
        NM_ITEM,  NULL, NULL, CHECKIT, 11L, (APTR)MEN_22V10,
        NM_ITEM,  NULL, NULL, CHECKIT,  7L, (APTR)MEN_20RA10,
        NM_ITEM,  (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
        NM_ITEM,  NULL, NULL, CHECKIT|MENUTOGGLE, 0L, (APTR)MEN_TYPEREQ,


        /* GAL menu */
        NM_TITLE, NULL, NULL, 0, NULL, (APTR)MEN_GAL,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_PROG,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_COPY,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_ERASE,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_CMP,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_CLEAR,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_SETSEC,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_TESTSEC,
        NM_ITEM,  (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_WRITE,

        /* GAL-Assembler menu */
        NM_TITLE, NULL, NULL, 0, NULL, (APTR)MEN_GALASM,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_ASSEMBLE,

        /* GAL-Disassembler menu */
        NM_TITLE, NULL, NULL, 0, NULL, (APTR)MEN_GALDIS,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_READSIG,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_READACW,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_READINFO,
        NM_ITEM,  (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_READJED,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_READJEDPARA,
        NM_ITEM,  (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_REASM,

        /* Tools menu */
        NM_TITLE, NULL, NULL, 0, NULL, (APTR)MEN_TOOLS,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_SHOWPIN,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_CLEARPIN,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_CALLCHECKER,
        NM_ITEM,  (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_OPTIMIZER,
        NM_ITEM,  (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_EDIT,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_CALLEDIT,
        NM_ITEM,  (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL,
        NM_ITEM,  NULL, NULL, 0, 0L, (APTR)MEN_HELP,
        NM_END,   NULL, NULL, 0, 0L, NULL
    };





static UBYTE prog_name[] = "GALer";

static UBYTE version[]   = "$VER: GALer V2.1 (27.04.96)";


UBYTE  main_win_title[]  = "GALer V2.1  © 1996 by Christian Habermann               GAL16V8   ";


WORD    selected_timer;

int     checker_mode;

LONG    __stack = 8192;
 



APTR    app, main_win;


APTR    menustrip, menu_project, menu_galtype, menu_gal,    /* menu items */
        menu_asm, menu_galdis, menu_tools, menu_checker;


APTR    GAL_txt[34];                    /* used to store pointers */
                                        /* to the GAL text fields */

APTR    GAL_gads[32];                   /* used to store the pointers */
                                        /* to the GAL gadgets         */

APTR    LV_text;                        /* list view for text outputs */








void main(void)
{
    ULONG signals, id;


    if (!OpenStuff())                       /* open libs, windows... */
    {
        CloseStuff();
        exit(20);
    }

                                            /* parallel port free? */
 
    if (!GetParPort())
    {
        puts((char *)AppStrings[MSG_ERR_PARPORT].as_Str);
        CloseStuff();
        exit(20);
    }


                                  /* get any CIA timer */
    if (!GetCIATimer())
    {
        FreeParPort();
        puts((char *)AppStrings[MSG_ERR_CIATIMER].as_Str);
        CloseStuff();
        exit(20);
    }
                                            /* open timer device */


    if (!GetTimer())
    {
        FreeParPort();
        FreeCIATimer();
        puts((char *)AppStrings[MSG_ERR_TIMER].as_Str);
        CloseStuff();
        exit(20);
    }




    InitHardware();                         /* init hardware   */
    EnableOutput();                         /* enable outputs  */

    LoadConfig();                           /* load configuration */



    for (;;)
    {
        id = DoMethod(app, MUIM_Application_Input, &signals);

                                            /* quit or window's close */
                                            /* gadget selected?       */
        if (id == MEN_QUIT || id == MUIV_Application_ReturnID_Quit)
        {
            if (TxtRequest(AppStrings[MSG_ASKQUIT_TXT].as_Str,
                           AppStrings[MSG_CONT_GAD].as_Str,
                           AppStrings[MSG_CANCEL_GAD].as_Str))
                break;
        }
                                            /* gadget of the symbolic GAL */
                                            /* selected?                  */
        if (id >= FIRST_GAL_GADID &&
            id < FIRST_GAL_GADID + NUM_OF_GAL_GADGETS &&
            checker_mode == ON)
            Checker(id);

                                            /* menu selected? */
        if (id >= FIRST_MENU_ID && id <= LAST_MENU_ID)
            ExecuteMenu(id);


        if (signals)
            Wait(signals);                  /* wait for next event */
    }



    FreeParPort();                          /* shut down */

    FreeCIATimer();

    FreeTimer();

    CloseStuff();

    exit(0);
}





/******************************************************************************
** ExecuteMenu()
*******************************************************************************
** input:   menu_id     ID of the selected menu item
**
** output:  none
**
** remarks: does execute the selected menu
******************************************************************************/
 
static void ExecuteMenu(int menu_id)
{

    switch (menu_id)
    {
                                    /* Project menu */
        case MEN_ABOUT:                     /* about */
            About();
            break;
                                            /* hardware versions */
        case MEN_VER11:
            DoMethod(main_win, MUIM_Window_SetMenuState, MEN_22V10,  FALSE);
            DoMethod(main_win, MUIM_Window_SetMenuState, MEN_20RA10, FALSE);

            if (GALType == GAL22V10 || GALType == GAL20RA10)
                SetGALType(GAL16V8);

            Config.HardwareVersion = hw_version = HW_GALER_1_0;
            InitHardware();
            break;

        case MEN_VER12:
            DoMethod(main_win, MUIM_Window_SetMenuState, MEN_22V10,  FALSE);
            DoMethod(main_win, MUIM_Window_SetMenuState, MEN_20RA10, FALSE);

            if (GALType == GAL22V10 || GALType == GAL20RA10)
                SetGALType(GAL16V8);

            Config.HardwareVersion = hw_version = HW_GALER_1_2;
            InitHardware();
            break;

        case MEN_VER13:
            DoMethod(main_win, MUIM_Window_SetMenuState, MEN_22V10,  TRUE);
            DoMethod(main_win, MUIM_Window_SetMenuState, MEN_20RA10, TRUE);

            Config.HardwareVersion = hw_version = HW_GALER_1_3;
            InitHardware();
            break;
 
        case MEN_VERELEKTOR:
            DoMethod(main_win, MUIM_Window_SetMenuState, MEN_22V10,  TRUE);
            DoMethod(main_win, MUIM_Window_SetMenuState, MEN_20RA10, TRUE);
            DoMethod(main_win, MUIM_Window_SetMenuState, MEN_CALLCHECKER, FALSE);

            Config.HardwareVersion = hw_version = HW_ELEKTOR_II;
            InitHardware();
            break;
 
        case MEN_SAVECONFIG:                /* save configuration */
            SaveConfig();
            break;
                                            /* quit is dealed in */
                                            /* the main loop     */

                                    /* GAL-type menu */

        case MEN_16V8:                      /* GAL16V8 */
            SetGALType(GAL16V8);
            break;

        case MEN_20V8:                      /* GAL20V8 */
            SetGALType(GAL20V8);
            break;

        case MEN_22V10:                     /* GAL22V10 */
            SetGALType(GAL22V10);
            break;

        case MEN_20RA10:                    /* GAL20RA10 */
            SetGALType(GAL20RA10);
            break;

        case MEN_TYPEREQ:                   /* type requester */
            Config.GALTypeReq = !Config.GALTypeReq;
            break;
 

                                    /* GAL menu */
        case MEN_PROG:
            ProgramGAL();                   /* program GAL */
            break;

        case MEN_COPY:                      /* copy */
            CopyGAL();
            break;

        case MEN_ERASE:                     /* erase */
            Loeschen();
            break;

        case MEN_CMP:                       /* compare */
            Compare();
            break;

        case MEN_CLEAR:                     /* is GAL clear */
            Leertest();
            break;

        case MEN_SETSEC:                    /* set security bit */
            SetSecurity(YES);
            break;

        case MEN_TESTSEC:                   /* test security bit */
            TestSecurity();
            break;

        case MEN_WRITE:                     /* how to read/prog GALs */
            Schreibverhalten();
            break;


                                    /* GAL assembler menu */
        case MEN_ASSEMBLE:
            AssembleInputFile(ASSEMBLER);   /* call assembler */
            break;
 

                                    /* GAL disassembler menu */
        case MEN_READSIG:
            PrintSignature();               /* print GAL's signature */
            break;

        case MEN_READACW:                   /* print ACW */
            PrintACW();
            break;

        case MEN_READINFO:                  /* print some infos */
            GALInfo();                      /* about the GAL    */
            break;

        case MEN_READJED:                   /* get JEDEC */
            PutJedec();
            break;
                                            /* parameters for getting JEDEC */
        case MEN_READJEDPARA:
            JedecRequester();
            break;

        case MEN_REASM:                     /* call reassembler */
            Reassembler();
            break;
   

                                    /* tools menu */
        case MEN_SHOWPIN:
            PrintPinNames();                /* show pin names */
            break;

        case MEN_CLEARPIN:                  /* clear pin names */
            ResetPinNames();
            break;

        case MEN_CALLCHECKER:               /* switch GAL checker on */
            ToggleChecker();
            break;

        case MEN_OPTIMIZER:                 /* optimizer */
            Optimizer();
            break;

        case MEN_EDIT:                      /* select editor */
            SelectEditor();
            break;

        case MEN_CALLEDIT:                  /* call selected editor */
            CallEditor();
            break;

        case MEN_HELP:                      /* help */
            HelpOnHelp();
            break;

 
                                    /* GAL checker menu */
        case MEN_EXITCHECKER:
            ToggleChecker();                /* exit GAL checker */
            break;

    }
}





/******************************************************************************
** GetParPort()
*******************************************************************************
** input:   none
**
** output:  TRUE:  ok
**          FALSE: parallel port in use
**
** remarks: allocate Amiga's parallel port
******************************************************************************/
 
static int GetParPort(void)
{

                                        /* get parallel port */

    if (!(MiscBase = (struct Library *)OpenResource(MISCNAME)))
    {
        return FALSE;
    }


    if (AllocMiscResource(MR_PARALLELPORT, prog_name))
    {
        return FALSE;
    }


    if (AllocMiscResource(MR_PARALLELBITS, prog_name))
    {
        FreeMiscResource(MR_PARALLELPORT);
        return FALSE;
    }


 
    InitParPort();                      /* init data direction register */

    return TRUE;
}





/******************************************************************************
** FreeParPort()
*******************************************************************************
** input:   none
** output:  none
**
** remarks: free Amiga's parallel port
******************************************************************************/
 
static void FreeParPort(void)
{

    RestoreParPort();                       /* restore the state of the */
                                            /* parallel port            */

    FreeMiscResource(MR_PARALLELBITS);      /* free parallel port */
    FreeMiscResource(MR_PARALLELPORT);

}





/******************************************************************************
** GetCIATimer()
*******************************************************************************
** input:   none
** output:  TRUE:  o.k.
**          FALSE: failed to get any CIA timer
**
** remarks: try to get one of the four CIA timers and initialize it
******************************************************************************/
 
static int GetCIATimer(void)
{


                            /* at first try to get one of the CIA-A timers */

    if ((CIABase = (struct Library *)OpenResource(CIAANAME)))
    {
                                            /* try to get timer A          */
                                            /* (interrupt is just a dummy) */

        if (!(AddICRVector(CIABase, CIAICRB_TA, &CIATimerInterrupt)))
        {
            AbleICR(CIABase, CIAICRB_TA);       /* disable timer A interrupt */

            selected_timer = CIAICRB_TA;

            cia_timer_low  = &ciaa.ciatalo;     /* init some variables */
            cia_timer_high = &ciaa.ciatahi;
            cia_timer_cr   = &ciaa.ciacra;

            cia_timer_start = ciaa.ciacra & (CIACRAF_SPMODE | CIACRAF_TODIN) |
                              CIACRAF_START | CIACRAF_LOAD;

            cia_timer_stop  = cia_timer_start & ~CIACRAF_START;

            return TRUE;
        }
                                            /* try to get timer B */

        if (!(AddICRVector(CIABase, CIAICRB_TB, &CIATimerInterrupt)))
        {
            AbleICR(CIABase, CIAICRB_TB);       /* disable timer B interrupt */

            selected_timer = CIAICRB_TB;

            cia_timer_low  = &ciaa.ciatblo;     /* init some variables */
            cia_timer_high = &ciaa.ciatbhi;
            cia_timer_cr   = &ciaa.ciacrb;

            cia_timer_start = ciaa.ciacrb & CIACRBF_ALARM |
                              CIACRBF_START | CIACRBF_LOAD;

            cia_timer_stop  = cia_timer_start & ~CIACRBF_START;

            return TRUE;
        }
 
    }


                            /* now try to get one of the CIA-B timers */

    if ((CIABase = (struct Library *)OpenResource(CIABNAME)))
    {
                                            /* try to get timer A          */

        if (!(AddICRVector(CIABase, CIAICRB_TA, &CIATimerInterrupt)))
        {
            AbleICR(CIABase, CIAICRB_TA);       /* disable timer A interrupt */

            selected_timer = CIAICRB_TA;

            cia_timer_low  = &ciab.ciatalo;     /* init some variables */
            cia_timer_high = &ciab.ciatahi;
            cia_timer_cr   = &ciab.ciacra;

            cia_timer_start = ciab.ciacra & (CIACRAF_SPMODE | CIACRAF_TODIN) |
                              CIACRAF_START | CIACRAF_LOAD;

            cia_timer_stop  = cia_timer_start & ~CIACRAF_START;

            return TRUE;
        }
                                            /* try to get timer B */

        if (!(AddICRVector(CIABase, CIAICRB_TB, &CIATimerInterrupt)))
        {
            AbleICR(CIABase, CIAICRB_TB);       /* disable timer B interrupt */

            selected_timer = CIAICRB_TB;

            cia_timer_low  = &ciab.ciatblo;     /* init some variables */
            cia_timer_high = &ciab.ciatbhi;
            cia_timer_cr   = &ciab.ciacrb;

            cia_timer_start = ciab.ciacrb & CIACRBF_ALARM |
                              CIACRBF_START | CIACRBF_LOAD;

            cia_timer_stop  = cia_timer_start & ~CIACRBF_START;
 
            return TRUE;
        }
 
    }
 

    return FALSE;
}





/******************************************************************************
** FreeCIATimer()
*******************************************************************************
** input:   none
** output:  none
**
** remarks: free CIA timer
******************************************************************************/

static void FreeCIATimer(void)
{

    RemICRVector(CIABase, selected_timer, &CIATimerInterrupt);

}





/******************************************************************************
** dummy_interrupt()
*******************************************************************************
** input:   none
** output:  none
**
** remarks: This is just a dummy function. It's needed for the interrupt
**          structure necessary to test whether or not a CIA timer is free.
**          __interrupt is a SAS-C keyword. This keyword turns off stack
**          checking.
******************************************************************************/
 
__interrupt static void dummy_interrupt(void)
{
    return;
}
 




/******************************************************************************
** GetTimer()
*******************************************************************************
** input:   none
**
** output:  TRUE:  ok
**          FALSE: failed
**
** remarks: open timer device
******************************************************************************/
 
static int GetTimer(void)
{

    timeport = (struct MsgPort *)CreatePort(0L, 0L);

    if (timeport == NULL)
        return FALSE;


    timereq = (struct timerequest *)AllocMem((long)sizeof(struct timerequest),
                                           MEMF_PUBLIC);

    if (timereq == NULL)
    {
        DeletePort(timeport);
        return FALSE;
    }


    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 FALSE;
    }

    return TRUE;
}





/******************************************************************************
** FreeTimer()
*******************************************************************************
** input:   none
** output:  none
**
** remarks: free the timer device
******************************************************************************/
 
static void FreeTimer(void)
{

    CloseDevice((struct IORequest *)timereq);

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

    DeletePort(timeport);
}





/******************************************************************************
** OpenStuff()
*******************************************************************************
** input:   none
**
** output:  TRUE:  ok
**          FALSE: something failed
**
** remarks: does open all libraries and the MUI application
******************************************************************************/
 
static int OpenStuff(void)
{
    int    n;
    LONG   open;



    if ((LocaleBase = OpenLibrary("locale.library", 38L)))
        catalog = OpenCatalog(NULL, (STRPTR)"GALer.catalog", OC_Version, 2,
                              TAG_DONE);

    LocalizeText();


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


    if (!(filereq = rtAllocRequestA(RT_FILEREQ, NULL)))
    {
        puts((char *)AppStrings[MSG_ERR_FILEREQ].as_Str);
        return FALSE;
    }


    if (!(MUIMasterBase = OpenLibrary(MUIMASTER_NAME, MUIMASTER_VMIN)))
    {
        puts((char *)AppStrings[MSG_ERR_MUILIB].as_Str);
        return FALSE;
    }



    app = ApplicationObject,
            MUIA_Application_Title,       "GALer",
            MUIA_Application_Version,     "$VER: GALer 2.1 (27.04.1996)",
            MUIA_Application_Copyright,   "©1991/96, Christian Habermann",
            MUIA_Application_Author,      "Christian Habermann",
            MUIA_Application_Description, "Software to program GALs.",
            MUIA_Application_Base,        "GALER",
            MUIA_Application_HelpFile,    HELP_FILE,

            MUIA_Application_Menustrip,   menustrip =
                                              MUI_MakeObject(MUIO_MenustripNM,
                                                             MainMenu, 0),

            SubWindow, main_win = WindowObject,
                MUIA_Window_Title, main_win_title,
                MUIA_Window_ID,    MAKE_ID('G','A','L','E'),
                MUIA_HelpNode,     "Main",

                WindowContents, GroupObject,

                    Child, ColGroup(6), GroupFrameT("GAL"),
                        MUIA_Group_VertSpacing, 0,

                                        /* pins 1 and 24 */
                            Child, GAL_gads[0] = SimpleButton("L"),
 
                            Child, GAL_txt[0] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33rnoname  \33b1",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[23] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33b24\33n noname",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, HSpace(0),

                            Child, HSpace(0),

                            Child, HSpace(0),


                                        /* pins 2 and 23 */
                            Child, GAL_gads[1] = SimpleButton("L"),
 
                            Child, GAL_txt[1] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33rnoname  \33b2",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[22] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33b23\33n noname",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[33] = TextObject,
                                MUIA_Background, MUII_TextBack,                               MUIA_Frame, MUIV_Frame_None,
                                MUIA_Text_Contents, "Z",
                                MUIA_Text_SetMin, TRUE,
                                MUIA_Text_SetMax, TRUE,
                                End,

                            Child, GAL_gads[21] = SimpleButton("L"),

                            Child, GAL_gads[31] = SimpleButton("O"),

 
                                        /* pins 3 and 22 */
                            Child, GAL_gads[2] = SimpleButton("L"),
 
                            Child, GAL_txt[2] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33rnoname  \33b3",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[21] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33b22\33n noname",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[32] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_None,
                                MUIA_Text_Contents, "Z",
                                MUIA_Text_SetMin, TRUE,
                                MUIA_Text_SetMax, TRUE,
                                End,

                            Child, GAL_gads[20] = SimpleButton("L"),

                            Child, GAL_gads[30] = SimpleButton("O"),

 
                                        /* pins 4 and 21 */
                            Child, GAL_gads[3] = SimpleButton("L"),
 
                            Child, GAL_txt[3] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33rnoname  \33b4",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[20] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33b21\33n noname",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[31] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_None,
                                MUIA_Text_Contents, "Z",
                                MUIA_Text_SetMin, TRUE,
                                MUIA_Text_SetMax, TRUE,
                                End,

                            Child, GAL_gads[19] = SimpleButton("L"),

                            Child, GAL_gads[29] = SimpleButton("O"),

 
                                        /* pins 5 and 20 */
                            Child, GAL_gads[4] = SimpleButton("L"),
 
                            Child, GAL_txt[4] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33rnoname  \33b5",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[19] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33b20\33n noname",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[30] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_None,
                                MUIA_Text_Contents, "Z",
                                MUIA_Text_SetMin, TRUE,
                                MUIA_Text_SetMax, TRUE,
                                End,

                            Child, GAL_gads[18] = SimpleButton("L"),

                            Child, GAL_gads[28] = SimpleButton("O"),
 
 
                                        /* pins 6 and 19 */
                            Child, GAL_gads[5] = SimpleButton("L"),
 
                            Child, GAL_txt[5] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33rnoname  \33b6",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[18] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33b19\33n noname",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[29] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_None,
                                MUIA_Text_Contents, "Z",
                                MUIA_Text_SetMin, TRUE,
                                MUIA_Text_SetMax, TRUE,
                                End,

                            Child, GAL_gads[17] = SimpleButton("L"),

                            Child, GAL_gads[27] = SimpleButton("O"),

 
                                        /* pins 7 and 18 */
                            Child, GAL_gads[6] = SimpleButton("L"),
 
                            Child, GAL_txt[6] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33rnoname  \33b7",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[17] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33b18\33n noname",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[28] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_None,
                                MUIA_Text_Contents, "Z",
                                MUIA_Text_SetMin, TRUE,
                                MUIA_Text_SetMax, TRUE,
                                End,

                            Child, GAL_gads[16] = SimpleButton("L"),

                            Child, GAL_gads[26] = SimpleButton("O"),
 

                                        /* pins 8 and 17 */
                            Child, GAL_gads[7] = SimpleButton("L"),
 
                            Child, GAL_txt[7] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33rnoname  \33b8",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[16] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33b17\33n noname",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[27] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_None,
                                MUIA_Text_Contents, "Z",
                                MUIA_Text_SetMin, TRUE,
                                MUIA_Text_SetMax, TRUE,
                                End,

                            Child, GAL_gads[15] = SimpleButton("L"),

                            Child, GAL_gads[25] = SimpleButton("O"),
 
 
                                        /* pins 9 and 16 */
                            Child, GAL_gads[8] = SimpleButton("L"),
 
                            Child, GAL_txt[8] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33rnoname  \33b9",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[15] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33b16\33n noname",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[26] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_None,
                                MUIA_Text_Contents, "Z",
                                MUIA_Text_SetMin, TRUE,
                                MUIA_Text_SetMax, TRUE,
                                End,

                            Child, GAL_gads[14] = SimpleButton("L"),

                            Child, GAL_gads[24] = SimpleButton("O"),
 
 
                                        /* pins 10 and 15 */
                            Child, GAL_gads[9] = SimpleButton("L"),
 
                            Child, GAL_txt[9] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33rnoname \33b10",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[14] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33b15\33n noname",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[25] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_None,
                                MUIA_Text_Contents, "Z",
                                MUIA_Text_SetMin, TRUE,
                                MUIA_Text_SetMax, TRUE,
                                End,

                            Child, GAL_gads[13] = SimpleButton("L"),

                            Child, GAL_gads[23] = SimpleButton("O"),
 
 
                                        /* pins 11 and 14 */
                            Child, GAL_gads[10] = SimpleButton("L"),
 
                            Child, GAL_txt[10] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33rnoname \33b11",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[13] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33b14\33n noname",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[24] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_None,
                                MUIA_Text_Contents, "Z",
                                MUIA_Text_SetMin, TRUE,
                                MUIA_Text_SetMax, TRUE,
                                End,

                            Child, GAL_gads[12] = SimpleButton("L"),

                            Child, GAL_gads[22] = SimpleButton("O"),
 
 
                                        /* pins 12 and 13 */
                            Child, HSpace(0), 

                            Child, GAL_txt[11] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33rnoname \33b12",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, GAL_txt[12] = TextObject,
                                MUIA_Background, MUII_TextBack,
                                MUIA_Frame, MUIV_Frame_Text,
                                MUIA_Text_Contents, "\33b13\33n noname",
                                MUIA_Text_SetMin, TRUE,
                                End,

                            Child, HSpace(0),

                            Child, GAL_gads[11] = SimpleButton("L"),

                            Child, HSpace(0),
                    End,
 

                    Child, LV_text = ListviewObject,
                        MUIA_Listview_Input, FALSE,
                        MUIA_Listview_List, ListObject,
                        MUIA_List_ConstructHook, MUIV_List_ConstructHook_String,
                        MUIA_List_DestructHook, MUIV_List_DestructHook_String,
                        ReadListFrame,
                        End,
                    End,
                End,
            End,
        End;

                                /* checker menu */

    menu_checker = MenuObject, MUIA_Menu_Title,
                                 AppStrings[MSG_CHECKER_MENU1].as_Str,
        MUIA_Family_Child, MUI_MakeObject(MUIO_Menuitem,
                            AppStrings[MSG_CHECKER_MENU1_ITEM1].as_Str,
                            AppStrings[MSG_CHECKER_MENU1_ITEM1_COMMKEY].as_Str,
                            0, MEN_EXITCHECKER),
        End;


 
 

                                    /* set gadget IDs of all */
                                    /* GAL gadgets           */

    for (n = 0; n < NUM_OF_GAL_GADGETS; n++)
        DoMethod(GAL_gads[n], MUIM_Notify, MUIA_Pressed, FALSE,
                 app, 2, MUIM_Application_ReturnID, FIRST_GAL_GADID + n);
 



    if (!app || !menu_checker)
    {
        puts((char *)AppStrings[MSG_ERR_APPLICATION].as_Str);
        return FALSE;
    }
 
                       /* get pointers to the menu objects of the main menu */
                       /* with this pointers the main menu can be removed   */
                       /* and the GAL checker menu can be added             */

    menu_project = (APTR)DoMethod(menustrip, MUIM_FindUData, MEN_PROJECT);
    menu_galtype = (APTR)DoMethod(menustrip, MUIM_FindUData, MEN_GALTYPE);
    menu_gal     = (APTR)DoMethod(menustrip, MUIM_FindUData, MEN_GAL);
    menu_asm     = (APTR)DoMethod(menustrip, MUIM_FindUData, MEN_GALASM);
    menu_galdis  = (APTR)DoMethod(menustrip, MUIM_FindUData, MEN_GALDIS);
    menu_tools   = (APTR)DoMethod(menustrip, MUIM_FindUData, MEN_TOOLS);

                                        /* show menu help text when the user */
                                        /* does press the HELP-key while the */
                                        /* mouse is over a menu item         */

    DoMethod(app, MUIM_Notify, MUIA_Application_MenuHelp, MUIV_EveryTime,
             app, 5, MUIM_Application_ShowHelp, main_win, HELP_FILE,
             "Menus", 0);

                                        /* let GALer know when the close */
                                        /* gadget is selected            */

    DoMethod(main_win, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
             app, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);

 


    set(main_win, MUIA_Window_Open, TRUE);        /* open the main window */
    get(main_win, MUIA_Window_Open, &open);

    if (!open)
    {
        puts((char *)AppStrings[MSG_ERR_OPENWINDOW].as_Str);
        return FALSE;
    }
 
 


    return TRUE;
}





/******************************************************************************
** CloseStuff()
*******************************************************************************
** input:   none
** output:  none
**
** remarks: close libraries and the MUI application
******************************************************************************/
 
static void CloseStuff(void)
{

    if (filereq)
        rtFreeRequest(filereq);

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

    if (LocaleBase)
    {
        CloseCatalog(catalog);
        CloseLibrary (LocaleBase);
    }


    if (app)                                /* close MUI application */
        MUI_DisposeObject(app);

    if (MUIMasterBase)
        CloseLibrary(MUIMasterBase);
 
}





/* EOF */
