home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d5xx / d563 / menu2asm.lha / Menu2Asm / Menu2Asm.mod < prev    next >
Text File  |  1991-11-20  |  13KB  |  430 lines

  1. (**********************************************************************
  2.  
  3.     :Program.    Menu2Asm.mod
  4.     :Contents.   Procedure which writes an initialized menu as A68k-
  5.     :Contents.   compatible source-code on disk
  6.     :Author.     Jürgen Zimmermann [JnZ]
  7.     :Address.    Ringstraße 6, W-6719 Altleiningen, Germany
  8.     :Phone.      06356/1456
  9.     :Copyright.  Freeware (but donation is always welcome!)
  10.     :Language.   Modula-2
  11.     :Translator. M2Amiga AMSoft V4.096d
  12.     :History.    V1.13 [JnZ] 04.Jun.1991 first published version
  13. **********************************************************************)
  14.  
  15. IMPLEMENTATION MODULE Menu2Asm;
  16.  
  17. FROM IntuitionD IMPORT Window, WindowPtr, Menu, MenuPtr, MenuItem,
  18.                        MenuItemPtr, MenuItemFlags, MenuItemFlagSet,
  19.                        IntuiText, IntuiTextPtr;
  20.  
  21. IMPORT io: InOut,
  22.        co: Conversions,
  23.        d : DosL,
  24.        s : String,
  25.        SY: SYSTEM;
  26.  
  27.  
  28. CONST Version = "1.13d";
  29.       VersionDate = "04.06.91";
  30.  
  31. CONST StandardTitle = "Menu2Asm "+Version+", "+VersionDate+", © Würmi-Connection\n() Name of the module> ";
  32.  
  33.       Header1 = "; Menu created by Menu2Asm (Version "+Version+") by Jürgen Zimmermann\n; For A68k V2.61\n\n\n   IDNT ";
  34.       Header2 = "Asm\n   SECTION __MERGED,DATA\n   XDEF ";
  35.       Header3 = "Asm_MenuStrip\n\n";
  36.       Header4 = "Asm_MenuStrip:\n          DC.L Menu00\n\n";
  37.  
  38.       DefMod = 'DEFINITION MODULE ;\n\nFROM IntuitionD IMPORT MenuPtr;\n\nVAR MenuStrip[<"Asm_MenuStrip"]: MenuPtr;\n\nEND .';
  39.       ModMod = "IMPLEMENTATION MODULE ;\n\nBEGIN\nEND .";
  40.  
  41.  
  42. TYPE StrPtr = POINTER TO ARRAY[0..255] OF CHAR;
  43.  
  44.  
  45. VAR open: BOOLEAN;
  46.  
  47.  
  48. PROCEDURE OpenFiles;
  49.  
  50.    VAR ws1, ws2: ARRAY[0..200] OF CHAR;
  51.        Name: ARRAY[0..100] OF CHAR;
  52.        PathName : ARRAY[0..200] OF CHAR;
  53.        lpos: LONGINT;
  54.  
  55.  
  56.    PROCEDURE GetPathAndName(VAR file: ARRAY OF CHAR;
  57.                             VAR name: ARRAY OF CHAR);
  58.  
  59.       VAR lpos: LONGINT;
  60.           path: ARRAY[0..100] OF CHAR;
  61.  
  62.       BEGIN
  63.          name[0]:=0C;
  64.          path[0]:=0C;
  65.          lpos:=s.LastPos(file,MAX(LONGCARD),"/");
  66.          IF (lpos = s.noOccur)
  67.             THEN
  68.                lpos:=s.LastPos(file,MAX(LONGCARD),":");
  69.                IF (lpos = s.noOccur)
  70.                   THEN (* nur Filename! *)
  71.                      s.Copy(name,file);
  72.                END; (* IF *)
  73.          END; (* IF *)
  74.  
  75.          IF (lpos # s.noOccur)
  76.             THEN (* Path- & Filename! *)
  77.                s.CopyPart(path,file,0,(lpos + 1));
  78.                s.CopyPart(name,file,(lpos + 1),(s.Length(file) - (lpos + 1)));
  79.          END; (* IF *)
  80.  
  81.          lpos:=s.LastPos(name,MAX(LONGCARD),".");
  82.          IF (lpos # s.noOccur)
  83.             THEN
  84.                s.Delete(name,lpos,(s.Length(name) - lpos));
  85.          END; (* IF *)
  86.  
  87.         (* Filename aktualisieren! *)
  88.          s.Copy(file,path);
  89.          s.Concat(file,name);
  90.       END GetPathAndName;
  91.  
  92.    BEGIN
  93.       io.WriteString(StandardTitle);
  94.       io.ReadString(PathName);
  95.       GetPathAndName(PathName,Name);
  96.  
  97. (* Definitionsmodul schreiben! *)
  98.       s.Copy(ws1,PathName);
  99.       s.Concat(ws1,".def");
  100.       io.SetOutput(ws1);
  101.       IF NOT(io.done)
  102.          THEN
  103.             HALT;
  104.       END; (* IF *)
  105.       open:=TRUE;
  106.       s.Copy(ws2,DefMod);
  107.       s.Insert(ws2,101,Name);
  108.       s.Insert(ws2,70,Name); (* Variablenname *)
  109.       s.Insert(ws2,18,Name);
  110.       io.WriteString(ws2);
  111.       io.CloseOutput;
  112.       open:=FALSE;
  113.  
  114.  
  115. (* "Leeres" Implementationsmodul schreiben *)
  116.       s.Copy(ws1,PathName);
  117.       s.Concat(ws1,".mod");
  118.       io.SetOutput(ws1);
  119.       IF NOT(io.done)
  120.          THEN
  121.             HALT;
  122.       END; (* IF *)
  123.       open:=TRUE;
  124.       s.Copy(ws2,ModMod);
  125.       s.Insert(ws2,35,Name);
  126.       s.Insert(ws2,22,Name);
  127.       io.WriteString(ws2);
  128.       io.CloseOutput;
  129.       open:=FALSE;
  130.  
  131.  
  132. (* Assemblerquelltext erzeugen *)
  133.       s.Copy(ws1,PathName);
  134.       s.Concat(ws1,"Asm.asm");
  135.       io.SetOutput(ws1);
  136.       IF NOT(io.done)
  137.          THEN
  138.             HALT;
  139.       END; (* IF *)
  140.       open:=TRUE;
  141.       io.WriteString(Header1);
  142.       io.WriteString(Name);
  143.       io.WriteString(Header2);
  144.       io.WriteString(Name);
  145.       io.WriteString(Header3);
  146.       io.WriteString(Name);
  147.       io.WriteString(Header4);
  148.    END OpenFiles;
  149.  
  150.  
  151. PROCEDURE CloseFiles;
  152.  
  153.    BEGIN
  154.       IF open
  155.          THEN
  156.             io.CloseOutput;
  157.             open:=FALSE;
  158.       END; (* IF *)
  159.    END CloseFiles;
  160.  
  161.  
  162. PROCEDURE MakeMenu2Asm(window: WindowPtr);
  163.  
  164.    VAR  MenuList   : MenuPtr;
  165.         ItemList   : MenuItemPtr;
  166.         SubItemList: MenuItemPtr;
  167.         Menus      : INTEGER;
  168.         Items      : INTEGER;
  169.         SubItems   : INTEGER;
  170.  
  171.         error      : BOOLEAN; (* For "Conversions" *)
  172.         CS         : ARRAY[0..2] OF CHAR;
  173.  
  174.  
  175.     PROCEDURE MenuNumName(num     : INTEGER;
  176.                           VAR name: ARRAY OF CHAR);
  177.  
  178.        BEGIN
  179.            s.Copy(name,"Menu");
  180.            co.ValToStr(num,FALSE,CS,10,2,"0",error);
  181.            s.Insert(name,4,CS);
  182.        END MenuNumName;
  183.  
  184.  
  185.    PROCEDURE MakeMenuName(num     : INTEGER;
  186.                           VAR name: ARRAY OF CHAR);
  187.  
  188.       BEGIN
  189.          MenuNumName(num,name);
  190.          s.Insert(name,4,"Name");
  191.       END MakeMenuName;
  192.  
  193.  
  194.       PROCEDURE ItemNumName(mnum, inum: INTEGER;
  195.                             VAR name  : ARRAY OF CHAR);
  196.  
  197.          BEGIN
  198.             MenuNumName(mnum,name);
  199.             s.Insert(name,s.last,"Item");
  200.             co.ValToStr(inum,FALSE,CS,10,2,"0",error);
  201.             s.Insert(name,s.last,CS);
  202.          END ItemNumName;
  203.  
  204.  
  205.       PROCEDURE SubNumName(mnum, inum, snum: INTEGER;
  206.                            VAR name        : ARRAY OF CHAR);
  207.  
  208.          BEGIN
  209.             ItemNumName(mnum,inum,name);
  210.             s.Insert(name,s.last,"Sub");
  211.             co.ValToStr(snum,FALSE,CS,10,2,"0",error);
  212.             s.Insert(name,s.last,CS);
  213.          END SubNumName;
  214.  
  215.  
  216.       PROCEDURE WriteName(name: ARRAY OF CHAR;
  217.                           a   : StrPtr);
  218.  
  219.          VAR i: INTEGER;
  220.  
  221.          BEGIN
  222.             io.WriteString(name);
  223.             io.WriteString(':\n          DC.B "');
  224.             FOR i:=0 TO (s.Length(a^)-1) DO
  225.                io.Write(a^[i]);
  226.             END; (* FOR *)
  227.             io.WriteString('",0\n          EVEN\n\n\n');
  228.          END WriteName;
  229.  
  230.  
  231.    PROCEDURE WriteIntuiTextName(name: ARRAY OF CHAR);
  232.  
  233.        BEGIN
  234.           io.WriteString(name);
  235.           io.WriteString("IText");
  236.        END WriteIntuiTextName;
  237.  
  238.  
  239.    PROCEDURE WriteIntuiText(itp : IntuiTextPtr;
  240.                             name: ARRAY OF CHAR);
  241.  
  242.       BEGIN
  243.          s.Insert(name,s.last,"IText");
  244.          io.WriteString(name);
  245.          io.WriteString(":\n          DC.B   ");
  246.          io.WriteCard(itp^.frontPen,1);
  247.          io.Write(",");
  248.          io.WriteCard(itp^.backPen,1);
  249.          io.WriteString("\n          DC.B   ");
  250.          io.WriteCard(SY.CAST(SHORTCARD,itp^.drawMode),1);
  251.          io.WriteString(",0   ; DrawModeSet + pad\n          DC.W   ");
  252.          io.WriteCard(itp^.leftEdge,1);
  253.          io.Write(",");
  254.          io.WriteCard(itp^.topEdge,1);
  255.          io.WriteString("\n          DC.L   0   ; At this time no special font\n          DC.L   ");
  256.          s.Insert(name,s.last,"String");
  257.          io.WriteString(name);
  258.          io.WriteString("\n          DC.L   0   ; only one intuitext per item at this time \n\n\n");
  259.          WriteName(name,itp^.iText);
  260.       END WriteIntuiText;
  261.  
  262.  
  263.    PROCEDURE WriteMenu;
  264.  
  265.       VAR MenuString: ARRAY[0..30] OF CHAR;
  266.           NextMenuSt: ARRAY[0..30] OF CHAR;
  267.           FirstItemS: ARRAY[0..30] OF CHAR;
  268.           MenuName  : ARRAY[0..30] OF CHAR;
  269.           MenuNamePtr: StrPtr;
  270.           i: INTEGER;
  271.  
  272.       BEGIN
  273.          MenuNumName(Menus,MenuString);
  274.          io.WriteString(MenuString);
  275.          io.WriteString(":\n");
  276.          io.WriteString("          DC.L   ");
  277.          IF (MenuList^.nextMenu # NIL)
  278.             THEN
  279.                MenuNumName((Menus+1),NextMenuSt);
  280.                io.WriteString(NextMenuSt);
  281.             ELSE
  282.                io.WriteString("0");
  283.          END; (* IF *)
  284.  
  285.          io.WriteString("\n          DC.W    ");
  286.          io.WriteCard(MenuList^.leftEdge,1);
  287.          io.Write(",");
  288.          io.WriteCard(MenuList^.topEdge,1);
  289.          io.Write(",");
  290.          io.WriteCard(MenuList^.width,1);
  291.          io.Write(",");
  292.          io.WriteCard(MenuList^.height,1);
  293.          io.WriteString("\n          DC.W   $");
  294.          IF (0 IN MenuList^.flags)
  295.             THEN
  296.                io.WriteHex(1,4);
  297.             ELSE
  298.                io.WriteHex(0,4);
  299.          END; (* IF *)
  300. (*         io.WriteHex(SY.CAST(CARDINAL,MenuList^.flags),4); *)
  301.          io.WriteString("   ; MenuFlags\n          DC.L   ");
  302.          MakeMenuName(Menus,MenuName);
  303.          io.WriteString(MenuName);
  304.          io.WriteString("\n          DC.L   ");
  305.          ItemNumName(Menus,0,FirstItemS);
  306.          io.WriteString(FirstItemS);
  307.          io.WriteString("   ; First Item\n          DC.W   0,0,0,0\n\n\n");
  308.  
  309.          WriteName(MenuName,MenuList^.menuName);
  310.       END WriteMenu;
  311.  
  312.  
  313.    PROCEDURE WriteItem(sub: BOOLEAN);
  314.  
  315.       VAR error: BOOLEAN;
  316.           ip   : MenuItemPtr;
  317.           n    : INTEGER;
  318.           ItemString: ARRAY[0..30] OF CHAR;
  319.           ItemNString: ARRAY[0..30] OF CHAR;
  320.           ItemSString: ARRAY[0..30] OF CHAR;
  321.  
  322.       BEGIN
  323.          IF sub
  324.             THEN
  325.                ip:=SubItemList;
  326.                n :=SubItems;
  327.                SubNumName(Menus,Items,SubItems,ItemString);
  328.             ELSE
  329.                ip:=ItemList;
  330.                n :=Items;
  331.                ItemNumName(Menus,Items,ItemString);
  332.          END; (* IF *)
  333.  
  334.          io.WriteString(ItemString);
  335.          io.WriteString(":\n          DC.L   ");
  336.          IF (ip^.nextItem # NIL)
  337.             THEN
  338.                IF sub
  339.                   THEN
  340.                      SubNumName(Menus,Items,(SubItems + 1),ItemNString);
  341.                   ELSE
  342.                      ItemNumName(Menus,(Items + 1),ItemNString);
  343.                END; (* IF *)
  344.                io.WriteString(ItemNString);
  345.             ELSE
  346.                io.Write("0");
  347.          END; (* IF *)
  348.          io.WriteString("\n          DC.W   ");
  349.          io.WriteCard(ip^.leftEdge,1);
  350.          io.Write(",");
  351.          io.WriteCard(ip^.topEdge,1);
  352.          io.Write(",");
  353.          io.WriteCard(ip^.width,1);
  354.          io.Write(",");
  355.          io.WriteCard(ip^.height,1);
  356.          io.WriteString("\n          DC.W   $");
  357.          io.WriteHex(SY.CAST(CARDINAL,ip^.flags),4);
  358.          io.WriteString(" ; Flags\n          DC.L   $");
  359.          io.WriteHex(SY.CAST(LONGCARD,ip^.mutualExclude),8);
  360.          io.WriteString(" ; MutualExclude\n          DC.L   ");
  361.          WriteIntuiTextName(ItemString);
  362.          io.WriteString("  ; IntuiTextPtr\n          DC.L   0 ; selectFill (not at the moment!)\n          DC.B   ");   (* not at the moment *)
  363.          io.WriteCard(CARDINAL(ip^.command),1);
  364.          io.WriteString(",0   ; command, pad\n          DC.L   ");
  365.          IF (NOT(sub) AND (ip^.subItem # NIL))
  366.             THEN
  367.                SubNumName(Menus,Items,0,ItemSString);
  368.                io.WriteString(ItemSString);
  369.              ELSE
  370.                io.Write("0");
  371.          END; (* IF *)
  372.          io.WriteString("  ; SubItem\n          DC.W   ");
  373.          io.WriteCard(ip^.nextSelect,1);
  374.          io.WriteString("\n          DC.W   0 ; pad\n\n\n");
  375.          WriteIntuiText(ip^.itemFill,ItemString);
  376.       END WriteItem;
  377.  
  378.  
  379.    BEGIN
  380.       IF (window = NIL)
  381.          THEN
  382.             io.WriteString("The window-pointer you gave me was NIL!\n");
  383.             RETURN;
  384.       ELSIF (window^.menuStrip = NIL)
  385.          THEN
  386.             io.WriteString("There is no menu at the window you gave me!\n");
  387.             RETURN;
  388.       END; (* IF *)
  389.       OpenFiles;
  390.  
  391.  
  392.       MenuList:=window^.menuStrip;
  393.       Menus   :=0;
  394.  
  395.       WHILE (MenuList # NIL) DO
  396.          WriteMenu;
  397.  
  398.          ItemList:=MenuList^.firstItem;
  399.          Items:=0;
  400.          WHILE (ItemList # NIL) DO
  401.             WriteItem(FALSE);
  402.  
  403.             SubItemList:=ItemList^.subItem;
  404.             SubItems:=0;
  405.             WHILE (SubItemList # NIL) DO
  406.                WriteItem(TRUE);
  407.  
  408.                INC(SubItems);
  409.                SubItemList:=SubItemList^.nextItem;
  410.             END; (* WHILE *)
  411.  
  412.             INC(Items);
  413.             ItemList:=ItemList^.nextItem;
  414.          END; (* WHILE *)
  415.  
  416.          INC(Menus);
  417.          MenuList:=MenuList^.nextMenu;
  418.       END; (* WHILE *)
  419.  
  420.       io.WriteString("   END");
  421.       CloseFiles;
  422.       io.WriteString("\n\nOperation successful!\n\n");
  423.    END MakeMenu2Asm;
  424.  
  425. BEGIN
  426.    open:=FALSE;
  427. CLOSE
  428.    CloseFiles;
  429. END Menu2Asm.
  430.