home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 5 / DATAFILE_PDCD5.iso / utilities / m / motorola / !AsRef / Sources / c / as next >
Text File  |  1993-07-18  |  15KB  |  413 lines

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4.  
  5. /* #include <kernel.h> */
  6.  
  7. #include "mselect.h"    /*external selection of microprocessor symbol table*/
  8. #include "proto.h"
  9. #include "as.h"
  10. #include "structs.h"
  11. #include "glovars.h"
  12.  
  13. void            stable(struct nlist * ptr);
  14. void            cross(struct nlist * point);
  15.  
  16. /*
  17.  * as --- cross assembler main program
  18.  * 
  19.  * Note: Compile with define DEBUG for function module debug statements. Compile
  20.  * with define DEBUG2 for version 2 debug statements only.  Compile with
  21.  * define IBM to use original, non- Amiga, non-MAC, non-UNIX fgets()
  22.  * function.  Amiga version will accept IBM generated source code but not the
  23.  * other way around. Note added version (TER) 2.01 19 June 1989.
  24.  */
  25.  
  26. int
  27. main(int argc, char **argv)
  28. {
  29.         char          **np;
  30.         char           *i;
  31.         int             j = 0;
  32.  
  33.         fprintf(stderr, "Assembler release TER_2.0 version 2.09 - (c) Motorola (free ware)\n");
  34.         fprintf(stderr, "Archimedes porting April 1993 Maurizio Ferrari - version 2.00\n");
  35.  
  36.         if (argc < 2) {
  37.                 fprintf(stderr, "Usage:   %s [files] [-options]\n", argv[j]);
  38.                 fprintf(stderr, "Example: %s FILE1.ASM FILE2.ASM -o <Obj_name> -x -list <List_name> -cyc -p50 -crlf -nnf\n", argv[j]);
  39.                 exit(1);
  40.         }
  41.         Argv = argv;
  42.         while ((*argv[j] != '-') && (j < argc)) {
  43. #ifdef DEBUG
  44.                 printf("%s\n", argv[j]);
  45. #endif
  46.                 j++;
  47.         }
  48.         N_files = j - 1;
  49.         Lflag = 0;
  50.         Cflag = 0;
  51.         Sflag = 0;
  52.         CREflag = 0;
  53.         if (j < argc) {
  54.                 while (j < argc) {
  55.                         for (i = argv[j]; *i != 0; i++)
  56.                                 if ((*i <= 'Z') && (*i >= 'A'))
  57.                                         *i = *i + 32;
  58.                         if (strcmp(argv[j], "-list") == 0) {
  59.                                 Lflag = 1;
  60.                         } else if (strcmp(argv[j], "-cyc") == 0)
  61.                                 {Cflag = 1;}
  62.                         else if (strcmp(argv[j], "-sym") == 0)
  63.                                 {Sflag = 1;}
  64.                         else if (strcmp(argv[j], "-x") == 0)
  65.                                 {CREflag = 1;}
  66.                         else if (strcmp(argv[j], "-crlf") == 0) /* test for crlf option */
  67.                                 {CRflag = 1;}     /* add <CR><LF> to S record */
  68.                         /* ver TER_1.1 June 3, 1989 */
  69.                         else if (strcmp(argv[j], "-nnf") == 0)  /* test for nnf option */
  70.                                 {nfFlag = 0;}     /* nfFlag=1 means number
  71.                                                  * INCLUDE separately. ver
  72.                                                  * TER_2.0 6/17/89 */
  73.                         else if (strcmp(argv[j], "-p") == 0)  /* page every 50 lines */
  74.                                 {Pflag50 = 1;
  75.                                 PageLen = atoi(argv[++j]);}    /* ver (TER) 2.01 19 Jun 89 */
  76.                         else if (strcmp(argv[j], "-o") == 0) {
  77.                                 ObjFilePos = ++j;
  78.                         } else if (*argv[j]) {
  79.                                 fprintf(stderr, "\nUnrecognized option '%s' on command line\n", argv[j]);
  80.                                 fprintf(stderr, "Valid options are:");
  81.                                 fprintf(stderr, "  -list  -cyc  -sym  -x  -crlf -nnf -p <pages> -o <Obj name>\n\n");
  82.                                 exit(1);
  83.                         }
  84.                         j++;
  85.                 }
  86.         }
  87.         if (ObjFilePos == 0)
  88.                 fatal("\nmust specify output file");
  89.         /* errorInit(throwback,SourceFileName); */
  90.         fwdinit();              /* forward ref init */
  91.         initialize();
  92.         root = NULL;
  93.         Cfn = 0;
  94.         np = argv;
  95.         Line_num = 0;           /* reset line number */
  96.         Local_Line_num = 0;     /* reset line number */
  97.         while (++Cfn <= N_files)
  98.                 if ((Fd = fopen(*++np, "r")) == NULL) {
  99.                         fprintf(stderr, "as: can't open %s\n", *np);
  100.                 } else {
  101.                         errorInit(1, *np);
  102.                         make_pass();
  103.                         fclose(Fd);
  104.                         errorFinish();
  105.                         Local_Line_num = 0;     /* reset line number */
  106.                 }
  107.         if (Err_count == 0) {
  108.                 Pass++;
  109.                 re_init();
  110.                 Cfn = 0;
  111.                 np = argv;
  112.                 Line_num = 0;
  113.                 Local_Line_num = 0;
  114.                 FdCount = 0;    /* Resets INCLUDE file nesting ver TER_2.0
  115.                                  * 6/17/89 */
  116.                 while (++Cfn <= N_files)
  117.                         if ((Fd = fopen(*++np, "r")) != NULL) {
  118.                                 fprintf(stderr, "\nAssembling %s\n", *np);
  119.                                 errorInit(1, *np);
  120.                                 make_pass();
  121.                                 fclose(Fd);
  122.                                 errorFinish();
  123.                                 Local_Line_num = 0;     /* reset Line_num for
  124.                                                          * throwback */
  125.                         }
  126.                 fprintf(stderr, "\nProgram + Init Data = %d bytes\n", F_total); /* print total bytes */
  127.                 fprintf(stderr, "Error count = %d\n\n", Err_count);     /* rel TER_2.0 */
  128.                 if (Sflag == 1) {
  129.                         fprintf(stderr, "Writing Symbols file\n");
  130.                         stable(root);
  131.                         fclose (Mapfil);
  132.                 }
  133.                 if (CREflag == 1) {
  134.                         fprintf(stderr, "Writing Xref file\n");
  135.                         cross(root);
  136.                         fclose (Xfil);
  137.                 }
  138.                 if (CRflag == 1)
  139.                         fprintf(Objfil, "S9030000FC%c\n", CR);  /* ver TER_1.1 print w
  140.                                                                  * <CR> */
  141.                 else
  142.                         fprintf(Objfil, "S9030000FC\n");        /* at least give a
  143.                                                                  * decent ending */
  144.                 fclose(Objfil); /* close file correctly ver TER_1.1 */
  145.                 fclose(Listfil); /* close file */
  146.         } else {                /* just note errors, TER_2.0 */
  147.                 fprintf(stderr, "\nProgram + Init Data = %d bytes\n", F_total); /* print total bytes */
  148.                 fprintf(stderr, "Error count = %d\n\n", Err_count);
  149.                 fclose(Listfil); /* close file */      
  150.                 }
  151.         fwd_done();
  152.         errorFinish();
  153.         exit(Err_count);        /* neat for UNIX cuz can test return value in
  154.                                  * script but on other systems like Amiga,
  155.                                  * mostly just makes further script
  156.                                  * statements fail if >10, else nothing.
  157.                                  * Therefore, printed out byte count and
  158.                                  * error level. ver (TER) 2.02 19 Jun 89 */
  159. }
  160.  
  161. void
  162. initialize(void)
  163. {
  164.         char            c;
  165.         char            *leafname, *maproot, *xroot, *lroot;/*input file leaf and output names*/
  166.         int             i = 0;
  167.  
  168. #ifdef DEBUG
  169.         printf("Initializing\n");
  170. #endif
  171.         Err_count = 0;
  172.         Pc = 0;
  173.         Pass = 1;
  174.         Ctotal = 0;
  175.         N_page = 0;
  176.         Line[MAXBUF - 1] = NEWLINE;
  177.         if (strlen(Argv[ObjFilePos]) > FILENAME_MAX)
  178.                 fatal("obj_file name too long ");
  179.         Obj_name = (char *) malloc(strlen(Argv[ObjFilePos]));
  180.         lroot = (char *) malloc(strlen(Argv[1]));
  181.         maproot = (char *) malloc(strlen(Argv[1]));
  182.         xroot = (char *) malloc(strlen(Argv[1]));
  183.         if (Obj_name == NULL)
  184.                 fatal("Cannot allocate space for obj name");
  185.         if (lroot == NULL)
  186.                 fatal("Cannot allocate space for list file name");
  187.         if (maproot == NULL)
  188.                 fatal("Cannot allocate space for  map file name");
  189.         if (xroot == NULL)
  190.                 fatal("Cannot allocat