home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / language / motasms / as.c next >
Encoding:
C/C++ Source or Header  |  1993-10-23  |  4.3 KB  |  223 lines

  1. #include "as.h"
  2.  
  3. char mapdn();
  4. char *alloc();
  5. /*
  6.  *    as ---    cross assembler main program
  7.  */
  8. main(argc,argv)
  9. int    argc;
  10. char    **argv;
  11. {
  12.     char    **np;
  13.     char    *i;
  14.     FILE    *fopen();
  15.     int    j = 0;
  16.  
  17.     if(argc < 2){
  18.         printf("Usage: asx file1 file2 [-opt1 opt2]\n");
  19.         exit(1);
  20.         }
  21.       Argv = argv;
  22.       initialize();
  23.       while ((*argv[j] != '-') && (j<argc))
  24.        j++;
  25.       N_files = j-1;
  26.      if (j < argc )
  27.       {
  28.       argv[j]++;
  29.       while (j<argc)
  30.        {
  31.        for (i = argv[j]; *i != 0; i++)
  32.          if ((*i <= 'Z') && (*i >= 'A'))
  33.            *i = *i + 32;
  34.        if (strcmp(argv[j],"l")==0)
  35.          Lflag = 1;
  36.        else if (strcmp(argv[j],"nol")==0)
  37.          Lflag = 0;
  38.        else if (strcmp(argv[j],"c")==0)
  39.           Cflag = 1;
  40.        else if (strcmp(argv[j],"noc")==0)
  41.          Cflag = 0;
  42.        else if (strcmp(argv[j],"s")==0)
  43.          Sflag = 1;
  44.        else if (strcmp(argv[j],"cre")==0)
  45.          CREflag = 1;
  46.         j++;
  47.        }
  48.       }
  49.     root = NULL;
  50.  
  51.     Cfn = 0;
  52.     np = argv;
  53.     Line_num = 0; /* reset line number */
  54.     while( ++Cfn <= N_files )
  55.         if((Fd = fopen(*++np,"r")) == NULL)
  56.             printf("as: can't open %s\n",*np);
  57.         else{
  58.             make_pass();
  59.             fclose(Fd);
  60.         }
  61.     if( Err_count == 0 ){
  62.         Pass++;
  63.         re_init();
  64.         Cfn = 0;
  65.         np = argv;
  66.         Line_num = 0;
  67.         while( ++Cfn <= N_files)
  68.             if((Fd = fopen(*++np,"r")) != NULL)
  69.                 {
  70.                 make_pass();
  71.                 fclose(Fd);
  72.                  }
  73.             if (Sflag == 1)
  74.               {
  75.                 printf ("\f");
  76.                 stable (root);
  77.               }
  78.             if (CREflag == 1)
  79.               {
  80.                 printf ("\f");
  81.                 cross (root);
  82.               }
  83.         fprintf(Objfil,"S9030000FC\n"); /* at least give a decent ending */
  84.         }
  85.   printf("\n\nNumber of errors %d\n",Err_count);
  86.     exit(Err_count);
  87. }
  88.  
  89. initialize()
  90. {
  91.     FILE    *fopen();
  92.     int    i = 0;
  93.  
  94. #ifdef DEBUG
  95.     printf("Initializing\n");
  96. #endif
  97.     Err_count = 0;
  98.     Pc      = 0;
  99.     Pass      = 1;
  100.     Lflag      = 0;
  101.     Cflag      = 0;
  102.     Ctotal      = 0;
  103.     Sflag      = 0;
  104.     CREflag   = 0;
  105.     N_page      = 0;
  106.     Line[MAXBUF-1] = NEWLINE;
  107.  
  108.     strcpy(Obj_name,Argv[1]); /* copy first file name into array */
  109.     do {
  110.         if (Obj_name[i]=='.')
  111.            Obj_name[i]=0;
  112.     }
  113.     while (Obj_name[i++] != 0);
  114.     strcat(Obj_name,".s19");  /* append .out to file name. */
  115.     if( (Objfil = fopen(Obj_name,"w")) == NULL)
  116.         fatal("Can't create object file");
  117.     fwdinit();    /* forward ref init */
  118.     localinit();    /* target machine specific init. */
  119. }
  120.  
  121. re_init()
  122. {
  123. #ifdef DEBUG
  124.     printf("Reinitializing\n");
  125. #endif
  126.     Pc    = 0;
  127.     E_total = 0;
  128.     P_total = 0;
  129.     Ctotal    = 0;
  130.     N_page    = 0;
  131.     fwdreinit();
  132. }
  133.  
  134. make_pass()
  135. {
  136.     char    *fgets();
  137.  
  138. #ifdef DEBUG
  139.     printf("Pass %d\n",Pass);
  140. #endif
  141.     while( fgets(Line,MAXBUF-1,Fd) != (char *)NULL ){
  142.         Line_num++;
  143.         P_force = 0;    /* No force unless bytes emitted */
  144.         N_page = 0;
  145.            if(parse_line())
  146.             process();
  147.         if(Pass == 2 && Lflag && !N_page)
  148.             print_line();
  149.         P_total = 0;    /* reset byte count */
  150.         Cycles = 0;    /* and per instruction cycle count */
  151.         }
  152.     f_record();
  153. }
  154.  
  155.  
  156. /*
  157.  *    parse_line --- split input line into label, op and operand
  158.  */
  159. parse_line()
  160. {
  161.     register char *ptrfrm = Line;
  162.     register char *ptrto = Label;
  163.     char    *skip_white();
  164.  
  165.     if((*ptrfrm == '*') || (*ptrfrm == '\n') || (*ptrfrm == ';'))
  166.         return(0);    /* a comment line */
  167.  
  168.   while( delim(*ptrfrm)== NO )
  169.       *ptrto++ = *ptrfrm++;
  170.     if(*--ptrto != ':')ptrto++;     /* allow trailing : */
  171.     *ptrto = EOS;
  172.  
  173.     ptrfrm = skip_white(ptrfrm);
  174.  
  175.     ptrto = Op;
  176.   if(*ptrfrm != ';')
  177.       while( delim(*ptrfrm) == NO)
  178.           *ptrto++ = mapdn(*ptrfrm++);
  179.     *ptrto = EOS;
  180.  
  181.     ptrfrm = skip_white(ptrfrm);
  182.  
  183.     ptrto = Operand;
  184.   if(*ptrfrm != ';')
  185.       while( *ptrfrm != NEWLINE )
  186.           *ptrto++ = *ptrfrm++;
  187.     *ptrto = EOS;
  188.  
  189. #ifdef DEBUG
  190.     printf("Label-%s-\n",Label);
  191.     printf("Op----%s-\n",Op);
  192.     printf("Operand-%s-\n",Operand);
  193. #endif
  194.     return(1);
  195. }
  196.  
  197. /*
  198.  *    process --- determine mnemonic class and act on it
  199.  */
  200. process()
  201. {
  202.     register struct oper *i;
  203.     struct oper *mne_look();
  204.  
  205.     Old_pc = Pc;        /* setup `old' program counter */
  206.     Optr = Operand;     /* point to beginning of operand field */
  207.  
  208.     if(*Op==EOS){        /* no mnemonic */
  209.         if(*Label != EOS)
  210.             install(Label,Pc);
  211.         }
  212.     else if( (i = mne_look(Op))== NULL)
  213.         error("Unrecognized Mnemonic");
  214.     else if( i->class == PSEUDO )
  215.         do_pseudo(i->opcode);
  216.     else{
  217.         if( *Label )install(Label,Pc);
  218.         if(Cflag)Cycles = i->cycles;
  219.         do_op(i->opcode,i->class);
  220.         if(Cflag)Ctotal += Cycles;
  221.         }
  222. }
  223.