home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / compiler / bob13st / bobdbg.c < prev    next >
C/C++ Source or Header  |  1991-12-23  |  3KB  |  129 lines

  1. /* bobdbg.c - debug routines */
  2. /*
  3.     Copyright (c) 1991, by David Michael Betz
  4.     All rights reserved
  5. */
  6.  
  7. #include "bob.h"
  8.  
  9. /* instruction output formats */
  10. #define FMT_NONE    0
  11. #define FMT_BYTE    1
  12. #define FMT_WORD    2
  13. #define FMT_LIT        3
  14.  
  15. typedef struct { int ot_code; char *ot_name; int ot_fmt; } OTDEF;
  16. OTDEF otab[] = {
  17. {    OP_BRT,        "BRT",        FMT_WORD    },
  18. {    OP_BRF,        "BRF",        FMT_WORD    },
  19. {    OP_BR,        "BR",        FMT_WORD    },
  20. {    OP_LIT,        "LIT",        FMT_LIT        },
  21. {    OP_REF,        "REF",        FMT_LIT        },
  22. {    OP_SET,        "SET",        FMT_LIT        },
  23. {    OP_AREF,    "AREF",        FMT_BYTE    },
  24. {    OP_ASET,    "ASET",        FMT_BYTE    },
  25. {    OP_TREF,     "TREF",        FMT_BYTE    },
  26. {    OP_TSET,    "TSET",        FMT_BYTE    },
  27. {    OP_MREF,    "MREF",        FMT_BYTE    },
  28. {    OP_MSET,    "MSET",        FMT_BYTE    },
  29. {    OP_VREF,    "VREF",        FMT_NONE    },
  30. {    OP_VSET,    "VSET",        FMT_NONE    },
  31. {    OP_CALL,    "CALL",        FMT_BYTE    },
  32. {    OP_RETURN,    "RETURN",    FMT_NONE    },
  33. {    OP_SEND,    "SEND",        FMT_BYTE    },
  34. {    OP_TSPACE,    "TSPACE",    FMT_BYTE    },
  35. {    OP_NIL,        "NIL",        FMT_NONE    },
  36. {    OP_PUSH,    "PUSH",        FMT_NONE    },
  37. {    OP_NOT,        "NOT",        FMT_NONE    },
  38. {    OP_NEG,        "NEG",        FMT_NONE    },
  39. {    OP_ADD,        "ADD",        FMT_NONE    },
  40. {    OP_SUB,        "SUB",        FMT_NONE    },
  41. {    OP_MUL,        "MUL",        FMT_NONE    },
  42. {    OP_DIV,        "DIV",        FMT_NONE    },
  43. {    OP_REM,        "REM",        FMT_NONE    },
  44. {    OP_SHL,        "SHL",        FMT_NONE    },
  45. {    OP_SHR,        "SHR",        FMT_NONE    },
  46. {    OP_BAND,    "BAND",        FMT_NONE    },
  47. {    OP_BOR,        "BOR",        FMT_NONE    },
  48. {    OP_BNOT,    "BNOT",        FMT_NONE    },
  49. {    OP_LT,        "LT",        FMT_NONE    },
  50. {    OP_LE,        "LE",        FMT_NONE    },
  51. {    OP_EQ,        "EQ",        FMT_NONE    },
  52. {    OP_NE,        "NE",        FMT_NONE    },
  53. {    OP_GE,        "GE",        FMT_NONE    },
  54. {    OP_GT,        "GT",        FMT_NONE    },
  55. {    OP_INC,        "INC",        FMT_NONE    },
  56. {    OP_DEC,        "DEC",        FMT_NONE    },
  57. {    OP_DUP2,    "DUP2",        FMT_NONE    },
  58. {    OP_NEW,        "NEW",        FMT_NONE    },
  59. {0,0,0}
  60. };
  61.  
  62. /* decode_procedure - decode the instructions in a code object */
  63. decode_procedure(code)
  64. VALUE *code;
  65. {
  66.     int len,lc,n;
  67.     
  68.     len = strgetsize(vecgetelement(code,0));
  69.     for (lc = 0; lc < len; lc += n)
  70.         n = decode_instruction(code,lc);
  71. }
  72.  
  73. /* decode_instruction - decode a single bytecode instruction */
  74. int decode_instruction(code,lc)
  75. VALUE *code; int lc;
  76. {
  77.     char name[TKNSIZE+1],buf[100];
  78.     unsigned char *cp;
  79.     OTDEF *op;
  80.     int n=1;
  81.  
  82.     cp = strgetdata(vecgetelement(code,0)) + lc; /* get bytecode pointer for this instruction */
  83.  
  84.     if (valtype(vecgetelement(code,1)) == DT_CLASS)  /* show the address and opcode */
  85.     {
  86.         getcstring(name,sizeof(name),clgetname(vecgetelement(code,1)));
  87.         sprintf(buf,"%s::",name);
  88.         osputs(buf);
  89.     }
  90.     getcstring(name,sizeof(name),vecgetelement(code,2));
  91.     sprintf(buf,"%s %04x %02x ",name,lc,*cp);
  92.     osputs(buf);
  93.  
  94.     for (op = otab; op->ot_name; ++op) /* display the operands */
  95.     if (*cp == op->ot_code) 
  96.     {
  97.         switch (op->ot_fmt) 
  98.         {
  99.         case FMT_NONE:
  100.             sprintf(buf,"      %s\n",op->ot_name);
  101.             osputs(buf);
  102.             break;
  103.         case FMT_BYTE:
  104.             sprintf(buf,"%02x    %s %02x\n",cp[1],op->ot_name,cp[1]);
  105.             osputs(buf);
  106.             n += 1;
  107.             break;
  108.         case FMT_WORD:
  109.             sprintf(buf,"%02x %02x %s %02x%02x\n",cp[1],cp[2],
  110.             op->ot_name,cp[2],cp[1]);
  111.             osputs(buf);
  112.             n += 2;
  113.             break;
  114.         case FMT_LIT:
  115.             sprintf(buf,"%02x    %s %02x ; ",cp[1],op->ot_name,cp[1]);
  116.             osputs(buf);
  117.             print1(stderr,TRUE,vecgetelement(code,cp[1]));
  118.             osputs("\n");
  119.             n += 1;
  120.             break;
  121.         }
  122.         return (n);
  123.     }
  124.     
  125.     sprintf(buf,"      <UNKNOWN>\n"); /* unknown opcode */
  126.     osputs(buf);
  127.     return (1);
  128. }
  129.