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

  1. #include <string.h>
  2. #include <stdio.h>
  3.  
  4. #include "mselect.h"    /*external selection of microprocessor symbol table*/
  5. #include "proto.h"
  6. #include "as.h"
  7. #include "structs.h"
  8. #ifdef HC11
  9.         #include "table11.h"
  10. #else
  11.         #include "table5.h"
  12. #endif
  13. #include "extvars.h"
  14.  
  15. /*
  16.  * pseudo --- pseudo op processing
  17.  */
  18.  
  19. #define RMB     0               /* Reserve Memory Bytes         */
  20. #define FCB     1               /* Form Constant Bytes          */
  21. #define FDB     2               /* Form Double Bytes (words)    */
  22. #define FCC     3               /* Form Constant Characters     */
  23. #define ORG     4               /* Origin                       */
  24. #define EQU     5               /* Equate                       */
  25. #define ZMB     6               /* Zero memory bytes            */
  26. #define FILL    7               /* block fill constant bytes    */
  27. #define OPT     8               /* assembler option             */
  28. #define NULL_OP 9               /* null pseudo op               */
  29. #define PAGE    10              /* new page                     */
  30. #define INCLUDE 11              /* include <file> or "file" ver TER_2.0         */
  31. #define END     12              /* include <file> terminator ver TER_2.0        */
  32. #define IFD     13              /* if define <symbol> ver TER_2.0 */
  33. #define IFND    14              /* if not define <symbol> ver TER_2.0 */
  34. #define ELSE    15              /* else (for IF statements) ver TER_2.0 */
  35. #define ENDIF   16              /* endif (for IF statements) ver TER_2.0 */
  36. #define BSS     17              /* block storage segment (RAM) ver TER_2.09 */
  37. #define CODE    18              /* code segment ver TER_2.09 25 Jul 89 */
  38. #define DATA    19              /* data segment ver TER_2.09 25 Jul 89 */
  39. #define AUTO    20              /* data segment ver TER_2.09 25 Jul 89 */
  40.  
  41.  
  42. struct oper     pseudo[] = {
  43.         "=", PSEUDO, EQU, 0,    /* ver TER_2.09 25 Jul 89 */
  44.         "auto", PSEUDO, AUTO, 0,/* ver TER_2.09 25 Jul 89 */
  45.         "bss", PSEUDO, BSS, 0,  /* ver TER_2.09 25 Jul 89 */
  46.         "bsz", PSEUDO, ZMB, 0,
  47.         "code", PSEUDO, CODE, 0,/* ver TER_2.09 25 Jul 89 */
  48.         "data", PSEUDO, DATA, 0,/* ver TER_2.09 25 Jul 89 */
  49.         "else", PSEUDO, ELSE, 0,/* ver TER_2.0 6/17/89 */
  50.         "end", PSEUDO, END, 0,  /* ver TER_2.0 6/17/89 */
  51.         "endif", PSEUDO, ENDIF, 0,      /* ver TER_2.0 6/17/89 */
  52.         "equ", PSEUDO, EQU, 0,
  53.         "fcb", PSEUDO, FCB, 0,
  54.         "fcc", PSEUDO, FCC, 0,
  55.         "fdb", PSEUDO, FDB, 0,
  56.         "fill", PSEUDO, FILL, 0,
  57.         "ifd", PSEUDO, IFD, 0,  /* ver TER_2.0 6/17/89 */
  58.         "ifnd", PSEUDO, IFND, 0,/* ver TER_2.0 6/17/89 */
  59.         "include", PSEUDO, INCLUDE, 0,  /* ver TER_2.0 6/17/89 */
  60.         "nam", PSEUDO, NULL_OP, 0,
  61.         "name", PSEUDO, NULL_OP, 0,
  62.         "opt", PSEUDO, OPT, 0,
  63.         "org", PSEUDO, ORG, 0,
  64.         "pag", PSEUDO, PAGE, 0,
  65.         "page", PSEUDO, PAGE, 0,
  66.         "ram", PSEUDO, BSS, 0,  /* ver TER_2.09 25 Jul 89 */
  67.         "rmb", PSEUDO, RMB, 0,
  68.         "spc", PSEUDO, NULL_OP, 0,
  69.         "ttl", PSEUDO, NULL_OP, 0,
  70.         "zmb", PSEUDO, ZMB, 0
  71. };
  72.  
  73. /*
  74.  * do_pseudo --- do pseudo op processing
  75.  */
  76. void
  77. do_pseudo(int op)
  78. /* int op; which op */
  79. {
  80.         char            fccdelim;
  81.         int             fill;
  82.         int             c;      /* test variable  ver TER_2.0 6/18/89 */
  83.         char           *savept; /* savept is pointer to string save */
  84.         FILE           *FdTemp; /* ver TER_2.0 6/17/89 */
  85.         /*
  86.          * void    pouterror(), NewPage(), IfMachine();
  87.          *//* rel TER_2.0 6/18/89 */
  88.         /* void    PC_Exchange();  *//* ver TER_2.09 25 Jul 89 */
  89.  
  90.         if (op != EQU && *Label)
  91.                 install(Label, Pc);
  92.  
  93.         P_force++;
  94.  
  95. #ifdef DEBUG3
  96.         printf("%s, line no. ", Argv[Cfn]);     /* current file name */
  97.         printf("%d: ", Line_num);       /* current line number */
  98.         printf(" Pseudo Op=%u\n", op);
  99. #endif
  100.  
  101.         switch (op) {
  102.         case RMB:               /* reserve memory bytes */
  103.                 if (eval()) {
  104.                         Pc += Result;
  105.                         f_record();     /* flush out bytes */
  106.                 } else
  107.                         error("Undefined Operand during Pass One");
  108.                 break;
  109.         case ZMB:               /* zero memory bytes */
  110.                 if (eval())
  111.                         while (Result--)
  112.                                 emit(0);
  113.                 else
  114.                         error("Undefined Operand during Pass One");
  115.                 break;
  116.         case FILL:              /* fill memory with constant */
  117.                 eval();
  118.                 fill = Result;
  119.                 if (*Optr++ != ',')
  120.                         error("Bad fill");
  121.                 else {
  122.                         Optr = skip_white(Optr);
  123.                         eval();
  124.                         while (Result--)
  125.                                 emit(fill);
  126.                 }
  127.                 break;
  128.         case FCB:               /* form constant byte(s) */
  129.                 do {
  130.                         Optr = skip_white(Optr);
  131.                         eval();
  132.                         if (Result > 0xFF) {
  133.                                 if (!Force_byte)
  134.                                         warn("Value truncated");
  135.                                 Result = lobyte(Result);
  136.                         }
  137.                         emit(Result);
  138.                 } while (*Optr++ == ',');
  139.                 break;
  140.         case FDB:               /* form double byte(s) */
  141.                 do {
  142.                         Optr = skip_white(Optr);
  143.                         eval();
  144.                         eword(Result);
  145.                 } while (*Optr++ == ',');
  146.                 break;
  147.         case FCC:               /* form constant characters */
  148.                 if (*Operand == EOS)
  149.                         break;
  150. /*                Optr++;*/
  151.                 fccdelim = *Optr++;
  152.                 if ((fccdelim != SQUOT) && (fccdelim != DQUOT))
  153.                         {error("Missing Delimiter - \' or \" expected");
  154.                           break;}
  155. /*              putchar ( fccdelim );*/
  156.                 while (*Optr != EOS && *Optr != fccdelim)
  157.                         emit(*Optr++);
  158.                 if (*Optr == fccdelim)
  159.                         {Optr++;}
  160.                 else
  161.                         {error("Missing Delimiter");}
  162.                 break;
  163.         case ORG:               /* origin */
  164.                 if (eval()) {
  165.                         Old_pc = Pc = Result;
  166.                         f_record();     /* flush out any bytes */
  167.                 } else
  168.                         error("Undefined Operand during Pass One");
  169.                 break;
  170.         case EQU:               /* equate */
  171.                 if (*Label == EOS) {
  172.                         error("EQU requires label");
  173.                         break;
  174.                 }
  175.                 if (eval()) {
  176.                         install(Label, Result);
  177.                         Old_pc = Result;        /* override normal */
  178.                 } else
  179.                         error("Undefined Operand during Pass One");
  180.                 break;
  181.         case OPT:               /* assembler option */
  182.                 P_force = 0;
  183.                 if (head(Operand, "l"))
  184.                         Lflag = 1;
  185.                 else if (head(Operand, "nol"))
  186.                         Lflag = 0;
  187.                 else if (head(Operand, "c")) {
  188.                         Cflag = 1;
  189.                         Ctotal = 0;
  190.                 } else if (head(Operand, "noc"))
  191.                         Cflag = 0;
  192.                 else if (head(Operand, "contc")) {
  193.                         Cflag = 1;
  194.                 } else if (head(Operand, "s"))
  195.                         Sflag = 1;
  196.                 else if (head(Operand, "cre"))
  197.                         CREflag = 1;
  198.                 else if (head(Operand, "p50"))  /* turn on page flag */
  199.                         Pflag50 = 1;    /* ver (TER) 2.02 19 Jun 89 */
  200.                 else if (head(Operand, "crlf")) /* add <CR> <LF> to */
  201.                         CRflag = 1;     /* S record ver TER_2.08 */
  202.                 else if (head(Operand, "nnf"))  /* no extra line no. *