/*========================================================
*
*     a_source.c
*     Prints assembler source from DisplayMenu
*
*     This code MAY NOT be redistributed if it is
*     modified in any way whatsoever.
*
*     For Lattice/SAS Version 5.10a or higher:
*
*     Compile:
*     lc -cfist -v -y -b1 a_source.c 
*
*     Link:
*     Blink FROM
*           c.o
*           main.o
*           a_source.o
*           b_source.o
*           c_source.o
*           TO ms
*           LIB lc.lib
*
*
*  MenuScript a_source.c
*  Version 1.14
*  Copyright (c) 1991 David T. Ossorio
*  All Rights Reserved.
*
*=======================================================*/

#include <stdio.h>
#include <string.h>
#include <exec/types.h>
#include <intuition/intuition.h>

#ifdef LATTICE
#include <proto/all.h>
#endif

extern VOID pcl(char type);
extern VOID print_header(char type);

extern struct Image *CheckMarkImage;
extern struct TextAttr *textAttr;
extern BOOL own_font;
extern UBYTE *mname;

static UBYTE menuflags[32];
static UBYTE itemflags[128];

/*=========================================================
*  functions
*========================================================*/

VOID print_a_source(struct Menu *fm);
VOID SetMenuFlags(struct Menu *menu);
VOID SetItemFlags(struct MenuItem *item);
VOID PrintMenuText(struct Menu *menu);
VOID PrintMenuItems(struct MenuItem *item);
VOID PrintItemText(struct Menu *menu);
VOID WriteIText(struct MenuItem *item);
VOID WriteTxt(struct IntuiText *itext);

/*========================================================
*  
*  SetItemFlags()
*  Creates a string out of item->Flags.
*  i.e:  CHECKIT becomes "CHECKIT"
*
*=======================================================*/

/*    
   Normally we would just test the flags with
   (flags & bit), but sometimes flags are not really
   flags, and I'm tired of playing cute games with
   Commodore, so I make VERY sure only the flag I want
   is tested.  This all came about because HIGHNONE is not
   really a flag but actually has the value of 0xc0, so
   two bits are really set.  In an earlier version when
   flags were tested with (flags & bit) this caused a MAJOR
   bug which took BEAUCOUP time to track down, so now I take
   no chances...
*/
     
VOID SetItemFlags(struct MenuItem *item)
{
   REGISTER USHORT flags = item->Flags; 
   strcpy(itemflags,"NULL");
   
   if((flags & CHECKIT)==CHECKIT) 
      strcat(itemflags,"!CHECKIT");
   if((flags & CHECKED)==CHECKED) 
      strcat(itemflags,"!CHECKED");
   if((flags & ITEMTEXT)==ITEMTEXT) 
      strcat(itemflags,"!ITEMTEXT");
   if((flags & COMMSEQ)==COMMSEQ) 
      strcat(itemflags,"!COMMSEQ");
   if((flags & MENUTOGGLE)==MENUTOGGLE) 
      strcat(itemflags,"!MENUTOGGLE");
   if((flags & ITEMENABLED)==ITEMENABLED) 
      strcat(itemflags,"!ITEMENABLED");
   
   if((flags & HIGHNONE)==HIGHNONE) 
      strcat(itemflags,"!HIGHNONE");
   else if((flags & HIGHCOMP)==HIGHCOMP) 
      strcat(itemflags,"!HIGHCOMP");
   else if((flags & HIGHBOX)==HIGHBOX) 
      strcat(itemflags,"!HIGHBOX");
   else strcat(itemflags,"!HIGHIMAGE");
      
   return;
}
   
/*=========================================================
*  PrintMenuItems()
*========================================================*/

VOID PrintMenuItems(struct MenuItem *fi)
{
   REGISTER struct MenuItem *item = fi;
   
   while (item) {
      
      SetItemFlags(item);
      pcl('a');
      printf(";MenuItem structure for item \"%s\"\n",
            ((struct IntuiText *)item->ItemFill)->IText);
      
      pcl('a');
      printf("menuitem_%x:\n",item);
            
      if(item->NextItem) 
         printf("\tdc.l\tmenuitem_%x\t\t;NextItem\n",item->NextItem);
      else
         printf("\tdc.l\tNULL\t\t;NextItem\n");
         
      printf("\tdc.w\t%d,%d\t\t;LeftEdge,TopEdge\n",
               item->LeftEdge,item->TopEdge);
      printf("\tdc.w\t%d,%d\t\t;Width,Height\n",item->Width,item->Height);
      printf("\tdc.w\t%s ;Flags\n",itemflags);
      printf("\tdc.l\t%d\t\t;MutualExclude\n",item->MutualExclude);
      printf("\tdc.l\titemtext_%x\t\t;ItemFill\n",item->ItemFill);
            
      if(item->SelectFill)
         printf("\tdc.l\titemtext_%x\t\t;SelectFill\n",item->SelectFill);
      else
         printf("\tdc.l\tNULL\t\t;SelectFill\n");
         
      if(item->Command)
         printf("\tdc.b\t'%c',0\t\t;Command,KludgeFill\n",item->Command);
      else
         printf("\tdc.b\t0,0\t\t;Command,KludgeFill\n");
         
               
      if(item->SubItem)
         printf("\tdc.l\tmenuitem_%x\t\t;SubItem\n",item->SubItem);
      else
         printf("\tdc.l\tNULL\t\t;SubItem\n");
         
      printf("\tdc.w\tNULL\t\t;NextSelect\n");
      PrintMenuItems(item->SubItem);
    
      item = item->NextItem;
   
   }     /* end while */
         
   return;
}                                   
/*---------------------------------------------------------------
*  print_a_source()
*-----------------------------------------------------------------*/


VOID print_a_source(fm)
struct Menu *fm;
{
     REGISTER struct Menu *menu = fm;
                   
      /* print heading information  */

     fprintf(stderr,"\nWriting Assembler Source Code...\n"); 
        
     print_header('a');
     
    printf("\n\n\tinclude\t'exec/types.i'\n"
            "\tinclude\t'intuition/intuition.i'\n\n"
            "\tIFND NULL\nNULL\t\tEQU\t0\n\tENDC\n\n\tXDEF\t%s\n\n",mname);
            
     if(own_font) {
      pcl('a');
      printf(";Your font is here, but you still must open it yourself...\n");
      pcl('a');
      printf("\n\tXDEF MAttr\n\n");
      printf("MAttr:\n\tdc.l\tMAttr_Name\n\tdc.w\t%d\n\t"
      "dc.b\t%d\n\tdc.b\t%d\nMAttr_Name:\tdc.b\t\"%s\",0\n\tCNOP\t0,2\n\n",
      textAttr->ta_YSize,textAttr->ta_Style,
      textAttr->ta_Flags,textAttr->ta_Name);
      }
      
      if(CheckMarkImage) {
         
         ULONG i;
         pcl('a');
         printf(";Your checkmark image is here, but you must be\n"
                ";sure that it is in CHIP ram.  If you're using\n"
                ";A68k this is taken care of, if not, you may have\n"
                ";to change this line.\n");
         pcl('a');
         
         printf("\tSECTION MenuData,DATA,CHIP\n\n");
         
         printf("\n\tXDEF CheckMarkImage\nCheckMarkImage:\n\n");
         printf("\tdc.w\t%d,%d,%d,%d,%d\n\t"
                  "dc.l\tImageData\n\tdc.b\t%d,%d\n\tdc.l\tNULL\n",
            CheckMarkImage->LeftEdge,CheckMarkImage->TopEdge,
            CheckMarkImage->Width,CheckMarkImage->Height,
            CheckMarkImage->Depth,CheckMarkImage->PlanePick,
            CheckMarkImage->PlaneOnOff);
            
        printf("ImageData:\n");
        
        for(i = 0;i < CheckMarkImage->Width/16*CheckMarkImage->Height;i++)
         printf("\tdc.w\t$%x\n",CheckMarkImage->ImageData[i]);
        printf("\n\n");
      }
            
                  
       
     while (menu) {
      
         SetMenuFlags(menu);
         pcl('a');
         printf(";Menu Structure for Menu \"%s\"\n",menu->MenuName);
         pcl('a');
         
         if(menu == fm)      /* first menu of the list */
             printf("\n%s:\n",mname);     
         else printf("\n\nmenu_%x:\n",menu);
         
         if(menu->NextMenu) 
             printf("\tdc.l\tmenu_%x\t\t;NextMenu\n",menu->NextMenu);
         else
             printf("\tdc.l\tNULL\t\t;NextMenu\n");
                 
         printf("\tdc.w\t%d,%d\t\t;LeftEdge,TopEdge\n",
               menu->LeftEdge,menu->TopEdge);
         printf("\tdc.w\t%d,%d\t\t;Width,Height\n",
               menu->Width,menu->Height);
         printf("\tdc.w\t%s\t\t;Flags\n",menuflags);
         printf("\tdc.l\tmenutext_%x\t\t;MenuName\n",menu->MenuName);
         
         if(menu->FirstItem) 
            printf("\tdc.l\tmenuitem_%x\t\t;FirstItem\n",menu->FirstItem);
         else 
            printf("\tdc.l\tNULL\t\t;FirstItem\n");
         
         printf("\tdc.w\tNULL,NULL,NULL,NULL\t\t;Jazz\n");
         
                                        
         PrintMenuItems(menu->FirstItem);                 
         menu = menu->NextMenu;

     }     /* end while */
     
     PrintMenuText(fm);     /* print all the text for menunames */
     PrintItemText(fm);

     pcl('a');
     printf(";if 'included' instead of linked, delete this\n");
     pcl('a');
     printf("\n\tEND\n");


}

/*--------------------------------------------------------------
*  PrintMenuText()
*---------------------------------------------------------------*/

VOID PrintMenuText(struct Menu *fm)
{
   REGISTER struct Menu *menu = fm;
   
   pcl('a');
   printf(";Text Definitions for Menu Title Bars...\n");
   pcl('a');
   printf("\n");
   
   while (menu) {      
      printf("menutext_%x:\tdc.b\t\"%s\",0\n\t\tCNOP\t0,2\n",
      menu->MenuName,menu->MenuName);
      menu = menu->NextMenu;
   }
}
/*-----------------------------------------------------------
*     PrintItemText()
*------------------------------------------------------------*/
VOID PrintItemText(struct Menu *fm)
{
   REGISTER struct Menu *menu = fm;
   REGISTER struct MenuItem *item;
   REGISTER struct MenuItem *subi;
         
   pcl('a');
   printf(";Text Definitions for items and subitems...\n");
   pcl('a');
   printf("\n\n");
   
   while (menu) {
      item = menu->FirstItem;
      
      while (item) {
         WriteIText(item);
         subi = item->SubItem;
         
         while(subi) {
            WriteIText(subi);
            subi = subi->NextItem;
         }
         
         item = item->NextItem;
      }
      
      menu = menu->NextMenu;
   }
   return;
}
/*------------------------------------------------------------
* WriteIText()
*-------------------------------------------------------------*/
VOID WriteIText(struct MenuItem *item)
{
   if(item->ItemFill) WriteTxt( (struct IntuiText *)item->ItemFill);
   if(item->SelectFill) WriteTxt( (struct IntuiText *)item->SelectFill);
   return;
}
/*-------------------------------------------------------------
*  WriteTxt()
*--------------------------------------------------------------*/

VOID WriteTxt(struct IntuiText *itext)
{
   printf("\nitemtext_%x:\n",itext);
   printf("\tdc.b\t%d,%d,%d,%d\t;FrontPen,BackPen,DrawMode,KludgeFill\n",
         itext->FrontPen,itext->BackPen,itext->DrawMode,0);
   printf("\tdc.w\t%d,%d\t\t;LeftEdge,TopEdge\n",
         itext->LeftEdge,itext->TopEdge);
         
   if(own_font) 
      printf("\tdc.l\t%s_font\t\t;ITextFont\n");
   else
      printf("\tdc.l\tNULL\t\t;ITextFont\n");
      
   printf("\tdc.l\tactual_%x\t\t;IText\n",itext->IText);
   printf("\tdc.l\tNULL\t\t;NextText\n");
   printf("actual_%x:\tdc.b\t\"%s\",0\n\tCNOP\t0,2\n",
      itext->IText,itext->IText);
      
   return;
}                        

            
            
/*----------------------------------------------------------
*  SetMenuFlags()
*------------------------------------------------------------*/

VOID SetMenuFlags(struct Menu *menu)
{
   strcpy(menuflags,"NULL");
   if(menu->Flags & MENUENABLED) strcat(menuflags,"!MENUENABLED");
   return;
}      
      
