00001 #ifndef __I8086_DBG_H__
00002 #define __I8086_DBG_H__
00003
00004
00005 class arg
00006 {
00007 public:
00008 virtual void dump() const =0;
00009 };
00010
00011
00012 class arg_reg : public arg
00013 {
00014 int m_width;
00015 int m_id;
00016 public:
00017 arg_reg(int width, int reg_id) : m_width(width), m_id(reg_id) {}
00018 virtual void dump() const
00019 {
00020 static const char* reg_name_8[] = {"AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH" };
00021 static const char* reg_name_16[] = {"AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI" };
00022 fprintf(stderr, "%s", m_width==8?reg_name_8[m_id] : reg_name_16[m_id]);
00023 }
00024 };
00025
00026
00027 class arg_sreg : public arg
00028 {
00029 int m_id;
00030 public:
00031 arg_sreg(int reg_id) : m_id(reg_id) {}
00032 virtual void dump() const
00033 {
00034 static const char* segreg_name_16[] = {"ES", "CS", "SS", "DS" };
00035 fprintf (stderr, "%s", segreg_name_16[m_id]);
00036 }
00037 };
00038
00039
00040 class arg_mem : public arg
00041 {
00042 int m_width;
00043 uint32 m_addr;
00044 public:
00045 arg_mem(int width, uint32 addr) : m_width(width), m_addr(addr) {}
00046 virtual void dump() const
00047 {
00048 fprintf (stderr, "%s PTR [%04Xh]", m_width==8?"BYTE":"WORD", m_addr);
00049 }
00050 };
00051
00052
00053 class arg_ea : public arg
00054 {
00055 int m_width;
00056 int m_mod;
00057 int m_rm;
00058 int m_disp;
00059 public:
00060 arg_ea(int width, int mod, int rm, int disp) : m_width(width), m_mod(mod), m_rm(rm), m_disp(disp) {}
00061 virtual void dump() const
00062 {
00063 fprintf(stderr, "%s PTR", m_width==8?"BYTE":"WORD");
00064 switch ((m_mod << 3) + m_rm) {
00065 case 0: fprintf (stderr, "[BX+SI]"); break;
00066 case 1: fprintf (stderr, "[BX+DI]"); break;
00067 case 2: fprintf (stderr, "[BP+SI]"); break;
00068 case 3: fprintf (stderr, "[BP+DI]"); break;
00069 case 4: fprintf (stderr, "[SI]"); break;
00070 case 5: fprintf (stderr, "[DI]"); break;
00071 case 6: fprintf (stderr, "[%04Xh]", m_disp); break;
00072 case 7: fprintf (stderr, "[BX]"); break;
00073
00074 case 8: fprintf (stderr, "[BX+SI+%04Xh]", m_disp >> 8); break;
00075 case 9: fprintf (stderr, "[BX+DI+%04Xh]", m_disp >> 8); break;
00076 case 10: fprintf (stderr, "[BP+SI+%04Xh]", m_disp >> 8); break;
00077 case 11: fprintf (stderr, "[BP+DI+%04Xh]", m_disp >> 8); break;
00078 case 12: fprintf (stderr, "[SI+%04Xh]", m_disp >> 8); break;
00079 case 13: fprintf (stderr, "[DI+%04Xh]", m_disp >> 8); break;
00080 case 14: fprintf (stderr, "[BP+%04Xh]", m_disp >> 8); break;
00081 case 15: fprintf (stderr, "[BX+%04Xh]", m_disp >> 8); break;
00082
00083 case 16: fprintf (stderr, "[BX+SI+%04Xh]", m_disp); break;
00084 case 17: fprintf (stderr, "[BX+DI+%04Xh]", m_disp); break;
00085 case 18: fprintf (stderr, "[BP+SI+%04Xh]", m_disp); break;
00086 case 19: fprintf (stderr, "[BP+DI+%04Xh]", m_disp); break;
00087 case 20: fprintf (stderr, "[SI+%04Xh]", m_disp); break;
00088 case 21: fprintf (stderr, "[DI+%04Xh]", m_disp); break;
00089 case 22: fprintf (stderr, "[BP+%04Xh]", m_disp); break;
00090 case 23: fprintf (stderr, "[BX+%04Xh]", m_disp); break;
00091 }
00092 }
00093 };
00094
00095
00096 class arg_immed : public arg
00097 {
00098 int m_width;
00099 uint32 m_value;
00100 public:
00101 arg_immed(int width, uint32 value) : m_width(width), m_value(value) {}
00102 virtual void dump() const
00103 {
00104 fprintf (stderr, m_width==8?"%02Xh":"%04Xh", m_value);
00105 }
00106 };
00107
00108 #endif