home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d170 / dis6502.lha / Dis6502 / print.c < prev    next >
C/C++ Source or Header  |  1988-11-22  |  4KB  |  263 lines

  1. #include <ctype.h>
  2. #include "dis.h"
  3.  
  4. char *strcpy();
  5. char *strcat();
  6.  
  7. dumpitout()
  8. {
  9.     int i;
  10.  
  11.     for(i = 0; i<0x10000;) {
  12.         if (f[i] & LOADED) {
  13.  
  14.             if (f[i] & SREF && f[i] & ISOP)
  15.                 printf("\n\n\n");
  16.  
  17.             printf("%04x  ",i);
  18.             print_bytes(i);
  19.             print_label(i);
  20.             if (f[i] & ISOP)
  21.                 i += print_inst(i);
  22.             else
  23.                 i += print_data(i);
  24.             printf("\n");
  25.  
  26.         } else {
  27.             i++;
  28.         }
  29.     }
  30.  
  31.     print_refs();
  32. }
  33.  
  34. pchar(c)
  35. int c;
  36. {
  37.     if (isascii(c) && isprint(c))
  38.         return(c);
  39.     return('.');
  40. }
  41.  
  42. char *
  43. lname(i)
  44. int i;
  45. {
  46.     static char buf[20];
  47.     char t;
  48.  
  49.     if (f[i] & NAMED) 
  50.         return(get_name(i));
  51.     if ((i > 0) && ((f[i-1] & (NAMED | DREF)) == (NAMED | DREF))) {
  52.         (void)strcpy(buf, get_name(i-1));
  53.         (void)strcat(buf, "+1");
  54.         return (buf);
  55.     }
  56.     if (f[i] & SREF)
  57.         t = 'S';
  58.     else if (f[i] & JREF)
  59.         t = 'L';
  60.     else if (f[i] & DREF)
  61.         t = 'D';
  62.     else 
  63.         t = 'X';
  64.     
  65.     (void)sprintf(buf, "%c%x", t, i);
  66.     return (buf);
  67. }
  68.  
  69. print_label(i)
  70. {
  71.     if (f[i] & (NAMED | JREF | SREF | DREF)) 
  72.         printf("%-10s", lname(i));
  73.     else
  74.         printf("%10s"," ");
  75. }
  76.  
  77. print_bytes(addr)
  78. int addr;
  79. {
  80.     register struct info *ip; 
  81.  
  82.     if ((f[addr] & ISOP) == 0) {
  83.         printf("           ");
  84.         return;
  85.     }
  86.  
  87.     ip = &optbl[getbyte(addr)];
  88.  
  89.     switch (ip->nb) {
  90.         case 1:
  91.             printf("%02x         ", getbyte(addr));
  92.             break;
  93.         case 2:
  94.             printf("%02x %02x      ", getbyte(addr), getbyte(addr+1));
  95.             break;
  96.         case 3:
  97.             printf("%02x %02x %02x   ", getbyte(addr), getbyte(addr+1), getbyte(addr+2));
  98.             break;
  99.     }
  100. }
  101.         
  102.  
  103. print_inst(addr)
  104. int addr;
  105. {
  106.     int opcode;
  107.     register struct info *ip; 
  108.     int operand;
  109.  
  110.     opcode = getbyte(addr);
  111.     ip = &optbl[opcode];
  112.  
  113.     printf("%s  ", ip->opn);
  114.  
  115.     addr++;
  116.  
  117.     switch(ip->nb) {
  118.         case 1:
  119.             break;
  120.         case 2:
  121.             operand = getbyte(addr);
  122.             break;
  123.         case 3:
  124.             operand = getword(addr);
  125.             break;
  126.     }
  127.  
  128.     if (ip->flag & REL) {
  129.         if (operand > 127) 
  130.             operand = (~0xff | operand);
  131.         operand = operand + ip->nb + addr - 1;
  132.     }
  133.  
  134.     switch (ip->flag & ADRMASK) {
  135.         case IMM:
  136.             printf("#$%02x                        * %d %c", operand, operand, pchar(operand));
  137.             break;
  138.         case ACC:
  139.         case IMP:
  140.             break;
  141.         case REL:
  142.         case ABS:
  143.         case ZPG:
  144.             printf("%s ", lname(operand));
  145.             break;
  146.         case IND:
  147.             printf("(%s) ", lname(operand));
  148.             break;
  149.         case ABX:
  150.         case ZPX:
  151.             printf("%s,X ", lname(operand));
  152.             break;
  153.         case ABY:
  154.         case ZPY:
  155.             printf("%s,Y ", lname(operand));
  156.             break;
  157.         case INX:
  158.             printf("(%s,X) ", lname(operand));
  159.             break;
  160.         case INY:
  161.             printf("(%s),Y", lname(operand));
  162.             break;
  163.         default:
  164.             break;
  165.     }
  166.  
  167.     return(ip->nb);
  168.  
  169. }
  170.  
  171. print_data(i)
  172. {
  173.     int count;
  174.     int j;
  175.     int start;
  176.  
  177.     start = i;
  178.     printf(".DB  %02x ", getbyte(i));
  179.     count = 1;
  180.     i++;
  181.  
  182.     for (j = 1; j < 8; j++) {
  183.         if (f[i] & (JREF | SREF | DREF) || ((f[i] & LOADED) == 0)) 
  184.             break;
  185.         else
  186.             printf("%02x ", getbyte(i));
  187.         i++;
  188.         count++;
  189.     }
  190.     for (j = count; j < 8; j++)
  191.         printf("   ");
  192.  
  193.     printf("    * ");
  194.  
  195.     for (j = start; j < i ; j++) 
  196.             printf("%c", pchar((int)getbyte(j)));
  197.  
  198.     return (count);
  199. }
  200.  
  201. print_refs()
  202. {
  203.     char tname[50];
  204.     char cmd[200];
  205.     FILE *fp;
  206.     register struct ref_chain *rp;
  207.     register int i;
  208.     int npline;
  209.  
  210. #ifndef AMIGA
  211.     (void)sprintf(tname, "dis.%d", getpid());
  212.     (void)sprintf(cmd, "sort %s; rm %s", tname, tname);
  213. #else
  214.     (void)sprintf(tname, "dis.%ld", FindTask(0L));
  215.     (void)sprintf(cmd, "Sort from %s to %s", tname, &tname[3] );
  216. #endif
  217.  
  218.     fp = fopen(tname, "w");
  219.     if (!fp) 
  220.         crash("Cant open temporary file/n");
  221.  
  222.     for (i = 0; i<0x10000; i++) {
  223.         if(f[i] & (JREF|SREF|DREF)) {
  224.             rp = get_ref(i);
  225.             if (!rp) {
  226.                 fprintf(stderr, "No ref %d\n", i);
  227.                 break;
  228.             }
  229.  
  230.             fprintf(fp, "%-8s  %04x   ", lname(i), i);
  231.             npline = 0;
  232.             while (rp) {
  233.                 fprintf(fp, "%04x ", rp->who);
  234.                 npline++;
  235.                 if (npline == 12) {
  236.                     fprintf(fp,"\n");
  237.                     fprintf(fp,"%-8s  %04x   ",lname(i),i);
  238.                     npline = 0;
  239.                 }
  240.                 rp = rp->next;
  241.             }
  242.             fprintf(fp, "\n");
  243.         }
  244.  
  245.     }
  246.  
  247.     (void)fclose(fp);
  248.  
  249.     printf("\n\n\n\n\nCross References\n\n");
  250.     printf("%-8s  Value  References\n", "Symbol");
  251.     (void)fflush (stdout);
  252.  
  253. #ifndef AMIGA
  254.     (void)system(cmd);
  255. #else
  256.     (void)Execute(cmd,0L,0L);
  257.     (void)sprintf(cmd, "Type %s",&tname[3]);
  258.     (void)Execute(cmd,0L,Output());
  259.     DeleteFile(tname);
  260.     DeleteFile(&tname[3]);
  261. #endif
  262. }
  263.