home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / drdobbs / 1991 / 09 / bob / bobdbg.c < prev    next >
Text File  |  1991-07-11  |  3KB  |  123 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_ADD,        "ADD",        FMT_NONE    },
  39. {    OP_SUB,        "SUB",        FMT_NONE    },
  40. {    OP_MUL,        "MUL",        FMT_NONE    },
  41. {    OP_DIV,        "DIV",        FMT_NONE    },
  42. {    OP_REM,        "REM",        FMT_NONE    },
  43. {    OP_BAND,    "BAND",        FMT_NONE    },
  44. {    OP_BOR,        "BOR",        FMT_NONE    },
  45. {    OP_BNOT,    "BNOT",        FMT_NONE    },
  46. {    OP_LT,        "LT",        FMT_NONE    },
  47. {    OP_LE,        "LE",        FMT_NONE    },
  48. {    OP_EQ,        "EQ",        FMT_NONE    },
  49. {    OP_GE,        "GE",        FMT_NONE    },
  50. {    OP_GT,        "GT",        FMT_NONE    },
  51. {    OP_INC,        "INC",        FMT_NONE    },
  52. {    OP_DEC,        "DEC",        FMT_NONE    },
  53. {    OP_DUP2,    "DUP2",        FMT_NONE    },
  54. {    OP_NEW,        "NEW",        FMT_NONE    },
  55. {0,0,0}
  56. };
  57.  
  58. /* decode_procedure - decode the instructions in a code object */
  59. decode_procedure(code)
  60.   VALUE *code;
  61. {
  62.     int len,lc,n;
  63.     len = code[1].v.v_string->s_length;
  64.     for (lc = 0; lc < len; lc += n)
  65.     n = decode_instruction(code,lc);
  66. }
  67.  
  68. /* decode_instruction - decode a single bytecode instruction */
  69. int decode_instruction(code,lc)
  70.   VALUE *code; int lc;
  71. {
  72.     char name[TKNSIZE+1],buf[100];
  73.     unsigned char *cp;
  74.     OTDEF *op;
  75.     int n=1;
  76.  
  77.     /* get bytecode pointer for this instruction */
  78.     cp = code[1].v.v_string->s_data + lc;
  79.  
  80.     /* show the address and opcode */
  81.     if (code[2].v_type == DT_CLASS) {
  82.     sprintf(buf,"%s::",code[2].v.v_class->cl_name);
  83.     osputs(buf);
  84.     }
  85.     getcstring(name,sizeof(name),code[3].v.v_string);
  86.     sprintf(buf,"%s %04x %02x ",name,lc,*cp);
  87.     osputs(buf);
  88.  
  89.     /* display the operands */
  90.     for (op = otab; op->ot_name; ++op)
  91.     if (*cp == op->ot_code) {
  92.         switch (op->ot_fmt) {
  93.         case FMT_NONE:
  94.         sprintf(buf,"      %s\n",op->ot_name);
  95.         osputs(buf);
  96.         break;
  97.         case FMT_BYTE:
  98.         sprintf(buf,"%02x    %s %02x\n",cp[1],op->ot_name,cp[1]);
  99.         osputs(buf);
  100.         n += 1;
  101.         break;
  102.         case FMT_WORD:
  103.         sprintf(buf,"%02x %02x %s %02x%02x\n",cp[1],cp[2],
  104.             op->ot_name,cp[2],cp[1]);
  105.         osputs(buf);
  106.         n += 2;
  107.         break;
  108.         case FMT_LIT:
  109.         sprintf(buf,"%02x    %s %02x ; ",cp[1],op->ot_name,cp[1]);
  110.         osputs(buf);
  111.         print1(TRUE,&code[cp[1]]);
  112.         osputs("\n");
  113.         n += 1;
  114.         break;
  115.         }
  116.         return (n);
  117.     }
  118.     
  119.     /* unknown opcode */
  120.     sprintf(buf,"      <UNKNOWN>\n");
  121.     osputs(buf);
  122. }
  123.