home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 1 / Meeting Pearls Vol 1 (1994).iso / installed_progs / hard / galer / source / src.lha / Source / GALer / Sub.c < prev   
Encoding:
C/C++ Source or Header  |  1993-11-10  |  34.2 KB  |  1,510 lines

  1. /****************************************************************/
  2. /*                                */
  3. /* Sub.c - this file includes some subroutines for GALer    */
  4. /*                                */
  5. /*                                 */
  6. /****************************************************************/
  7.  
  8.  
  9.  
  10. #include <dos/dostags.h>
  11.  
  12. #include <exec/types.h>
  13. #include <libraries/dos.h>
  14. #include <libraries/dosextens.h>
  15. #include <libraries/reqtools.h>
  16. #include <libraries/gadtools.h>
  17. #include <libraries/locale.h>
  18. #include <exec/memory.h>
  19. #include <intuition/intuition.h>
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include <ctype.h>
  23.  
  24. #include <proto/locale.h>
  25. #include <proto/reqtools.h>
  26. #include <proto/gadtools.h>
  27. #include <proto/intuition.h>
  28. #include <proto/exec.h>
  29. #include <proto/dos.h>
  30. #include <proto/graphics.h>
  31.  
  32. #include "GALer.h"
  33. #include "Localize.h"
  34.  
  35.  
  36. #define    YES_GADID    1
  37. #define    NO_GADID    2
  38.  
  39.  
  40. #define GD_AsmGad01     1        /* GadgetIDs für Assembler */
  41. #define GD_AsmGad02    2
  42. #define GD_AsmGad03    3
  43. #define GD_AsmGad04    4
  44. #define GD_AsmGad05    5
  45. #define GD_AsmGad06    6
  46. #define GD_AsmGad07    7
  47. #define GD_AsmGad08    8
  48.  
  49.  
  50.  
  51. #define GD_WriteGad01    1        /* GadgetIDs für Schreibverhalten */
  52. #define GD_WriteGad02    2
  53. #define GD_WriteGad03    3
  54. #define GD_WriteGad04    4
  55. #define GD_WriteGad05    5
  56. #define GD_WriteGad06    6
  57.  
  58.  
  59.  
  60. #define GD_JParGad01    1        /* GadgetIDs für JEDEC-Parameter */
  61. #define GD_JParGad02    2
  62. #define GD_JParGad03    3    
  63. #define GD_JParGad04    4
  64.  
  65.  
  66. #define GD_SelEdGad01    1        /* GadgetIDs of select editor */
  67. #define GD_SelEdGad02    2
  68. #define GD_SelEdGad03    3    
  69.  
  70.  
  71.  
  72.  
  73. extern    struct  AppString { LONG   as_ID;
  74.                  STRPTR as_Str;
  75.               };
  76.  
  77. extern    struct  AppString AppStrings[];
  78.  
  79. extern    struct    Screen     *screen;
  80. extern    struct    Window     *window;
  81. extern    struct    RastPort *rp;
  82. extern    struct    Menu     *mainmenu;
  83. extern    struct    TextAttr topaz8;
  84. extern    struct    Gadget     *WriteGList, *JEDGList, *AsmGList;
  85. extern    struct    Gadget     *SelectEditorGList;
  86. extern    struct  Gadget     *SelectEditorGadgets[];
  87. extern    struct    Catalog     *catalog;
  88.  
  89.  
  90.  
  91. extern    struct    rtFileRequester    *filereq;
  92.  
  93. extern    APTR    VisualInfo;
  94.  
  95.  
  96. extern    int    GALType, MaxFuseAdr, RowSize, XORSize, SigAdr;
  97. extern    int    hw_version;
  98.  
  99. extern    UBYTE    title[];
  100.  
  101.  
  102.  
  103.  
  104.                         /*Voreinstellungen*/
  105. struct    Configuration Config = { GAL16V8,    /*GAL16V8*/
  106.                  YES,        /*Requester für Typ*/
  107.                  YES,        /*Jedec erzeugen*/
  108.                  NO,        /*kein Fuse-File*/
  109.                  NO,        /*kein Chip-File*/
  110.                  NO,        /*kein Pin-File*/
  111.                  NO,        /*kein Auto-Save*/
  112.                  YES,        /*autom. GALTyp einstellen*/
  113.                  YES,        /*Leertest vor GAL-Prog.*/
  114.                  YES,        /*Verify nach GAL-Prog.*/
  115.                  YES,        /*Leertest vor Copy-GAL*/
  116.                  YES,        /*Verify nach Copy-GAL*/
  117.                  YES,        /*Leertest nach GAL-Löschen*/
  118.                  NO,        /*Sec.Bit der Jedec-Datei*/
  119.                  YES,        /*Fuse-Checksumme der Jedec*/
  120.                  NO,        /*File-Checksumme der Jedec*/
  121.                  HW_GALER_1_3,    /*Hardware-Version*/
  122.                  YES,        /*WB to front*/
  123.                  "c:ed \"%s\" -STICKY"
  124.                         };
  125.  
  126.  
  127.  
  128. struct    Configuration DummyConfig;        /*für LoadConfig*/
  129.  
  130.  
  131.  
  132.  
  133. UBYTE    ErrorLineStr[22];
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141. struct    IntuiText WriteIText3 =    { 2, 0, JAM1, 11, 83, &topaz8, NULL, NULL };
  142.  
  143. struct    IntuiText WriteIText2 =    { 2, 0, JAM1, 11, 44, &topaz8, NULL,
  144.                   &WriteIText3 };
  145.  
  146. struct    IntuiText WriteIText1 = { 2, 0, JAM1, 11,  5, &topaz8, NULL,
  147.                   &WriteIText2 };
  148.  
  149.  
  150.  
  151. struct IntuiText AsmITxt1 = { 2, 0, JAM1, 16, 6, &topaz8, NULL, NULL };
  152.  
  153.  
  154. struct IntuiText JEDITxt1 = { 2, 0, JAM1,  3, 7, &topaz8, NULL, NULL };
  155.  
  156.  
  157.  
  158.  
  159.  
  160.                     /* Gadgets für Assembler-Window */
  161.  
  162. struct NewGadget AsmNGad[] = {
  163.     60, 17, 26, 11, NULL, NULL, GD_AsmGad01, PLACETEXT_RIGHT, NULL, NULL,
  164.     60, 29, 26, 11, NULL, NULL, GD_AsmGad02, PLACETEXT_RIGHT, NULL, NULL,
  165.     60, 41, 26, 11, NULL, NULL, GD_AsmGad03, PLACETEXT_RIGHT, NULL, NULL,
  166.     60, 53, 26, 11, NULL, NULL, GD_AsmGad04, PLACETEXT_RIGHT, NULL, NULL,
  167.     60, 73, 26, 11, NULL, NULL, GD_AsmGad05, PLACETEXT_RIGHT, NULL, NULL,
  168.     19, 93, 26, 11, NULL, NULL, GD_AsmGad06, PLACETEXT_RIGHT, NULL, NULL,
  169.     19, 118, 83, 14, NULL, NULL, GD_AsmGad07, PLACETEXT_IN, NULL, NULL,
  170.     178, 118, 83, 14, NULL, NULL, GD_AsmGad08, PLACETEXT_IN, NULL, NULL
  171. };
  172.  
  173.  
  174. UWORD AsmGTypes[] = {
  175.     CHECKBOX_KIND,
  176.     CHECKBOX_KIND,
  177.     CHECKBOX_KIND,
  178.     CHECKBOX_KIND,
  179.     CHECKBOX_KIND,
  180.     CHECKBOX_KIND,
  181.     BUTTON_KIND,
  182.     BUTTON_KIND
  183. };
  184.  
  185.  
  186. ULONG AsmGTags[] = {
  187.     (GTCB_Checked), FALSE, (TAG_DONE),
  188.     (GTCB_Checked), FALSE, (TAG_DONE),
  189.     (GTCB_Checked), FALSE, (TAG_DONE),
  190.     (GTCB_Checked), FALSE, (TAG_DONE),
  191.     (GTCB_Checked), FALSE, (TAG_DONE),
  192.     (GTCB_Checked), FALSE, (TAG_DONE),
  193.     (TAG_DONE),
  194.     (TAG_DONE)
  195. };
  196.  
  197.  
  198.  
  199.  
  200.  
  201.                     /* Gadgets für Schreibverhalten */
  202. UWORD WriteGTypes[] = {
  203.     CHECKBOX_KIND,
  204.     CHECKBOX_KIND,
  205.     CHECKBOX_KIND,
  206.     CHECKBOX_KIND,
  207.     CHECKBOX_KIND,
  208.     BUTTON_KIND
  209. };
  210.  
  211. struct NewGadget WriteNGad[] = {
  212.     36, 15, 26, 11, NULL, NULL, GD_WriteGad01, PLACETEXT_RIGHT, NULL, NULL,
  213.     36, 27, 26, 11, NULL, NULL, GD_WriteGad02, PLACETEXT_RIGHT, NULL, NULL,
  214.     36, 54, 26, 11, NULL, NULL, GD_WriteGad03, PLACETEXT_RIGHT, NULL, NULL,
  215.     36, 66, 26, 11, NULL, NULL, GD_WriteGad04, PLACETEXT_RIGHT, NULL, NULL,
  216.     36, 93, 26, 11, NULL, NULL, GD_WriteGad05, PLACETEXT_RIGHT, NULL, NULL,
  217.     68, 118, 79, 14, NULL, NULL, GD_WriteGad06, PLACETEXT_IN, NULL, NULL
  218. };
  219.  
  220. ULONG WriteGTags[] = {
  221.     (GTCB_Checked), FALSE, (TAG_DONE),
  222.     (GTCB_Checked), FALSE, (TAG_DONE),
  223.     (GTCB_Checked), FALSE, (TAG_DONE),
  224.     (GTCB_Checked), FALSE, (TAG_DONE),
  225.     (GTCB_Checked), FALSE, (TAG_DONE),
  226.     (TAG_DONE)
  227. };
  228.  
  229.  
  230.  
  231.  
  232.  
  233.                     /* Gadgets für JEDEC-Parameter */
  234. UWORD JEDGTypes[] = {
  235.     CHECKBOX_KIND,
  236.     CHECKBOX_KIND,
  237.     CHECKBOX_KIND,
  238.     BUTTON_KIND
  239. };
  240.  
  241.  
  242. struct NewGadget JEDNGad[] = {
  243.     20, 17, 26, 11, NULL, NULL, GD_JParGad01, PLACETEXT_RIGHT, NULL, NULL,
  244.     20, 29, 26, 11, NULL, NULL, GD_JParGad02, PLACETEXT_RIGHT, NULL, NULL,
  245.     20, 41, 26, 11, NULL, NULL, GD_JParGad03, PLACETEXT_RIGHT, NULL, NULL,
  246.     56, 64, 76, 13, NULL, NULL, GD_JParGad04, PLACETEXT_IN, NULL, NULL
  247. };
  248.  
  249.  
  250. ULONG JEDGTags[] = {
  251.     (GTCB_Checked), FALSE, (TAG_DONE),
  252.     (GTCB_Checked), FALSE, (TAG_DONE),
  253.     (GTCB_Checked), FALSE, (TAG_DONE),
  254.     (TAG_DONE)
  255. };
  256.  
  257.  
  258.  
  259.                     /* gadgets for SelectEditor */
  260. UWORD SelectEditorGTypes[] = {
  261.     STRING_KIND,
  262.     CHECKBOX_KIND,
  263.     BUTTON_KIND
  264. };
  265.  
  266. struct NewGadget SelectEditorNGad[] = {
  267.     76,  8, 149, 14, NULL, NULL, GD_SelEdGad01, PLACETEXT_LEFT, NULL, NULL,
  268.     76,  30, 26, 11, NULL, NULL, GD_SelEdGad02, PLACETEXT_RIGHT, NULL, NULL,
  269.     115, 55, 63, 14, NULL, NULL, GD_SelEdGad03, PLACETEXT_IN, NULL, NULL
  270. };
  271.  
  272. ULONG SelectEditorGTags[] = {
  273.     (GTST_String), NULL, (GTST_MaxChars), EDITOR_STR_SIZE, (TAG_DONE),
  274.     (GTCB_Checked), FALSE, (TAG_DONE),
  275.     (TAG_DONE)
  276. };
  277.  
  278.  
  279.  
  280.  
  281.  
  282. char    filename[108];                /* Puffer für Filenamen */
  283. char    path[108 + 130 + 4];            /* Puffer für Dir+File  */
  284.                         /* +4 für Suffix    */
  285.  
  286. char    prevSourceFile[108 + 130 + 4];        /* name of the prev. */
  287.                         /* assembled file */
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.  
  299. /* Schreibverhalten: Läßt Requester erscheinen, in dem eingestellt werden
  300.              kann, ob ein Leertest und/oder Verify nach einem
  301.              schreibenden Zugriff auf ein GAL gemacht werden soll.
  302.    Aufruf   : Schreibverhalten();
  303.    Parameter: ---
  304.    Ergebnis : --- 
  305. */
  306. void Schreibverhalten(void)
  307. {
  308. struct    Window             *writewin;
  309. struct    IntuiMessage    *imsg;
  310. ULONG    class;
  311. USHORT    code, gadID;
  312. UWORD   offx = screen->WBorLeft, offy = screen->WBorTop + screen->RastPort.TxHeight + 1;
  313.  
  314.  
  315.  
  316.   if (!(writewin = OpenWindowTags( NULL,
  317.                 WA_Left,     207,
  318.                 WA_Top,         25,
  319.                 WA_Width,     226,
  320.                 WA_Height,     142 + offy,
  321.                 WA_IDCMP,     CHECKBOXIDCMP|BUTTONIDCMP|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY,
  322.                 WA_Flags,     WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
  323.                 WA_Gadgets,     WriteGList,
  324.                 WA_Title,     AppStrings[MSG_WRITEACC_WIN].as_Str,
  325.                 WA_CustomScreen, screen,
  326.                 TAG_DONE )))
  327.     return;
  328.  
  329.  
  330.   GT_RefreshWindow(writewin, NULL);
  331.  
  332.  
  333.   offx = writewin->BorderLeft;
  334.   offy = writewin->BorderTop;
  335.   PrintIText(writewin->RPort, &WriteIText1, offx, offy);
  336.  
  337.  
  338.  
  339.   for (;;) {
  340.  
  341.     Wait (1 << writewin->UserPort->mp_SigBit);
  342.  
  343.     while (imsg = GT_GetIMsg(writewin->UserPort)) {
  344.  
  345.       class = imsg->Class;
  346.       code  = imsg->Code;
  347.  
  348.       if (class == GADGETUP)
  349.         gadID = ((struct Gadget *)imsg->IAddress)->GadgetID;
  350.  
  351.       GT_ReplyIMsg(imsg);
  352.  
  353.  
  354.       if (class == VANILLAKEY) {
  355.     if (code == 13) {            /* Return-Key = Weiter */
  356.       CloseWindow(writewin);
  357.       return;
  358.     }
  359.       }
  360.  
  361.       if (class == GADGETUP) {
  362.         gadID = ((struct Gadget *)imsg->IAddress)->GadgetID;
  363.  
  364.     switch (gadID) {
  365.  
  366.       case GD_WriteGad06:
  367.         CloseWindow(writewin);
  368.         return;
  369.  
  370.       case GD_WriteGad01:
  371.         Config.ProgEmptyTest = !Config.ProgEmptyTest;
  372.         break;
  373.  
  374.       case GD_WriteGad02:
  375.         Config.ProgVerify = !Config.ProgVerify;
  376.         break;
  377.  
  378.       case GD_WriteGad03:
  379.         Config.CopyEmptyTest = !Config.CopyEmptyTest;
  380.         break;
  381.  
  382.       case GD_WriteGad04:
  383.         Config.CopyVerify = !Config.CopyVerify;
  384.         break;
  385.  
  386.       case GD_WriteGad05:
  387.         Config.EraseEmptyTest = !Config.EraseEmptyTest;
  388.         break;
  389.  
  390.     }
  391.       }
  392.     }
  393.   }
  394. }
  395.  
  396.  
  397.  
  398. /* JedecRequester: Läßt Requester erscheinen, in dem eingestellt werden kann,
  399.          was wie im JEDEC-File stehen soll.
  400.    Aufruf   : JedecReq();
  401.    Parameter: ---
  402.    Ergebnis : --- 
  403. */
  404. void JedecRequester(void)
  405. {
  406. struct    Window             *jedwin;
  407. struct    IntuiMessage    *imsg;
  408. ULONG    class;
  409. USHORT    code, gadID;
  410. UWORD   offx = screen->WBorLeft, offy = screen->WBorTop + screen->RastPort.TxHeight + 1;
  411.  
  412.  
  413.  
  414.  
  415.   if (!(jedwin = OpenWindowTags( NULL,
  416.                 WA_Left,     220,
  417.                 WA_Top,         45,
  418.                 WA_Width,     200,
  419.                 WA_Height,     84 + offy,
  420.                 WA_IDCMP,     CHECKBOXIDCMP|BUTTONIDCMP|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY,
  421.                 WA_Flags,     WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
  422.                 WA_Gadgets,     JEDGList,
  423.                 WA_Title,     AppStrings[MSG_JEDPARA_WIN].as_Str,
  424.                 WA_CustomScreen, screen,
  425.                 TAG_DONE )))
  426.     return;
  427.  
  428.  
  429.   GT_RefreshWindow(jedwin, NULL);
  430.  
  431.  
  432.   offx = jedwin->BorderLeft;
  433.   offy = jedwin->BorderTop;
  434.   PrintIText(jedwin->RPort, &JEDITxt1, offx, offy);
  435.  
  436.  
  437.  
  438.   for (;;) {
  439.  
  440.     Wait (1 << jedwin->UserPort->mp_SigBit);
  441.  
  442.     while (imsg = GT_GetIMsg(jedwin->UserPort)) {
  443.  
  444.       class = imsg->Class;
  445.       code  = imsg->Code;
  446.  
  447.       if (class == GADGETUP)
  448.         gadID = ((struct Gadget *)imsg->IAddress)->GadgetID;
  449.  
  450.       GT_ReplyIMsg(imsg);
  451.  
  452.  
  453.       if (class == VANILLAKEY) {
  454.     if (code == 13) {            /* Return-Key = Weiter */
  455.       CloseWindow(jedwin);
  456.       return;
  457.     }
  458.       }
  459.  
  460.       if (class == GADGETUP) {
  461.         gadID = ((struct Gadget *)imsg->IAddress)->GadgetID;
  462.  
  463.     switch (gadID) {
  464.  
  465.       case GD_JParGad04:
  466.         CloseWindow(jedwin);
  467.         return;
  468.  
  469.       case GD_JParGad01:
  470.         Config.JedecSecBit = !Config.JedecSecBit;
  471.         break;
  472.  
  473.       case GD_JParGad02:
  474.         Config.JedecFuseChk = !Config.JedecFuseChk;
  475.         break;
  476.  
  477.       case GD_JParGad03:
  478.         Config.JedecFileChk = !Config.JedecFileChk;
  479.         break;
  480.  
  481.     }
  482.       }
  483.     }
  484.   }
  485. }
  486.  
  487.  
  488.  
  489.  
  490.  
  491. /* About: zeigt About-Text
  492.    Aufruf   : About();
  493.    Parameter: ---
  494.    Ergebnis : --- 
  495. */
  496. void About(void)
  497. {
  498.  
  499.   rtEZRequestTags( AppStrings[MSG_ABOUT_TXT].as_Str,
  500.            "O.K.", NULL, NULL, RT_ReqPos, REQPOS_CENTERSCR, TAG_END);
  501.  
  502. }
  503.  
  504.  
  505.  
  506.  
  507. /* mystrcmp: wie strcmp, aber keine Unterscheidung zwischen Groß- und
  508.    Kleinschreibung
  509.    Aufruf: result = mystrcmp(cptr1, cptr2);
  510.        cptr1: Zeiger auf 1. String
  511.        cptr2: Zeiger auf 2. String
  512.    Ergebnis: 
  513.        result = 1: nicht gleich
  514.             = 0: gleich
  515. */
  516. int mystrcmp(char *cptr1, char *cptr2)
  517. {
  518.   while (*cptr1 && *cptr2) {
  519.     if (tolower(*cptr1) != tolower(*cptr2))
  520.       return(1);
  521.     cptr1++;
  522.     cptr2++;
  523.    }
  524.  
  525.   if (!*cptr1 && !*cptr2)
  526.     return(0);
  527.   else
  528.     return(1);
  529. }
  530.  
  531.  
  532. /* MyFileReq: öffnet den FileRequester aus der "req.library"
  533.    Aufruf: antwort = MyFileReq((char *)headtxt, (char *)showtxt, int showreq);
  534.              headtxt: Zeiger auf File-Requester-Titel
  535.          showtxt: Zeiger auf Suffix
  536.          showreq: YES: FileRequester zeigen; NO: keinen Requester
  537.    Ergebnis: 1 : O.K. wurde angeklickt
  538.          0 : Cancel wurde angeklickt
  539. */
  540. int MyFileReq(char *headtxt, char *showtxt, int showreq, int mode)
  541. {
  542. struct    FileLock *lock;
  543. char    *pos1, *pos2;
  544. int    freq = YES,result;
  545. char    showpattern[10] = "#?";
  546. ULONG    reqtags[] = {RT_ReqPos, REQPOS_CENTERSCR, TAG_END};
  547.  
  548.  
  549.  
  550.   strcat(showpattern ,showtxt);        /* Show-Pattern erzeugen */
  551.  
  552.   rtChangeReqAttr(filereq, RTFI_MatchPat, showpattern, TAG_END);
  553.  
  554.                      /*falls vorhanden, Suffix löschen*/
  555.   if (strlen((char *)filename) >= 4) {   /*und "showtxt" anhängen */
  556.     pos1 = (char *)(filename + (long)strlen(filename) - (long)strlen(showtxt));
  557.     if ((!mystrcmp(pos1, ".pld")) || (!mystrcmp(pos1, ".jed")) ||
  558.         (!mystrcmp(pos1, ".pin")) || (!mystrcmp(pos1, ".chp")) ||
  559.         (!mystrcmp(pos1, ".fus"))) {
  560.       *pos1 = 0;
  561.       strcat((char *)&filename[0], showtxt);
  562.     }
  563.   }
  564.  
  565.  
  566.  
  567.   if (showreq)                /*FileRequester zeigen?*/
  568.     freq = (int)rtFileRequest(filereq, filename, headtxt,
  569.                   RT_ReqPos,  REQPOS_CENTERSCR,
  570.                   RTFI_Flags, FREQF_PATGAD, TAG_END);
  571.  
  572.   if ((showreq && freq) || !showreq) {
  573.  
  574.     if (strlen((char *)filename) >= 4) {        /*Suffix anhängen*/
  575.  
  576.       pos1 = (char *)(filename + (long)strlen(filename) - (long)strlen(showtxt));
  577.  
  578.         if (mystrcmp(pos1, showtxt)) {        /*Suffix nur anhängen, wenn*/
  579.           strcat(filename, showtxt);        /*es nicht schon da steht  */
  580.           strcat(path, showtxt);
  581.     }
  582.  
  583.     }
  584.     else {
  585.  
  586.      if (!strlen(filename))            /*kein File angegeben?*/
  587.        return(0);                /*dann Abbruch*/
  588.  
  589.      strcat(filename, showtxt);
  590.      strcat(path, showtxt);
  591.  
  592.     }
  593.  
  594.                         /* Pfad erstellen */
  595.     strcpy(path, filereq->Dir);
  596.  
  597.     pos1 = (char *)(filereq->Dir + ((long)strlen(filereq->Dir) - 1L));
  598.     pos2 = (char *)(path + ((long)strlen(path)));
  599.  
  600.     if (!((*pos1 == ':') || (*pos1 == '/') || !*pos1)) {
  601.       *pos2++ = '/';
  602.       *pos2   = 0x00;                /*Stringende*/
  603.     }
  604.     strcat(path, filename);       
  605.  
  606.  
  607.     if (!strcmp(showtxt, ".pld"))        /* copy dir+filename of the */
  608.       strcpy(prevSourceFile, path);        /* source file to buffer */
  609.  
  610.  
  611.  
  612.     if (showreq && (mode == SAVE)) {    /* wenn Requester für's Schreiben, */
  613.                     /* dann abfragen of File schon */
  614.                     /* existiert */
  615.       if ((lock = (struct FileLock *) Lock((BYTE *)path, (long)ACCESS_READ))) {
  616.     UnLock((BPTR)lock);
  617.  
  618.         result = rtEZRequest(AppStrings[MSG_SAVEOVER].as_Str,
  619.                  AppStrings[MSG_YESNO_GADS].as_Str, NULL,
  620.                  (struct TagItem *)reqtags, filename);
  621.  
  622.     if (!result)            /* nochmal File-Requester aufrufen */
  623.       return(MyFileReq(headtxt, showtxt, showreq, mode));
  624.  
  625.       }
  626.     }
  627.     return(1);
  628.   }
  629.   else
  630.     return(0);
  631. }
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638. /* MyRequest:
  639.    öffnet einen Requester und wartet auf die Antwort
  640.    Aufruf: antwort = MyRequest(mode,text);
  641.        mode: CONT_REQ : Requester mit Weiter/Abbruch-Gadgets
  642.          ERR_REQ  : Requester für Fehlermeldungen (Abbruch/Abbruch)
  643.          INFO_REQ : Requester für Informationen (Weiter/Weiter)
  644.          ERASE_REQ: Requester mit Löschen/Abbruch-Gadgets
  645.          GALTYPE_REQ: Öffnet Requester, in dem der GAL-Typ eingestellt
  646.            werden kann, falls im Menü "Typ-Requester" eingestellt ist.
  647.            Wenn dies nicht der Fall ist, dann wird ein normaler    
  648.            Frage-Requester ("CONT_REQ") ausgegeben.
  649.        text: Zeiger auf Requester-Text
  650.        antwort: 0=Abbruch oder Fehler, 1=Bestätigung
  651.             bei GALTYPE_REQ:   1 = GAL16V8
  652.                        2 = GAL20V8
  653.                        3 = GAL22V10
  654.                        4 = GAL20RA10
  655. */
  656. int MyRequest(int mode, UBYTE *text)
  657. {
  658. int result;
  659.  
  660.  
  661.  if (Config.GALTypeReq && (mode == GALTYPE_REQ)) {    /* GAL-Gadgets? */
  662.  
  663.    if (hw_version <= HW_GALER_1_2)
  664.      result = (int)rtEZRequestTags(text,
  665.             AppStrings[MSG_TYPE_GADS1].as_Str, NULL, NULL,
  666.            RT_ReqPos, REQPOS_CENTERSCR, TAG_END);
  667.    else
  668.      result = (int)rtEZRequestTags(text,
  669.             AppStrings[MSG_TYPE_GADS2].as_Str, NULL, NULL,
  670.            RT_ReqPos, REQPOS_CENTERSCR, TAG_END);
  671.  
  672.    switch(result) {
  673.      case  0:    return(0);            /* Abbruch angewählt */
  674.         break;
  675.  
  676.      case  1:    SetGALType(GAL16V8);        /* GAL16V8 angewählt */
  677.         return(1);
  678.         break;
  679.  
  680.      case  2: SetGALType(GAL20V8);        /* GAL20V8 angewählt */
  681.         return(2);
  682.         break;
  683.  
  684.      case  3: SetGALType(GAL22V10);        /* GAL22V10 angewählt */
  685.         return(3);
  686.         break;
  687.  
  688.      case  4: SetGALType(GAL20RA10);        /* GAL20RA10 angewählt */
  689.         return(4);
  690.         break;
  691.    }
  692.  
  693.  }
  694.  else {
  695.  
  696.    if (mode == ERASE_REQ)
  697.      return((int)rtEZRequestTags(text,
  698.                  AppStrings[MSG_ERSCNCL].as_Str, NULL, NULL,
  699.                  RT_ReqPos, REQPOS_CENTERSCR, TAG_END));
  700.  
  701.    if (mode == ERR_REQ)
  702.      return((int)rtEZRequestTags(text,
  703.                  AppStrings[MSG_CANCEL_GAD].as_Str, NULL, NULL,
  704.                  RT_ReqPos, REQPOS_CENTERSCR, TAG_END));
  705.  
  706.  
  707.    if ((mode == CONT_REQ) || (mode == GALTYPE_REQ))
  708.      return((int)rtEZRequestTags(text,
  709.                  AppStrings[MSG_CONTCNCLS_GAD].as_Str, NULL, NULL,
  710.                  RT_ReqPos, REQPOS_CENTERSCR, TAG_END));
  711.  
  712.  
  713.    if (mode == INFO_REQ)
  714.      return((int)rtEZRequestTags(text,
  715.                  AppStrings[MSG_CONT_GAD].as_Str, NULL, NULL,
  716.                  RT_ReqPos, REQPOS_CENTERSCR, TAG_END));
  717.  
  718.  }
  719.  
  720.  return(0);
  721.  
  722. }
  723.  
  724.  
  725.  
  726.  
  727. /* AsmRequester: öffnet den Requester mit den Assembler-Optionen
  728.    Parameter: keine
  729.    Ergebnis : 0 : Abbruch
  730.           1 : Weiter
  731. */
  732. int AsmRequester(void)
  733. {
  734. struct    Window             *asmwin;
  735. struct    IntuiMessage    *imsg;
  736. ULONG    class;
  737. USHORT    code, gadID;
  738. UWORD   offx = screen->WBorLeft, offy = screen->WBorTop + screen->RastPort.TxHeight + 1;
  739.  
  740.  
  741.  
  742.  
  743.   if (!(asmwin = OpenWindowTags( NULL,
  744.                 WA_Left,     175,
  745.                 WA_Top,         25,
  746.                 WA_Width,     290,
  747.                 WA_Height,     141 + offy,
  748.                 WA_IDCMP,     CHECKBOXIDCMP|BUTTONIDCMP|IDCMP_REFRESHWINDOW|IDCMP_VANILLAKEY,
  749.                 WA_Flags,     WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
  750.                 WA_Gadgets,     AsmGList,
  751.                 WA_Title,     (UBYTE *)"Assembler",
  752.                 WA_CustomScreen, screen,
  753.                 TAG_DONE )))
  754.     return(0);
  755.  
  756.   GT_RefreshWindow(asmwin, NULL);
  757.  
  758.  
  759.   offx = asmwin->BorderLeft;
  760.   offy = asmwin->BorderTop;
  761.   PrintIText(asmwin->RPort, &AsmITxt1, offx, offy);
  762.  
  763.  
  764.  
  765.   for (;;) {
  766.  
  767.     Wait (1 << asmwin->UserPort->mp_SigBit);
  768.  
  769.     while (imsg = GT_GetIMsg(asmwin->UserPort)) {
  770.  
  771.       class = imsg->Class;
  772.       code  = imsg->Code;
  773.  
  774.       if (class == GADGETUP)
  775.         gadID = ((struct Gadget *)imsg->IAddress)->GadgetID;
  776.  
  777.       GT_ReplyIMsg(imsg);
  778.  
  779.  
  780.       if (class == VANILLAKEY) {
  781.     if (code == 13) {            /* Return => Weiter */
  782.       CloseWindow(asmwin);
  783.       return(1);
  784.     }
  785.  
  786.     if (code == 0x1B) {            /* ESC => Abbruch */
  787.       CloseWindow(asmwin);
  788.       return(0);
  789.         }
  790.       }
  791.  
  792.       if (class == GADGETUP) {
  793.         gadID = ((struct Gadget *)imsg->IAddress)->GadgetID;
  794.  
  795.     switch (gadID) {
  796.  
  797.       case GD_AsmGad07:
  798.         CloseWindow(asmwin);
  799.         return(1);
  800.         break;
  801.  
  802.       case GD_AsmGad08:
  803.         CloseWindow(asmwin);
  804.         return(0);
  805.         break;
  806.  
  807.       case GD_AsmGad01:
  808.         Config.GenJedec = !Config.GenJedec;
  809.         break;
  810.  
  811.       case GD_AsmGad02:
  812.         Config.GenFuse = !Config.GenFuse;
  813.         break;
  814.  
  815.       case GD_AsmGad03:
  816.         Config.GenChip = !Config.GenChip;
  817.         break;
  818.  
  819.       case GD_AsmGad04:
  820.         Config.GenPin = !Config.GenPin;
  821.         break;
  822.  
  823.       case GD_AsmGad05:
  824.         Config.AutoSave = !Config.AutoSave;
  825.         break;
  826.  
  827.       case GD_AsmGad06:
  828.         Config.AutoGAL = !Config.AutoGAL;
  829.         break;
  830.     }
  831.       }
  832.     }
  833.   }
  834.  
  835.   return(0);
  836. }
  837.  
  838.  
  839.  
  840.  
  841.  
  842. /* FileSize:
  843.    gibt die Länge einer Datei zurück
  844.    Aufruf: size=FileSize(filename);
  845.            filename: Zeiger auf Filenamen
  846.    Ergebnis: -1 : File existiert nicht
  847.          -2 : kein Speicher für FileInfoBlock
  848.         size: Filelänge
  849. */
  850. long FileSize(UBYTE *filename)
  851. {
  852. struct    FileInfoBlock    *fib;
  853. struct    FileLock    *lock;
  854. LONG    filesize;
  855.  
  856.  if((lock=(struct FileLock *) Lock((BYTE *)filename, (long)ACCESS_READ))) {
  857.    fib=(struct FileInfoBlock *)AllocMem((long)sizeof(struct FileInfoBlock),MEMF_CHIP);
  858.    if (fib!=NULL) {
  859.      if (Examine((BPTR)lock, fib))
  860.        filesize=fib->fib_Size;
  861.      else filesize=-1L;
  862.      UnLock((BPTR)lock);
  863.      FreeMem(fib,(long)sizeof(struct FileInfoBlock));
  864.      return(filesize);
  865.     }
  866.    else
  867.      return(-2L);                /*Mem-Error*/
  868.   }
  869.  else
  870.    return(-1L);                    /*File existiert nicht*/
  871. }
  872.  
  873.  
  874.  
  875. /* ReadFile
  876.    File einlesen
  877.    Aufruf: error=ReadFile(filename,filesize,filebuff)
  878.            filename: Zeiger auf Filenamen
  879.        filesize: Größe der Datei in Bytes
  880.        filebuff: Adresse, an die die Datei gelesen werden soll
  881.    Ergebnis: error: 1=kein Fehler, 0=Fehler
  882. */
  883. int ReadFile(UBYTE *filename, LONG filesize, UBYTE *filebuff)
  884. {
  885. long     actlength;
  886. BPTR    fh;
  887.  
  888.  if ((fh=Open((char *)filename, (long)MODE_OLDFILE))) {
  889.    actlength=Read(fh, (char *)filebuff, filesize);
  890.    Close(fh);
  891.    if (actlength==-1L) return(0);
  892.    else return(1);
  893.   }
  894.  else
  895.   return(0);
  896. }
  897.  
  898.  
  899.  
  900.  
  901. /*ErrorReq
  902.   gibt zu einer Fehlernummer den entsprechenden Requester aus
  903.   Aufruf: ErrorReq(errornum);
  904.       errornum: Fehlernummer
  905. */
  906. void ErrorReq(int errornum)
  907. {
  908.  switch (errornum) {
  909.    case  1:  MyRequest(ERR_REQ, AppStrings[MSG_ERR1].as_Str);
  910.          break;
  911.    case  2:  MyRequest(ERR_REQ, AppStrings[MSG_ERR2].as_Str);
  912.          break;
  913.    case  3:  MyRequest(ERR_REQ, AppStrings[MSG_ERR3].as_Str);
  914.          break;
  915.    case  4:  MyRequest(ERR_REQ, AppStrings[MSG_ERR4].as_Str);
  916.          break;
  917.    case  5:  MyRequest(ERR_REQ, AppStrings[MSG_ERR5].as_Str);
  918.          break;
  919.    case  6:  MyRequest(ERR_REQ, AppStrings[MSG_ERR6].as_Str);
  920.          break;
  921.    case  7:  MyRequest(ERR_REQ, AppStrings[MSG_ERR7].as_Str);
  922.          break;
  923.    case  8:  MyRequest(ERR_REQ, AppStrings[MSG_ERR8].as_Str);
  924.          break;
  925.    case  9:  MyRequest(ERR_REQ, AppStrings[MSG_ERR9].as_Str);
  926.          break;
  927.    case 10:  MyRequest(ERR_REQ, AppStrings[MSG_ERR10].as_Str);
  928.          break;
  929.    case 11:  MyRequest(ERR_REQ, AppStrings[MSG_ERR11].as_Str);
  930.          break;
  931.    case 12:  MyRequest(ERR_REQ, AppStrings[MSG_ERR12].as_Str);
  932.          break;
  933.    case 13:  MyRequest(ERR_REQ, AppStrings[MSG_ERR13].as_Str);
  934.          break;
  935.   }
  936. }
  937.  
  938.  
  939.  
  940.  
  941. /* PrintText
  942.    gibt Text im Text-Feld aus
  943.    Aufruf: PrintText(text);
  944.        text   : Zeiger auf Text
  945.        newline: 1: ypos auf nächste Zeile
  946.             0: ypos nicht auf nächste Zeile
  947.                Aufruf mit newline = 0 eigentlich nur sinnvoll wenn
  948.                zuvor schon mal mit newline = 1 aufgerufen wurde
  949.                Anwendungsbeispiel:
  950.              PrintText("führe Verify durch...",1);
  951.              Nach erfolgreichem Verify: PrintText(" O.K.",0);
  952.              =>  "führe Verify durch... O.K."
  953. */
  954. void PrintText(UBYTE *text, int newline)
  955. {
  956. static    long  delta_x;
  957. static  int   ytxt = 150;            /*Startpos. für Text*/
  958.  
  959.   if (newline)
  960.     if (ytxt < 180)
  961.       ytxt += 10;
  962.     else
  963.       ScrollRaster(rp, 0L, 10L, 31L, 152L, 609L, 183L);
  964.  
  965.   if (newline)
  966.     Move(rp, 40L, (long)ytxt);
  967.   else
  968.     Move(rp, 40L+delta_x, (long)ytxt);
  969.  
  970.  
  971.   Text(rp, (char *)text, (long)strlen((char *)text));
  972.   delta_x = (long)strlen((char *)text)*8L;
  973.  
  974. }
  975.  
  976.  
  977.  
  978. /*gibt "Fehler in Zeile xyz" aus
  979.   Aufruf: PrintErrorLine(line);
  980.       line: Zeilennummer
  981. */
  982. void PrintErrorLine(int line)
  983. {
  984.  
  985.   sprintf((char *)&ErrorLineStr[16], "%4d:", line);
  986.  
  987.   PrintText(&ErrorLineStr[0],1);
  988.  
  989. }
  990.  
  991.  
  992.  
  993.  
  994.  
  995.  
  996. /* Voreinstellungen laden ("s:GALer.config") und Menüs, Gadgets, usw.
  997.    entsprechend einstellen
  998. */
  999. void LoadConfig(void)
  1000. {
  1001. long     filelength;
  1002. BPTR    fh;
  1003.  
  1004.  
  1005.  if ((fh = Open((char *)"s:GALer.config", (long)MODE_OLDFILE))) {
  1006.    filelength = Read(fh, (char *)&DummyConfig, (long)sizeof(struct Configuration));
  1007.    Close(fh);
  1008.    if (filelength == -1L)
  1009.      ErrorReq(10); 
  1010.    else                    /* kein Fehler beim Lesen? */
  1011.      Config = DummyConfig;        /* dann Config übernehmen  */
  1012.   }
  1013.  
  1014.   GALType = UNKNOWN;
  1015.  
  1016.   SetGALType(Config.GALType);            /* set type of GAL */
  1017.  
  1018.   GALType = Config.GALType;
  1019.  
  1020.  
  1021.   ClearMenuStrip(window);            /* Menü ausschalten, um die */
  1022.                         /* Flags ändern zu können   */
  1023.  
  1024.   if (Config.GALTypeReq)             /* Typ-Requester-Menü */
  1025.     ItemAddress(mainmenu, FULLMENUNUM(1, 5, NOSUB))->Flags |= CHECKED;
  1026.  
  1027.  
  1028.   hw_version = Config.HardwareVersion;        /* Hardware-Version */
  1029.  
  1030.   switch(Config.HardwareVersion) {
  1031.  
  1032.     case HW_GALER_1_0:
  1033.       ItemAddress(mainmenu, FULLMENUNUM(0, 1, 0))->Flags |= CHECKED;
  1034.       break;
  1035.  
  1036.     case HW_GALER_1_2:
  1037.       ItemAddress(mainmenu, FULLMENUNUM(0, 1, 1))->Flags |= CHECKED;
  1038.       break;
  1039.  
  1040.     case HW_GALER_1_3:
  1041.       ItemAddress(mainmenu, FULLMENUNUM(0, 1, 2))->Flags |= CHECKED;
  1042.       break;
  1043.  
  1044.   }
  1045.  
  1046.  
  1047.   ResetMenuStrip(window, mainmenu);        /* set menus */
  1048.  
  1049.  
  1050.   if (hw_version <= HW_GALER_1_2) {        /* enable/disable 22V10 */
  1051.     OffMenu(window, FULLMENUNUM(1, 2, 0));    /* and 20RA10 menu */
  1052.     OffMenu(window, FULLMENUNUM(1, 3, 0));
  1053.  
  1054.     if (GALType == GAL22V10 || GALType == GAL20RA10) /*set 16V8 if 22V10 or  */
  1055.       SetGALType(GAL16V8);                 /*20RA10 is selected and*/
  1056.                              /*and hardware is <= 1.2*/
  1057.   }
  1058.   else {
  1059.     OnMenu(window, FULLMENUNUM(1, 2, 0));
  1060.     OnMenu(window, FULLMENUNUM(1, 3, 0));
  1061.   }
  1062.  
  1063.  
  1064.   if (Config.GenJedec)
  1065.     AsmGTags[1] = TRUE;
  1066.  
  1067.   if (Config.GenFuse)
  1068.     AsmGTags[4] = TRUE;
  1069.  
  1070.   if (Config.GenChip)
  1071.     AsmGTags[7] = TRUE;
  1072.  
  1073.   if (Config.GenPin)
  1074.     AsmGTags[10] = TRUE;
  1075.  
  1076.   if (Config.AutoSave)
  1077.     AsmGTags[13] = TRUE;
  1078.  
  1079.   if (Config.AutoGAL)
  1080.     AsmGTags[16] = TRUE;
  1081.  
  1082.  
  1083.  
  1084.   if (Config.JedecSecBit)
  1085.     JEDGTags[1] = TRUE;
  1086.  
  1087.   if (Config.JedecFuseChk)
  1088.     JEDGTags[4] = TRUE;
  1089.  
  1090.   if (Config.JedecFileChk)
  1091.     JEDGTags[7] = TRUE;
  1092.  
  1093.  
  1094.  
  1095.   if (Config.ProgEmptyTest)
  1096.     WriteGTags[1] = TRUE;
  1097.  
  1098.   if (Config.ProgVerify)
  1099.     WriteGTags[4] = TRUE;
  1100.  
  1101.   if (Config.CopyEmptyTest)
  1102.     WriteGTags[7] = TRUE;
  1103.  
  1104.   if (Config.CopyVerify)
  1105.     WriteGTags[10] = TRUE;
  1106.  
  1107.   if (Config.EraseEmptyTest)
  1108.     WriteGTags[13] = TRUE;
  1109.  
  1110.  
  1111.  
  1112.   if (Config.EdWBToFront)        /* Workbench to front? */
  1113.     SelectEditorGTags[6] = TRUE;
  1114.  
  1115.                     /* get string for editor call */
  1116.   SelectEditorGTags[1] = (ULONG)&Config.EditorStr[0];
  1117.  
  1118. }
  1119.  
  1120.  
  1121.  
  1122. /* Voreinstellungen sichern -  File "s:GALer.config"*/
  1123. void SaveConfig(void)
  1124. {
  1125. long     filelength;
  1126. BPTR    fh;
  1127.  
  1128.   Config.GALType = GALType;
  1129.                     /* get string for editor call */
  1130.   strcpy(&Config.EditorStr[0], (char *)((struct StringInfo *)
  1131.             SelectEditorGadgets[0]->SpecialInfo)->Buffer);
  1132.  
  1133.   if ((fh = Open((char *)"s:GALer.config", (long)MODE_NEWFILE))) {
  1134.     filelength = Write(fh, (char *)&Config, (long)sizeof(struct Configuration));
  1135.  
  1136.     Close(fh);
  1137.  
  1138.     if (filelength == -1L)
  1139.       ErrorReq(11);
  1140.   }
  1141.   else
  1142.     ErrorReq(11);
  1143.  
  1144. }
  1145.  
  1146.  
  1147.  
  1148.  
  1149. /* SetGALType: alle Variablen usw. auf den gewünschten GAL-Typ einstellen
  1150.    Aufruf:     SetGALType(galtype);
  1151.    Parameter:  galtype = GAL16V8, GAL20V8, GAL22V10, GAL20RA10
  1152. */
  1153. void SetGALType(int galtype)
  1154. {
  1155.  
  1156.   ClearMenuStrip(window);            /* Menüs auschalten, um die */
  1157.                         /* Flags ändern zu können   */
  1158.  
  1159.   if ((galtype == GAL16V8) && (GALType != GAL16V8)) {
  1160.     GALType    = GAL16V8;
  1161.     MaxFuseAdr = MAX_FUSE_ADR16;
  1162.     RowSize    = ROW_SIZE_16V8;
  1163.     XORSize    = 8;
  1164.     SigAdr     = SIG_ADR16;
  1165.  
  1166.     SetGAL  (GAL16V8);
  1167.     DrawGAL (GAL16V8);
  1168.  
  1169.     strncpy ((char *)&title[59], (char *)"GAL16V8  ", (size_t)9);
  1170.  
  1171.                     /* 16V8-Menü Amiga-Haken setzen*/
  1172.     ItemAddress(mainmenu, FULLMENUNUM(1, 0, NOSUB))->Flags |= CHECKED;
  1173.  
  1174.                     /* 20V8, 22V10, 22RA10-Menü */
  1175.     ItemAddress(mainmenu, FULLMENUNUM(1, 1, NOSUB))->Flags &= ~CHECKED;
  1176.     ItemAddress(mainmenu, FULLMENUNUM(1, 2, NOSUB))->Flags &= ~CHECKED;
  1177.     ItemAddress(mainmenu, FULLMENUNUM(1, 3, NOSUB))->Flags &= ~CHECKED;
  1178.   }
  1179.  
  1180.  
  1181.   if ((galtype == GAL20V8) && (GALType != GAL20V8)) {
  1182.     GALType    = GAL20V8;
  1183.     MaxFuseAdr = MAX_FUSE_ADR20;
  1184.     RowSize    = ROW_SIZE_20V8;
  1185.     XORSize    = 8;
  1186.     SigAdr     = SIG_ADR20;
  1187.  
  1188.     SetGAL  (GAL20V8);
  1189.     DrawGAL (GAL20V8);
  1190.  
  1191.     strncpy ((char *)&title[59], (char *)"GAL20V8  ", (size_t)9);
  1192.  
  1193.                     /* 20V8-Menü Amiga-Haken setzen*/
  1194.     ItemAddress(mainmenu, FULLMENUNUM(1, 1, NOSUB))->Flags |= CHECKED;
  1195.  
  1196.                     /* 16V8, 22V10, 22RA10-Menü */
  1197.     ItemAddress(mainmenu, FULLMENUNUM(1, 0, NOSUB))->Flags &= ~CHECKED;
  1198.     ItemAddress(mainmenu, FULLMENUNUM(1, 2, NOSUB))->Flags &= ~CHECKED;
  1199.     ItemAddress(mainmenu, FULLMENUNUM(1, 3, NOSUB))->Flags &= ~CHECKED;
  1200.   }
  1201.  
  1202.  
  1203.   if ((galtype == GAL22V10) && (GALType != GAL22V10)) {
  1204.     GALType    = GAL22V10;
  1205.     MaxFuseAdr = MAX_FUSE_ADR22V10;
  1206.     RowSize    = ROW_SIZE_22V10;
  1207.     XORSize    = 10;
  1208.     SigAdr     = SIG_ADR22V10;
  1209.  
  1210.     SetGAL  (GAL22V10);
  1211.     DrawGAL (GAL22V10);
  1212.  
  1213.     strncpy ((char *)&title[59], (char *)"GAL22V10 ", (size_t)9);
  1214.  
  1215.                     /* 22V10-Menü Amiga-Haken setzen*/
  1216.     ItemAddress(mainmenu, FULLMENUNUM(1, 2, NOSUB))->Flags |= CHECKED;
  1217.  
  1218.                     /* 16V8, 20V8, 22RA10-Menü */
  1219.     ItemAddress(mainmenu, FULLMENUNUM(1, 0, NOSUB))->Flags &= ~CHECKED;
  1220.     ItemAddress(mainmenu, FULLMENUNUM(1, 1, NOSUB))->Flags &= ~CHECKED;
  1221.     ItemAddress(mainmenu, FULLMENUNUM(1, 3, NOSUB))->Flags &= ~CHECKED;
  1222.   }
  1223.  
  1224.  
  1225.   if ((galtype == GAL20RA10) && (GALType != GAL20RA10)) {
  1226.     GALType    = GAL20RA10;
  1227.     MaxFuseAdr = MAX_FUSE_ADR20RA10;
  1228.     RowSize    = ROW_SIZE_20RA10;
  1229.     XORSize    = 10;
  1230.     SigAdr     = SIG_ADR20RA10;
  1231.  
  1232.     SetGAL  (GAL20RA10);
  1233.     DrawGAL (GAL20RA10);
  1234.  
  1235.     strncpy ((char *)&title[59], (char *)"GAL20RA10", (size_t)9);
  1236.  
  1237.                     /* 22V10-Menü Amiga-Haken setzen*/
  1238.     ItemAddress(mainmenu, FULLMENUNUM(1, 3, NOSUB))->Flags |= CHECKED;
  1239.  
  1240.                     /* 16V8, 20V8, 22RA10-Menü */
  1241.     ItemAddress(mainmenu, FULLMENUNUM(1, 0, NOSUB))->Flags &= ~CHECKED;
  1242.     ItemAddress(mainmenu, FULLMENUNUM(1, 1, NOSUB))->Flags &= ~CHECKED;
  1243.     ItemAddress(mainmenu, FULLMENUNUM(1, 2, NOSUB))->Flags &= ~CHECKED;
  1244.   }
  1245.  
  1246.  
  1247.  
  1248.   SetWindowTitles(window, (char *)-1L, (char *)title);
  1249.  
  1250.  
  1251.   ResetMenuStrip(window, mainmenu);        /* Menüs wieder setzen */
  1252.  
  1253. }
  1254.  
  1255.  
  1256.  
  1257.  
  1258.  
  1259.  
  1260. /* Die Routienen  "AddByte", "AddString", "IncPointer", "DecPointer" und
  1261.    "FreeBuffer" erleichtern die Erstellung und Bearbeitung von verketteten
  1262.    Speicherlisten.
  1263. */
  1264.  
  1265.  
  1266. /*AddByte:   Schreibt das Byte "code" in den Puffer. Wenn das Ende des
  1267.          Puffers erreicht ist, wird ein neuer erstellt
  1268.          (Struktur Buffer).
  1269.   Aufruf   : result = AddByte(buff,code);
  1270.   Einsprung: code: Byte das in den Puffer an die Position "buff"
  1271.          geschrieben werden soll, "buff" wird anschließend um eins erhöht
  1272.          buff: Zeiger auf ActBuffer-Struktur
  1273.   Ergebnis:  Returnwert = 0: alles o.k.    sonst: Fehler (kein Speicher)
  1274.          buff enthält neuen Entry-Zeiger und den entsprechenden Puffer-
  1275.          Anfang und das Ende
  1276. */
  1277. int AddByte(struct ActBuffer *buff, UBYTE code)
  1278. {
  1279. struct    Buffer    *mybuff;
  1280.  
  1281.  if ((buff->Entry) < (buff->BuffEnd)) {        /*noch im Puffer?*/
  1282.    *buff->Entry++ = code;            /*ja, dann Byte eintragen*/
  1283.   }
  1284.  else {                    /*nein, dann neuen Puffer erstellen*/
  1285.    if (!(mybuff = (struct Buffer *)AllocMem((long)sizeof(struct Buffer),MEMF_PUBLIC|MEMF_CLEAR))) {
  1286.      ErrorReq(2);            /*kein Speicher mehr->Fehlermeldung*/
  1287.      return(-1);
  1288.     }
  1289.    buff->ThisBuff->Next   = mybuff;    /*neuer Puffer ist aktueller*/
  1290.    mybuff->Prev   = buff->ThisBuff;    /*vorheriger Puffer ist alter*/
  1291.    buff->ThisBuff = mybuff;        /*aktueller Puffer ist neuer*/
  1292.    buff->Entry    = (UBYTE *)(&mybuff->Entries[0]);
  1293.    buff->BuffEnd  = (UBYTE *)mybuff + (long)sizeof(struct Buffer);
  1294.    *buff->Entry++ = code;
  1295.   }
  1296.  return(0);
  1297. }
  1298.  
  1299.  
  1300.  
  1301. /*AddString: Schreibt den String "strnptr" in den Puffer. Wenn das Ende des
  1302.          Puffers erreicht ist, wird ein neuer erstellt.
  1303.          (Struktur Buffer).
  1304.   Aufruf   : result = AddString(buff,strnptr);
  1305.   Einsprung: strnptr: Zeiger auf String der in den Puffer an die Position
  1306.          "buff" geschrieben werden soll, "buff" zeigt zum Schluß auf
  1307.          das lezte Zeichen im String + 1.
  1308.          buff: Zeiger auf ActBuffer-Struktur
  1309.   Ergebnis:  Returnwert = 0: alles o.k.    sonst: Fehler (kein Speicher)
  1310.          buff enthält neuen Entry-Zeiger und den entsprechenden Puffer-
  1311.          Anfang und das Ende
  1312. */
  1313. int AddString(struct ActBuffer *buff, UBYTE *strnptr)
  1314. {
  1315.   while (*strnptr) {
  1316.     if (AddByte(buff,*strnptr++))
  1317.       return(-1);
  1318.   }
  1319.   return(0);
  1320. }
  1321.  
  1322.  
  1323.  
  1324. /*IncPointer:   Zeiger  auf nächsten Eintrag im verketten Puffer
  1325.  
  1326.    Aufruf:     IncPointer(buff);
  1327.    Parameter:    buff            : Zeiger auf ActBuffer-Struktur
  1328.    Ergebnis :    buff->Entry   : zeigt auf nächstes Zeichen im Puffer
  1329.         buff->BuffEnd : zeigt auf das Ende des Puffers, in den
  1330.                     Entry zeigt
  1331.         buff->ThisBuff: zeigt auf Puffer-Anfang
  1332. ACHTUNG: es erfolgt keine Abfrage, ob das Ende des gesamten Puffers
  1333.      schon erreicht ist
  1334. */
  1335. void IncPointer(struct ActBuffer *buff)
  1336. {
  1337.  
  1338.   buff->Entry++;
  1339.  
  1340.   if (buff->Entry == buff->BuffEnd) {    /*Pufferende erreicht?*/
  1341.     buff->ThisBuff = buff->ThisBuff->Next; /*ja, dann auf nächsten Puffer*/
  1342.  
  1343.     buff->Entry    = (UBYTE *)(&buff->ThisBuff->Entries[0]);
  1344.  
  1345.     buff->BuffEnd  = (UBYTE *)buff->ThisBuff + (long)sizeof(struct Buffer);
  1346.   }
  1347.  
  1348. }
  1349.  
  1350.  
  1351. /*DecPointer:   Zeiger  auf vorigen Eintrag im verketten Puffer
  1352.  
  1353.    Aufruf:      IncPointer(buff);
  1354.    Parameter:    buff            : Zeiger auf ActBuffer-Struktur
  1355.    Ergebnis :    buff->Entry   : zeigt auf voriges Zeichen im Puffer
  1356.         buff->BuffEnd : zeigt auf das Ende des Puffers, in den
  1357.                     Entry zeigt
  1358.         buff->ThisBuff : zeigt auf Puffer-Anfang
  1359. ACHTUNG: es erfolgt keine Abfrage, ob der Anfang des gesamten Puffers
  1360.      schon erreicht ist
  1361. */
  1362. void DecPointer(struct ActBuffer *buff)
  1363. {
  1364.  
  1365.   buff->Entry--;
  1366.  
  1367.   if (buff->Entry < &buff->ThisBuff->Entries[0]) { /*Pufferanfang erreicht?*/
  1368.     buff->ThisBuff = buff->ThisBuff->Prev;    /*dann auf vorigen Puffer*/
  1369.  
  1370.     buff->BuffEnd  = (UBYTE *)buff->ThisBuff + (long)sizeof(struct Buffer);
  1371.  
  1372.     buff->Entry    = (UBYTE *)((buff->BuffEnd)-1L);
  1373.   }
  1374.  
  1375. }
  1376.  
  1377.  
  1378. /*FreeBuffer:   gibt die verketteten Puffer wieder frei
  1379.  Aufruf:      FreeBuffer(buff);
  1380.  Einsprung:   buff: Zeiger auf ersten Speicherblock
  1381.  Ergebnis :   ---
  1382. */
  1383. void FreeBuffer(struct Buffer *buff)
  1384. {
  1385. struct    Buffer    *nextbuff;
  1386.  
  1387.   do {
  1388.  
  1389.     nextbuff = buff->Next;
  1390.  
  1391.     FreeMem(buff,(long)sizeof(struct Buffer)); }
  1392.  
  1393.   while (buff = nextbuff);
  1394. }
  1395.  
  1396.  
  1397.  
  1398.  
  1399. /* open window to select editor
  1400. */
  1401. void SelectEditor(void)
  1402. {
  1403. struct    Window             *SelEdWin;
  1404. struct    IntuiMessage    *imsg;
  1405. ULONG    class;
  1406. USHORT    code, gadID;
  1407. UWORD    offy = screen->WBorTop + screen->RastPort.TxHeight + 1;
  1408.  
  1409.  
  1410.   if (!(SelEdWin = OpenWindowTags( NULL,
  1411.                 WA_Left,    165,
  1412.                 WA_Top,        25,
  1413.                 WA_Width,    310,
  1414.                 WA_Height,    78 + offy,
  1415.                 WA_IDCMP,    STRINGIDCMP|CHECKBOXIDCMP|BUTTONIDCMP|IDCMP_GADGETDOWN|IDCMP_VANILLAKEY|
  1416.                         IDCMP_REFRESHWINDOW,
  1417.                 WA_Flags,    WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
  1418.                 WA_Gadgets,    SelectEditorGList,
  1419.                 WA_Title,    AppStrings[MSG_SELEDITOR_WIN].as_Str,
  1420.                 WA_CustomScreen, screen,
  1421.                 TAG_DONE )))
  1422.     return;
  1423.  
  1424.  
  1425.   GT_RefreshWindow(SelEdWin, NULL);
  1426.  
  1427.  
  1428.   for (;;) {
  1429.  
  1430.     Wait (1 << SelEdWin->UserPort->mp_SigBit);
  1431.  
  1432.     while (imsg = GT_GetIMsg(SelEdWin->UserPort)) {
  1433.  
  1434.       class = imsg->Class;
  1435.       code  = imsg->Code;
  1436.  
  1437.       if (class == GADGETUP)
  1438.         gadID = ((struct Gadget *)imsg->IAddress)->GadgetID;
  1439.  
  1440.       GT_ReplyIMsg(imsg);
  1441.  
  1442.  
  1443.       if (class == VANILLAKEY) {
  1444.     if (code == 13) {            /* Return-Key = Weiter */
  1445.       CloseWindow(SelEdWin);
  1446.       return;
  1447.     }
  1448.       }
  1449.  
  1450.       if (class == GADGETUP) {
  1451.         gadID = ((struct Gadget *)imsg->IAddress)->GadgetID;
  1452.  
  1453.     switch (gadID) {
  1454.  
  1455.       case GD_SelEdGad02:
  1456.         Config.EdWBToFront = !Config.EdWBToFront;
  1457.         break;
  1458.  
  1459.       case GD_SelEdGad03:
  1460.         CloseWindow(SelEdWin);
  1461.         return;
  1462.         break;
  1463.  
  1464.     }
  1465.       }
  1466.     }
  1467.   }
  1468. }
  1469.  
  1470.  
  1471.  
  1472. /* call editor and replace %s with current *.pld
  1473. */
  1474. void CallEditor(void)
  1475. {
  1476. char  callstrn[100 + EDITOR_STR_SIZE];
  1477. BPTR  ofh;
  1478.  
  1479.  
  1480.   if (Config.EdWBToFront)            /* bring WB to front? */
  1481.     WBenchToFront();
  1482.  
  1483.  
  1484.   if (ofh = Open("NIL:", (long)MODE_NEWFILE)) {    /* open file handle */
  1485.  
  1486.     if (strlen(prevSourceFile) <= 100) {    /* is string too long? */
  1487.  
  1488.       sprintf(&callstrn[0], (char *)((struct StringInfo *)
  1489.                     SelectEditorGadgets[0]->SpecialInfo)->Buffer,
  1490.                 prevSourceFile);
  1491.  
  1492.       if (Execute(&callstrn[0], NULL, ofh) == FALSE)
  1493.         rtEZRequestTags(AppStrings[MSG_CALLED_ERR].as_Str,
  1494.              AppStrings[MSG_CANCEL_GAD].as_Str, NULL, NULL, RT_ReqPos,
  1495.              REQPOS_CENTERSCR, TAG_END);
  1496.  
  1497.     }
  1498.  
  1499.     Close(ofh);                    /* close output file handle */
  1500.  
  1501.   }
  1502.  
  1503.   if (Config.EdWBToFront) {
  1504.     ScreenToFront(screen);        /* get back GALer's window */
  1505.  
  1506.     ActivateWindow(window);
  1507.   }
  1508. }
  1509.  
  1510.