Annotation of 3BSD/cmd/as/as.h.512, revision 1.1

1.1     ! root        1: /* Copyright (c) 1979 Regents of the University of California */
        !             2: #define readonly
        !             3: #define        NINST   300
        !             4: #define        NSYM    4000
        !             5: #define        NHASH   (NSYM+1)
        !             6: #define        NLOC    4               /* number of location ctrs */
        !             7: #define        NCPS    8               /* number of characters per symbol, fixed */
        !             8: 
        !             9: /*
        !            10:  * Symbol types
        !            11:  */
        !            12: #define        XUNDEF  0x0
        !            13: #define        XABS    0x2
        !            14: #define        XTEXT   0x4
        !            15: #define        XDATA   0x6
        !            16: #define        XBSS    0x8
        !            17: #define        XDATAO  0xA
        !            18: #define        XBSSO   0xC
        !            19: #define        XTEXTO  0xE
        !            20: #define        XABSO   0x10
        !            21: #define        XUNDEFO 0x12
        !            22: 
        !            23: #define        XTXRN   0xA     /* external symbol */
        !            24: #define        XXTRN   0x1
        !            25: #define        XTYPE   0x1E
        !            26: 
        !            27: #define        XFORW   0x20    /* Was forward-referenced when undefined */
        !            28: 
        !            29: #define        ERR     (-1)
        !            30: #define        NBPW    32      /* Bits per word */
        !            31: 
        !            32: #define        AMASK   017
        !            33: 
        !            34: /*
        !            35:  * Actual argument syntax types
        !            36:  */
        !            37: #define AREG   1       /* %r */
        !            38: #define ABASE  2       /* (%r) */
        !            39: #define ADECR  3       /* -(%r) */
        !            40: #define AINCR  4       /* (%r)+ */
        !            41: #define ADISP  5       /* expr(%r) */
        !            42: #define AEXP   6       /* expr */
        !            43: #define AIMM   7       /* $ expr */
        !            44: #define ASTAR  8       /* * */
        !            45: #define AINDX  16      /* [%r] */
        !            46: 
        !            47: /*
        !            48:  * Argument access types used to test validity of operands to operators
        !            49:  */
        !            50: #define ACCA   (8<<3)  /* address only */
        !            51: #define ACCR   (1<<3)  /* read */
        !            52: #define ACCW   (2<<3)  /* write */
        !            53: #define ACCM   (3<<3)  /* modify */
        !            54: #define ACCB   (4<<3)  /* branch displacement */
        !            55: #define ACCI   (5<<3)  /* XFC code */
        !            56: 
        !            57: /*
        !            58:  * Argument data types
        !            59:  */
        !            60: #define TYPB   0       /* byte */
        !            61: #define TYPW   1       /* word */
        !            62: #define TYPL   2       /* long */
        !            63: #define TYPQ   3       /* quad */
        !            64: #define TYPF   4       /* floating */
        !            65: #define TYPD   5       /* double floating */
        !            66: 
        !            67: #define TYPMASK 7
        !            68: 
        !            69: /* reference types for loader */
        !            70: #define PCREL 1
        !            71: #define LEN1 2
        !            72: #define LEN2 4
        !            73: #define LEN4 6
        !            74: #define LEN8 8
        !            75: 
        !            76: #define        TMPC    7       /* offset into the string /tmp/aaaXXX for creating tmp file names*/
        !            77: #define        HW      01
        !            78: #define        FW      03
        !            79: #define        DW      07
        !            80: 
        !            81: #define        PAGRND  0x1FFL
        !            82: 
        !            83: #define        round(x,y)      (((x)+(y)) & ~(y))
        !            84: 
        !            85: #define        STABTYPS        0340
        !            86: #define STABFLAG       0200
        !            87: 
        !            88: /*
        !            89:  *     Follows are the definitions for the symbol table tags, which are
        !            90:  *     all unsigned characters..
        !            91:  *     High value tags are generated by the asembler for internal
        !            92:  *     use.
        !            93:  *     Low valued tags are the parser coded tokens the scanner returns.
        !            94:  *     There are several pertinant bounds in this ordering:
        !            95:  *             a)      Symbols greater than JXQUESTIONABLE
        !            96:  *                     are used by the jxxx bumper, indicating that
        !            97:  *                     the symbol table entry is a jxxx entry
        !            98:  *                     that has yet to be bumped.
        !            99:  *             b)      Symbols greater than IGNOREBOUND are not
        !           100:  *                     bequeathed to the loader; they are truly
        !           101:  *                     for assembler internal use only.
        !           102:  *             c)      Symbols greater than OKTOBUMP represent
        !           103:  *                     indices into the program text that should
        !           104:  *                     be changed in preceeding jumps or aligns
        !           105:  *                     must get turned into their long form.
        !           106:  */
        !           107: 
        !           108: #define TAGMASK                0xFF
        !           109: 
        !           110: #      define  JXACTIVE        0xFF    /*jxxx instruction size unknown*/
        !           111: #      define  JXNOTYET        0xFE    /*jxxx instruction size known, but not yet expanded*/
        !           112: #      define  JXALIGN         0xFD    /*align jxxx entry*/
        !           113: #      define  JXINACTIVE      0xFC    /*jxxx instruction size known and expanded*/
        !           114: 
        !           115: #define JXQUESTIONABLE         0xFB
        !           116: 
        !           117: #      define  JXTUNNEL        0xFA    /*jxxx instruction that jumps to another*/
        !           118: #      define  OBSOLETE        0xF9    /*erroneously entered symbol*/
        !           119: 
        !           120: #define        IGNOREBOUND     0xF8    /*symbols greater than this are ignored*/
        !           121: #      define  STABFLOATING    0xF7
        !           122: #      define  LABELID         0xF6
        !           123: 
        !           124: #define        OKTOBUMP        0xF5
        !           125: #      define  STABFIXED       0xF4
        !           126: 
        !           127: /*
        !           128:  *     astoks.h contains reserved word codings the parser should
        !           129:  *     know about
        !           130:  */
        !           131: #include "astoks.h"
        !           132: 
        !           133: /*
        !           134:  *     The structure for one symbol table entry.
        !           135:  *     Symbol table entries are used for both user defined symbols,
        !           136:  *     and symbol slots generated to create the jxxx jump from
        !           137:  *     slots.
        !           138:  */
        !           139: 
        !           140: #define symfirstfields char    *name;  unsigned char tag, type
        !           141: 
        !           142: struct symtab{
        !           143:                symfirstfields;
        !           144: #ifdef vax
        !           145:                short   ___hole;
        !           146: #endif
        !           147:       /*save*/ char    ptype;          /*tag == NAME*/
        !           148: 
        !           149: #define                jxbump  ptype           /*tag == JX..., how far to expand*/
        !           150: 
        !           151:      /*save*/  char    other;          /*for stab info*/
        !           152: 
        !           153:      /*save*/  short   desc;           /*tag == NAME*/
        !           154: 
        !           155: #define                jxfear  desc            /*how far needs to be bumped*/
        !           156: 
        !           157:      /*save*/  long    value;          /*address in the segment*/
        !           158:                char    jxoveralign;    /*if a JXXX, jumped over an align*/
        !           159:                short   index;          /*which segment*/
        !           160:                struct  symtab *dest;   /*if JXXX, where going to*/
        !           161: #ifdef DJXXX
        !           162:                short   jxline;         /*source line of the jump from*/
        !           163: #endif
        !           164: };
        !           165: 
        !           166: struct instab{
        !           167:        symfirstfields;
        !           168: 
        !           169: #define                opcode type             /*use the same field as symtab.type*/
        !           170: 
        !           171:        char    nargs;                  /*how many arguments*/
        !           172:        char    argtype[6];             /*argument type info*/
        !           173: };
        !           174: 
        !           175: struct arg {                           /*one argument to an instruction*/
        !           176:        char    atype;
        !           177:        char    areg1;
        !           178:        char    areg2;
        !           179:        char    dispsize;               /*usually d124, unless have B^, etc*/
        !           180:        struct  exp *xp;
        !           181: };
        !           182: 
        !           183: struct exp {
        !           184:        char    xtype;
        !           185:        char    xloc;
        !           186:        long    xvalue;
        !           187:        struct  symtab *xname;
        !           188:        union{
        !           189:                double  dvalue; 
        !           190:                struct {
        !           191:                        unsigned int doub_MSW, doub_LSW;
        !           192:                } dis_dvalue;
        !           193:        } doubval;
        !           194: };
        !           195: 
        !           196: /*
        !           197:  *     Magic layout macros
        !           198:  */
        !           199: #define        MINBYTE -128
        !           200: #define                MAXBYTE 127
        !           201: #define                MINWORD -32768
        !           202: #define                MAXWORD 32767
        !           203: 
        !           204: #define                LITFLTMASK 0x000043F0   /*really magic*/
        !           205: /*
        !           206:  *             Is the floating point double word in xp a
        !           207:  *             short literal floating point number?
        !           208:  */
        !           209: #define                slitflt(xp) \
        !           210:                        (    (xp->doubval.dis_dvalue.doub_LSW == 0) \
        !           211:                         && ((xp->doubval.dis_dvalue.doub_MSW & LITFLTMASK) \
        !           212:                           == xp->doubval.dis_dvalue.doub_MSW) )
        !           213: 
        !           214: #define                extlitflt(xp) \
        !           215:                        xp->doubval.dis_dvalue.doub_MSW >> 4
        !           216: 
        !           217: /*
        !           218:  *     Structure that appears at the head of a.out
        !           219:  */
        !           220: struct hdr {
        !           221:        long    magic;
        !           222:        long    tsize;
        !           223:        long    dsize;
        !           224:        long    bsize;
        !           225:        long    ssize;
        !           226:        long    entry;
        !           227:        long    trsize;
        !           228:        long    drsize;
        !           229: };
        !           230: 
        !           231:        struct  arg     arglist[6];     /*building operands in instructions*/
        !           232:        struct  exp     explist[20];    /*building up a list of expressions*/
        !           233: 
        !           234:        /*
        !           235:         *      Communication between the scanner and the jxxx handlers.
        !           236:         *      lastnam:        the last name seen on the input
        !           237:         *      lastjxxx:       pointer to the last symbol table entry for
        !           238:         *                      a jump from
        !           239:         */
        !           240:        extern  struct  symtab  *lastnam;
        !           241:        extern  struct  symtab  *lastjxxx;      
        !           242:        /*
        !           243:         *      For each of the named .text .data segments
        !           244:         *      (introduced by .text <expr>), we maintain
        !           245:         *      the current value of the dot, and the Files where
        !           246:         *      the information for each of the segments is salted
        !           247:         *      away.
        !           248:         *
        !           249:         *      Use of rulesfile and usefile is unclear
        !           250:         */
        !           251:        extern  struct  exp     usedot[NLOC+NLOC];
        !           252:        extern          FILE    *usefile[NLOC+NLOC];
        !           253:        extern          FILE    *rusefile[NLOC+NLOC];
        !           254:        /*
        !           255:         *      Strings used to construct the temporary files
        !           256:         *      for each of the named segments in pass 2.
        !           257:         */
        !           258:        extern  char    *tmpn2;                 /* /tmp/aaaXXXX */
        !           259:        extern  char    *tmpn3;                 /* /tmp/aabXXX */
        !           260: 
        !           261:        extern  struct  exp     *dotp;          /*the current dot location*/
        !           262:        extern  int     loctr;
        !           263:        extern  long    tsize;                  /* total text size */
        !           264:        extern  long    dsize;                  /* total data size */
        !           265:        extern  long    datbase;                /* base of the data segment */
        !           266:        /*
        !           267:         *      Bitoff and bitfield keep track of the packing into 
        !           268:         *      bytes mandated by the expression syntax <expr> ':' <expr>
        !           269:         */
        !           270:        extern  int     bitoff; 
        !           271:        extern  long    bitfield;
        !           272:        
        !           273:        /*
        !           274:         *      The lexical analyzer builds up symbols in yytext.  Lookup
        !           275:         *      expects its argument in this buffer
        !           276:         */
        !           277:        extern  char    yytext[NCPS+2];         /* text buffer for lexical */
        !           278:        /*
        !           279:         *      Variables to manage the input assembler source file
        !           280:         */
        !           281:        extern  int     lineno;                 /*the line number*/
        !           282:        extern  char    *dotsname;              /*the name of the as source*/
        !           283:        /*extern FILE   stdin*;*/               /*the as source input*/
        !           284: 
        !           285:        extern  FILE    *txtfil;                /* file for text*/
        !           286:        extern  FILE    *tmpfil;                /* interpass communication*/
        !           287:        extern  FILE    *relfil;                /* holds relocation informtion*/
        !           288: 
        !           289:        extern  int     passno;                 /* 1 or 2 */
        !           290: 
        !           291:        extern  int     anyerrs;                /*errors assembling arguments*/
        !           292:        extern  int     silent;                 /*don't mention the errors*/
        !           293:        extern  int     savelabels;             /*save labels in a.out*/
        !           294:                int     orgwarn;                /* questionable origin ? */
        !           295:                int     useVM;                  /*use virtual memory temp file*/
        !           296: #ifdef DEBUG
        !           297:        extern  int     debug;
        !           298:        extern  int     toktrace;
        !           299: #endif
        !           300:        /*
        !           301:         *      Information about the instructions
        !           302:         */
        !           303:        struct  instab  *itab[NINST];           /*maps opcodes to instructions*/
        !           304:        extern  readonly struct instab instab[];
        !           305: 
        !           306:        int     curlen;                         /*current storage size*/
        !           307:        
        !           308:        struct  symtab  **lookup();             /*argument in yytext*/
        !           309:        struct  symtab  *symalloc();
        !           310: 
        !           311: #ifdef METRIC
        !           312:        int     outcounters;                    /*should we print them?*/
        !           313:        int     nhcollision;
        !           314:        int     nhashed;
        !           315:        int     nentered;
        !           316:        int     lgtmpfile;
        !           317:        int     jxxxiterate;
        !           318:        int     jxxxtunnel;                     /*how many tunnel jumps done*/
        !           319:        int     jxdeadlock;
        !           320:        int     nbadjxsegs;
        !           321: #endif
        !           322: 
        !           323: 
        !           324: #define outb(val) {dotp->xvalue++; if (passno==2) putc((val), txtfil);}
        !           325: 
        !           326: #define outs(cp, lg) dotp->xvalue += (lg); if (passno == 2) fwrite((cp), 1, (lg), txtfil)
        !           327: 
        !           328: /*
        !           329:  *     Most of the time, the argument to flushfield is a power of two constant,
        !           330:  *     the calculations involving it can be optimized to shifts.
        !           331:  */
        !           332: #define flushfield(n) if (bitoff != 0)  Flushfield( ( (bitoff+n-1) /n ) * n)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.