home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume4 / 68kdisassem / part2 / prin.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-11-30  |  5.4 KB  |  293 lines

  1. /*
  2.  *    SCCS:    @(#)prin.c    1.2    11/2/84    14:19:47
  3.  *    Print stuff.
  4.  *
  5.  ***********************************************************************
  6.  *    This software is copyright of
  7.  *
  8.  *        John M Collins
  9.  *        47 Cedarwood Drive
  10.  *        St Albans
  11.  *        Herts, AL4 0DN
  12.  *        England            +44 727 57267
  13.  *
  14.  *    and is released into the public domain on the following conditions:
  15.  *
  16.  *        1.  No free maintenance will be guaranteed.
  17.  *        2.  Nothing may be based on this software without
  18.  *            acknowledgement, including incorporation of this
  19.  *            notice.
  20.  *
  21.  *    Notwithstanding the above, the author welcomes correspondence and bug
  22.  *    fixes.
  23.  ***********************************************************************
  24.  */
  25.  
  26. #include <stdio.h>
  27. #include <a.out.h>
  28. #include "unc.h"
  29.  
  30. #define    LINELNG    70
  31.  
  32. void    gette(), getde();
  33. long    gettw(), getdw();
  34. void    prinst();
  35.  
  36. char    noabs;            /*  No non-global absolutes  */
  37. int    rel;            /*  File being analysed is relocatable  */
  38. int    lpos;
  39.  
  40. struct    commit    abstab, comtab;
  41.  
  42. /*
  43.  *    Print absolute and common values.
  44.  */
  45.  
  46. void    pabs()
  47. {
  48.     register  int    i;
  49.     register  symbol  cs;
  50.  
  51.     for  (i = 0;  i < abstab.c_int;  i++)
  52.     
  53.     for  (i = 0;  i < abstab.c_int;  i++)  {
  54.         cs = abstab.c_symb[i];
  55.         if  (cs->s_glob)
  56.             (void) printf("\t.globl\t%s\n", cs->s_name);
  57.         else  if  (noabs)
  58.             continue;
  59.         (void) printf("%s\t=\t0x%lx\n", cs->s_name, cs->s_value);
  60.     }
  61.     for  (i = 0;  i < comtab.c_int;  i++)  {
  62.         cs = comtab.c_symb[i];
  63.         (void) printf("\t.comm\t%s,%d\n", cs->s_name, cs->s_value);
  64.     }
  65. }
  66.  
  67. /*
  68.  *    Print out labels.
  69.  */
  70.  
  71. void    plabs(ls, seg)
  72. register  symbol  ls;
  73. int    seg;
  74. {
  75.     for  (; ls != NULL;  ls = ls->s_link)  {
  76.         if  (ls->s_type != seg)
  77.             continue;
  78.         if  (ls->s_lsymb)  {
  79.             (void) printf("%u$:\n", ls->s_lsymb);
  80.             return;        /*  Set last  */
  81.         }
  82.         if  (ls->s_glob)
  83.             (void) printf("\n\t.globl\t%s", ls->s_name);
  84.         (void) printf("\n%s:\n", ls->s_name);
  85.     }
  86. }
  87.  
  88. /*
  89.  *    Print out text.
  90.  */
  91.  
  92. void    ptext(fid)
  93. register  ef_fid  fid;
  94. {
  95.     register  long    tpos, endt;
  96.     t_entry    tstr;
  97.  
  98.     (void) printf(".text\n");
  99.     
  100.     tpos = fid->ef_tbase;
  101.     endt = tpos + fid->ef_tsize;
  102. contin:    
  103.     for  (;  tpos < endt;  tpos += tstr.t_lng * 2)  {
  104.         gette(fid, tpos, &tstr);
  105.         plabs(tstr.t_lab, TEXT);
  106.         if  (tstr.t_type == T_BEGIN)
  107.             prinst(&tstr, tpos);
  108.         else  if  (tstr.t_relsymb != NULL)  {
  109.             (void) printf("\t.long\t%s", tstr.t_relsymb->s_name);
  110.             if  (tstr.t_relsymb->s_type!=TEXT &&
  111.                 tstr.t_relsymb->s_type!=DATA)
  112.                 (void) printf("+0x%x", gettw(fid, tpos, R_LONG));
  113.             putchar('\n');
  114.             tpos += 4;
  115.             goto  contin;
  116.         }
  117.         else
  118.             (void) printf("\t.word\t0x%x\n", tstr.t_contents);
  119.     }
  120.  
  121.     /*
  122.      *    Print out any trailing label.
  123.      */
  124.     
  125.     gette(fid, tpos, &tstr);
  126.     plabs(tstr.t_lab, TEXT);
  127. }
  128.  
  129. /*
  130.  *    Print out data.
  131.  */
  132.  
  133. void    pdata(fid)
  134. register  ef_fid  fid;
  135. {
  136.     register  long    dpos, endd;
  137.     register  int    lng;
  138.     unsigned  ctyp;
  139.     int    had, par, inc;
  140.     char    *msg;
  141.     d_entry    dstr;
  142.     
  143.     (void) printf("\n.data\n");
  144.     
  145.     dpos = fid->ef_dbase;
  146.     endd = dpos + fid->ef_dsize;
  147.  
  148.     while  (dpos < endd)  {
  149.         
  150.         getde(fid, dpos, &dstr);
  151.         plabs(dstr.d_lab, DATA);
  152.             
  153.         switch  (dstr.d_type)  {
  154.         case  D_CONT:
  155.             (void) fprintf(stderr, "Data sync error\n");
  156.             exit(200);
  157.             
  158.         case  D_ASC:
  159.         case  D_ASCZ:
  160.             ctyp = dstr.d_type;
  161.             lng = dstr.d_lng;
  162.             (void) printf("\t.asci");
  163.             if  (ctyp == D_ASC)
  164.                 (void) printf("i\t\"");
  165.             else  {
  166.                 (void) printf("z\t\"");
  167.                 lng--;
  168.             }
  169.                 
  170.             while  (lng > 0)  {
  171.                 getde(fid, dpos, &dstr);
  172.                 switch  (dstr.d_contents)  {
  173.                 default:
  174.                     if  (dstr.d_contents < ' ' ||
  175.                         dstr.d_contents > '~')
  176.                         (void) printf("\\%.3o", dstr.d_contents);
  177.                     else
  178.                         putchar(dstr.d_contents);
  179.                     break;
  180.                 case  '\"':
  181.                 case  '\'':
  182.                 case  '\\':
  183.                 case  '|':
  184.                     (void) printf("\\%c", dstr.d_contents);
  185.                     break;
  186.                 case  '\b':
  187.                     (void) printf("\\b");
  188.                     break;
  189.                 case  '\n':
  190.                     (void) printf("\\n");
  191.                     break;
  192.                 case  '\r':
  193.                     (void) printf("\\r");
  194.                     break;
  195.                 }
  196.                 
  197.                 lng--;
  198.                 dpos++;
  199.             }
  200.             (void) printf("\"\n");
  201.             if  (ctyp == D_ASCZ)
  202.                 dpos++;
  203.             break;
  204.  
  205.         case  D_BYTE:
  206.             msg = "byte";
  207.             par = R_BYTE;
  208.             inc = 1;
  209.             goto  wrest;
  210.             
  211.         case  D_WORD:
  212.             msg = "word";
  213.             par = R_WORD;
  214.             inc = 2;
  215.             goto  wrest;
  216.             
  217.         case  D_LONG:
  218.             msg = "long";
  219.             par = R_LONG;
  220.             inc = 4;
  221.         wrest:
  222.             (void) printf("\t.%s\t", msg);
  223.             lng = dstr.d_lng;
  224.             lpos = 16;
  225.             had = 0;
  226.             while  (lng > 0)  {
  227.                 if  (lpos > LINELNG)  {
  228.                     (void) printf("\n\t.%s\t", msg);
  229.                     lpos = 16;
  230.                 }
  231.                 else  if  (had)
  232.                     lpos += printf(", ");
  233.  
  234.                 lpos += printf("0x%x", getdw(fid, dpos, par));
  235.                 lng -= inc;
  236.                 dpos += inc;
  237.                 had++;
  238.             }
  239.             putchar('\n');
  240.             break;
  241.  
  242.         case  D_ADDR:
  243.             (void) printf("\t.long\t");
  244.             lng = dstr.d_lng;
  245.             lpos = 16;
  246.             had = 0;
  247.             while  (lng > 0)  {
  248.                 if  (lpos > LINELNG)  {
  249.                     (void) printf("\n\t.long\t");
  250.                     lpos = 16;
  251.                 }
  252.                 else  if  (had)
  253.                     lpos += printf(", ");
  254.  
  255.                 getde(fid, dpos, &dstr);
  256.                 lpos += printf("%s", dstr.d_relsymb->s_name);
  257.                 lng -= sizeof(long);
  258.                 dpos += sizeof(long);
  259.                 had++;
  260.             }
  261.             putchar('\n');
  262.             break;
  263.         }
  264.     }
  265.     
  266.     /*
  267.      *    Print trailing label.
  268.      */
  269.     
  270.     getde(fid, dpos, &dstr);
  271.     plabs(dstr.d_lab, DATA);
  272. }
  273.  
  274. void    pbss(fid)
  275. register  ef_fid  fid;
  276. {
  277.     register  long    bpos = fid->ef_bbase;
  278.     long    endb = fid->ef_end;
  279.     d_entry    bstr;
  280.     
  281.     (void) printf("\n.bss\n");
  282.     
  283.     while  (bpos < endb)  {
  284.         getde(fid, bpos, &bstr);
  285.         plabs(bstr.d_lab, BSS);
  286.         (void) printf("\t.space\t%d\n", bstr.d_lng);
  287.         bpos += bstr.d_lng;
  288.     }
  289.     
  290.     getde(fid, endb, &bstr);
  291.     plabs(bstr.d_lab, BSS);
  292. }
  293.