Annotation of researchv9/jerq/sgs/dis/dis_utls.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     static  char    dis_utls_ID[] = "@(#)dis_utls.c 1.25 12/15/83";
                      3:  */
                      4: #define        DEBUG
                      5: #include       <stdio.h>
                      6: #include       <ar.h>
                      7: #include       "dis.h"
                      8: #include       "filehdr.h"
                      9: #include       "ldfcn.h"
                     10: #include       "sgs.h"
                     11: #include       "scnhdr.h"
                     12: #include       "linenum.h"
                     13: #include       "syms.h"
                     14: #include       "structs.h"
                     15: #ifdef OLIST
                     16: #include       "olist_defs.h"
                     17: #endif
                     18: 
                     19: #ifndef OLIST
                     20: #define TOOL   "dis"
                     21: #endif
                     22: /*
                     23:  * The following #define is necessary so that the disassembler
                     24:  * will run on UNIX 370 3.0 and UNIX 370 4.0 (printf was changed).
                     25:  *
                     26:  */
                     27: #ifndef UNIX
                     28: #define UNIX 3
                     29: #endif
                     30: 
                     31: #define                FUNC_NM 0       /* for line_nums func, indicates the    */
                     32:                                /* line number entry value for the      */
                     33:                                /* beginning of a function              */
                     34: #define                BADADDR -1L     /* used by the resynchronization        */
                     35:                                /* function to indicate that a restart  */
                     36:                                /* candidate has not been found         */
                     37: 
                     38: #ifdef OLIST
                     39: extern struct  files   *curfile;
                     40: extern char            linebuf[];
                     41: #endif
                     42: 
                     43: /*
                     44:  *     This structure is used for storing data needed for the looking up
                     45:  *     of symbols for labels or functions.  It consists of a pointer to a
                     46:  *     structure describing a symbol table entry, and a pointer to another
                     47:  *     structure of its own type (a forward linked list will be created).
                     48:  */
                     49: 
                     50: struct SYMLINK {
                     51:        SYMENT  *element;
                     52:        struct  SYMLINK *next;
                     53: };
                     54: 
                     55: /*
                     56:  *     To look up labels, a linked list of 'struct SYMLINK' will be
                     57:  *     searched.  'num_labels' will be set to the number of label
                     58:  *     entries that exist, and 'head_ptr' will point to the head
                     59:  *     of this list.
                     60:  */
                     61: 
                     62: static int     num_labels = 0;
                     63: static struct  SYMLINK *head_ptr;
                     64: #ifdef OLIST
                     65: static int     firsttime = 1;
                     66: #endif
                     67: 
                     68: /*
                     69:  *     To store the names and addresses of all the functions in the symbol
                     70:  *     table, SYMLINK is used so that all symbol information is collected
                     71:  *     for flexname purposes.
                     72:  *     In the previous version, only the name and address of the symbol
                     73:  *     was saved.
                     74:  */
                     75: 
                     76: 
                     77: extern unsigned short  num_funcs;
                     78: static struct SYMLINK  *func_ptr;
                     79: 
                     80: /*
                     81:  *     To store the name of each section and associate it with its section
                     82:  *     number, an array of pointers is used.
                     83:  */
                     84: 
                     85: static char    **section;
                     86: 
                     87: /*
                     88:  *     The following declarations provide space for the current
                     89:  *     lint number entry and the number of line numbers that have
                     90:  *     been read
                     91:  */
                     92: static LINENO  line_ent;
                     93: static unsigned short  lnno_cnt;
                     94: 
                     95: FUNCLIST       *currfunc;
                     96: 
                     97: /*
                     98:  *     build_labels ()
                     99:  *
                    100:  *     Construct an array containing all the label entries in the 
                    101:  *     symbol table. (This will be a forward linked structure.)
                    102:  *     Then construct an array containing each section name,
                    103:  *     associating the section name with its section number by its 
                    104:  *     index.  This is needed in looking up the labels.
                    105:  */
                    106: 
                    107: build_labels()
                    108: {
                    109:        /* the following items are from _extn.c */
                    110:        extern  FILHDR  filhdr;
                    111:        extern  LDFILE  *f_ptr,
                    112:                        *symb;
                    113:        extern  char    *fname;
                    114:        extern  int     trace,
                    115:                        Lflag,
                    116:                        save_Lflag;
                    117:        SCNHDR  sect_hdr;
                    118:        LDFILE  *sect_ptr;
                    119:        unsigned short  j;
                    120:        long    limit;
                    121:        struct  SYMLINK *current;
                    122:        char    *calloc();
                    123:        SYMENT  sym_ent;
                    124:        SYMENT  *sym_ptr = &sym_ent;
                    125:        long    sym_cnt;
                    126: 
                    127:        if ((filhdr.f_flags & F_LSYMS) || (filhdr.f_symptr == NULL)) {
                    128:                printf("\nfile %s has been stripped of labels\n",fname);
                    129:                /* if labels are stripped off save the value of Lflag */
                    130:                save_Lflag = Lflag;
                    131:                Lflag = -1;
                    132:                return;
                    133:        }
                    134: 
                    135:        limit = filhdr.f_nsyms;         /* # of symbol table entries    */
                    136: 
                    137:        /*
                    138:         * Allocate for link structure of first element.
                    139:         */
                    140: 
                    141:        if ((head_ptr = (struct SYMLINK *) calloc(1,sizeof(struct SYMLINK))) == NULL) {
                    142:                fprintf( stderr, "memory allocation failure on call to calloc");
                    143:                exit(0);
                    144:        }
                    145: 
                    146:        current = head_ptr; /* point to first entry */
                    147: 
                    148:        /*
                    149:         * Allocate for symbol structure of first element.
                    150:         */
                    151: 
                    152:        if ((current->element = (SYMENT *) calloc(1,SYMESZ)) == NULL) {
                    153:                fprintf( stderr, "memory allocation failure on call to calloc");
                    154:                exit(0);
                    155:        }
                    156: 
                    157:        /*
                    158:         * initialize all needed for get_sym()
                    159:         */
                    160: 
                    161:        ldtbseek(symb);
                    162: 
                    163:        /*
                    164:         * Search the whole symbol table looking for elements
                    165:         * with a storage class of label (C_LABEL)
                    166:         */
                    167: 
                    168:        for( sym_cnt = 0; sym_cnt < limit; sym_cnt++ ) {
                    169:                if (ldtbread( symb, sym_cnt, sym_ptr ) == FAILURE)
                    170:                {
                    171:                        fprintf( stderr, "%s%s: %s: cannot read symbol table\n",
                    172:                                SGS, TOOL, fname );
                    173:                        exit(1);
                    174:                }
                    175:                if (trace > 0) {
                    176:                        printf("\nsym name %s\tsec # %d\tstor cl %d\n",
                    177:                                sym_ptr->n_name,
                    178:                                sym_ptr->n_scnum,
                    179:                                sym_ptr->n_sclass);
                    180:                }
                    181:                if (sym_ptr->n_sclass == C_LABEL)  {
                    182: 
                    183:                        /* if it's a label add it to the list */
                    184: 
                    185: #ifdef FLEXNAMES
                    186:                        current->element->n_zeroes=sym_ptr->n_zeroes;
                    187:                        current->element->n_offset=sym_ptr->n_offset;
                    188: #else
                    189:                        strcpy(current->element->n_name,sym_ptr->n_name);
                    190: #endif
                    191:                        current->element->n_value = sym_ptr->n_value;
                    192:                        current->element->n_scnum = sym_ptr->n_scnum;
                    193:                        current->element->n_type = sym_ptr->n_type;
                    194:                        current->element->n_sclass = sym_ptr->n_sclass;
                    195:                        current->element->n_numaux = sym_ptr->n_numaux;
                    196: 
                    197:                        /*
                    198:                         * Obtain space for another link structure.
                    199:                         */
                    200: 
                    201:                        if ((current->next = (struct SYMLINK *) calloc(1,sizeof(struct SYMLINK))) == NULL) {
                    202:                                fprintf( stderr, "memory allocation failure on call to calloc");
                    203:                                exit(0);
                    204:                        }
                    205: 
                    206:                        current = current->next;
                    207: 
                    208:                        /*
                    209:                         * Obtain space for another symbol element.
                    210:                         */
                    211: 
                    212:                        if ((current->element = (SYMENT *) calloc(1,SYMESZ)) == NULL) {
                    213:                                fprintf( stderr, "memory allocation failure on call to calloc");
                    214:                                exit(0);
                    215:                        }
                    216:                        num_labels++;
                    217:                }
                    218:                sym_cnt += sym_ptr->n_numaux;
                    219:        }
                    220:        current->next = NULL;
                    221: 
                    222:        sect_ptr = NULL;
                    223:        sect_ptr = ldaopen(fname,f_ptr);
                    224: 
                    225:        /*
                    226:         * now build an array to store the pointers to the names of
                    227:         * each section.  First allocate a pointer for each section.
                    228:         */
                    229: 
                    230:        if ((section = (char **) calloc(filhdr.f_nscns + 1, sizeof(section))) == NULL) {
                    231:                fprintf( stderr, "memory allocation failure on call to calloc");
                    232:                exit(0);
                    233:        }
                    234: 
                    235:        /*
                    236:         * now have section[0] point to a block of memory big enough to
                    237:         * hold all the section names (their size has 1 added to
                    238:         * account for a trailing '\0').
                    239:         */
                    240: 
                    241:        if ((*section = calloc ( filhdr.f_nscns + 1, (sizeof(sect_hdr.s_name)+1))) == NULL) {
                    242:                fprintf( stderr, "memory allocation failure on call to calloc");
                    243:                exit(0);
                    244:        }
                    245: 
                    246:        /*
                    247:         * now read and assign the section names.  One will note that
                    248:         * the allocated memory for the first name is not used.  This
                    249:         * does not cause us to run out of space, though, since '1'
                    250:         * was added above in allocating space.
                    251:         */
                    252: 
                    253:        for (j = 1; j < filhdr.f_nscns; j++) {
                    254:                ldshread(sect_ptr, j, &sect_hdr);
                    255:                section[j] = section[j-1] + sizeof(sect_hdr.s_name) + 1;
                    256:                sprintf(section[j],"%-.8s",sect_hdr.s_name);
                    257:        }
                    258:        ldaclose(sect_ptr);
                    259: }
                    260: 
                    261: /*
                    262:  *     compoff (lng, temp)
                    263:  *
                    264:  *     This routine will compute the location to which control is to be
                    265:  *     transferred.  'lng' is the number indicating the jump amount
                    266:  *     (already in proper form, meaning masked and negated if necessary)
                    267:  *     and 'temp' is a character array which already has the actual
                    268:  *     jump amount.  The result computed here will go at the end of 'temp'.
                    269:  *     (This is a great routine for people that don't like to compute in
                    270:  *     hex arithmetic.)
                    271:  */
                    272: 
                    273: compoff(lng, temp)
                    274: long   lng;
                    275: char   *temp;
                    276: {
                    277:        extern  int     oflag;  /* from _extn.c */
                    278:        extern  long    loc;    /* from _extn.c */
                    279: 
                    280:        lng += loc;
                    281:        if (oflag)
                    282:                sprintf(temp,"%s <%lo>",temp,lng);
                    283:        else
                    284:                sprintf(temp,"%s <%lx>",temp,lng);
                    285: }
                    286: /*
                    287:  *     convert (num, temp, flag)
                    288:  *
                    289:  *     Convert the passed number to either hex or octal, depending on
                    290:  *     the oflag, leaving the result in the supplied string array.
                    291:  *     If  LEAD  is specified, preceed the number with '0' or '0x' to
                    292:  *     indicate the base (used for information going to the mnemonic
                    293:  *     printout).  NOLEAD  will be used for all other printing (for
                    294:  *     printing the offset, object code, and the second byte in two
                    295:  *     byte immediates, displacements, etc.) and will assure that
                    296:  *     there are leading zeros.
                    297:  */
                    298: 
                    299: convert(num,temp,flag)
                    300: unsigned       num;
                    301: char   temp[];
                    302: int    flag;
                    303: 
                    304: {
                    305:        extern  int     oflag;          /* in _extn.c */
                    306: 
                    307: #if UNIX < 4
                    308: #ifdef B16
                    309:        if (flag == NOLEAD) 
                    310:                (oflag) ?       sprintf(temp,"%03o",num):
                    311:                                sprintf(temp,"%02x",num);
                    312: #else
                    313:        if (flag == NOLEAD)
                    314:                (oflag) ?       sprintf(temp,"%06o",num):
                    315:                                sprintf(temp,"%04x",num);
                    316: #endif /* B16 */
                    317: #else
                    318: #ifdef B16
                    319:        if (flag == NOLEAD) 
                    320:                (oflag) ?       sprintf(temp,"%.3o",num):
                    321:                                sprintf(temp,"%.2x",num);
                    322: #else
                    323:        if (flag == NOLEAD)
                    324:                (oflag) ?       sprintf(temp,"%.6o",num):
                    325:                                sprintf(temp,"%.4x",num);
                    326: #endif /* B16 */
                    327: #endif /* UNIX < 4 */
                    328:        if (flag == LEAD)
                    329:                (oflag) ?       sprintf(temp,"0%o",num):
                    330:                                sprintf(temp,"0x%x",num);
                    331: }
                    332: /*
                    333:  *     dis_data ()
                    334:  *
                    335:  *     the routine to disassemble a data section,
                    336:  *     which consists of just dumping it with byte offsets
                    337:  */
                    338: 
                    339: dis_data( sectp )
                    340: SCNLIST        *sectp;
                    341: 
                    342: {
                    343:        extern  SCNHDR  scnhdr;  /* from _extn.c */
                    344:        extern  int     oflag;   /* from _extn.c */
                    345:        extern  int     trace;   /* from _extn.c */
                    346:        extern  short   aflag;   /* from _extn.c */
                    347:        extern  long    loc;     /* from _extn.c */
                    348:        extern  char    mneu[];  /* from _extn.c */
                    349:        extern  char    object[];/* from _extn.c */
                    350:        extern  unsigned short cur2bytes; /* from _extn.c */
                    351:        extern  LDFILE  *f_ptr;
                    352:        extern  char    *fname;
                    353: 
                    354:        LDFILE          *d_ptr;
                    355:        short           count;
                    356:        long            last_addr;
                    357: 
                    358:        scnhdr = sectp->shdr;
                    359:        d_ptr = ldaopen( fname, f_ptr );
                    360:        ldsseek( d_ptr, sectp->scnum );
                    361: 
                    362:        /* Blank out mneu so the printline routine won't print extraneous
                    363:         * garbage.
                    364:         */
                    365: 
                    366:        sprintf(mneu,"");
                    367:        if (scnhdr.s_nlnno  != 0){
                    368:                fprintf(stderr,"\n%sdis: QUIRK--data section has line number entries",SGS);
                    369:                printf("\n        Are you sure this was a data section?!\n");
                    370:        }
                    371: 
                    372:        if (trace > 0){
                    373:                printf("\ntrace: section name %s\n",scnhdr.s_name);
                    374:                printf("\ntrace: section size %x\n",scnhdr.s_size);
                    375:        }
                    376: 
                    377:        for (loc = aflag? scnhdr.s_paddr: 0, last_addr = loc + scnhdr.s_size;
                    378:            loc < last_addr; printline()) {
                    379:                /* if -da flag specified, actual adress will be printed
                    380:                   if -d flag specified, offset within section will be printed */
                    381:                printf("\t");
                    382:                prt_offset();
                    383: #ifdef B16
                    384:                for (count=0; (count<6) && (loc<last_addr); count++)
                    385:                        getbyte(d_ptr);
                    386: #endif
                    387: #ifdef MC68
                    388:                for (count=0; (count<8) && (loc<last_addr); count+=2)
                    389:                        get2bytes(d_ptr);
                    390: #endif
                    391: #ifdef N3B
                    392:                for (count=0; (count<8) && (loc<last_addr); count+=2)
                    393:                        get2bytes(d_ptr);
                    394: #endif
                    395: #ifdef M32
                    396:                for (count=0; (count<8) && (loc<last_addr); count+=2)
                    397:                        /* bytes of data are swapped so they must be swapped back */
                    398:                        getswapb2(d_ptr);
                    399: #endif /* M32 */
                    400:        }
                    401: 
                    402: }
                    403: #if U3B | N3B | U3B5 | M32
                    404: /*
                    405:  *     dfpconv(fpword1, fpword2, fpdoub, fpshort)
                    406:  *
                    407:  *     This routine will convert the 2 longs (64 bit) "fpword1 fpword2" double  
                    408:  *     precision floating point representation of a number into its decimal 
                    409:  *     equivalent. The result will be stored in *fpdoub. The routine will
                    410:  *     return a value indicating what type of floating point number was
                    411:  *     converted.
                    412:  *     *NOTE*  The conversion routine will calculate a decimal value
                    413:  *             if the disassembler is to run native mode on the 3B.
                    414:  *             If the 3B disassembler is to be run on a DEC processor
                    415:  *             (pdp11 or vax) the routine will store the exponent in
                    416:  *             *fpshort. The mantissa will be stored in the form:
                    417:  *             "T.fraction" where "T" is the implied bit and the
                    418:  *             fraction is of radix 2. The mantissa will be stored
                    419:  *             in *fpdoub. This is due to the difference in range
                    420:  *             of floating point numbers between the 3B and DEC
                    421:  *             processors.
                    422:  */
                    423: dfpconv(fpword1, fpword2, fpdoub, fpshort)
                    424: long   fpword1, fpword2;
                    425: double *fpdoub;
                    426: short  *fpshort;
                    427: {
                    428:        unsigned short exponent;
                    429:        short   leadbit, signbit;
                    430:        double  dtemp, dec2exp, mantissa;
                    431:        long    ltemp;
                    432: 
                    433:        exponent = (unsigned short)((fpword1>>20) & 0x7ffL);
                    434:        /* exponent is bits 1-11 of the double  */
                    435: 
                    436:        ltemp = fpword1 & 0xfffffL;     /* first 20 bits of mantissa */
                    437:        mantissa = ((double)ltemp * TWO_32) + (double)fpword2;
                    438:        /* mantissa is bits 12-63 of the double */
                    439: 
                    440:        signbit = (short)((fpword1>>31) & 0x1L);
                    441:        /* sign bit (1-negative, 0-positive) is bit 0 of double */
                    442: 
                    443:        leadbit = 1;
                    444:        /* implied bit to the left of the decimal point */
                    445: 
                    446:        if (exponent==2047)
                    447:                if (mantissa)
                    448:                        return(NOTANUM);
                    449:                else
                    450:                        return((signbit)? NEGINF: INFINITY);
                    451: 
                    452:        if (exponent==0)
                    453:                if (mantissa)
                    454:                /* This is a denormalized number. The implied bit to 
                    455:                 * the left of the decimal point is 0.
                    456:                 */
                    457:                        leadbit = 0;
                    458:                else
                    459:                        return((signbit)? NEGZERO: ZERO);
                    460: 
                    461:        /*
                    462:         * Convert the 52 bit mantissa into "I.fraction" where
                    463:         * "I" is the implied bit. The 52 bits are divided by
                    464:         * 2 to the 52rd power to transform the mantissa into a
                    465:         * fraction. Then the implied bit is added on.
                    466:         */
                    467:        dtemp = (double)(leadbit + (mantissa/TWO_52));
                    468: 
                    469: #if U3B | U3B5
                    470:        /* Calculate 2 raised to the (exponent-BIAS) power and
                    471:         * store it in a double.
                    472:         */
                    473:        if (exponent < DBIAS)
                    474:                for(dec2exp=1; exponent < DBIAS; ++exponent)
                    475:                        dec2exp /= 2;
                    476:        else
                    477:                for(dec2exp=1; exponent > DBIAS; --exponent)
                    478:                        dec2exp *= 2;
                    479: 
                    480:        /* Multiply "I.fraction" by 2 raised to the (exponent-BIAS)
                    481:         * power to obtain the decimal floating point number.
                    482:         */
                    483:        *fpdoub = dtemp *dec2exp;
                    484: 
                    485:        if (signbit)
                    486:                *fpdoub = -(*fpdoub);
                    487:        return(FPNUM);
                    488: #else
                    489:        *fpshort = exponent - DBIAS;
                    490:        *fpdoub = ((signbit)? (-dtemp): dtemp);
                    491:        return(FPBIGNUM);
                    492: #endif /* U3B | U3B5 */
                    493: }
                    494: #endif /* U3B | N3B | U3B5 | M32 */
                    495: 
                    496: /*
                    497:  *     getbyte (ptr)
                    498:  *
                    499:  *     read a byte, mask it, then return the result in 'curbyte'.
                    500:  *     The getting of all single bytes is done here.  The 'getbyte[s]'
                    501:  *     routines are the only place where the global variable 'loc'
                    502:  *     is incremented.
                    503:  */
                    504: int
                    505: getbyte(ptr)
                    506: LDFILE *ptr;
                    507: 
                    508: {
                    509:        extern  long    loc;            /* from _extn.c */
                    510:        extern  unsigned short curbyte; /* from _extn.c */
                    511:        extern  char    object[];       /* from _extn.c */
                    512:        char    temp[NCPS+1];
                    513:        char    byte;
                    514: 
                    515:        if ( FREAD(&byte,sizeof(byte),1,ptr) == NULL){
                    516:                fprintf(stderr,"\n%s%s: premature EOF\n",SGS,TOOL);
                    517:                exit(4);
                    518:        }
                    519:        loc++;
                    520:        curbyte = byte & 0377;
                    521:        convert(curbyte, temp, NOLEAD);
                    522:        sprintf(object,"%s%s ",object,temp);
                    523: }
                    524: /*
                    525:  *     lookbyte (ptr)
                    526:  *
                    527:  *     read a byte, mask it, then return the result in 'curbyte'.
                    528:  *     The byte is not immediately placed into the string object[].
                    529:  *     is incremented.
                    530:  */
                    531: 
                    532: int
                    533: lookbyte(ptr)
                    534: LDFILE *ptr;
                    535: 
                    536: {
                    537:        extern  long    loc;            /* from _extn.c */
                    538:        extern  unsigned short curbyte; /* from _extn.c */
                    539:        char    byte;
                    540: 
                    541:        if ( FREAD(&byte,sizeof(byte),1,ptr) == NULL){
                    542:                fprintf(stderr,"\n%s%s: premature EOF\n",SGS,TOOL);
                    543:                exit(4);
                    544:        }
                    545:        loc++;
                    546:        curbyte = byte & 0377;
                    547: }
                    548: 
                    549: /*
                    550:  *     get2bytes(ptr)
                    551:  *
                    552:  *     This routine will get 2 bytes, print them in the object file
                    553:  *     and place the result in 'cur2bytes'.
                    554:  */
                    555: 
                    556: int
                    557: get2bytes(ptr)
                    558: LDFILE *ptr;
                    559: {
                    560:        extern  long    loc;            /* from _extn.c */
                    561:        extern  unsigned short cur2bytes; /* from _extn.c */
                    562:        extern  char    object[];       /* from _extn.c */
                    563:        char    temp[NCPS+1];
                    564:        extern  int     trace;
                    565: 
                    566:        if ( FREAD(&cur2bytes,sizeof(cur2bytes),1,ptr) == NULL){
                    567:                fprintf(stderr,"\n%s%s: premature EOF\n",SGS,TOOL);
                    568:                exit(4);
                    569:        }
                    570:        loc += 2;
                    571:        convert( (cur2bytes & 0xffff), temp, NOLEAD);
                    572:        sprintf(object,"%s%s ",object, temp);
                    573:        if (trace > 1)
                    574:                printf("\nin get2bytes object<%s>\n",object);
                    575: }
                    576: #ifdef M32
                    577: /*
                    578:  *     getswapb2(ptr)
                    579:  *
                    580:  *     This routine is used only for m32 and m32a. It will get and
                    581:  *     swap 2 bytes, print them in the object file and place the
                    582:  *     result in 'cur2bytes'.
                    583:  */
                    584: 
                    585: int
                    586: getswapb2(ptr)
                    587: LDFILE *ptr;
                    588: {
                    589:        extern  long    loc;            /* from _extn.c */
                    590:        extern  unsigned short cur2bytes; /* from _extn.c */
                    591:        extern  char    object[];       /* from _extn.c */
                    592:        char    temp[NCPS+1];
                    593:        extern  int     trace;
                    594: 
                    595:        if ( FREAD(&cur2bytes,sizeof(cur2bytes),1,ptr) == NULL){
                    596:                fprintf(stderr,"\n%s%s: premature EOF\n",SGS,TOOL);
                    597:                exit(4);
                    598:        }
                    599:        loc += 2;
                    600:        /* swap the 2 bytes contained in 'cur2bytes' */
                    601:        cur2bytes = ((cur2bytes>>8) & (unsigned short)0x00ff) |
                    602:                ((cur2bytes<<8) & (unsigned short)0xff00);
                    603:        convert( (cur2bytes & 0xffff), temp, NOLEAD);
                    604:        sprintf(object,"%s%s ",object, temp);
                    605:        if (trace > 1)
                    606:                printf("\nin getswapb2 object<%s>\n",object);
                    607: }
                    608: #endif
                    609: /*
                    610:  *     get4bytes(ptr)
                    611:  *
                    612:  *     This routine will bet 4 bytes, print them in the object and
                    613:  *     place the results in 'cur4bytes'.
                    614:  */
                    615: 
                    616: get4bytes(ptr)
                    617: LDFILE *ptr;
                    618: {
                    619:        extern  long    loc;            /* from _extn.c */
                    620: #ifdef AR32WR
                    621:        extern  unsigned long   cur4bytes;      /* from _extn.c */
                    622: #else
                    623:        extern  long            cur4bytes;
                    624: #endif
                    625:        extern  unsigned short cur2bytes;       /* from _extn.c */
                    626:        extern  char    object[];       /* from _extn.c */
                    627:        char    temp[NCPS+1];
                    628:        unsigned        send;
                    629:        extern  int     trace;                  /* in _extn.c   */
                    630: #ifdef AR32WR
                    631:        unsigned long   tempvax;
                    632: #endif
                    633: 
                    634:        if ( FREAD(&cur4bytes,sizeof(cur4bytes),1,ptr) == NULL){
                    635:                fprintf(stderr,"\n%s%s: premature EOF\n",SGS,TOOL);
                    636:                exit(4);
                    637:        }
                    638: 
                    639:        loc += 4;
                    640: #ifdef AR32WR
                    641:        tempvax = (( cur4bytes >>16 ) & 0xffffL);
                    642:        cur4bytes = (( cur4bytes <<16 ) | tempvax);
                    643: #endif
                    644:        send = (cur4bytes >> 16) & 0xffffL;
                    645:        convert(send, temp, NOLEAD);
                    646:        sprintf(object,"%s%s ",object,temp);
                    647:        cur2bytes = cur4bytes & 0xffffL;
                    648:        send = cur4bytes  & 0xffffL;
                    649:        convert(send, temp, NOLEAD);
                    650:        sprintf(object,"%s%s ",object,temp);
                    651:        if (trace > 1)
                    652:                printf("\nin get4bytes object<%s>\n",object);
                    653: }
                    654: /*
                    655:  *     label_free ()
                    656:  *
                    657:  *     Free all the space that has been allocated which would be the space
                    658:  *     for section names plus those label entries that are not already free.
                    659:  */
                    660: 
                    661: label_free()
                    662: 
                    663: {
                    664:        struct  SYMLINK *temp;
                    665:        int     i;
                    666: 
                    667:        cfree(section[0]);
                    668:        cfree(section);
                    669: 
                    670:        for (i = 0; i < num_labels; i++) {
                    671:                temp = head_ptr;
                    672:                head_ptr = head_ptr->next;
                    673:                free(temp->element);
                    674:                free(temp);
                    675:        }
                    676: 
                    677: }
                    678: /*
                    679:  *     lib_free ()
                    680:  *
                    681:  *     After all the files have been processed, free the space that was
                    682:  *     allocated for libraries that were disassembled.
                    683:  */
                    684: 
                    685: lib_free()
                    686: 
                    687: {
                    688:        /* the following array is from _extn.c */
                    689:        extern  char    *libs[];
                    690:        extern  int     lflag;          /* from _extn.c */
                    691:        int     i;
                    692: 
                    693:        for (i = lflag; i > 0; i--)
                    694:                free(libs[i]);
                    695: 
                    696: }
                    697: 
                    698: /*
                    699:  *     line_nums ()
                    700:  *
                    701:  *     This function prints out the names of functions being disassembled
                    702:  *     and break-pointable line numbers.  First it checks the address
                    703:  *     of the next function in the list of functions; if if matches
                    704:  *     the current location, it prints the name of that function.
                    705:  *
                    706:  *     It then examines the line number entries. If the address of the
                    707:  *     current line number equals that of the current location, the
                    708:  *     line number is printed.
                    709:  */
                    710: line_nums()
                    711: {
                    712:        /* the following items are from _extn.c */
                    713:        extern  LDFILE  *l_ptr,
                    714:                        *t_ptr,
                    715:                        *symb,
                    716:                        *symb_ptr;
                    717: 
                    718:        extern  SCNHDR  scnhdr;
                    719:        extern  FILHDR  filhdr;
                    720:        extern  int     trace;
                    721:        extern  int     oflag;
                    722: #ifndef OLIST
                    723:        extern  int     fflag;
                    724: #endif
                    725:        extern  long    loc;
                    726:        extern  FUNCLIST        *next_function;
                    727:        extern  FUNCLIST        *currfunc;
                    728: #ifdef OLIST
                    729:        extern  int     nosource;
                    730:        extern  int     funcs_listed;
                    731: #endif
                    732: 
                    733:        SYMENT  sym_ent;
                    734:        SYMENT  *sym_ptr = &sym_ent;
                    735:        long    sym_cnt;
                    736:        char    *flexname, /* pointer to flexname returned by ldgetname */
                    737:                *ldgetname();
                    738:        LINENO  *lnno_ptr = &line_ent;
                    739: 
                    740: #ifdef OLIST
                    741:        linebuf[0] = '\0';
                    742: #endif
                    743: 
                    744:        while (next_function != NULL)
                    745:        {
                    746:                /* not there yet */
                    747:                if (loc < next_function->faddr)
                    748:                        break;
                    749: 
                    750:                if (loc > next_function->faddr)
                    751:                {
                    752:                        /* this is an error condition */
                    753:                        fflush( stdout );
                    754:                        fprintf( stderr, "\nWARNING: Possible strings in text or bad physical address before location ");
                    755:                        if (oflag) 
                    756:                                fprintf( stderr, "0%lo\n", loc );
                    757:                        else
                    758:                                fprintf( stderr, "0x%lx\n", loc );
                    759:                        FSEEK( t_ptr, (next_function->faddr - scnhdr.s_paddr) + scnhdr.s_scnptr, 0);
                    760:                        loc = next_function->faddr;
                    761:                }
                    762: 
                    763:                /* loc == next_function->addr, so print the function name */
                    764: #if OLIST
                    765:                funcs_listed++;
                    766:                if (nosource == TRUE)
                    767:                        printf( "\t" );
                    768:                else if (curfile->f_nam[ strlen( curfile->f_nam ) -1] == 's')
                    769:                        printf( "\n\@FUNCTION: %s\n\n", next_function->funcnm );
                    770: #endif
                    771:                printf("%s()\n", next_function->funcnm );
                    772:                currfunc = next_function;
                    773:                next_function = next_function->nextfunc;
                    774:        }
                    775: 
                    776:        if (scnhdr.s_lnnoptr != NULL)
                    777:        {
                    778: #if OLIST
                    779:                /* read the first one for the section */
                    780:                if (loc == scnhdr.s_paddr || firsttime)
                    781:                {
                    782:                        firsttime = 0;
                    783:                        FSEEK( l_ptr, scnhdr.s_lnnoptr, 0 );
                    784:                        lnno_cnt = 0;
                    785:                        if (FREAD( (char *) lnno_ptr, LINESZ,1, l_ptr ) != 1)
                    786:                                fatal( "cannot read line numbers" );
                    787:                }
                    788: #else
                    789:                if (loc == scnhdr.s_paddr)
                    790:                {
                    791:                        if (fflag)  {
                    792:                                if ((ldlinit(l_ptr, currfunc->fcnindex)) == FAILURE)
                    793:                                        return;
                    794:                        }  else
                    795:                                FSEEK( l_ptr, scnhdr.s_lnnoptr, 0 );
                    796:                        lnno_cnt = 0;
                    797:                        if (FREAD( (char *) lnno_ptr, LINESZ,1, l_ptr ) != 1)
                    798:                                fatal( "cannot read line numbers" );
                    799:                }
                    800: #endif
                    801: 
                    802:                for ( ; lnno_cnt < scnhdr.s_nlnno; )
                    803:                {
                    804:                        if (lnno_ptr->l_lnno == FUNC_NM)
                    805:                        {
                    806:                                if (currfunc && lnno_ptr->l_addr.l_symndx == currfunc->fcnindex)
                    807:                                {
                    808:                                        /* if the function matches the last one
                    809:                                         * printed, skip the line number entry
                    810:                                         */
                    811:                                        if (FREAD((char *) lnno_ptr, LINESZ,1, l_ptr ) !=1 )
                    812:                                                fatal( "cannot read line numbers" );
                    813:                                        lnno_cnt++;
                    814:                                }
                    815:                                else
                    816:                                {
                    817:                                        /* should never get here.  All of the
                    818:                                         * functions should be in the function
                    819:                                         * list, but the code is here just
                    820:                                         * in case
                    821:                                         */
                    822:                                        if (ldtbread( symb_ptr, lnno_ptr->l_addr.l_symndx, sym_ptr ) == FAILURE)
                    823:                                                fatal( "cannot read symbol table");
                    824:                                        if (sym_ptr->n_value > loc)
                    825:                                                break;
                    826:                                        if (sym_ptr->n_value < loc)
                    827: #if OLIST
                    828:                                                if (sym_ptr->n_value < curfile->tbegin)
                    829:                                                {
                    830:                                                        lnno_cnt += 1;
                    831:                                                        if (FREAD ((char *) lnno_ptr, LINESZ, 1, l_ptr ) != 1)
                    832:                                                                fatal("cannot read line numbers");
                    833:                                                        continue;
                    834:                                                }
                    835:                                                else
                    836: #endif
                    837:                                                {
                    838:                                                        fflush( stdout );
                    839:                                                        fprintf( stderr, "\nWARNING: Possible strings in text or bad physical address before location " );
                    840:                                                        if (oflag)
                    841:                                                                fprintf( stderr, "0%lo\n", loc);
                    842:                                                        else
                    843:                                                                fprintf(stderr, "0x%lx\n", loc);
                    844:                                                        FSEEK(t_ptr, (sym_ptr->n_value - scnhdr.s_paddr) + scnhdr.s_scnptr, BEGINNING);
                    845:                                                        loc = sym_ptr->n_value;
                    846:                                                }
                    847: 
                    848:                                        /* the address of the function matches so print its name */
                    849:                                        if(!(flexname = ldgetname(symb_ptr, sym_ptr)))
                    850:                                                fprintf(stderr, "ldgetname returned 0\n");
                    851: #ifdef OLIST
                    852:                                        if (nosource == TRUE )
                    853:                                                printf("\t");
                    854:                                        else if (curfile->f_nam[strlen(curfile->f_nam)-1] =='s')
                    855:                                                printf("\n\\@FUNCTION: %s\n\n", flexname);
                    856: #endif
                    857:                                        printf("%s()\n",flexname);
                    858:                                        lnno_cnt += 1;
                    859:                                        if (FREAD( lnno_ptr, LINESZ, 1, l_ptr ) != 1)
                    860:                                                fatal( "cannot read line numbers\n");
                    861:                                }
                    862:                        }
                    863:                        else
                    864:                        {
                    865:                                /* this is just a line number entry */
                    866: #ifdef OLIST
                    867:                                if ((loc == lnno_ptr->l_addr.l_paddr) && (nosource != TRUE))
                    868:                                        sprintf(linebuf, "%s[%-d%]", linebuf, lnno_ptr->l_lnno);
                    869: #else
                    870:                                if (loc == lnno_ptr->l_addr.l_paddr)
                    871:                                        printf("[%d]",lnno_ptr->l_lnno);
                    872: #endif
                    873:                                else if (loc < lnno_ptr->l_addr.l_paddr)
                    874:                                        break;
                    875:                                if (FREAD( lnno_ptr, LINESZ, 1, l_ptr ) != 1)
                    876:                                        fatal( "cannot read line numbers\n" );
                    877:                                lnno_cnt++;
                    878:                        }
                    879:                }
                    880:        }
                    881: 
                    882: #ifndef OLIST
                    883:        printf("\t");
                    884: #endif
                    885: }
                    886: 
                    887: /*
                    888:  *     looklabel (addr, sect_num)
                    889:  *
                    890:  *     This function will look in the symbol table to see if
                    891:  *     a label exists which may be printed.
                    892:  */
                    893: 
                    894: looklabel(addr, sect_num)
                    895: long   addr;
                    896: unsigned short sect_num;
                    897: 
                    898: {
                    899:        struct  SYMLINK *current,
                    900:                        *previous;
                    901:        int     i;
                    902:        extern  LDFILE  *symb_ptr;
                    903:        char    *flexname,
                    904:                *ldgetname();
                    905: 
                    906:        current = head_ptr;
                    907:        previous = current;
                    908: 
                    909:        for (i = 0; i < num_labels; i++) {
                    910: 
                    911:                /* both the address and section number must match       */
                    912:                if (current->element->n_value == addr &&
                    913:                        current->element->n_scnum == sect_num) {
                    914: 
                    915:                        /* found the label so print it  */
                    916:                        if(!(flexname = ldgetname(symb_ptr, current->element))) {
                    917:                                fprintf(stderr, "ldgetname returned 0\n");
                    918:                        }
                    919:                        printf("%s:\n",flexname);
                    920: 
                    921:                        /* now free up the space occupied by the        */
                    922:                        /* found element                                */
                    923: 
                    924:                        if (current == head_ptr)
                    925:                                head_ptr = head_ptr->next;
                    926: 
                    927:                        previous->next = current->next;
                    928:                        free (current->element);
                    929:                        free(current);
                    930:                        num_labels--;
                    931:                        return;
                    932:                }
                    933:                /* didn't find a label yet, so go to the next label     */
                    934:                previous = current;
                    935:                current = current->next;
                    936:        }
                    937: }
                    938: 
                    939: /*
                    940:  *     printline ()
                    941:  *
                    942:  *     Print the disassembled line, consisting of the object code
                    943:  *     and the mnemonics.  The breakpointable line number, if any,
                    944:  *     has already been printed, and 'object' contains the offset
                    945:  *     within the section for the instruction.
                    946:  */
                    947: 
                    948: printline()
                    949: 
                    950: {
                    951:        extern  int     oflag;          /* in _extn.c */
                    952:        extern  char    object[];
                    953:        extern  char    mneu[];
                    954: #ifdef OLIST
                    955:        extern  int     nosource;
                    956: #endif
                    957: 
                    958: #ifdef B16
                    959:        (oflag > 0) ?
                    960:                printf("%-36s%s\n",object,mneu):        /* to print octal */
                    961:                printf("%-30s%s\n",object,mneu);        /* to print hex */
                    962: #endif
                    963: #ifdef MC68
                    964:        (oflag > 0) ?
                    965:                printf("%-36s%s\n",object,mneu):        /* to print octal */
                    966:                printf("%-37s%s\n",object,mneu);        /* to print hex */
                    967: #endif
                    968: #ifdef N3B
                    969: #ifdef OLIST
                    970:        if (nosource == TRUE) return;
                    971:        printf("%-46s%-8s%s\n", object, linebuf, mneu);
                    972: #else
                    973:        (oflag > 0) ?
                    974:                printf("%-36s%s\n",object,mneu):        /* to print octal */
                    975:                printf("%-37s%s\n",object,mneu);        /* to print hex */
                    976: #endif
                    977: #endif
                    978: #ifdef M32
                    979:        (oflag > 0) ?
                    980:                printf("%-36s%s\n",object,mneu):        /* to print octal */
                    981:                printf("%-37s%s\n",object,mneu);        /* to print hex */
                    982: #endif /* M32 */
                    983: }
                    984: /*
                    985:  *     prt_offset ()
                    986:  *
                    987:  *     Print the offset, right justified, followed by a ':'.
                    988:  */
                    989: 
                    990: 
                    991: prt_offset()
                    992: 
                    993: {
                    994:        extern  long    loc;    /* from _extn.c */
                    995:        extern  int     oflag;
                    996:        extern  char    object[];
                    997: 
                    998: #ifdef OLIST
                    999:        if (oflag)
                   1000:                sprintf(object,"0%.7lo  ", loc);
                   1001:        else
                   1002:                sprintf(object, "0x%.6lx  ", loc);
                   1003: #else
                   1004:        if (oflag)
                   1005:                sprintf(object,"%6lo:  ",loc);
                   1006:        else
                   1007:                sprintf(object,"%4lx:  ",loc);
                   1008: #endif
                   1009: }
                   1010: /*
                   1011:  *     resync ()
                   1012:  *
                   1013:  *     If a bad op code is encountered, the disassembler will attempt
                   1014:  *     to resynchronize itself. The next line number entry and the
                   1015:  *     next function symbol table entry will be found. The restart
                   1016:  *     point will be the smaller of these two addresses and bytes
                   1017:  *     of object code will be dumped (not disassembled) until the
                   1018:  *     restart point is reached.
                   1019:  */
                   1020: 
                   1021: 
                   1022: resync()
                   1023: 
                   1024: {
                   1025:        /* the following 7 items are from _extn.c */
                   1026:        extern  char    *fname;
                   1027:        extern  char    *sname;
                   1028:        extern  LDFILE  *f_ptr;
                   1029:        extern  LDFILE  *t_ptr;
                   1030:        extern  LDFILE  *l_ptr;
                   1031:        extern  LDFILE  *symb;
                   1032:        extern  FILHDR  filhdr;
                   1033:        extern  SCNHDR   scnhdr;
                   1034:        extern  long    loc;
                   1035:        extern  FUNCLIST        *next_function;
                   1036:        extern  FUNCLIST        *currfunc;
                   1037:        extern  char    mneu[];
                   1038:        extern  int     nosyms;
                   1039: #if OLIST
                   1040:        extern  int     funcs_listed;
                   1041:        extern  int     nosource;
                   1042: #endif
                   1043: 
                   1044: #if AR16WR && !OLIST
                   1045:        static  long    firstfn = -1L;
                   1046: #endif
                   1047: 
                   1048:        struct  lineno  *eptr = &line_ent;
                   1049:        struct  syment  sentry, stbentry, *septr;
                   1050:        long    paddr, sindex, linaddr, symaddr, dumpaddr, s_end;
                   1051: 
                   1052:        linaddr = BADADDR;
                   1053:        symaddr = BADADDR;
                   1054:        s_end = scnhdr.s_paddr + scnhdr.s_size;
                   1055:        /* Find the next line number entry if the file has not been
                   1056:         * stripped of line number information. Each entry from the
                   1057:         * beginning will be read until one having a greater address
                   1058:         * than the present location is found.
                   1059:         */
                   1060:        if (nosyms == TRUE) {
                   1061:                printf ("\n\t**   FILE IS STRIPPED  **\t\n");
                   1062:                printf ("\t**   SKIP TWO BYTES AND TRY AGAIN  **\n");
                   1063:                return(SUCCESS);
                   1064:        }
                   1065:        if (stripped() != TRUE)
                   1066:        {
                   1067:                for( ; lnno_cnt < scnhdr.s_nlnno; lnno_cnt++ )
                   1068:                {
                   1069:                        if (eptr->l_lnno == 0) {
                   1070:                                if (symb == NULL)
                   1071:                                        break;
                   1072:                                ldtbread(symb, eptr->l_addr.l_symndx, &sentry);
                   1073:                                linaddr = sentry.n_value;
                   1074:                                if (loc <= linaddr)
                   1075:                                        goto symfind;
                   1076:                        } 
                   1077:                        else if (eptr->l_addr.l_paddr >= loc) {
                   1078:                                linaddr = eptr->l_addr.l_paddr;
                   1079:                                goto symfind;
                   1080:                        }
                   1081:                        FREAD(eptr, LINESZ, 1, l_ptr);
                   1082:                }
                   1083:                /* Cannot restart based on line number information.
                   1084:                 * Try to use symbol table information to find restart
                   1085:                 * point.
                   1086:                 */
                   1087:                if (symb == NULL)
                   1088:                        linaddr = BADADDR;
                   1089:                else
                   1090:                        /* If no further line numbers have been found,
                   1091:                         * the address of the section end will be a
                   1092:                         * candidate for a restart point.
                   1093:                         */
                   1094:                        linaddr = s_end;
                   1095:        }
                   1096: symfind:
                   1097:        /* Find next function symbol table entry.       */
                   1098:        for( ; next_function; currfunc = next_function, next_function = next_function->nextfunc )
                   1099:                if (next_function->faddr >= loc)
                   1100:                {
                   1101:                        symaddr = next_function->faddr;
                   1102:                        break;
                   1103:                }
                   1104: #if OLIST
                   1105:                else
                   1106:                        funcs_listed += 1;
                   1107: 
                   1108:        if (next_function == NULL)
                   1109:                symaddr = curfile->tend;
                   1110: #else
                   1111: #if AR32W || AR32WR
                   1112:        if (next_function == NULL)
                   1113:                symaddr = scnhdr.s_paddr + scnhdr.s_size;
                   1114: #else
                   1115:        /* scan the symbol table        */
                   1116:        if ((filhdr.f_nsyms != 0L) && (symb != NULL) && (ldtbseek(symb) != FAILURE)) {
                   1117:                /*
                   1118:                 * set firstfn equal to the symbol table index
                   1119:                 * of the first function symbol table entry.
                   1120:                 * The search for the next function symbol
                   1121:                 * table entry will always begin at firstfn.
                   1122:                         */
                   1123:                septr = &stbentry;
                   1124:                if (firstfn == BADADDR) {
                   1125:                        ldtbread (symb, 0, septr);
                   1126:                        for (sindex = 1+septr->n_numaux; (sindex<filhdr.f_nsyms)
                   1127:                        && ((septr->n_scnum<1) || (!ISFCN(septr->n_type)
                   1128:                        || (septr->n_value < scnhdr.s_paddr)
                   1129:                        || (septr->n_value > s_end))); sindex++) {
                   1130:                                ldtbread (symb, sindex, septr);
                   1131:                                sindex += septr->n_numaux;
                   1132:                        }
                   1133:                        firstfn = sindex -1 - septr->n_numaux;
                   1134:                }
                   1135:                ldtbread(symb, firstfn, septr);
                   1136:                sindex = firstfn + 1 + septr->n_numaux;
                   1137:                for (;(sindex < filhdr.f_nsyms) && ((septr->n_scnum < 1)
                   1138:                || (septr->n_numaux == 0) || ( !ISFCN(septr->n_type))
                   1139:                || (septr->n_value < scnhdr.s_paddr)
                   1140:                || (septr->n_value > s_end)
                   1141:                || (septr->n_value <= loc)); sindex++) {
                   1142:                        ldtbread(symb, sindex, septr);
                   1143:                        sindex += septr->n_numaux;
                   1144:                }
                   1145:                /*
                   1146:                * If the next fuction symbol table entry has been
                   1147:                * found, it is a candidate for a restart point.
                   1148:                * If the entire symbol table has been read, and a
                   1149:                * possible restart point has not been found, the end  
                   1150:                * of the section is a candidate for a restart point.
                   1151:                */
                   1152:                if ((sindex - septr->n_numaux) == filhdr.f_nsyms)
                   1153:                        symaddr = s_end;
                   1154:                else
                   1155:                        symaddr = septr->n_value;
                   1156:        }
                   1157:        /* end of the section is end of the function */
                   1158: #endif
                   1159: #endif
                   1160: 
                   1161:        if (symaddr == BADADDR) {
                   1162:                /* Restart point was not found by searching the
                   1163:                 * symbol table.
                   1164:                 */
                   1165:                if (linaddr == BADADDR) {
                   1166:                        /* Restart point was not found by looking
                   1167:                         * at line number information.
                   1168:                         */
                   1169: #ifdef OLIST
                   1170:                        if (nosource == FALSE)
                   1171: #endif
                   1172:                        {
                   1173:                                printf ("\n\t**\tCANNOT FIND NEXT LINE NUMBER\t\t\t**\n");
                   1174:                                printf ("\t**  CANNOT FIND NEXT FUNCTION SYMBOL TABLE ENTRY\t**\n");
                   1175:                                printf ("\t**  FOLLOWING DISASSEMBLY MAY BE OUT OF SYNC\t\t**\n");
                   1176:                        }
                   1177:                        return (FAILURE);
                   1178:                } 
                   1179:                else {
                   1180:                        /* The next line number entry will be the
                   1181:                         * restart point.
                   1182:                         */
                   1183:                        paddr = linaddr;
                   1184: #ifdef OLIST
                   1185:                        if (nosource == FALSE)
                   1186: #endif
                   1187:                        {
                   1188:                                printf ("\n\t** OBJECT CODE WILL BE DUMPED UNTIL\t**\n");
                   1189:                                printf ("\t** THE NEXT BREAKPOINTABLE LINE NUMBER\t**\n");
                   1190:                        }
                   1191:                }
                   1192:        }
                   1193:        else if (linaddr == BADADDR) {
                   1194:                /* The next function symbol table entry or the end
                   1195:                 * of the section will be the restart point.
                   1196:                 */
                   1197:                paddr = symaddr;
                   1198: #ifdef OLIST
                   1199:                if (nosource == FALSE)
                   1200: #endif
                   1201:                {
                   1202:                        printf ("\n\t**   OBJECT CODE WILL BE DUMPED UNTIL\t**\n");
                   1203:                        printf ("\t**  THE BEGINNING OF THE NEXT FUNCTION\t**\n");
                   1204:                        printf ("\t**    OR UNTIL THE END OF THE SECTION\t**\n");
                   1205:                }
                   1206:        }
                   1207:        else {
                   1208:                /* The smaller address of the next line number
                   1209:                 * entry and the next function symbol table entry
                   1210:                 * will be the restart point.
                   1211:                 */
                   1212:                paddr = (linaddr < symaddr)? linaddr: symaddr;
                   1213: #ifdef OLIST
                   1214:                if (nosource == FALSE)
                   1215: #endif
                   1216:                {
                   1217:                        printf ("\n\t**      OBJECT CODE WILL BE DUMPED UNTIL\t**\n");
                   1218:                        printf ("\t**           RESTART POINT IS REACHED\t\t**\n");
                   1219:                }
                   1220:        }
                   1221:        dumpaddr = (loc < paddr - scnhdr.s_paddr)? (paddr -scnhdr.s_paddr):
                   1222:                                                paddr;
                   1223:        for (; loc < dumpaddr; ) {
                   1224:                /* Dump bytes until the restart point is reached. */
                   1225: #ifdef OLIST
                   1226:                if (nosource == FALSE)
                   1227: #endif
                   1228:                        printf("\t");
                   1229:                prt_offset();
                   1230: #ifdef B16
                   1231:                getbyte( t_ptr );
                   1232:                if (loc < dumpaddr)
                   1233:                        getbyte( t_ptr );
                   1234: #endif
                   1235: #ifdef MC68
                   1236:                get2bytes(t_ptr);
                   1237: #endif
                   1238: #ifdef N3B
                   1239:                get2bytes(t_ptr);
                   1240: #endif
                   1241: #ifdef M32
                   1242:                get1byte(t_ptr);
                   1243: #endif /* M32 */
                   1244:                sprintf(mneu,"");
                   1245:                printline();
                   1246:        }       /* end of dump of unused object code    */
                   1247: 
                   1248: #ifdef OLIST
                   1249:        if ( nosource == FALSE )
                   1250: #endif
                   1251:                printf("\n\t** DISASSEMBLER RESYNCHRONIZED **\n");
                   1252:        return(SUCCESS);
                   1253: 
                   1254: }
                   1255: /*
                   1256:  *     sect_name ()
                   1257:  *
                   1258:  *     If labels are to be looked up, the 'looklabel' routine needs to know
                   1259:  *     the number of the section being processed.  Compare the section name
                   1260:  *     to the stored names, created in 'build_labels', and return the
                   1261:  *     appropriate section number.
                   1262:  */
                   1263: 
                   1264: short
                   1265: sect_name()
                   1266: 
                   1267: {
                   1268:        /* the following 2 items are from _extn.c */
                   1269:        extern  char    *sname;
                   1270:        extern  FILHDR  filhdr;
                   1271: 
                   1272:        unsigned short  i;
                   1273: 
                   1274:        for (i = 1; i < filhdr.f_nscns +1; i++) 
                   1275:                if (strcmp(sname,section[i]) == STRNGEQ)
                   1276:                        return(i);
                   1277: 
                   1278:        return (FAILURE);
                   1279: }
                   1280: 
                   1281: #if N3B | U3B | M32 | U3B5
                   1282: /*
                   1283:  *     sfpconv(fprep, fpdoub)
                   1284:  *
                   1285:  *     This routine will convert the long "fprep" single precision 
                   1286:  *     floating point representation of a number into its decimal 
                   1287:  *     equivalent. The result will be stored in *fpdoub. The routine
                   1288:  *     will return a value indicating what type of floating point
                   1289:  *     number was converted.
                   1290:  */
                   1291: sfpconv(fprep, fpdoub)
                   1292: long fprep;
                   1293: double *fpdoub;
                   1294: {
                   1295:        unsigned short exponent;
                   1296:        short   leadbit, signbit;
                   1297:        long    mantissa;
                   1298:        double  dtemp, dec2exp;
                   1299: 
                   1300:        exponent = (unsigned short)((fprep>>23) & 0xffL);
                   1301:        /* exponent is bits 1-8 of the long     */
                   1302: 
                   1303:        mantissa = fprep & 0x7fffffL;
                   1304:        /* mantissa is bits 9-31 of the long    */
                   1305: 
                   1306:        signbit = (fprep>>31) & 0x1L;
                   1307:        /* sign bit (1-negative, 0-positive) is bit 0 of long   */
                   1308: 
                   1309:        leadbit = 1;
                   1310:        /* implied bit to the left of the decimal point */
                   1311: 
                   1312:        if (exponent==255)
                   1313:                if (mantissa)
                   1314:                        return(NOTANUM);
                   1315:                else
                   1316:                        return((signbit)? NEGINF: INFINITY);
                   1317: 
                   1318:        if (exponent==0)
                   1319:                if (mantissa)
                   1320:                /* This is a denormalized number. The implied bit to 
                   1321:                 * the left of the decimal point is 0.
                   1322:                 */
                   1323:                        leadbit = 0;
                   1324:                else
                   1325:                        return((signbit)? NEGZERO: ZERO);
                   1326: 
                   1327:        /*
                   1328:         * Convert the 23 bit mantissa into "I.fraction" where
                   1329:         * "I" is the implied bit. The 23 bits are divided by
                   1330:         * 2 to the 23rd power to transform the mantissa into a
                   1331:         * fraction. Then the implied bit is added on.
                   1332:         */
                   1333:        dtemp = (double)(leadbit + (double)mantissa/TWO_23);
                   1334: 
                   1335:        /* Calculate 2 raised to the (exponent-BIAS) power and
                   1336:         * store it in a double.
                   1337:         */
                   1338:        if (exponent < BIAS)
                   1339:                for(dec2exp=1; exponent < BIAS; ++exponent)
                   1340:                        dec2exp /= 2;
                   1341:        else
                   1342:                for(dec2exp=1; exponent > BIAS; --exponent)
                   1343:                        dec2exp *= 2;
                   1344: 
                   1345:        /* Multiply "I.fraction" by 2 raised to the (exponent-BIAS)
                   1346:         * power to obtain the decimal floating point number.
                   1347:         */
                   1348:        *fpdoub = dtemp *dec2exp;
                   1349: 
                   1350:        if (signbit)
                   1351:                *fpdoub = -(*fpdoub);
                   1352:        return(FPNUM);
                   1353: }
                   1354: #endif /* N3B | U3B | M32 | U3B5 */
                   1355: 
                   1356: /*
                   1357:  *     stripped ()
                   1358:  *
                   1359:  *     Is the file stripped (no line number entries)?
                   1360:  *     If so, return TRUE else FALSE.
                   1361:  */
                   1362: 
                   1363: stripped()
                   1364: 
                   1365: {
                   1366:        extern  SCNHDR   scnhdr;        /* from _extn.c */
                   1367: 
                   1368:        return( (scnhdr.s_nlnno == 0) ? TRUE : FALSE);
                   1369: }
                   1370: 
                   1371: /*
                   1372:  *     fatal()
                   1373:  *
                   1374:  *     print an error message and quit
                   1375:  */
                   1376: 
                   1377: fatal( message )
                   1378: char   *message;
                   1379: {
                   1380:        extern  char    *fname;
                   1381: 
                   1382:        fprintf( stderr, "\n%s%s: %s: %s\n", SGS, TOOL, fname, message );
                   1383:        exit(1);
                   1384: }

unix.superglobalmegacorp.com

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